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