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ä()) {
let tuntiListassa = document.createElement('li');
let nimi = tunti.nimi;
let luokat = tunti.luokat.join(', ');
let opettajat = tunti.opettajaLyhenteet.join(', ');
let luokat = tunti.luokat.alkiot().join(', ');
let opettajat = tunti.opettajaLyhenteet.alkiot().join(', ');
let kertaaViikossa = tunti.kertaaViikossa;
let teksti;
if (kertaaViikossa === 1) {

View File

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

View File

@ -112,8 +112,8 @@ class Opettajat {
class Tunti {
constructor(nimi, luokat, opettajaLyhenteet, kertaaViikossa) {
this.nimi = nimi;
this.luokat = luokat;
this.opettajaLyhenteet = opettajaLyhenteet;
this.luokat = new Joukko(luokat);
this.opettajaLyhenteet = new Joukko(opettajaLyhenteet);
this.kertaaViikossa = kertaaViikossa;
}
}
@ -146,11 +146,11 @@ class Tunnit {
let tulos = vertaa(a[1].nimi, b[1].nimi);
// TODO: Korjaa niin, että osaa verrata okein listoja
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
if (tulos === 0) {
tulos = vertaa(a[1].opettajaLyhenteet, b[1].opettajaLyhenteet);
tulos = vertaa(a[1].opettajaLyhenteet.alkiot(), b[1].opettajaLyhenteet.alkiot());
}
if (tulos === 0) {
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) {
if (a < b) {
return -1;
@ -299,12 +328,12 @@ testi('tuntien lisääminen', () => {
assertEq('historia', tunnit.lisää('Historia', '5B', 'KV', 1), 0);
assertEq('äidinkieli', tunnit.lisää('Äidinkieli', '1A', 'AS', 3), 1);
assertEq('historia nimi', tunnit.tunnit.get(0).nimi, 'Historia');
assertEq('historia luokat', tunnit.tunnit.get(0).luokat, ['5B']);
assertEq('historia opettajat', tunnit.tunnit.get(0).opettajaLyhenteet, ['KV']);
assertEq('historia luokat', tunnit.tunnit.get(0).luokat.alkiot(), ['5B']);
assertEq('historia opettajat', tunnit.tunnit.get(0).opettajaLyhenteet.alkiot(), ['KV']);
assertEq('historia viikossa', tunnit.tunnit.get(0).kertaaViikossa, 1);
assertEq('äidinkieli nimi', tunnit.tunnit.get(1).nimi, 'Äidinkieli');
assertEq('äidinkieli luokat', tunnit.tunnit.get(1).luokat, ['1A']);
assertEq('äidinkieli opettajat', tunnit.tunnit.get(1).opettajaLyhenteet, ['AS']);
assertEq('äidinkieli luokat', tunnit.tunnit.get(1).luokat.alkiot(), ['1A']);
assertEq('äidinkieli opettajat', tunnit.tunnit.get(1).opettajaLyhenteet.alkiot(), ['AS']);
assertEq('äidinkieli viikossa', tunnit.tunnit.get(1).kertaaViikossa, 3);
});
@ -326,10 +355,10 @@ testi('tuntien järjestys', () => {
tunnit.lisää('Äidinkieli', '1B', 'AS', 3);
assertEq('aluksi', tunnit.järjestyksessä()[0][1].nimi, 'Historia');
tunnit.tunnit.get(1).nimi = 'Historia';
assertEq('sama nimi', tunnit.järjestyksessä()[0][1].luokat, ['1B']);
tunnit.tunnit.get(0).luokat = ['1B'];
assertEq('sama luokka', tunnit.järjestyksessä()[0][1].opettajaLyhenteet, ['AS']);
tunnit.tunnit.get(0).opettajaLyhenteet = ['AS'];
assertEq('sama nimi', tunnit.järjestyksessä()[0][1].luokat.alkiot(), ['1B']);
tunnit.tunnit.get(0).luokat = new Joukko(['1B']);
assertEq('sama luokka', tunnit.järjestyksessä()[0][1].opettajaLyhenteet.alkiot(), ['AS']);
tunnit.tunnit.get(0).opettajaLyhenteet = new Joukko(['AS']);
assertEq('sama opettaja', tunnit.järjestyksessä()[0][1].kertaaViikossa, 1);
tunnit.tunnit.get(1).kertaaViikossa = 1;
assertEq('yhtä monta kertaa viikossa', tunnit.järjestyksessä()[0][0], 0);