From a0c500edaefc37c8fbed6cb0e2eb5ae04c90a363 Mon Sep 17 00:00:00 2001 From: tornhale <hannes.lt.tornberg@student.jyu.fi> Date: Thu, 13 Mar 2025 19:45:11 +0200 Subject: [PATCH] H5 --- Kirjalista.jar | Bin 234742 -> 237685 bytes src/Kirjalista/Genre.java | 14 +++- src/Kirjalista/GenreRelaatio.java | 54 ++++++++++++--- src/Kirjalista/Genret.java | 40 ++++++++++- src/Kirjalista/Kirja.java | 30 ++++---- src/Kirjalista/Kirjasto.java | 1 - src/Kirjalista/Kirjat.java | 56 +++++++++++++-- src/Kirjalista/test/GenreRelaatioTest.java | 52 ++++++++++++-- src/Kirjalista/test/GenretTest.java | 46 +++++++++++++ src/Kirjalista/test/KirjanGenreTest.java | 17 ----- src/Kirjalista/test/KirjatTest.java | 76 +++++++++++++++++++++ 11 files changed, 330 insertions(+), 56 deletions(-) create mode 100644 src/Kirjalista/test/GenretTest.java delete mode 100644 src/Kirjalista/test/KirjanGenreTest.java create mode 100644 src/Kirjalista/test/KirjatTest.java diff --git a/Kirjalista.jar b/Kirjalista.jar index efec7402fef9b585d65eceb0e90b8d3e390fa6cd..97a7c33d1b7f8e0529149fc9b361a77dbc5c610a 100644 GIT binary patch delta 14181 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 W3bPj9E{0tUmn;|<defO17#INmK*YZQ delta 11281 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 diff --git a/src/Kirjalista/Genre.java b/src/Kirjalista/Genre.java index 6aaa9ab..998072d 100644 --- a/src/Kirjalista/Genre.java +++ b/src/Kirjalista/Genre.java @@ -71,8 +71,20 @@ public class Genre { this.nimi = esim[rand.nextInt(3)]; } + /** + * Luo olion testejä varten + * @return Genre satunnaisilla arvoilla + */ + public static Genre testiGenre() { + Genre g = new Genre(); + Random rand = new Random(); + g.nimi = g.esim[rand.nextInt(3)]; + g.rekisteroi(); + return g; + } /** + * Palauttaa genren nimen * @return Genren nimi */ public String getNimi() { @@ -80,7 +92,7 @@ public class Genre { } /** - * palauttaa genren id:n + * Palauttaa genren id:n * @return Genren id */ public int getId() { diff --git a/src/Kirjalista/GenreRelaatio.java b/src/Kirjalista/GenreRelaatio.java index 8a2ef37..7ef0c1d 100644 --- a/src/Kirjalista/GenreRelaatio.java +++ b/src/Kirjalista/GenreRelaatio.java @@ -28,17 +28,32 @@ public class GenreRelaatio { * esim. palauttaa kaikkien kirjojen id:t, joiden genre on fantasia * @param genreId Genren id, jonka perusteella haetaan kirjojen id:itä * @return Kaikkien niiden kirjojen id:t, joiden genren id on genreId - * TODO testit * <pre name="test"> + * #import java.util.ArrayList; * GenreRelaatio gr = new GenreRelaatio(); - * gr.lisaa(new KirjanGenre(1, 2)); - * int[] t = gr.haeKirjat(2); - * t[0] === 1; - * TODO lisää testejä + * Kirja k = Kirja.testiKirja(); + * Kirja k1 = Kirja.testiKirja(); + * Kirja k2 = Kirja.testiKirja(); + * Genre g = Genre.testiGenre(); + * Genre g2 = Genre.testiGenre(); + * + * gr.lisaa(new KirjanGenre(k, g)); + * gr.lisaa(new KirjanGenre(k1, g)); + * gr.lisaa(new KirjanGenre(k2, g)); + * gr.lisaa(new KirjanGenre(k, g2)); + * ArrayList<Integer> al = gr.haeKirjat(g.getId()); + * int i = al.get(0); + * int i1 = al.get(1); + * int i2 = al.get(2); + * i === k.getId(); + * i1 === k1.getId(); + * i2 === k2.getId(); + * al.size() === 3; + * </pre> */ public ArrayList<Integer> haeKirjat(int genreId) { - //if (alkiot.length() <= 0) throw new IndexOutOfBoundsException(); + ArrayList<Integer> kirjojenIdt = new ArrayList<Integer>(); alkiot.iter = alkiot.getEka(); @@ -46,7 +61,7 @@ public class GenreRelaatio { for (int i = 0; i < alkiot.length(); i++) { KirjanGenre alkio = alkiot.iter.getSisalto(); if (alkio.getGenreId() == genreId) { - kirjojenIdt.add(alkio.getGenreId()); + kirjojenIdt.add(alkio.getKirjaId()); } alkiot.iter = alkiot.iter.getNext(); } @@ -60,10 +75,31 @@ public class GenreRelaatio { * eli toisin sanoen palauttaa tietyn kirjan kaikkien genrejen id:t * @param kirjaId Kirjan id, jonka perusteella haetaan genrejen id:itä * @return Kaikkien niiden genrejen id:t, joiden kirjan id on kirjaId - * TODO testit + * <pre name="test"> + * GenreRelaatio gr = new GenreRelaatio(); + * Kirja k = Kirja.testiKirja(); + * Kirja k2 = Kirja.testiKirja(); + * Genre g = Genre.testiGenre(); + * Genre g1 = Genre.testiGenre(); + * Genre g2 = Genre.testiGenre(); + * + * gr.lisaa(new KirjanGenre(k, g2)); + * gr.lisaa(new KirjanGenre(k, g)); + * gr.lisaa(new KirjanGenre(k, g1)); + * gr.lisaa(new KirjanGenre(k2, g)); + * ArrayList<Integer> al = gr.haeGenret(k.getId()); + * int i = al.get(0); + * int i1 = al.get(1); + * int i2 = al.get(2); + * i === g2.getId(); + * i1 === g.getId(); + * i2 === g1.getId(); + * + * al.size() === 3; + * </pre> */ public ArrayList<Integer> haeGenret(int kirjaId) { - //if (alkiot.length() <= 0) throw new IndexOutOfBoundsException(); ??? tämä ei mahdollista + ArrayList<Integer> genrejenIdt = new ArrayList<Integer>(); alkiot.iter = alkiot.getEka(); diff --git a/src/Kirjalista/Genret.java b/src/Kirjalista/Genret.java index c852475..5ffdcd4 100644 --- a/src/Kirjalista/Genret.java +++ b/src/Kirjalista/Genret.java @@ -9,6 +9,34 @@ import java.util.NoSuchElementException; * - Lisää ja poistaa kirjoja * - Lukee ja kirjoittaa tiedostoon * - Etsii ja lajittelee + * <pre name="test"> + * #import java.util.NoSuchElementException; + * Genret g = new Genret(); + * Genre g1 = Genre.testiGenre(); + * Genre g2 = Genre.testiGenre(); + * Genre g3 = Genre.testiGenre(); + * + * g.lisaa(g1); + * g.lisaa(g2); + * g.lisaa(g3); + * + * Genre g4 = new Genre(); + * g4.parse(g1.toString()); + * + * g.onOlemassa(g4.getNimi()) === true; + * + * g.haeIdNimella(g1.getNimi()) === g1.getId(); + * g.haeIdNimella(g2.getNimi()) === g2.getId(); + * g.haeIdNimella(g3.getNimi()) === g3.getId(); + * + * g.hae(g1.getId()).toString() === g1.getNimi(); + * g.hae(g2.getId()).toString() === g2.getNimi(); + * g.hae(g3.getId()).toString() === g3.getNimi(); + * + * int g1Id = g1.getId(); + * g.poista(g1Id); + * g.hae(g1Id); #THROWS NoSuchElementException + * </pre> */ public class Genret { private ArrayList<Genre> alkiot = new ArrayList<Genre>(); @@ -28,9 +56,14 @@ public class Genret { } - private int haeIdNimella(String nimi) { + /** + * Hakee genren id:n nimen perusteella + * @param nimi Nimi, jonka perusteella id haetaan + * @return Genren id, -1 jos ei löydy + */ + public int haeIdNimella(String nimi) { for (int i = 0; i < alkiot.size(); i++) { - if (alkiot.get(i).getNimi() == nimi) return alkiot.get(i).getId(); + if (alkiot.get(i).getNimi().toLowerCase().contentEquals(nimi.toLowerCase())) return alkiot.get(i).getId(); } return -1; } @@ -59,8 +92,9 @@ public class Genret { */ public boolean onOlemassa(String nimi) { for (int i = 0; i < alkiot.size(); i++) { - if (alkiot.get(i).getNimi() == nimi) { + if (alkiot.get(i).getNimi().toLowerCase().contentEquals(nimi.toLowerCase())) { return true; + } } return false; diff --git a/src/Kirjalista/Kirja.java b/src/Kirjalista/Kirja.java index 4028e94..91036ac 100644 --- a/src/Kirjalista/Kirja.java +++ b/src/Kirjalista/Kirja.java @@ -83,6 +83,21 @@ public class Kirja { } + /** + * Apumetodi, jolla saadaan luotua kirjaolio testejä varten + * @return Kirja satunnaisilla arvoilla + */ + public static Kirja testiKirja() { + Kirja k = new Kirja(); + k.rekisteroi(); + Random rand = new Random(); + k.nimi = "Hobitti" + rand.nextInt(10); + k.kirjoittaja = "J.R.R. Tolkien"; + k.kirjasarja = ""; + k.sivumaara = rand.nextInt(1000); + return k; + } + /** * @return palauttaa kirjan id:n */ @@ -107,18 +122,5 @@ public class Kirja { } - /** - * Testausta varten - * @param args ei käytössä - */ - public static void main(String[] args) { - Kirja k = new Kirja(); - k.rekisteroi(); - k.esimerkkiKirja(); - k.tulosta(System.out); - Kirja k1 = new Kirja(); - k1.rekisteroi(); - k1.esimerkkiKirja(); - k1.tulosta(System.out); - } + } diff --git a/src/Kirjalista/Kirjasto.java b/src/Kirjalista/Kirjasto.java index aaca495..a523cbf 100644 --- a/src/Kirjalista/Kirjasto.java +++ b/src/Kirjalista/Kirjasto.java @@ -44,7 +44,6 @@ public class Kirjasto { } } - // TODO haku ja poisto genreRelaatioille ??? /** * @param idnro Haettavan kirjan id diff --git a/src/Kirjalista/Kirjat.java b/src/Kirjalista/Kirjat.java index 8f56955..460ee48 100644 --- a/src/Kirjalista/Kirjat.java +++ b/src/Kirjalista/Kirjat.java @@ -8,6 +8,38 @@ import java.util.NoSuchElementException; * - Lisää ja poistaa kirjoja * - Lukee ja kirjoittaa tiedostoon (sitten joskus) * - Etsii ja lajittelee (sitten joskus) + * <pre name="test"> + * #import java.util.NoSuchElementException; + * #THROWS NoSuchElementException + * Kirjat kirjat = new Kirjat(); + * + * Kirja k1 = new Kirja(); + * Kirja k2 = new Kirja(); + * Kirja k3 = new Kirja(); + * k1.parse("Hobitti1 |J.R.R. Tolkien||336"); + * k2.parse("Hobitti2 |J.R.R. Tolkien||336"); + * k3.parse("Hobitti3 |J.R.R. Tolkien||336"); + * + * + * try { + * kirjat.lisaa(k1); + * kirjat.lisaa(k2); + * kirjat.lisaa(k3); + * } catch (SailoException e) { + * e.printStackTrace(); + * } + * + * + * kirjat.hae(k1.getId()).getNimi() === "Hobitti1"; + * kirjat.hae(k3.getId()).getNimi() === "Hobitti3"; + * kirjat.hae(0); #THROWS NoSuchElementException + * kirjat.hae(5); #THROWS NoSuchElementException + * + * int k2Id = k2.getId(); + * kirjat.poista(k2Id); + * kirjat.hae(k2Id); #THROWS NoSuchElementException + * + * </pre> */ public class Kirjat { private int maxLkm = 8; @@ -18,6 +50,22 @@ public class Kirjat { /** * @param kirja Lisättävä kirja * @throws SailoException Heittää, jos lisääminen ei onnistu + * <pre name="test"> + * Kirja kirja = new Kirja(); + * Kirjat kirjat = new Kirjat(); + * try { + * for (int i = 0; i < 8; i++) { + * kirjat.lisaa(kirja); + * kirjat.getLkm() === i + 1; + * } + * kirjat.getLkm() === 8; + * } catch (SailoException e) { + * System.out.println("Comtest heittaa virheita, jos ei ole trycatchia"); + * } + * kirjat.lisaa(kirja); #THROWS SailoException + * + * + * </pre> */ public void lisaa(Kirja kirja) throws SailoException { if (this.lkm >= this.alkiot.length) throw new SailoException("Liikaa alkioita"); @@ -31,7 +79,6 @@ public class Kirjat { * Poistaa kirjan annetulla id:llä * @param id Poistettavan kirjan id * @throws NoSuchElementException Jos id:tä vastaavaa kirjaa ei löydy - * TODO testit */ public void poista(int id) throws NoSuchElementException { for (int i = 0; i < alkiot.length; i++) { @@ -39,7 +86,7 @@ public class Kirjat { for (int j = i; j < alkiot.length - 1; j++) { alkiot[j] = alkiot[j + 1]; } - alkiot[alkiot.length] = null; + alkiot[alkiot.length - 1] = null; this.lkm--; return; } @@ -51,12 +98,11 @@ public class Kirjat { * Hakee kirjan id:n perusteella * @param id Halutun kirjan id * @return Viite kirjaan halutulla id:llä - * @throws NoSuchElementException - * TODO testit + * @throws NoSuchElementException Jos Id:tä vastaavaa kirjaa ei löydy */ public Kirja hae(int id) throws NoSuchElementException { - for (int i = 0; i < alkiot.length; i++) { + for (int i = 0; i < this.lkm; i++) { if (alkiot[i].getId() == id) return alkiot[i]; } diff --git a/src/Kirjalista/test/GenreRelaatioTest.java b/src/Kirjalista/test/GenreRelaatioTest.java index e0049be..439fae5 100644 --- a/src/Kirjalista/test/GenreRelaatioTest.java +++ b/src/Kirjalista/test/GenreRelaatioTest.java @@ -1,5 +1,6 @@ package Kirjalista.test; // Generated by ComTest BEGIN +import java.util.ArrayList; import static org.junit.Assert.*; import org.junit.*; import Kirjalista.*; @@ -8,7 +9,7 @@ import tietorakenne.LinkattuLista; /** * Test class made by ComTest - * @version 2025.03.05 22:52:50 // Generated by ComTest + * @version 2025.03.13 19:08:29 // Generated by ComTest * */ @SuppressWarnings({ "all" }) @@ -17,12 +18,51 @@ public class GenreRelaatioTest { // Generated by ComTest BEGIN - /** testHaeKirjat33 */ + /** testHaeKirjat31 */ @Test - public void testHaeKirjat33() { // GenreRelaatio: 33 + public void testHaeKirjat31() { // GenreRelaatio: 31 GenreRelaatio gr = new GenreRelaatio(); - gr.lisaa(new KirjanGenre(1, 2)); - int[] t = gr.haeKirjat(2); - assertEquals("From: GenreRelaatio line: 37", 1, t[0]); + Kirja k = Kirja.testiKirja(); + Kirja k1 = Kirja.testiKirja(); + Kirja k2 = Kirja.testiKirja(); + Genre g = Genre.testiGenre(); + Genre g2 = Genre.testiGenre(); + gr.lisaa(new KirjanGenre(k, g)); + gr.lisaa(new KirjanGenre(k1, g)); + gr.lisaa(new KirjanGenre(k2, g)); + gr.lisaa(new KirjanGenre(k, g2)); + ArrayList<Integer> al = gr.haeKirjat(g.getId()); + int i = al.get(0); + int i1 = al.get(1); + int i2 = al.get(2); + assertEquals("From: GenreRelaatio line: 48", k.getId(), i); + assertEquals("From: GenreRelaatio line: 49", k1.getId(), i1); + assertEquals("From: GenreRelaatio line: 50", k2.getId(), i2); + assertEquals("From: GenreRelaatio line: 51", 3, al.size()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testHaeGenret78 */ + @Test + public void testHaeGenret78() { // GenreRelaatio: 78 + GenreRelaatio gr = new GenreRelaatio(); + Kirja k = Kirja.testiKirja(); + Kirja k2 = Kirja.testiKirja(); + Genre g = Genre.testiGenre(); + Genre g1 = Genre.testiGenre(); + Genre g2 = Genre.testiGenre(); + gr.lisaa(new KirjanGenre(k, g2)); + gr.lisaa(new KirjanGenre(k, g)); + gr.lisaa(new KirjanGenre(k, g1)); + gr.lisaa(new KirjanGenre(k2, g)); + ArrayList<Integer> al = gr.haeGenret(k.getId()); + int i = al.get(0); + int i1 = al.get(1); + int i2 = al.get(2); + assertEquals("From: GenreRelaatio line: 94", g2.getId(), i); + assertEquals("From: GenreRelaatio line: 95", g.getId(), i1); + assertEquals("From: GenreRelaatio line: 96", g1.getId(), i2); + assertEquals("From: GenreRelaatio line: 98", 3, al.size()); } // Generated by ComTest END } \ No newline at end of file diff --git a/src/Kirjalista/test/GenretTest.java b/src/Kirjalista/test/GenretTest.java new file mode 100644 index 0000000..b27b7e8 --- /dev/null +++ b/src/Kirjalista/test/GenretTest.java @@ -0,0 +1,46 @@ +package Kirjalista.test; +// Generated by ComTest BEGIN +import java.util.NoSuchElementException; +import static org.junit.Assert.*; +import org.junit.*; +import Kirjalista.*; +// Generated by ComTest END + +/** + * Test class made by ComTest + * @version 2025.03.13 19:30:50 // Generated by ComTest + * + */ +@SuppressWarnings({ "all" }) +public class GenretTest { + + + + // Generated by ComTest BEGIN + /** testGenret12 */ + @Test + public void testGenret12() { // Genret: 12 + Genret g = new Genret(); + Genre g1 = Genre.testiGenre(); + Genre g2 = Genre.testiGenre(); + Genre g3 = Genre.testiGenre(); + g.lisaa(g1); + g.lisaa(g2); + g.lisaa(g3); + Genre g4 = new Genre(); + g4.parse(g1.toString()); + assertEquals("From: Genret line: 26", true, g.onOlemassa(g4.getNimi())); + assertEquals("From: Genret line: 28", g1.getId(), g.haeIdNimella(g1.getNimi())); + assertEquals("From: Genret line: 29", g2.getId(), g.haeIdNimella(g2.getNimi())); + assertEquals("From: Genret line: 30", g3.getId(), g.haeIdNimella(g3.getNimi())); + assertEquals("From: Genret line: 32", g1.getNimi(), g.hae(g1.getId()).toString()); + assertEquals("From: Genret line: 33", g2.getNimi(), g.hae(g2.getId()).toString()); + assertEquals("From: Genret line: 34", g3.getNimi(), g.hae(g3.getId()).toString()); + int g1Id = g1.getId(); + g.poista(g1Id); + try { + g.hae(g1Id); + fail("Genret: 38 Did not throw NoSuchElementException"); + } catch(NoSuchElementException _e_){ _e_.getMessage(); } + } // Generated by ComTest END +} \ No newline at end of file diff --git a/src/Kirjalista/test/KirjanGenreTest.java b/src/Kirjalista/test/KirjanGenreTest.java deleted file mode 100644 index 67e68bc..0000000 --- a/src/Kirjalista/test/KirjanGenreTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package Kirjalista.test; -// Generated by ComTest BEGIN -import static org.junit.Assert.*; -import org.junit.*; -import Kirjalista.*; -// Generated by ComTest END - * @version 2025.03.10 18:15:06 // Generated by ComTest -package Kirjalista.test; - -/** - * Test class made by ComTest - * @version 2025.03.10 18:15:06 // Generated by ComTest - * - */ -@SuppressWarnings({ "all" }) -public class KirjanGenreTest { -} \ No newline at end of file diff --git a/src/Kirjalista/test/KirjatTest.java b/src/Kirjalista/test/KirjatTest.java new file mode 100644 index 0000000..02e1f5c --- /dev/null +++ b/src/Kirjalista/test/KirjatTest.java @@ -0,0 +1,76 @@ +package Kirjalista.test; +// Generated by ComTest BEGIN +import java.util.NoSuchElementException; +import static org.junit.Assert.*; +import org.junit.*; +import Kirjalista.*; +// Generated by ComTest END + +/** + * Test class made by ComTest + * @version 2025.03.13 19:42:50 // Generated by ComTest + * + */ +@SuppressWarnings({ "all" }) +public class KirjatTest { + + + + // Generated by ComTest BEGIN + /** testKirjat11 */ + @Test + public void testKirjat11() { // Kirjat: 11 + Kirjat kirjat = new Kirjat(); + Kirja k1 = new Kirja(); + Kirja k2 = new Kirja(); + Kirja k3 = new Kirja(); + k1.parse("Hobitti1 |J.R.R. Tolkien||336"); + k2.parse("Hobitti2 |J.R.R. Tolkien||336"); + k3.parse("Hobitti3 |J.R.R. Tolkien||336"); + try { + kirjat.lisaa(k1); + kirjat.lisaa(k2); + kirjat.lisaa(k3); + } catch (SailoException e) { + e.printStackTrace(); + } + assertEquals("From: Kirjat line: 33", "Hobitti1", kirjat.hae(k1.getId()).getNimi()); + assertEquals("From: Kirjat line: 34", "Hobitti3", kirjat.hae(k3.getId()).getNimi()); + try { + kirjat.hae(0); + fail("Kirjat: 35 Did not throw NoSuchElementException"); + } catch(NoSuchElementException _e_){ _e_.getMessage(); } + try { + kirjat.hae(5); + fail("Kirjat: 36 Did not throw NoSuchElementException"); + } catch(NoSuchElementException _e_){ _e_.getMessage(); } + int k2Id = k2.getId(); + kirjat.poista(k2Id); + try { + kirjat.hae(k2Id); + fail("Kirjat: 40 Did not throw NoSuchElementException"); + } catch(NoSuchElementException _e_){ _e_.getMessage(); } + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testLisaa53 */ + @Test + public void testLisaa53() { // Kirjat: 53 + Kirja kirja = new Kirja(); + Kirjat kirjat = new Kirjat(); + try { + for (int i = 0; i < 8; i++) { + kirjat.lisaa(kirja); + assertEquals("From: Kirjat line: 59", i + 1, kirjat.getLkm()); + } + assertEquals("From: Kirjat line: 61", 8, kirjat.getLkm()); + } catch (SailoException e) { + System.out.println("Comtest heittaa virheita, jos ei ole trycatchia"); + } + try { + kirjat.lisaa(kirja); + fail("Kirjat: 65 Did not throw SailoException"); + } catch(SailoException _e_){ _e_.getMessage(); } + } // Generated by ComTest END +} \ No newline at end of file -- GitLab