2023-08-02 17:12:15 +00:00
|
|
|
|
'use strict';
|
|
|
|
|
let testit = [];
|
|
|
|
|
|
|
|
|
|
function testi(nimi, funktio) {
|
|
|
|
|
testit.push([nimi, funktio]);
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-07 14:56:48 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-02 17:12:15 +00:00
|
|
|
|
function assertEq(konteksti, a, b) {
|
2023-08-07 14:56:48 +00:00
|
|
|
|
if (!ovatkoSama(a, b)) {
|
2023-08-02 17:12:15 +00:00
|
|
|
|
throw new Error(`${konteksti}: ${a}, pitäisi olla ${b}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function assertNe(konteksti, a, b) {
|
2023-08-07 14:56:48 +00:00
|
|
|
|
if (ovatkoSama(a, b)) {
|
2023-08-02 17:12:15 +00:00
|
|
|
|
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`;
|
|
|
|
|
}
|
|
|
|
|
}
|