'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`; } }