Käytä joukkoja tuntien luokkien ja opettajien mallintamiseen

This commit is contained in:
Juhani Krekelä 2023-08-10 00:44:56 +03:00
parent f90d7bbab7
commit 11f74837ba
3 changed files with 72 additions and 52 deletions

View File

@ -268,8 +268,8 @@ function luoTuntiLista() {
for (let [_, tunti] of tunnit.järjestyksessä()) { for (let [_, tunti] of tunnit.järjestyksessä()) {
let tuntiListassa = document.createElement('li'); let tuntiListassa = document.createElement('li');
let nimi = tunti.nimi; let nimi = tunti.nimi;
let luokat = tunti.luokat.join(', '); let luokat = tunti.luokat.alkiot().join(', ');
let opettajat = tunti.opettajaLyhenteet.join(', '); let opettajat = tunti.opettajaLyhenteet.alkiot().join(', ');
let kertaaViikossa = tunti.kertaaViikossa; let kertaaViikossa = tunti.kertaaViikossa;
let teksti; let teksti;
if (kertaaViikossa === 1) { if (kertaaViikossa === 1) {

View File

@ -45,15 +45,13 @@ function suorita(tyyppi, ...argumentit) {
let [poistettuAste] = argumentit; let [poistettuAste] = argumentit;
luokkaAsteet.poista(poistettuAste); luokkaAsteet.poista(poistettuAste);
// Poista poistettujen luokka-asteiden luokat tunneista // Poista poistettujen luokka-asteiden luokat tunneista
for (let [id, tunti] of tunnit.tunnit) { for (let [_, tunti] of tunnit.tunnit) {
let luokat = []; for (let luokka of tunti.luokat.alkiot()) {
for (let luokka of tunti.luokat) {
let luokanAste = parseInt(luokka[0]); let luokanAste = parseInt(luokka[0]);
if (luokanAste !== poistettuAste) { if (luokanAste === poistettuAste) {
luokat.push(luokka); tunti.luokat.poista(luokka);
} }
} }
tunnit.tunnit.get(id).luokat = luokat;
} }
break; break;
case tapahtumaTyypit.muutaAste: case tapahtumaTyypit.muutaAste:
@ -61,18 +59,15 @@ function suorita(tyyppi, ...argumentit) {
let [vanhaAste, uusiAste] = argumentit; let [vanhaAste, uusiAste] = argumentit;
luokkaAsteet.muuta(vanhaAste, uusiAste); luokkaAsteet.muuta(vanhaAste, uusiAste);
// Muuta muutetut luokka-asteet tunneissa // Muuta muutetut luokka-asteet tunneissa
for (let [id, tunti] of tunnit.tunnit) { for (let [_, tunti] of tunnit.tunnit) {
let luokat = []; for (let luokka of tunti.luokat.alkiot()) {
for (let luokka of tunti.luokat) {
let luokanAste = parseInt(luokka[0]); let luokanAste = parseInt(luokka[0]);
if (luokanAste === vanhaAste) { if (luokanAste === vanhaAste) {
let luokanLuokka = luokka.slice(1); let uusiLuokka = `${uusiAste}${luokka.slice(1)}`;
luokat.push(`${uusiAste}${luokanLuokka}`); tunti.luokat.poista(luokka);
} else { tunti.luokat.lisää(uusiLuokka);
luokat.push(luokka);
} }
} }
tunnit.tunnit.get(id).luokat = luokat;
} }
break; break;
@ -85,14 +80,12 @@ function suorita(tyyppi, ...argumentit) {
let [aste] = argumentit; let [aste] = argumentit;
luokkaAsteet.asteet[aste].poista(); luokkaAsteet.asteet[aste].poista();
// Poista luokka jota ei enää ole asteella tunneista // Poista luokka jota ei enää ole asteella tunneista
for (let [id, tunti] of tunnit.tunnit) { for (let [_, tunti] of tunnit.tunnit) {
let luokat = []; for (let luokka of tunti.luokat.alkiot()) {
for (let luokka of tunti.luokat) { if (luokkaAsteet.luokat().indexOf(luokka) === -1) {
if (luokkaAsteet.luokat().indexOf(luokka) !== -1) { tunti.luokat.poista(luokka);
luokat.push(luokka);
} }
} }
tunnit.tunnit.get(id).luokat = luokat;
} }
break; break;
@ -105,14 +98,12 @@ function suorita(tyyppi, ...argumentit) {
let [poistettuOpettaja] = argumentit; let [poistettuOpettaja] = argumentit;
opettajat.poista(poistettuOpettaja); opettajat.poista(poistettuOpettaja);
// Poista opettaja joita ei enää ole tunneista // Poista opettaja joita ei enää ole tunneista
for (let [id, tunti] of tunnit.tunnit) { for (let [_, tunti] of tunnit.tunnit) {
let opettajaLyhenteet = []; for (let opettajaLyhenne of tunti.opettajaLyhenteet.alkiot()) {
for (let opettajaLyhenne of tunti.opettajaLyhenteet) { if (opettajaLyhenne === poistettuOpettaja) {
if (opettajaLyhenne !== poistettuOpettaja) { tunti.opettajaLyhenteet.poista(poistettuOpettaja);
opettajaLyhenteet.push(opettajaLyhenne);
} }
} }
tunnit.tunnit.get(id).opettajaLyhenteet = opettajaLyhenteet;
} }
break; break;
@ -300,24 +291,24 @@ testi('tuntien käsittely', () => {
assertEq('lisättyä pituus', tunnit.järjestyksessä().length, 3); assertEq('lisättyä pituus', tunnit.järjestyksessä().length, 3);
suorita(tapahtumaTyypit.poistaAste, 1); suorita(tapahtumaTyypit.poistaAste, 1);
assertEq('aste poistettua 0', tunnit.järjestyksessä()[0][1].luokat, ['5B']); assertEq('aste poistettua 0', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['5B']);
assertEq('aste poistettua 1', tunnit.järjestyksessä()[1][1].luokat, ['5A']); assertEq('aste poistettua 1', tunnit.järjestyksessä()[1][1].luokat.alkiot(), ['5A']);
assertEq('aste poistettua 2', tunnit.järjestyksessä()[2][1].luokat, []); assertEq('aste poistettua 2', tunnit.järjestyksessä()[2][1].luokat.alkiot(), []);
suorita(tapahtumaTyypit.muutaAste, 5, 6); suorita(tapahtumaTyypit.muutaAste, 5, 6);
assertEq('aste muutettua 0', tunnit.järjestyksessä()[0][1].luokat, ['6B']); assertEq('aste muutettua 0', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['6B']);
assertEq('aste muutettua 1', tunnit.järjestyksessä()[1][1].luokat, ['6A']); assertEq('aste muutettua 1', tunnit.järjestyksessä()[1][1].luokat.alkiot(), ['6A']);
assertEq('aste muutettua 2', tunnit.järjestyksessä()[2][1].luokat, []); assertEq('aste muutettua 2', tunnit.järjestyksessä()[2][1].luokat.alkiot(), []);
suorita(tapahtumaTyypit.poistaLuokka, 6); suorita(tapahtumaTyypit.poistaLuokka, 6);
assertEq('luokka poistettua 0', tunnit.järjestyksessä()[0][1].luokat, []); assertEq('luokka poistettua 0', tunnit.järjestyksessä()[0][1].luokat.alkiot(), []);
assertEq('luokka poistettua 1', tunnit.järjestyksessä()[1][1].luokat, ['6A']); assertEq('luokka poistettua 1', tunnit.järjestyksessä()[1][1].luokat.alkiot(), ['6A']);
assertEq('luokka poistettua 1', tunnit.järjestyksessä()[2][1].luokat, []); assertEq('luokka poistettua 1', tunnit.järjestyksessä()[2][1].luokat.alkiot(), []);
suorita(tapahtumaTyypit.poistaOpettaja, 'KV'); suorita(tapahtumaTyypit.poistaOpettaja, 'KV');
assertEq('opettaja poistettua 0', tunnit.järjestyksessä()[0][1].opettajaLyhenteet, []); assertEq('opettaja poistettua 0', tunnit.järjestyksessä()[0][1].opettajaLyhenteet.alkiot(), []);
assertEq('opettaja poistettua 1', tunnit.järjestyksessä()[1][1].opettajaLyhenteet, ['MM']); assertEq('opettaja poistettua 1', tunnit.järjestyksessä()[1][1].opettajaLyhenteet.alkiot(), ['MM']);
assertEq('opettaja poistettua 2', tunnit.järjestyksessä()[2][1].opettajaLyhenteet, ['AS']); assertEq('opettaja poistettua 2', tunnit.järjestyksessä()[2][1].opettajaLyhenteet.alkiot(), ['AS']);
suorita(tapahtumaTyypit.poistaTunti, 0); suorita(tapahtumaTyypit.poistaTunti, 0);
assertEq('poistettua pituus', tunnit.järjestyksessä().length, 2); assertEq('poistettua pituus', tunnit.järjestyksessä().length, 2);

View File

@ -112,8 +112,8 @@ class Opettajat {
class Tunti { class Tunti {
constructor(nimi, luokat, opettajaLyhenteet, kertaaViikossa) { constructor(nimi, luokat, opettajaLyhenteet, kertaaViikossa) {
this.nimi = nimi; this.nimi = nimi;
this.luokat = luokat; this.luokat = new Joukko(luokat);
this.opettajaLyhenteet = opettajaLyhenteet; this.opettajaLyhenteet = new Joukko(opettajaLyhenteet);
this.kertaaViikossa = kertaaViikossa; this.kertaaViikossa = kertaaViikossa;
} }
} }
@ -146,11 +146,11 @@ class Tunnit {
let tulos = vertaa(a[1].nimi, b[1].nimi); let tulos = vertaa(a[1].nimi, b[1].nimi);
// TODO: Korjaa niin, että osaa verrata okein listoja // TODO: Korjaa niin, että osaa verrata okein listoja
if (tulos === 0) { if (tulos === 0) {
tulos = vertaa(a[1].luokat, b[1].luokat); tulos = vertaa(a[1].luokat.alkiot(), b[1].luokat.alkiot());
} }
// TODO: Korjaa niin, että osaa verrata okein listoja // TODO: Korjaa niin, että osaa verrata okein listoja
if (tulos === 0) { if (tulos === 0) {
tulos = vertaa(a[1].opettajaLyhenteet, b[1].opettajaLyhenteet); tulos = vertaa(a[1].opettajaLyhenteet.alkiot(), b[1].opettajaLyhenteet.alkiot());
} }
if (tulos === 0) { if (tulos === 0) {
tulos = vertaa(a[1].kertaaViikossa, b[1].kertaaViikossa); tulos = vertaa(a[1].kertaaViikossa, b[1].kertaaViikossa);
@ -164,6 +164,35 @@ class Tunnit {
} }
} }
class Joukko {
#alkiot = new Map();
constructor(alkiot) {
if (alkiot !== undefined) {
for (let alkio of alkiot) {
this.#alkiot.set(alkio, true);
}
}
}
alkiot() {
let alkiot = [];
for (let [alkio, _] of this.#alkiot) {
alkiot.push(alkio);
}
alkiot.sort();
return alkiot;
}
lisää(alkio) {
this.#alkiot.set(alkio, true);
}
poista(alkio) {
this.#alkiot.delete(alkio);
}
}
function vertaa(a, b) { function vertaa(a, b) {
if (a < b) { if (a < b) {
return -1; return -1;
@ -299,12 +328,12 @@ testi('tuntien lisääminen', () => {
assertEq('historia', tunnit.lisää('Historia', '5B', 'KV', 1), 0); assertEq('historia', tunnit.lisää('Historia', '5B', 'KV', 1), 0);
assertEq('äidinkieli', tunnit.lisää('Äidinkieli', '1A', 'AS', 3), 1); assertEq('äidinkieli', tunnit.lisää('Äidinkieli', '1A', 'AS', 3), 1);
assertEq('historia nimi', tunnit.tunnit.get(0).nimi, 'Historia'); assertEq('historia nimi', tunnit.tunnit.get(0).nimi, 'Historia');
assertEq('historia luokat', tunnit.tunnit.get(0).luokat, ['5B']); assertEq('historia luokat', tunnit.tunnit.get(0).luokat.alkiot(), ['5B']);
assertEq('historia opettajat', tunnit.tunnit.get(0).opettajaLyhenteet, ['KV']); assertEq('historia opettajat', tunnit.tunnit.get(0).opettajaLyhenteet.alkiot(), ['KV']);
assertEq('historia viikossa', tunnit.tunnit.get(0).kertaaViikossa, 1); assertEq('historia viikossa', tunnit.tunnit.get(0).kertaaViikossa, 1);
assertEq('äidinkieli nimi', tunnit.tunnit.get(1).nimi, 'Äidinkieli'); assertEq('äidinkieli nimi', tunnit.tunnit.get(1).nimi, 'Äidinkieli');
assertEq('äidinkieli luokat', tunnit.tunnit.get(1).luokat, ['1A']); assertEq('äidinkieli luokat', tunnit.tunnit.get(1).luokat.alkiot(), ['1A']);
assertEq('äidinkieli opettajat', tunnit.tunnit.get(1).opettajaLyhenteet, ['AS']); assertEq('äidinkieli opettajat', tunnit.tunnit.get(1).opettajaLyhenteet.alkiot(), ['AS']);
assertEq('äidinkieli viikossa', tunnit.tunnit.get(1).kertaaViikossa, 3); assertEq('äidinkieli viikossa', tunnit.tunnit.get(1).kertaaViikossa, 3);
}); });
@ -326,10 +355,10 @@ testi('tuntien järjestys', () => {
tunnit.lisää('Äidinkieli', '1B', 'AS', 3); tunnit.lisää('Äidinkieli', '1B', 'AS', 3);
assertEq('aluksi', tunnit.järjestyksessä()[0][1].nimi, 'Historia'); assertEq('aluksi', tunnit.järjestyksessä()[0][1].nimi, 'Historia');
tunnit.tunnit.get(1).nimi = 'Historia'; tunnit.tunnit.get(1).nimi = 'Historia';
assertEq('sama nimi', tunnit.järjestyksessä()[0][1].luokat, ['1B']); assertEq('sama nimi', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['1B']);
tunnit.tunnit.get(0).luokat = ['1B']; tunnit.tunnit.get(0).luokat = new Joukko(['1B']);
assertEq('sama luokka', tunnit.järjestyksessä()[0][1].opettajaLyhenteet, ['AS']); assertEq('sama luokka', tunnit.järjestyksessä()[0][1].opettajaLyhenteet.alkiot(), ['AS']);
tunnit.tunnit.get(0).opettajaLyhenteet = ['AS']; tunnit.tunnit.get(0).opettajaLyhenteet = new Joukko(['AS']);
assertEq('sama opettaja', tunnit.järjestyksessä()[0][1].kertaaViikossa, 1); assertEq('sama opettaja', tunnit.järjestyksessä()[0][1].kertaaViikossa, 1);
tunnit.tunnit.get(1).kertaaViikossa = 1; tunnit.tunnit.get(1).kertaaViikossa = 1;
assertEq('yhtä monta kertaa viikossa', tunnit.järjestyksessä()[0][0], 0); assertEq('yhtä monta kertaa viikossa', tunnit.järjestyksessä()[0][0], 0);