95 lines
2.4 KiB
JavaScript
95 lines
2.4 KiB
JavaScript
'use strict';
|
||
let testit = [];
|
||
|
||
function testi(nimi, funktio) {
|
||
testit.push([nimi, funktio]);
|
||
}
|
||
|
||
function ovatkoSama(a, b) {
|
||
// Strukturaalinen yhteneväisyysvertaus Array:lle
|
||
if (a instanceof Array && b instanceof Array && a.length === b.length) {
|
||
for (let i = 0; i < a.length; i++) {
|
||
if (!ovatkoSama(a[i], b[i])) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
} else {
|
||
return a === b;
|
||
}
|
||
}
|
||
|
||
function assertEq(konteksti, a, b) {
|
||
if (!ovatkoSama(a, b)) {
|
||
throw new Error(`${konteksti}: ${a}, pitäisi olla ${b}`);
|
||
}
|
||
}
|
||
|
||
function assertNe(konteksti, a, b) {
|
||
if (ovatkoSama(a, b)) {
|
||
throw new Error(`${konteksti}: ei tulisi olla ${b}`);
|
||
}
|
||
}
|
||
|
||
function assertRange(konteksti, a, min, max) {
|
||
if (a < min || a > max) {
|
||
throw new Error(`${konteksti}: ${a}, pitäisi olla välillä [${min}, ${max}]`);
|
||
}
|
||
}
|
||
|
||
function assertThrow(konteksti, viesti, funktio) {
|
||
try {
|
||
funktio();
|
||
} catch(poikkeus) {
|
||
if (poikkeus.message !== viesti) {
|
||
throw new Error(`${konteksti}: poikkeus "${poikkeus}", pitäisi olla "${viesti}"`);
|
||
}
|
||
return;
|
||
}
|
||
throw new Error(`${konteksti}: pitäisi heittää "${viesti}"`);
|
||
}
|
||
|
||
function ajaTestit() {
|
||
// Luo otsikko ja lista testeistä sivulle
|
||
let otsikkoTeksti = document.createTextNode('Testit käynnissä…');
|
||
let otsikko = document.createElement('h1');
|
||
otsikko.id = 'testit-otsikko';
|
||
otsikko.appendChild(otsikkoTeksti);
|
||
|
||
let testilista = document.createElement('ul');
|
||
testilista.id = 'testit-lista';
|
||
|
||
let body = document.getElementsByTagName('body')[0];
|
||
body.appendChild(otsikko);
|
||
body.appendChild(testilista);
|
||
|
||
// Aja testit
|
||
let epäonnistuneitaTestejä = 0;
|
||
for (let [nimi, funktio] of testit) {
|
||
// Lisää testi listaan
|
||
let testiListassa = document.createElement('li');
|
||
let testiTeksti = document.createTextNode(`${nimi} …`);
|
||
testiListassa.appendChild(testiTeksti);
|
||
testilista.appendChild(testiListassa);
|
||
|
||
try {
|
||
funktio();
|
||
} catch (poikkeus) {
|
||
// Virhe testiä suoritettaessa — kerro virhe käyttäjälle ja päivitä
|
||
// epäonnistuneiden testien laskuria
|
||
testiTeksti.textContent = `${nimi}: ${poikkeus}`;
|
||
testiListassa.classList.add('testit-epäonnistunut');
|
||
epäonnistuneitaTestejä++;
|
||
continue;
|
||
}
|
||
|
||
testiTeksti.textContent = `${nimi}`;
|
||
}
|
||
|
||
// Päivitä otsikko – onnistuivatko testit?
|
||
if (epäonnistuneitaTestejä === 0) {
|
||
otsikko.textContent = 'Testit suoritettu onnistuneesti';
|
||
} else {
|
||
otsikko.textContent = `${epäonnistuneitaTestejä} epäonnistui`;
|
||
}
|
||
}
|