From 2a98b78233489e5d8395a8a638a777b83b2cb503 Mon Sep 17 00:00:00 2001 From: JohanH Date: Tue, 27 Jan 2026 10:06:56 +0100 Subject: [PATCH 01/17] update --- src/main/java/org/example/Calculator.java | 8 +++++++- src/test/java/org/example/CalculatorTest.java | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/example/Calculator.java b/src/main/java/org/example/Calculator.java index 0a31456..627d5a1 100644 --- a/src/main/java/org/example/Calculator.java +++ b/src/main/java/org/example/Calculator.java @@ -14,9 +14,11 @@ public static int add(int a, int b){ } - public static int add(int a, int b,int c){ + public static int add(int a, int b,int c) + { return a + b + c; } + public static int add(int... numbers){ int sum = 0; for(int number : numbers){ @@ -37,4 +39,8 @@ public static int divide(int a, int b) { return a / b; } + public static float divide(float a, float b) { + return a / b; + } + } diff --git a/src/test/java/org/example/CalculatorTest.java b/src/test/java/org/example/CalculatorTest.java index 0d96bb5..4f948ed 100644 --- a/src/test/java/org/example/CalculatorTest.java +++ b/src/test/java/org/example/CalculatorTest.java @@ -34,4 +34,5 @@ public void subtractNumbers() { } + } \ No newline at end of file From f1e43b6627264f10d8e4621dd272c07032b72ea2 Mon Sep 17 00:00:00 2001 From: JohanH Date: Tue, 27 Jan 2026 13:34:21 +0100 Subject: [PATCH 02/17] Update, addade Bowling.java och BowlingTest --- functional-requirements.md | 2 ++ opencode.json | 16 +++++++++++ src/main/java/org/example/Bowling.java | 14 +++++++++ src/test/java/org/example/BowlingTest.java | 33 ++++++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 functional-requirements.md create mode 100644 opencode.json create mode 100644 src/main/java/org/example/Bowling.java create mode 100644 src/test/java/org/example/BowlingTest.java diff --git a/functional-requirements.md b/functional-requirements.md new file mode 100644 index 0000000..1527669 --- /dev/null +++ b/functional-requirements.md @@ -0,0 +1,2 @@ +FR1: Systemet ska kunna dividera två tal +FR2: Systemet ska kunna hantera division med 0 \ No newline at end of file diff --git a/opencode.json b/opencode.json new file mode 100644 index 0000000..1b0f8dd --- /dev/null +++ b/opencode.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://opencode.ai/config.json", + "permission": { + "edit": { + "pom.xml": "deny" + } + +}, +"mcp":{ + "context7": { + "type": "remote", + "url" : "https://mcp.context7.com/mcp", + "enabled": true + } +} +} \ No newline at end of file diff --git a/src/main/java/org/example/Bowling.java b/src/main/java/org/example/Bowling.java new file mode 100644 index 0000000..f6ad8bc --- /dev/null +++ b/src/main/java/org/example/Bowling.java @@ -0,0 +1,14 @@ +package org.example; + +public class Bowling { + private int score = 0; + + + public void roll(int pins){ + score += pins; + } + public int score(){ + return score; + } + +} diff --git a/src/test/java/org/example/BowlingTest.java b/src/test/java/org/example/BowlingTest.java new file mode 100644 index 0000000..22cd80c --- /dev/null +++ b/src/test/java/org/example/BowlingTest.java @@ -0,0 +1,33 @@ +package org.example; + + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class BowlingTest { + + + @Test + void gutterGameGivesZeroScore() { + Bowling bowlingGame = new Bowling(); + + for(int i = 0; i < 20; i++){ + bowlingGame.roll(0); + } + + assertThat(bowlingGame.score()).isEqualTo(0); + + } + + @Test + void onePinEachRollGivesScore20(){ + Bowling bowlingGame = new Bowling(); + + for(int i = 0; i < 20; i++){ + bowlingGame.roll(1); + } + assertThat(bowlingGame.score()).isEqualTo(20); + } + +} From 215f2e4b24e32e9a059b9cb01f19c4b98949a458 Mon Sep 17 00:00:00 2001 From: JohanH Date: Tue, 27 Jan 2026 13:57:39 +0100 Subject: [PATCH 03/17] Mer kod och tester --- src/main/java/org/example/Bowling.java | 12 ++++++++++- src/test/java/org/example/BowlingTest.java | 25 +++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/Bowling.java b/src/main/java/org/example/Bowling.java index f6ad8bc..540f607 100644 --- a/src/main/java/org/example/Bowling.java +++ b/src/main/java/org/example/Bowling.java @@ -1,13 +1,23 @@ package org.example; public class Bowling { + private int[] rolls = new int[20]; + private int rollCount = 0; private int score = 0; public void roll(int pins){ - score += pins; + rolls[rollCount++] = pins; } public int score(){ + for (int i = 0; i < rolls.length; i++) { + if(rolls[i] + rolls[i+1] == 10){ + score += 10 + rolls[i+2]; + score += rolls[i]; + score += rolls[i+1]; + } + + } return score; } diff --git a/src/test/java/org/example/BowlingTest.java b/src/test/java/org/example/BowlingTest.java index 22cd80c..3af5a81 100644 --- a/src/test/java/org/example/BowlingTest.java +++ b/src/test/java/org/example/BowlingTest.java @@ -21,7 +21,7 @@ void gutterGameGivesZeroScore() { } @Test - void onePinEachRollGivesScore20(){ + void allOneGivesScoreTwenty(){ Bowling bowlingGame = new Bowling(); for(int i = 0; i < 20; i++){ @@ -30,4 +30,27 @@ void onePinEachRollGivesScore20(){ assertThat(bowlingGame.score()).isEqualTo(20); } + @Test + void oneSpareGivesScoreTwnetyNine(){ + Bowling bowlingGame = new Bowling(); + + bowlingGame.roll(5); + bowlingGame.roll(5); + for(int i = 0; i < 18; i++){ + bowlingGame.roll(1); + } + + assertThat(bowlingGame.score()).isEqualTo(29); + } + @Test + void oneStrikeGivesScoreTwentyFour(){ + Bowling bowlingGame = new Bowling(); + bowlingGame.roll(10); + bowlingGame.roll(3); + bowlingGame.roll(4); + bowlingGame.roll(16); + + assertThat(bowlingGame.score()).isEqualTo(40); + + } } From 1ace17cf9ed8cf7f02ca892731c3deaa4cfd642a Mon Sep 17 00:00:00 2001 From: JohanH Date: Tue, 27 Jan 2026 17:15:37 +0100 Subject: [PATCH 04/17] Mer kod och tester --- src/main/java/org/example/Bowling.java | 45 ++++++++++++++++++---- src/test/java/org/example/BowlingTest.java | 30 ++++++++++++++- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/example/Bowling.java b/src/main/java/org/example/Bowling.java index 540f607..dd7ce41 100644 --- a/src/main/java/org/example/Bowling.java +++ b/src/main/java/org/example/Bowling.java @@ -3,22 +3,51 @@ public class Bowling { private int[] rolls = new int[20]; private int rollCount = 0; - private int score = 0; + public void roll(int pins){ + if (pins == 10) + rollCount++; rolls[rollCount++] = pins; } + + private boolean isFinalFrame(){ + return rollCount > 18; + } public int score(){ - for (int i = 0; i < rolls.length; i++) { - if(rolls[i] + rolls[i+1] == 10){ - score += 10 + rolls[i+2]; - score += rolls[i]; - score += rolls[i+1]; - } + int score = 0; + for (int i = 0; i < rolls.length; i+=2) { + if(isStrike(i)) + score += strikeBonus(i); + else if(isSpare(i)){ + score += rolls[i] + rolls[i + 1] + spareBonus(i); + } else + score += rolls[i] + rolls[i + 1]; - } + } return score; + } + + private int spareBonus(int i){ + return rolls[i + 2]; } + private int strikeBonus(int i){ + if (i == 16) + return rolls[i+1] + rolls[i+2]; + if(rolls[i + 2] == 10) + return rolls[i + 2] + rolls[i + 4]; + return rolls[i + 2] + rolls[i + 3]; + } + + public boolean isStrike(int i){ + return rolls[i] == 10; + + } + + public boolean isSpare(int i){ + + return rolls[i] == 0 && rolls[i + 1] == 10; + } } diff --git a/src/test/java/org/example/BowlingTest.java b/src/test/java/org/example/BowlingTest.java index 3af5a81..b39e0d6 100644 --- a/src/test/java/org/example/BowlingTest.java +++ b/src/test/java/org/example/BowlingTest.java @@ -48,9 +48,37 @@ void oneStrikeGivesScoreTwentyFour(){ bowlingGame.roll(10); bowlingGame.roll(3); bowlingGame.roll(4); - bowlingGame.roll(16); + + for(int i = 0; i < 16; i++){ + bowlingGame.roll(1); + } assertThat(bowlingGame.score()).isEqualTo(40); } + @Test + void perfectGameGivesScore300(){ + Bowling bowlingGame = new Bowling(); + for(int i = 0; i < 12; i++){ + bowlingGame.roll(10); + } + assertThat(bowlingGame.score()).isEqualTo(300); + } + @Test + void normalGame(){ + Bowling bowlingGame = new Bowling(); + bowlingGame.roll(10); + bowlingGame.roll(3); + bowlingGame.roll(7); + bowlingGame.roll(1); + bowlingGame.roll(9); + bowlingGame.roll(0); + bowlingGame.roll(4); + bowlingGame.roll(10); + bowlingGame.roll(2); + bowlingGame.roll(8); + + assertThat(bowlingGame.score()).isEqualTo(59); + + } } From 99cb0a8d802f220cc23067391d4ac16e0d15a152 Mon Sep 17 00:00:00 2001 From: JohanHiths Date: Tue, 27 Jan 2026 20:58:21 +0100 Subject: [PATCH 05/17] Addade PhoneNumberValidation och PhoneNumberValidationTest --- .../example/utils/PhoneNumberValidator.java | 16 +++++ .../org/example/PhoneNumberValidatorTest.java | 67 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/main/java/org/example/utils/PhoneNumberValidator.java create mode 100644 src/test/java/org/example/PhoneNumberValidatorTest.java diff --git a/src/main/java/org/example/utils/PhoneNumberValidator.java b/src/main/java/org/example/utils/PhoneNumberValidator.java new file mode 100644 index 0000000..c047914 --- /dev/null +++ b/src/main/java/org/example/utils/PhoneNumberValidator.java @@ -0,0 +1,16 @@ +package org.example.utils; + +import java.util.function.Predicate; + +public class PhoneNumberValidator implements Predicate{ + + @Override + public boolean test(String phoneNumber){ + return phoneNumber.startsWith("+44") && + phoneNumber.length() == 13; + + } + + } + + diff --git a/src/test/java/org/example/PhoneNumberValidatorTest.java b/src/test/java/org/example/PhoneNumberValidatorTest.java new file mode 100644 index 0000000..78c1c56 --- /dev/null +++ b/src/test/java/org/example/PhoneNumberValidatorTest.java @@ -0,0 +1,67 @@ +package org.example; + +import org.example.utils.PhoneNumberValidator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + + + +class PhoneNumberValidatorTest { + + private PhoneNumberValidator underTest; + + @BeforeEach + void setUp() { + underTest = new PhoneNumberValidator(); + } + + @ParameterizedTest + @CsvSource({"+447000000000, TRUE"}) + void itShouldValidatePhoneNumber(String phoneNumber, String expected){ + + + //Act + boolean isValid = underTest.test(phoneNumber); + + //Assert + assertThat(isValid).isEqualTo(Boolean.valueOf(expected)); + + } + @Test + @DisplayName("Should fail when length bigger than 13") + void itShouldValidatePhoneNumberWhenIncorrectAndLengthIsBiggerThan13(){ + + //Arrange + String phoneNumber = "+447000000008888"; + + //Act + boolean isValid = underTest.test(phoneNumber); + + //Assert + assertThat(isValid).isFalse(); + + } + @Test + + @DisplayName("Should fail when does not start with +") + void itShouldValidatePhoneNumberWhenPhoneNumberDoesNotStartWithPlus(){ + + //Arrange + String phoneNumber = "447000000008888"; + + //Act + boolean isValid = underTest.test(phoneNumber); + + //Assert + assertThat(isValid).isFalse(); + + } + + + +} From 4b95de5acb12998c54d8f8c5dc70db8e3b9872ba Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 08:45:39 +0100 Subject: [PATCH 06/17] =?UTF-8?q?B=C3=B6rjat=20med=20toDoList,=20toDoListT?= =?UTF-8?q?est?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/example/toDoList.java | 6 ++++++ src/test/java/org/example/toDoListTest.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/org/example/toDoList.java create mode 100644 src/test/java/org/example/toDoListTest.java diff --git a/src/main/java/org/example/toDoList.java b/src/main/java/org/example/toDoList.java new file mode 100644 index 0000000..137798b --- /dev/null +++ b/src/main/java/org/example/toDoList.java @@ -0,0 +1,6 @@ +package org.example; + +public class toDoList { + + +} diff --git a/src/test/java/org/example/toDoListTest.java b/src/test/java/org/example/toDoListTest.java new file mode 100644 index 0000000..2c7a5d5 --- /dev/null +++ b/src/test/java/org/example/toDoListTest.java @@ -0,0 +1,15 @@ +package org.example; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class toDoListTest { + + @Test + void toDoListEmpty(){ + toDoList list = new toDoList(); + + + } +} From 25f462af5e1e40840a6b5761a832a78edc86c387 Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 08:47:26 +0100 Subject: [PATCH 07/17] =?UTF-8?q?B=C3=B6rjat=20med=20toDoList,=20toDoListT?= =?UTF-8?q?est?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/example/toDoList.java | 4 +++- src/test/java/org/example/toDoListTest.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/toDoList.java b/src/main/java/org/example/toDoList.java index 137798b..f8946ac 100644 --- a/src/main/java/org/example/toDoList.java +++ b/src/main/java/org/example/toDoList.java @@ -2,5 +2,7 @@ public class toDoList { - + public int size(int size){ + return size = 0; + } } diff --git a/src/test/java/org/example/toDoListTest.java b/src/test/java/org/example/toDoListTest.java index 2c7a5d5..84b4830 100644 --- a/src/test/java/org/example/toDoListTest.java +++ b/src/test/java/org/example/toDoListTest.java @@ -10,6 +10,6 @@ public class toDoListTest { void toDoListEmpty(){ toDoList list = new toDoList(); - + assertThat(list.size(0)).isEqualTo(0); } } From 57a82317985c8ef7504cb634e02c3078e10d7397 Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 08:51:13 +0100 Subject: [PATCH 08/17] =?UTF-8?q?B=C3=B6rjat=20med=20toDoList,=20toDoListT?= =?UTF-8?q?est?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/example/toDoList.java | 2 +- src/test/java/org/example/toDoListTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/toDoList.java b/src/main/java/org/example/toDoList.java index f8946ac..b6568f5 100644 --- a/src/main/java/org/example/toDoList.java +++ b/src/main/java/org/example/toDoList.java @@ -1,5 +1,5 @@ package org.example; - +// public class toDoList { public int size(int size){ diff --git a/src/test/java/org/example/toDoListTest.java b/src/test/java/org/example/toDoListTest.java index 84b4830..7b8eeaf 100644 --- a/src/test/java/org/example/toDoListTest.java +++ b/src/test/java/org/example/toDoListTest.java @@ -1,5 +1,5 @@ package org.example; - +// import org.junit.jupiter.api.Test; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; From 93d2dd7c8e680379926b9927d332aaf5504a77dc Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 09:02:57 +0100 Subject: [PATCH 09/17] Fler tester --- .idea/dbnavigator.xml | 6 ++++++ src/main/java/org/example/toDoList.java | 5 +++++ .../example/{toDoListTest.java => todoListTest.java} | 12 ++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) rename src/test/java/org/example/{toDoListTest.java => todoListTest.java} (52%) diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml index c87a7de..73447bd 100644 --- a/.idea/dbnavigator.xml +++ b/.idea/dbnavigator.xml @@ -10,6 +10,12 @@ + + + + + + diff --git a/src/main/java/org/example/toDoList.java b/src/main/java/org/example/toDoList.java index b6568f5..9d35685 100644 --- a/src/main/java/org/example/toDoList.java +++ b/src/main/java/org/example/toDoList.java @@ -5,4 +5,9 @@ public class toDoList { public int size(int size){ return size = 0; } + + public int Id(int id){ + return id; + } + } diff --git a/src/test/java/org/example/toDoListTest.java b/src/test/java/org/example/todoListTest.java similarity index 52% rename from src/test/java/org/example/toDoListTest.java rename to src/test/java/org/example/todoListTest.java index 7b8eeaf..cdbf46d 100644 --- a/src/test/java/org/example/toDoListTest.java +++ b/src/test/java/org/example/todoListTest.java @@ -4,12 +4,20 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -public class toDoListTest { +public class todoListTest { @Test void toDoListEmpty(){ toDoList list = new toDoList(); - assertThat(list.size(0)).isEqualTo(0); + assertThat(list.size(0)).isZero(); + } + + @Test + void toDoListId(){ + toDoList list = new toDoList(); + + assertThat(list.Id(1)).isNotNull(); + } } From 42dcb84f0e4f882b9d16feb9481cd1e1023f6480 Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 09:43:50 +0100 Subject: [PATCH 10/17] Addade WeatherTest, outFitAdvisor, WeatherService --- functional-requirements.md | 7 +++- pom.xml | 7 +++- .../org/example/weather/WeatherService.java | 8 ++++ .../org/example/weather/outFitAdvisor.java | 17 ++++++++ src/test/java/org/example/WeatherTest.java | 41 +++++++++++++++++++ 5 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/example/weather/WeatherService.java create mode 100644 src/main/java/org/example/weather/outFitAdvisor.java create mode 100644 src/test/java/org/example/WeatherTest.java diff --git a/functional-requirements.md b/functional-requirements.md index 1527669..c801722 100644 --- a/functional-requirements.md +++ b/functional-requirements.md @@ -1,2 +1,5 @@ -FR1: Systemet ska kunna dividera två tal -FR2: Systemet ska kunna hantera division med 0 \ No newline at end of file +Project 1: Väder-baserad Klädväljare + +FR1: Returnera "Vinterjacka" om temperaturen understiger 0 grader; +FR2: Returnera "Tshirt" om temperaturen överstiger 15 grader; +FR3: Lägg till "ta med Paraply" om nederbörd; diff --git a/pom.xml b/pom.xml index 776cf47..23c7afc 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,12 @@ 3.27.6 test - + + org.mockito + mockito-junit-jupiter + 5.21.0 + test + diff --git a/src/main/java/org/example/weather/WeatherService.java b/src/main/java/org/example/weather/WeatherService.java new file mode 100644 index 0000000..1ea027e --- /dev/null +++ b/src/main/java/org/example/weather/WeatherService.java @@ -0,0 +1,8 @@ +package org.example.weather; + +public interface WeatherService { + + float getTemperature(); + + +} diff --git a/src/main/java/org/example/weather/outFitAdvisor.java b/src/main/java/org/example/weather/outFitAdvisor.java new file mode 100644 index 0000000..8dd4051 --- /dev/null +++ b/src/main/java/org/example/weather/outFitAdvisor.java @@ -0,0 +1,17 @@ +package org.example.weather; + +public class outFitAdvisor { + + private final WeatherService weatherService; + + public outFitAdvisor(WeatherService weatherService){ + this.weatherService = weatherService; + + } + public String getClothingAdvice(){ + if(weatherService.getTemperature() < 0) + return "Vinterjacka"; + return null; + } + +} diff --git a/src/test/java/org/example/WeatherTest.java b/src/test/java/org/example/WeatherTest.java new file mode 100644 index 0000000..44bcc75 --- /dev/null +++ b/src/test/java/org/example/WeatherTest.java @@ -0,0 +1,41 @@ +package org.example; + + +import org.example.weather.WeatherService; +import org.example.weather.outFitAdvisor; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@ExtendWith(MockitoExtension.class) +public class WeatherTest { + + @Mock + WeatherService weatherService; + + @InjectMocks + outFitAdvisor advisor; + +// @BeforeEach +// void setup() { +// +// WeatherService weatherService; +// outFitAdvisor advisor; +// } + + + @Test + void freezingTemps(){ + Mockito.when(weatherService.getTemperature()).thenReturn((float) -5.0); + String advice = advisor.getClothingAdvice(); + assertThat(advice).isEqualTo("VinterJacka"); + + } + +} From 3525e7448f37d8d889aa6f9cfe3e3a3368c95695 Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 09:47:55 +0100 Subject: [PATCH 11/17] =?UTF-8?q?Addade=20temperatur=20f=C3=B6r=20sommar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/example/weather/outFitAdvisor.java | 5 ++++- src/test/java/org/example/WeatherTest.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/example/weather/outFitAdvisor.java b/src/main/java/org/example/weather/outFitAdvisor.java index 8dd4051..4b38c9e 100644 --- a/src/main/java/org/example/weather/outFitAdvisor.java +++ b/src/main/java/org/example/weather/outFitAdvisor.java @@ -9,8 +9,11 @@ public outFitAdvisor(WeatherService weatherService){ } public String getClothingAdvice(){ - if(weatherService.getTemperature() < 0) + var temp = weatherService.getTemperature(); + if(temp < 0) return "Vinterjacka"; + if(temp > 15) + return "Sweatpants"; return null; } diff --git a/src/test/java/org/example/WeatherTest.java b/src/test/java/org/example/WeatherTest.java index 44bcc75..9ad5057 100644 --- a/src/test/java/org/example/WeatherTest.java +++ b/src/test/java/org/example/WeatherTest.java @@ -38,4 +38,11 @@ void freezingTemps(){ } + @Test + void summerTemps(){ + Mockito.when(weatherService.getTemperature()).thenReturn((float) 15.0); + String advice = advisor.getClothingAdvice(); + assertThat(advice).isEqualTo("Sweatpants"); + } + } From 4e91d1cc3d0b0572f1a63c6efb476d7ab59448e9 Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 11:23:21 +0100 Subject: [PATCH 12/17] =?UTF-8?q?M=C3=A5nga=20updateringar..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functional-requirements.md | 5 ++ pom.xml | 6 +++ src/main/java/org/example/TodoItem.java | 14 ++++++ .../example/price/NotificationService.java | 7 +++ .../java/org/example/price/PriceWatcher.java | 17 +++++++ .../java/org/example/price/Priceservice.java | 7 +++ src/main/java/org/example/toDoList.java | 11 +++-- .../{todoListTest.java => ToDoListTest.java} | 7 ++- src/test/java/org/example/WeatherTest.java | 1 - .../priceTest/AsyncNotificationService.java | 28 +++++++++++ .../priceTest/PriceWatcherAsyncTest.java | 46 +++++++++++++++++++ .../example/priceTest/PriceWatcherTest.java | 39 ++++++++++++++++ 12 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/example/TodoItem.java create mode 100644 src/main/java/org/example/price/NotificationService.java create mode 100644 src/main/java/org/example/price/PriceWatcher.java create mode 100644 src/main/java/org/example/price/Priceservice.java rename src/test/java/org/example/{todoListTest.java => ToDoListTest.java} (72%) create mode 100644 src/test/java/org/example/priceTest/AsyncNotificationService.java create mode 100644 src/test/java/org/example/priceTest/PriceWatcherAsyncTest.java create mode 100644 src/test/java/org/example/priceTest/PriceWatcherTest.java diff --git a/functional-requirements.md b/functional-requirements.md index c801722..eb49954 100644 --- a/functional-requirements.md +++ b/functional-requirements.md @@ -3,3 +3,8 @@ Project 1: Väder-baserad Klädväljare FR1: Returnera "Vinterjacka" om temperaturen understiger 0 grader; FR2: Returnera "Tshirt" om temperaturen överstiger 15 grader; FR3: Lägg till "ta med Paraply" om nederbörd; +FR4: Hantera undantag. + +Project 2: Prishantering + +FR1: \ No newline at end of file diff --git a/pom.xml b/pom.xml index 23c7afc..5fee14a 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,12 @@ 5.21.0 test + + org.awaitility + awaitility + 4.2.0 + test + diff --git a/src/main/java/org/example/TodoItem.java b/src/main/java/org/example/TodoItem.java new file mode 100644 index 0000000..f164222 --- /dev/null +++ b/src/main/java/org/example/TodoItem.java @@ -0,0 +1,14 @@ +package org.example; + +public class TodoItem { + private final int id; + + public TodoItem(int id) { + this.id = id; + } + + @Override + public String toString() { + return "Id: " + id; + } +} diff --git a/src/main/java/org/example/price/NotificationService.java b/src/main/java/org/example/price/NotificationService.java new file mode 100644 index 0000000..26b8b64 --- /dev/null +++ b/src/main/java/org/example/price/NotificationService.java @@ -0,0 +1,7 @@ +package org.example.price; + +public interface NotificationService { + + void notify(String productName, int price); + boolean isSent(); +} diff --git a/src/main/java/org/example/price/PriceWatcher.java b/src/main/java/org/example/price/PriceWatcher.java new file mode 100644 index 0000000..23dea7b --- /dev/null +++ b/src/main/java/org/example/price/PriceWatcher.java @@ -0,0 +1,17 @@ +package org.example.price; + +public class PriceWatcher { + Priceservice priceService; + NotificationService notificationService; + + PriceWatcher(Priceservice priceService, NotificationService notificationService){ + this.priceService = priceService; + this.notificationService = notificationService; + } + public void checkPrices(){ + int price = priceService.getPrice("T-SHIRT"); + if (price < 100) + notificationService.notify("T-SHIRT", priceService.getPrice("T-SHIRT")); + + } +} diff --git a/src/main/java/org/example/price/Priceservice.java b/src/main/java/org/example/price/Priceservice.java new file mode 100644 index 0000000..48a8ae5 --- /dev/null +++ b/src/main/java/org/example/price/Priceservice.java @@ -0,0 +1,7 @@ +package org.example.price; + +public interface Priceservice { + int getPrice(String productName); + + +} diff --git a/src/main/java/org/example/toDoList.java b/src/main/java/org/example/toDoList.java index 9d35685..1cbf3f2 100644 --- a/src/main/java/org/example/toDoList.java +++ b/src/main/java/org/example/toDoList.java @@ -2,12 +2,17 @@ // public class toDoList { + + private int nextId = 1; + + + public TodoItem add(String text) { + return new TodoItem(nextId++); + } + public int size(int size){ return size = 0; } - public int Id(int id){ - return id; } -} diff --git a/src/test/java/org/example/todoListTest.java b/src/test/java/org/example/ToDoListTest.java similarity index 72% rename from src/test/java/org/example/todoListTest.java rename to src/test/java/org/example/ToDoListTest.java index cdbf46d..76c4a98 100644 --- a/src/test/java/org/example/todoListTest.java +++ b/src/test/java/org/example/ToDoListTest.java @@ -4,7 +4,8 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -public class todoListTest { + +public class ToDoListTest { @Test void toDoListEmpty(){ @@ -17,7 +18,9 @@ void toDoListEmpty(){ void toDoListId(){ toDoList list = new toDoList(); - assertThat(list.Id(1)).isNotNull(); + TodoItem item = list.add("Milk"); + + assertThat(item.toString()).isEqualTo("Id: 1"); } } diff --git a/src/test/java/org/example/WeatherTest.java b/src/test/java/org/example/WeatherTest.java index 9ad5057..8fd5932 100644 --- a/src/test/java/org/example/WeatherTest.java +++ b/src/test/java/org/example/WeatherTest.java @@ -3,7 +3,6 @@ import org.example.weather.WeatherService; import org.example.weather.outFitAdvisor; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/src/test/java/org/example/priceTest/AsyncNotificationService.java b/src/test/java/org/example/priceTest/AsyncNotificationService.java new file mode 100644 index 0000000..43b32bc --- /dev/null +++ b/src/test/java/org/example/priceTest/AsyncNotificationService.java @@ -0,0 +1,28 @@ +package org.example.priceTest; + +import org.example.price.NotificationService; + +public class AsyncNotificationService implements NotificationService { + + private boolean isSent = false; + + + @Override + public void notify(String productName, int price) { + new Thread(() -> { + try { + Thread.sleep(5000); + + isSent = true; + System.out.println("Sending notification for " + productName + " at " + price); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }).start(); + } + + @Override + public boolean isSent() { + return isSent; + } +} diff --git a/src/test/java/org/example/priceTest/PriceWatcherAsyncTest.java b/src/test/java/org/example/priceTest/PriceWatcherAsyncTest.java new file mode 100644 index 0000000..043fb83 --- /dev/null +++ b/src/test/java/org/example/priceTest/PriceWatcherAsyncTest.java @@ -0,0 +1,46 @@ +package org.example.priceTest; + +import org.awaitility.Awaitility; +import org.example.price.NotificationService; +import org.example.price.PriceWatcher; +import org.example.price.Priceservice; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.concurrent.TimeUnit; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@ExtendWith(MockitoExtension.class) +public class PriceWatcherAsyncTest { + + @Mock + Priceservice priceService; + + @Spy + NotificationService notificationService = new AsyncNotificationService(); + + @InjectMocks + PriceWatcher priceWatcher; + + + @Test + void sendNotlificationWhenPriceLowerThanThreshold(){ + Mockito.when(priceService.getPrice(("T-SHIRT"))) + .thenReturn(95); + + priceWatcher.checkPrices(); + + Awaitility.await().atMost(5, TimeUnit.SECONDS) + .until(notificationService::isSent); + + assertThat(notificationService.isSent()).isTrue(); + + + } +} diff --git a/src/test/java/org/example/priceTest/PriceWatcherTest.java b/src/test/java/org/example/priceTest/PriceWatcherTest.java new file mode 100644 index 0000000..ad680de --- /dev/null +++ b/src/test/java/org/example/priceTest/PriceWatcherTest.java @@ -0,0 +1,39 @@ +package org.example.priceTest; + + +import org.example.price.NotificationService; +import org.example.price.PriceWatcher; +import org.example.price.Priceservice; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class PriceWatcherTest { + + @Mock + Priceservice priceService; + + @Mock + NotificationService notificationService; + + @InjectMocks + PriceWatcher priceWatcher; + + @Test + void sendNotificationWhenPriceLowerThanThreshold(){ + Mockito.when(priceService.getPrice(("T-SHIRT"))) + .thenReturn(95); + + priceWatcher.checkPrices(); + + Mockito.verify(notificationService, + Mockito.times(1)) + .notify("T-SHIRT", 95); + notificationService.isSent(); + + } +} From 9d94a402fe53721de5e3cfc6bbd41fab2527c528 Mon Sep 17 00:00:00 2001 From: JohanH Date: Wed, 28 Jan 2026 11:29:10 +0100 Subject: [PATCH 13/17] Fler updateringar --- .../org/example/weather/outFitAdvisor.java | 20 +++++++++++-------- src/test/java/org/example/WeatherTest.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/example/weather/outFitAdvisor.java b/src/main/java/org/example/weather/outFitAdvisor.java index 4b38c9e..9767f10 100644 --- a/src/main/java/org/example/weather/outFitAdvisor.java +++ b/src/main/java/org/example/weather/outFitAdvisor.java @@ -8,13 +8,17 @@ public outFitAdvisor(WeatherService weatherService){ this.weatherService = weatherService; } - public String getClothingAdvice(){ - var temp = weatherService.getTemperature(); - if(temp < 0) - return "Vinterjacka"; - if(temp > 15) - return "Sweatpants"; - return null; - } + public String getClothingAdvice() { + try { + var temp = weatherService.getTemperature(); + if (temp < 0) + return "Vinterjacka"; + if (temp > 15) + return "Sweatpants"; + return null; + } catch(IllegalStateException e) { + return "Jeans and Jacket"; + } + } } diff --git a/src/test/java/org/example/WeatherTest.java b/src/test/java/org/example/WeatherTest.java index 8fd5932..73ea9aa 100644 --- a/src/test/java/org/example/WeatherTest.java +++ b/src/test/java/org/example/WeatherTest.java @@ -43,5 +43,15 @@ void summerTemps(){ String advice = advisor.getClothingAdvice(); assertThat(advice).isEqualTo("Sweatpants"); } + @Test + void defaultAdvice(){ + Mockito.when(weatherService.getTemperature()) + .thenThrow(new IllegalStateException()); + + assertThat(advisor.getClothingAdvice()). + isEqualTo("Jeans and Jacket"); + + + } } From 9dd000bf01e53b43f046a8ead4b7d792fa32eef1 Mon Sep 17 00:00:00 2001 From: JohanHiths Date: Wed, 28 Jan 2026 18:13:16 +0100 Subject: [PATCH 14/17] Addade TodoListTasks, fler tester --- .../org/example/{ => todolist}/TodoItem.java | 2 +- .../java/org/example/todolist/TodoList.java | 14 +++++ .../org/example/todolist/TodoListTask.java | 4 ++ .../org/example/weather/outFitAdvisor.java | 2 +- src/test/java/org/example/ToDoListTest.java | 26 -------- src/test/java/org/example/TodoListTest.java | 61 +++++++++++++++++++ 6 files changed, 81 insertions(+), 28 deletions(-) rename src/main/java/org/example/{ => todolist}/TodoItem.java (86%) create mode 100644 src/main/java/org/example/todolist/TodoList.java create mode 100644 src/main/java/org/example/todolist/TodoListTask.java delete mode 100644 src/test/java/org/example/ToDoListTest.java create mode 100644 src/test/java/org/example/TodoListTest.java diff --git a/src/main/java/org/example/TodoItem.java b/src/main/java/org/example/todolist/TodoItem.java similarity index 86% rename from src/main/java/org/example/TodoItem.java rename to src/main/java/org/example/todolist/TodoItem.java index f164222..f1d4255 100644 --- a/src/main/java/org/example/TodoItem.java +++ b/src/main/java/org/example/todolist/TodoItem.java @@ -1,4 +1,4 @@ -package org.example; +package org.example.todolist; public class TodoItem { private final int id; diff --git a/src/main/java/org/example/todolist/TodoList.java b/src/main/java/org/example/todolist/TodoList.java new file mode 100644 index 0000000..410008c --- /dev/null +++ b/src/main/java/org/example/todolist/TodoList.java @@ -0,0 +1,14 @@ +package org.example.todolist; + +public class TodoList { + + public int nextId = 1; + public int size = 0; + + public int size(){ + return size(); + } + public TodoItem add(String text) { + return new TodoItem(nextId++); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/todolist/TodoListTask.java b/src/main/java/org/example/todolist/TodoListTask.java new file mode 100644 index 0000000..8ddf768 --- /dev/null +++ b/src/main/java/org/example/todolist/TodoListTask.java @@ -0,0 +1,4 @@ +package org.example.todolist; + +public class TodoListTask { +} diff --git a/src/main/java/org/example/weather/outFitAdvisor.java b/src/main/java/org/example/weather/outFitAdvisor.java index 9767f10..2206ec7 100644 --- a/src/main/java/org/example/weather/outFitAdvisor.java +++ b/src/main/java/org/example/weather/outFitAdvisor.java @@ -13,7 +13,7 @@ public String getClothingAdvice() { var temp = weatherService.getTemperature(); if (temp < 0) return "Vinterjacka"; - if (temp > 15) + if (temp >= 15) return "Sweatpants"; return null; } catch(IllegalStateException e) { diff --git a/src/test/java/org/example/ToDoListTest.java b/src/test/java/org/example/ToDoListTest.java deleted file mode 100644 index 76c4a98..0000000 --- a/src/test/java/org/example/ToDoListTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example; -// -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - - -public class ToDoListTest { - - @Test - void toDoListEmpty(){ - toDoList list = new toDoList(); - - assertThat(list.size(0)).isZero(); - } - - @Test - void toDoListId(){ - toDoList list = new toDoList(); - - TodoItem item = list.add("Milk"); - - assertThat(item.toString()).isEqualTo("Id: 1"); - - } -} diff --git a/src/test/java/org/example/TodoListTest.java b/src/test/java/org/example/TodoListTest.java new file mode 100644 index 0000000..5d8f24b --- /dev/null +++ b/src/test/java/org/example/TodoListTest.java @@ -0,0 +1,61 @@ +package org.example; + +import org.example.todolist.TodoItem; +import org.example.todolist.TodoList; +import org.example.todolist.TodoListTask; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class TodoListTest { + + + @Test + void toDoListIsEmpty(){ + TodoList todo = new TodoList(); + + assertThat(todo.size()).isZero(); + } + + @Test + void toDoListId() { + TodoList list = new TodoList(); + + TodoItem item = list.add("Milk"); + + assertThat(item.toString()).isEqualTo("Id: 1"); + + } + + @DisplayName("När jag lägger till items får de id1 och id2") + void toDoListTwoIds(){ + TodoList list = new TodoList(); + + TodoItem item = list.add("Milk"); + TodoItem item2 = list.add("Bread"); + + assertThat(item.toString()).isEqualTo("Id: 1"); + assertThat(item2.toString()).isEqualTo("Id: 2"); + + } + + @Test + void todoListRemembersItems() { + TodoList list = new TodoList(); + + list.add("Milk"); + list.add("Bread"); + + assertThat(list.size()).isEqualTo(2); + } + + @Test + void testingTasks() { + TodoListTask task = new TodoListTask(); + + } + + + + } From 2513e548e1357992b3c88c43b9e5f56d6ad274aa Mon Sep 17 00:00:00 2001 From: JohanHiths Date: Wed, 28 Jan 2026 20:14:11 +0100 Subject: [PATCH 15/17] Addade Csv filer, mer tester --- .../java/org/example/CSV/CsvTodoStorage.java | 30 ++++++++++++ src/main/java/org/example/CSV/saveToFile.java | 21 ++++++++ .../java/org/example/todolist/TodoItem.java | 20 +++++++- .../java/org/example/todolist/TodoList.java | 8 ++- .../org/example/todolist/TodoListTask.java | 10 ++++ .../org/example/CSV/CsvTodoStorageTest.java | 49 +++++++++++++++++++ src/test/java/org/example/TodoListTest.java | 21 +++++--- 7 files changed, 148 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/example/CSV/CsvTodoStorage.java create mode 100644 src/main/java/org/example/CSV/saveToFile.java create mode 100644 src/test/java/org/example/CSV/CsvTodoStorageTest.java diff --git a/src/main/java/org/example/CSV/CsvTodoStorage.java b/src/main/java/org/example/CSV/CsvTodoStorage.java new file mode 100644 index 0000000..657b3da --- /dev/null +++ b/src/main/java/org/example/CSV/CsvTodoStorage.java @@ -0,0 +1,30 @@ +package org.example.CSV; + +import org.example.todolist.TodoItem; + +import java.io.IOException; +import java.io.Writer; +import java.util.List; + +public class CsvTodoStorage { + + + public void write(List items, Writer out) throws IOException { + out.write("id,task,due\n"); + + for (TodoItem item : items) { + out.write(item.getId() + ",\"Buy milk, \"\"organic\"\"\""); + out.write(escapeCsv(item.getTask()) + ","); + out.write(item.getDue() + "\n"); + } + } + + private String escapeCsv(String s) { + if (s == null) return ""; + boolean needsQuotes = + s.contains(",") || s.contains("\"") || s.contains("\n"); + + String escaped = s.replace("\"", "\"\""); + return needsQuotes ? "\"" + escaped + "\"" : escaped; + } +} diff --git a/src/main/java/org/example/CSV/saveToFile.java b/src/main/java/org/example/CSV/saveToFile.java new file mode 100644 index 0000000..4b3a097 --- /dev/null +++ b/src/main/java/org/example/CSV/saveToFile.java @@ -0,0 +1,21 @@ +import org.example.todolist.TodoItem; + +import java.io.BufferedWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; + +import static java.nio.file.Files.write; + +public void saveToFile(List items, Path path) throws Exception { + try (BufferedWriter writer = + Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { + write(items, writer); + } +} + +private void write(List items, BufferedWriter writer) { +} + +void main() { + +} diff --git a/src/main/java/org/example/todolist/TodoItem.java b/src/main/java/org/example/todolist/TodoItem.java index f1d4255..31bf52f 100644 --- a/src/main/java/org/example/todolist/TodoItem.java +++ b/src/main/java/org/example/todolist/TodoItem.java @@ -1,14 +1,32 @@ package org.example.todolist; +import java.time.LocalDate; +import java.time.LocalDateTime; + public class TodoItem { private final int id; - public TodoItem(int id) { + public TodoItem(int id, String buyMilk, LocalDate localDate) { this.id = id; + } @Override public String toString() { return "Id: " + id; } + + public int getId() { + return id; + } + + public String getTask() { + return ""; + } + + public LocalDate getDue() { + + return LocalDate.of(2026, 1, 20); + + } } diff --git a/src/main/java/org/example/todolist/TodoList.java b/src/main/java/org/example/todolist/TodoList.java index 410008c..6161c46 100644 --- a/src/main/java/org/example/todolist/TodoList.java +++ b/src/main/java/org/example/todolist/TodoList.java @@ -1,14 +1,18 @@ package org.example.todolist; +import java.time.LocalDate; + public class TodoList { public int nextId = 1; public int size = 0; + public TodoItem[] items = new TodoItem[100]; + public int size(){ return size(); } - public TodoItem add(String text) { - return new TodoItem(nextId++); + public TodoItem add(String text, LocalDate localDate) { + return new TodoItem(nextId++, "Buy milk", LocalDate.of(2026, 1, 20)); } } \ No newline at end of file diff --git a/src/main/java/org/example/todolist/TodoListTask.java b/src/main/java/org/example/todolist/TodoListTask.java index 8ddf768..332c8a0 100644 --- a/src/main/java/org/example/todolist/TodoListTask.java +++ b/src/main/java/org/example/todolist/TodoListTask.java @@ -1,4 +1,14 @@ package org.example.todolist; public class TodoListTask { + String task; + boolean done; + + + public String TodoListTask(String task) { + return task; + } + public TodoListTask task(String text) { + return new TodoListTask(); + } } diff --git a/src/test/java/org/example/CSV/CsvTodoStorageTest.java b/src/test/java/org/example/CSV/CsvTodoStorageTest.java new file mode 100644 index 0000000..705c5cb --- /dev/null +++ b/src/test/java/org/example/CSV/CsvTodoStorageTest.java @@ -0,0 +1,49 @@ +package org.example.CSV; + +import org.example.CSV.CsvTodoStorage; +import org.example.todolist.TodoItem; +import org.junit.jupiter.api.Test; + +import java.io.StringWriter; +import java.time.LocalDate; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +class CsvTodoStorageTest { + + @Test + void savesTodosAsCsvWithIdTaskAndDue() throws Exception { + List items = List.of( + new TodoItem(1, "Buy milk", LocalDate.of(2026, 1, 20)), + new TodoItem(2, "Bread", LocalDate.of(2026, 1, 21)) + ); + + CsvTodoStorage storage = new CsvTodoStorage(); + StringWriter out = new StringWriter(); + + storage.write(items, out); + + assertThat(out.toString()).isEqualTo( + "id,task,due\n" + + "1,Buy milk,2026-01-20\n" + + "2,Bread,2026-01-21\n" + ); + } + @Test + void savesTaskWithCommaAndQuotesUsingCsvEscaping() throws Exception { + List items = List.of( + new TodoItem(1, "Buy milk, \"organic\"", LocalDate.of(2026, 1, 20)) + ); + + CsvTodoStorage storage = new CsvTodoStorage(); + StringWriter out = new StringWriter(); + + storage.write(items, out); + + assertThat(out.toString()).isEqualTo( + "id,task,due\n" + + "1,\"Buy milk, \"\"organic\"\"\",2026-01-20\n" + ); + } +} diff --git a/src/test/java/org/example/TodoListTest.java b/src/test/java/org/example/TodoListTest.java index 5d8f24b..aba301e 100644 --- a/src/test/java/org/example/TodoListTest.java +++ b/src/test/java/org/example/TodoListTest.java @@ -2,10 +2,11 @@ import org.example.todolist.TodoItem; import org.example.todolist.TodoList; -import org.example.todolist.TodoListTask; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.time.LocalDate; + import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class TodoListTest { @@ -22,7 +23,7 @@ void toDoListIsEmpty(){ void toDoListId() { TodoList list = new TodoList(); - TodoItem item = list.add("Milk"); + TodoItem item = list.add("Milk", LocalDate.of(2026, 1, 20)); assertThat(item.toString()).isEqualTo("Id: 1"); @@ -32,8 +33,8 @@ void toDoListId() { void toDoListTwoIds(){ TodoList list = new TodoList(); - TodoItem item = list.add("Milk"); - TodoItem item2 = list.add("Bread"); + TodoItem item = list.add("Milk", LocalDate.of(2026, 1, 20)); + TodoItem item2 = list.add("Bread", LocalDate.of(2026, 1, 20)); assertThat(item.toString()).isEqualTo("Id: 1"); assertThat(item2.toString()).isEqualTo("Id: 2"); @@ -44,16 +45,20 @@ void toDoListTwoIds(){ void todoListRemembersItems() { TodoList list = new TodoList(); - list.add("Milk"); - list.add("Bread"); + list.add("Milk", LocalDate.of(2026, 1, 20)); + list.add("Bread", LocalDate.of(2026, 1, 20)); assertThat(list.size()).isEqualTo(2); } @Test - void testingTasks() { - TodoListTask task = new TodoListTask(); + void addStoresTaskAndDueInItem() { + TodoList list = new TodoList(); + + TodoItem item = list.add("Buy milk", LocalDate.of(2026, 1, 20)); + assertThat(item.getTask()).isEqualTo("Buy milk"); + assertThat(item.getDue()).isEqualTo(LocalDate.of(2026, 1, 20)); } From 077c6b0ef07e9a7eac136b383870e4acd7b9d568 Mon Sep 17 00:00:00 2001 From: JohanHiths Date: Thu, 29 Jan 2026 11:46:40 +0100 Subject: [PATCH 16/17] Addade SimpleClient, SimpleServer --- .../java/org/example/socket/SimpleClient.java | 21 ++++++++ .../java/org/example/socket/SimpleServer.java | 52 +++++++++++++++++++ .../java/org/example/todolist/TodoItem.java | 21 +++++--- .../java/org/example/todolist/TodoList.java | 21 +++++--- .../org/example/todolist/TodoListTask.java | 3 ++ src/test/java/org/example/TodoListTest.java | 20 +++++++ 6 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/example/socket/SimpleClient.java create mode 100644 src/main/java/org/example/socket/SimpleServer.java diff --git a/src/main/java/org/example/socket/SimpleClient.java b/src/main/java/org/example/socket/SimpleClient.java new file mode 100644 index 0000000..a832081 --- /dev/null +++ b/src/main/java/org/example/socket/SimpleClient.java @@ -0,0 +1,21 @@ +package org.example.socket; + +import java.io.IOException; +import java.net.Socket; +import java.net.UnknownHostException; + +public class SimpleClient { + + static void main(){ + int port = 3000; + String serverIp = "127.0.0.1"; + + try(Socket socket = new Socket(serverIp, port)){ + + } catch (UnknownHostException e){ + throw new RuntimeException(e); + } catch (IOException e){ + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/org/example/socket/SimpleServer.java b/src/main/java/org/example/socket/SimpleServer.java new file mode 100644 index 0000000..b5522c9 --- /dev/null +++ b/src/main/java/org/example/socket/SimpleServer.java @@ -0,0 +1,52 @@ +package org.example.socket; + +import java.io.*; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Arrays; + +public class SimpleServer { + + static void main(){ + + int port = 3000; + + try(ServerSocket serverSocket = new ServerSocket(port, 5, + InetAddress.ofLiteral("127.0.0.1"))){ + System.out.println("" + serverSocket.getLocalPort() + " is the port"); + + while(true) { + Socket socket = serverSocket.accept(); + Thread.ofVirtual().start(() -> { + try { + handleClient(socket); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + + private static void handleClient(Socket socket ) throws IOException { + try (Socket client = socket) { + System.out.println("Client connected: " + socket.getRemoteSocketAddress()); + BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + InputStream input = socket.getInputStream(); + OutputStream output = socket.getOutputStream(); + PrintWriter writer = new PrintWriter(output, true); + IO.readln(); + + writer.println("Hello client!"); + socket.close(); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + } + diff --git a/src/main/java/org/example/todolist/TodoItem.java b/src/main/java/org/example/todolist/TodoItem.java index 31bf52f..329c649 100644 --- a/src/main/java/org/example/todolist/TodoItem.java +++ b/src/main/java/org/example/todolist/TodoItem.java @@ -5,28 +5,33 @@ public class TodoItem { private final int id; + private final String task; + private final LocalDate due; - public TodoItem(int id, String buyMilk, LocalDate localDate) { - this.id = id; + public TodoItem(int id, String task, LocalDate due) { + this.id = id; + this.task = task; + this.due = due; } - @Override - public String toString() { - return "Id: " + id; - } + public int getId() { return id; } public String getTask() { - return ""; + return task; } public LocalDate getDue() { - return LocalDate.of(2026, 1, 20); + return due; } + @Override + public String toString() { + return "Id: " + id; + } } diff --git a/src/main/java/org/example/todolist/TodoList.java b/src/main/java/org/example/todolist/TodoList.java index 6161c46..9c464d1 100644 --- a/src/main/java/org/example/todolist/TodoList.java +++ b/src/main/java/org/example/todolist/TodoList.java @@ -1,18 +1,27 @@ package org.example.todolist; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; public class TodoList { - public int nextId = 1; - public int size = 0; - public TodoItem[] items = new TodoItem[100]; + private int nextId = 1; + private int size = 0; + private List items = new ArrayList<>(); + public int size(){ - return size(); + return size; + } - public TodoItem add(String text, LocalDate localDate) { - return new TodoItem(nextId++, "Buy milk", LocalDate.of(2026, 1, 20)); + public TodoItem add(String task, LocalDate due) { + size++; + return new TodoItem(nextId++, task, due); } + public TodoItem get(int index){ + return items.get(index); + } + } \ No newline at end of file diff --git a/src/main/java/org/example/todolist/TodoListTask.java b/src/main/java/org/example/todolist/TodoListTask.java index 332c8a0..d8f9ddb 100644 --- a/src/main/java/org/example/todolist/TodoListTask.java +++ b/src/main/java/org/example/todolist/TodoListTask.java @@ -11,4 +11,7 @@ public String TodoListTask(String task) { public TodoListTask task(String text) { return new TodoListTask(); } + public String getTask(){ + return task; + } } diff --git a/src/test/java/org/example/TodoListTest.java b/src/test/java/org/example/TodoListTest.java index aba301e..a0ef775 100644 --- a/src/test/java/org/example/TodoListTest.java +++ b/src/test/java/org/example/TodoListTest.java @@ -30,6 +30,7 @@ void toDoListId() { } @DisplayName("När jag lägger till items får de id1 och id2") + @Test void toDoListTwoIds(){ TodoList list = new TodoList(); @@ -60,7 +61,26 @@ void addStoresTaskAndDueInItem() { assertThat(item.getTask()).isEqualTo("Buy milk"); assertThat(item.getDue()).isEqualTo(LocalDate.of(2026, 1, 20)); } + @Test + void differentTodosHaveDifferentTasksAndDueDates() { + TodoList list = new TodoList(); + + TodoItem a = list.add("Buy milk", LocalDate.of(2026, 1, 20)); + TodoItem b = list.add("Walk dog", LocalDate.of(2026, 1, 21)); + + assertThat(a.getTask()).isEqualTo("Buy milk"); + assertThat(b.getTask()).isEqualTo("Walk dog"); + } + @Test + void listStoresAndReturnsItemsInInsertionOrder() { + TodoList list = new TodoList(); + list.add("Buy milk", LocalDate.of(2026, 1, 20)); + list.add("Walk dog", LocalDate.of(2026, 1, 21)); + assertThat(list.size()).isEqualTo(2); + assertThat(list.get(1).getTask()).isEqualTo("Buy milk"); + assertThat(list.get(2).getTask()).isEqualTo("Walk dog"); + } } From ee891e18cb544ba25b261a3644d429486183c677 Mon Sep 17 00:00:00 2001 From: JohanHiths Date: Thu, 29 Jan 2026 16:44:18 +0100 Subject: [PATCH 17/17] Update --- .../java/org/example/todolist/TodoItem.java | 10 ++++++++ .../java/org/example/todolist/TodoList.java | 25 ++++++++++++++++--- src/test/java/org/example/TodoListTest.java | 17 +++++++++++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/todolist/TodoItem.java b/src/main/java/org/example/todolist/TodoItem.java index 329c649..b48a0df 100644 --- a/src/main/java/org/example/todolist/TodoItem.java +++ b/src/main/java/org/example/todolist/TodoItem.java @@ -7,12 +7,14 @@ public class TodoItem { private final int id; private final String task; private final LocalDate due; + private boolean done; public TodoItem(int id, String task, LocalDate due) { this.id = id; this.task = task; this.due = due; + this.done = done; } @@ -34,4 +36,12 @@ public LocalDate getDue() { public String toString() { return "Id: " + id; } + + public boolean isDone() { + return done; + } + + public void markDone() { + done = true; + } } diff --git a/src/main/java/org/example/todolist/TodoList.java b/src/main/java/org/example/todolist/TodoList.java index 9c464d1..046eb55 100644 --- a/src/main/java/org/example/todolist/TodoList.java +++ b/src/main/java/org/example/todolist/TodoList.java @@ -8,20 +8,37 @@ public class TodoList { private int nextId = 1; private int size = 0; - private List items = new ArrayList<>(); + private final List items = new ArrayList<>(); + private TodoItem item; + private boolean done = false; public int size(){ - return size; + return items.size(); } public TodoItem add(String task, LocalDate due) { - size++; - return new TodoItem(nextId++, task, due); + + TodoItem item = new TodoItem(nextId++, task, due); + items.add(item); + return item; } public TodoItem get(int index){ return items.get(index); } + public TodoItem add() { + items.add(item); + return item; + } + public boolean markDone(int id) { + for (TodoItem item : items) { + if (item.getId() == id) { + item.markDone(); + return true; + } + } + return false; + } } \ No newline at end of file diff --git a/src/test/java/org/example/TodoListTest.java b/src/test/java/org/example/TodoListTest.java index a0ef775..4ead3c7 100644 --- a/src/test/java/org/example/TodoListTest.java +++ b/src/test/java/org/example/TodoListTest.java @@ -79,8 +79,21 @@ void listStoresAndReturnsItemsInInsertionOrder() { list.add("Walk dog", LocalDate.of(2026, 1, 21)); assertThat(list.size()).isEqualTo(2); - assertThat(list.get(1).getTask()).isEqualTo("Buy milk"); - assertThat(list.get(2).getTask()).isEqualTo("Walk dog"); + assertThat(list.get(0).getTask()).isEqualTo("Buy milk"); + assertThat(list.get(1).getTask()).isEqualTo("Walk dog"); + } + @Test + void canMarkTodoAsDoneById() { + TodoList list = new TodoList(); + + TodoItem item = list.add("Buy milk", LocalDate.of(2026, 1, 20)); + + assertThat(item.isDone()).isFalse(); + + boolean result = list.markDone(1); + + assertThat(result).isTrue(); + assertThat(item.isDone()).isTrue(); } }