From 95d095d0938e2da8399dfec970b6391f0a3b8225 Mon Sep 17 00:00:00 2001
From: Veritorakka <eemeli302@gmail.com>
Date: Wed, 3 May 2023 22:09:30 +0300
Subject: [PATCH] Luokkainvarianttien tekeminen

---
 .../fi/utu/tech/ooj/exercise2/Asiakas.java     |  4 ++++
 .../tech/ooj/exercise2/Asiakasrekisteri.java   |  4 ++++
 .../java/fi/utu/tech/ooj/exercise2/Lasku.java  |  5 +++++
 .../fi/utu/tech/ooj/exercise2/Laskurivi.java   | 18 ++++++++++++++++++
 .../java/fi/utu/tech/ooj/exercise2/Tuote.java  |  3 +++
 .../utu/tech/ooj/exercise2/Tuoteluettelo.java  |  4 ++++
 6 files changed, 38 insertions(+)

diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java
index f3d1489..1c9ab89 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java
@@ -1,6 +1,10 @@
 package fi.utu.tech.ooj.exercise2;
 /**
  * Asiakas-luokka sisältää tiedot yksittäisestä asiakkaasta.
+ * Luokkainvariantti:
+ * Asiakkaan nimi ei saa olla null eikä tyhjä merkkijono. Katuosoitteen, postinumeron, postitoimipaikan ja puhelinnumeron tulee olla ei-null merkkijonoja, joiden pituus on vähintään yksi merkki. 
+ * Postinumeron tulee olla viiden numeron mittainen merkkijono.
+ * Puhelinnumeron tulee sisältää vain numeroita, välilyöntejä, plus-merkkejä ja/tai miinusmerkkejä.
  */
 public class Asiakas {
     private String nimi;
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java
index 179ce70..3c0987a 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java
@@ -6,6 +6,10 @@ import java.util.ArrayList;
  * Asiakasrekisteri-luokka ylläpitää listaa kaikista asiakkaista.
  * Se mahdollistaa uusien asiakkaiden lisäämisen rekisteriin sekä
  * olemassa olevien asiakkaiden hakemisen ja poistamisen rekisteristä.
+ * Luokkainvariantti:
+ * Asiakasrekisteriin ei voi lisätä kahta samannimistä asiakasta. 
+ * Tämä tarkoittaa sitä, että jos lisättävä asiakas löytyy jo rekisteristä samalla nimellä, sitä ei voida lisätä uudelleen.
+ * Tämä invariantti varmistaa sen, että rekisteriin ei tule duplikaattiasiakkaita.
  */
 public class Asiakasrekisteri {
     private ArrayList<Asiakas> asiakkaat;
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java b/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java
index 708c09c..e2a1019 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Lasku.java
@@ -2,6 +2,11 @@ package fi.utu.tech.ooj.exercise2;
 
 import java.util.ArrayList;
 
+/*
+ * Luokkainvariantti: 
+ * Jokaisen laskurivin määrän tulee olla vähintään yksi (1) ja tuotekohtaisen alennuksen tulee olla välillä 0.0 ja 100.0 (sisältäen reunat). 
+ * Lisäksi jokaisella laskurivillä tulee olla olemassa oleva Tuote-olio.
+ */
 public class Lasku {
     private Asiakas asiakas;
     private ArrayList<Laskurivi> rivit;
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java b/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java
index 40b2688..229f8fb 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Laskurivi.java
@@ -2,6 +2,11 @@ package fi.utu.tech.ooj.exercise2;
 
 /**
  * Luokka kuvaa yksittäistä riviä laskussa.
+ * Luokkainvariantti:
+ * Laskurivin määrän tulee olla vähintään 1.
+ * Laskurivin tuotteen tulee olla voimassa (eli ei-null).
+ * Laskurivin tuotteen hinnan tulee olla ei-negatiivinen.
+ * Laskurivin tuotekohtaisen alennuksen tulee olla ei-negatiivinen ja enintään 100.
  */
 public class Laskurivi {
     private Tuote tuote;
@@ -14,8 +19,21 @@ public class Laskurivi {
      * @param tuote Laskurivin tuote.
      * @param maara Laskurivin tuotteiden määrä.
      * @param alennus Laskurivin tuotekohtainen alennus.
+     * @throws IllegalArgumentException jos invariantti ei toteudu
      */
     public Laskurivi(Tuote tuote, int maara, double alennus) {
+        if (maara < 1) {
+            throw new IllegalArgumentException("Laskurivin määrän tulee olla vähintään 1.");
+        }
+        if (tuote == null) {
+            throw new IllegalArgumentException("Laskurivin tuote ei voi olla null.");
+        }
+        if (tuote.getHintaAlv() < 0) {
+            throw new IllegalArgumentException("Laskurivin tuotteen hinta ei voi olla negatiivinen.");
+        }
+        if (alennus < 0 || alennus > 100) {
+            throw new IllegalArgumentException("Laskurivin tuotekohtaisen alennuksen tulee olla ei-negatiivinen ja enintään 100.");
+        }
         this.tuote = tuote;
         this.maara = maara;
         this.alennus = alennus;
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java b/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java
index 470ad55..f2757d2 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Tuote.java
@@ -3,6 +3,9 @@ package fi.utu.tech.ooj.exercise2;
 /**
  * Tuote-luokka kuvaa Oy Jekku Ab:n myymää tuotetta.
  * Luokka sisältää tuotteen nimen, normaalihinnan ja ALV-prosentin.
+ * Luokkainvariantti:
+ * Normaalihinta ja ALV-prosentti määrittelevät yhdessä tuotteen kokonaishinnan.
+ * Kokonaishinta ei voi olla negatiivinen.
  */
 public class Tuote {
     private String nimi;
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java b/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java
index 8c70982..3e178a3 100644
--- a/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Tuoteluettelo.java
@@ -2,6 +2,10 @@ package fi.utu.tech.ooj.exercise2;
 
 import java.util.ArrayList;
 
+/*
+ * Luokkainvariantti:
+ * Tuotteiden lukumäärä ei voi olla negatiivinen.
+ */
 public class Tuoteluettelo {
     private ArrayList<Tuote> tuotteet;
 
-- 
GitLab