This repository was archived by the owner on Feb 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun.js
More file actions
142 lines (119 loc) · 5.02 KB
/
run.js
File metadata and controls
142 lines (119 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const fs = require('fs')
const NUMERO_DEPART_FICHIERS_TEST = 1
const PREFIXE_FICHIER_INPUT = 'input'
const PREFIXE_FICHIER_OUTPUT = 'output'
const ICONE_SUCCES = '👍👌🎉🤘😎💪👊🤙🍾👏🙌🙏'
// Importe code.js pour pouvoir tester notre code
const code = require('./src/code')
// Retourne les chemins relatifs des fichiers de tests d'entrée et de sortie
function cheminsFichiersDeTest(numero) {
return [
`tests/${PREFIXE_FICHIER_INPUT}${numero}.txt`,
`tests/${PREFIXE_FICHIER_OUTPUT}${numero}.txt`,
]
}
// Retourne une icône aléatoire de succès
function iconeAleatoireSucces() {
// Les emojis sont composés d'une paire de "code point", la position doit
// être le début d'une paire, donc un chiffre pair.
let positionAleatoire = 0
do {
positionAleatoire = Math.floor(Math.random() * ICONE_SUCCES.length)
} while (positionAleatoire % 2 === 1)
return String.fromCodePoint(ICONE_SUCCES.codePointAt(positionAleatoire))
}
// Calcule le nombre de tests à passer
let nombreTotalDeTests = 0
let numero = NUMERO_DEPART_FICHIERS_TEST
let [fichierDeTest] = cheminsFichiersDeTest(numero)
console.log('> Recherche de tests...')
while (fs.existsSync(fichierDeTest)) {
nombreTotalDeTests++
numero++
;[fichierDeTest] = cheminsFichiersDeTest(numero)
}
if (nombreTotalDeTests > 0) {
const plurielOuSingulierLog = nombreTotalDeTests > 1 ? 's' : ''
const logFileFound = `> ${nombreTotalDeTests} fichier${plurielOuSingulierLog} de test trouvé${plurielOuSingulierLog}.`
console.log(logFileFound)
console.log('> Lancement des tests...')
} else {
const logFileNotFound =
'Aucun test trouvé. Copiez vos fichiers dans le répertoire ./tests.'
console.log(logFileNotFound)
return
}
let numeroTest = NUMERO_DEPART_FICHIERS_TEST
let nombreDeTestsReussis = 0
let succes = true
let [fichierEntree, fichierSortie] = cheminsFichiersDeTest(numeroTest)
// On parcourt tous les tests, on s'arrête dès qu'un test ne passe pas
while (fs.existsSync(fichierEntree) && fs.existsSync(fichierSortie) && succes) {
let contenuEntree = fs.readFileSync(fichierEntree).toString()
let contenuSortie = fs.readFileSync(fichierSortie).toString()
console.log(`\n=======[ Test ${numeroTest} ]=======`)
console.log(`-- Valeurs d'entrée --\n${contenuEntree}`)
// On travaille avec des lignes sous forme de tableaux
contenuEntree = contenuEntree.split(/\r?\n/g)
contenuSortie = contenuSortie.split(/\r?\n/g)
// On fournit à code.js les valeurs d'entrée
code.initInput(contenuEntree)
// On affiche la sortie correcte attendue
console.log(`-- Sortie attendue --\n${contenuSortie}`)
// On met en place un proxy sur console.log() pour écouter la sortie de code.js
let contenuConsole = []
const proxyDeConsole = new Proxy(console.log, {
apply(cible, leThis, listeArgs) {
contenuConsole.push(...listeArgs)
},
})
// On stocke l'ancienne méthode log() pour la réutiliser plus tard
const fonctionConsoleLog = console.log
// On met en place notre proxy à la place de console.log
console.log = proxyDeConsole
// On appelle le code à tester qui fait appel à console.log (notre proxy !)
// Tout ce qui sera affiché via console.log depuis code.js va être stocké dans contenuConsole
code.ContestResponse()
// On remet console.log normal (on retire le proxy) pour afficher les résultats
console.log = fonctionConsoleLog
// On affiche la valeur reçue
console.log('-- Valeur reçue (de code.js) --')
if (contenuConsole.length <= 0) {
const logContentNotFound =
'ERREUR: Aucune sortie reçue. Utilisez console.log() dans code.js pour soumettre votre réponse !'
console.log(logContentNotFound)
succes = false
} else {
// On affiche et on teste les lignes reçues
contenuConsole.map((ligne) => console.log(ligne))
contenuConsole.forEach((ligne, index) => {
if (ligne != contenuSortie[index]) {
console.log(`ERREUR: '${contenuSortie[index]}' != '${ligne}'`)
succes = false
}
})
}
if (succes) {
nombreDeTestsReussis++
console.log(`✅ Test ${numeroTest} réussi`)
}
// On passe aux prochains fichiers de test
numeroTest++
;[fichierEntree, fichierSortie] = cheminsFichiersDeTest(numeroTest)
}
// Affiche le taux de réussite
console.log('')
const messagePourcentage =
'Tests réussis : [' +
'✅'.repeat(nombreDeTestsReussis) +
'❌'.repeat(nombreTotalDeTests - nombreDeTestsReussis) +
`] ${((nombreDeTestsReussis * 100) / nombreTotalDeTests).toFixed(2)} %`
if (nombreDeTestsReussis === nombreTotalDeTests) {
const emojiSucces = iconeAleatoireSucces()
const messageSucces = '{ 100% des tests réussis }'
console.log(emojiSucces.repeat(messageSucces.length / 2 + 2))
console.log(messageSucces)
console.log(emojiSucces.repeat(messageSucces.length / 2 + 2))
} else {
console.log(messagePourcentage)
}