From fc198c51be51063462c55b85167e6e8f75fb2dab Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Tue, 6 Jul 2021 21:53:07 +0300 Subject: [PATCH 01/34] Task 1 and project --- src/main/java/Main.java | 9 ++++++ src/main/java/homework/task1/Task1.java | 37 +++++++++++++++++++++++++ src/main/java/lesson_2/Main.java | 12 -------- 3 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/homework/task1/Task1.java delete mode 100644 src/main/java/lesson_2/Main.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..43d44680 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,9 @@ + + +public class Main { + + public static void main(String[] args) { + // empty main + } + +} diff --git a/src/main/java/homework/task1/Task1.java b/src/main/java/homework/task1/Task1.java new file mode 100644 index 00000000..8c83be7b --- /dev/null +++ b/src/main/java/homework/task1/Task1.java @@ -0,0 +1,37 @@ +package homework.task1; + +public class Task1 { + public static void main(String[] args){ + + if(args.length > 0) { + for (int i = 0; i < args.length; i++) { + + String toPrint = args[i]; + if (toPrint.matches("error")){ //checking for error + System.err.println("Alarm!"); + System.exit(0); + } + + toPrint = checkString(toPrint); + System.out.println("Argument:" + toPrint); + } + } + else System.exit(0); + } + + public static String checkString(String s){ // checking String length, return 8 symbol string + + int sLength = s.length(); + return switch (sLength) { + case 8 -> s; + case 7 -> s + "_"; + case 6 -> s + "__"; + case 5 -> s + "___"; + case 4 -> s + "____"; + case 3 -> s + "_____"; + case 2 -> s + "______"; + case 1 -> s + "_______"; + default -> s.substring(0, 7); + }; + } +} diff --git a/src/main/java/lesson_2/Main.java b/src/main/java/lesson_2/Main.java deleted file mode 100644 index ed30607a..00000000 --- a/src/main/java/lesson_2/Main.java +++ /dev/null @@ -1,12 +0,0 @@ -package lesson_2; - -import lesson_2.catbox.Cat1; - -public class Main { - - public static void main(String[] args) { - final int x = 5; - final Cat1 cat1 = new Cat1(); - } - -} From 766bfbed58bbfc3138f7b3ffb919c3937946a218 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 12 Jul 2021 19:59:36 +0300 Subject: [PATCH 02/34] Correct solution --- src/main/java/homework/task1/Task1.java | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/main/java/homework/task1/Task1.java b/src/main/java/homework/task1/Task1.java index 8c83be7b..3393cd25 100644 --- a/src/main/java/homework/task1/Task1.java +++ b/src/main/java/homework/task1/Task1.java @@ -8,30 +8,13 @@ public static void main(String[] args){ String toPrint = args[i]; if (toPrint.matches("error")){ //checking for error - System.err.println("Alarm!"); + System.out.println("____Alarm!____"); System.exit(0); } - toPrint = checkString(toPrint); - System.out.println("Argument:" + toPrint); + System.out.println("Argument: " + toPrint +", "+ toPrint.length() + " letter(s)"); } } else System.exit(0); } - - public static String checkString(String s){ // checking String length, return 8 symbol string - - int sLength = s.length(); - return switch (sLength) { - case 8 -> s; - case 7 -> s + "_"; - case 6 -> s + "__"; - case 5 -> s + "___"; - case 4 -> s + "____"; - case 3 -> s + "_____"; - case 2 -> s + "______"; - case 1 -> s + "_______"; - default -> s.substring(0, 7); - }; - } } From 53d43e902a7ccb99ca94abe08271719d4a631b11 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko <68565154+dvaschenko@users.noreply.github.com> Date: Mon, 12 Jul 2021 20:05:36 +0300 Subject: [PATCH 03/34] Create README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..a99d520f --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Java Core June 2021 + +## *Nikolaev Artem* + +| Number | Solution | Short description +| --- | --- | --- | +| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task1/Task1.java) | The app that reads input arguments and prints them, until "error" argument | + +[Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From a2d59f3a387e859158e91b203e3e07cbccd3d8b8 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko <68565154+dvaschenko@users.noreply.github.com> Date: Mon, 12 Jul 2021 20:06:28 +0300 Subject: [PATCH 04/34] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a99d520f..c721bfb6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Java Core June 2021 -## *Nikolaev Artem* +## *Vaschenko Dmitriy* | Number | Solution | Short description | --- | --- | --- | From 541303660c4a4dd10bb89833f65791328c89cb9b Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Tue, 13 Jul 2021 22:52:09 +0300 Subject: [PATCH 05/34] Red added, System.exit removed. --- src/main/java/homework/task1/Task1.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/homework/task1/Task1.java b/src/main/java/homework/task1/Task1.java index 3393cd25..f89a81a4 100644 --- a/src/main/java/homework/task1/Task1.java +++ b/src/main/java/homework/task1/Task1.java @@ -8,13 +8,19 @@ public static void main(String[] args){ String toPrint = args[i]; if (toPrint.matches("error")){ //checking for error - System.out.println("____Alarm!____"); - System.exit(0); + System.out.println(ConsoleCollors.RED + "Alarm!" + ConsoleCollors.RESET); + break; } System.out.println("Argument: " + toPrint +", "+ toPrint.length() + " letter(s)"); } } - else System.exit(0); + } + public static class ConsoleCollors{ + // Reset + public static final String RESET = "\033[0m"; // Text Reset + + // Red + public static final String RED = "\033[0;31m"; // RED } } From 7a1e360518a23a6f8f4d494e334065e5e8701dce Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Wed, 14 Jul 2021 21:00:17 +0300 Subject: [PATCH 06/34] HW 2.1 first attempt --- src/main/java/Main.java | 9 --- src/main/java/homework/Homework_2_1.java | 83 ++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/Main.java create mode 100644 src/main/java/homework/Homework_2_1.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java deleted file mode 100644 index 43d44680..00000000 --- a/src/main/java/Main.java +++ /dev/null @@ -1,9 +0,0 @@ - - -public class Main { - - public static void main(String[] args) { - // empty main - } - -} diff --git a/src/main/java/homework/Homework_2_1.java b/src/main/java/homework/Homework_2_1.java new file mode 100644 index 00000000..2b8b4672 --- /dev/null +++ b/src/main/java/homework/Homework_2_1.java @@ -0,0 +1,83 @@ +package homework; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Homework_2_1 { + public static void main(String[] args) { + + int allSeconds = getInput(); + + getLight(allSeconds); + + } + + public static int getInput(){ + String numbOfSeconds = null; + int allSeconds = 0; + + try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + numbOfSeconds = reader.readLine(); + } + catch (IOException e) { + e.printStackTrace(); + } + try { + if (numbOfSeconds != null) { + allSeconds = Integer.parseInt(numbOfSeconds); + } + } + catch (NumberFormatException e) { + System.out.println(ConsoleColors.RED + "Wrong input, only integers are allowed!" + ConsoleColors.RESET); + System.exit(0); // I don't know how to manage this place w/o System.exit, but would like to ;) + } + return allSeconds; + } + + public static int getOnlySeconds(int i){ //recursively subtracts full minutes from input + if (i < 60){ + return i; + } + int secs = i - 60; + if (secs < 60) { + return secs; + } + secs = getOnlySeconds(secs); + + return secs; + } + + public static void getLight (int i){ + while (true) { + if (i < 0) { + System.out.println(ConsoleColors.RED + "Only positive numbers are allowed!" + ConsoleColors.RESET); + break; + } else if (i > 86399) { + System.out.println(ConsoleColors.RED + "To late, the day is over!" + ConsoleColors.RESET); + break; + } + int seconds = getOnlySeconds(i); + + if ((seconds >= 0) && (seconds < 35)) { + System.out.println(ConsoleColors.GREEN + "Light is GREEN, go you may!" + ConsoleColors.RESET); + break; + } else if (((seconds >= 35) && (seconds < 40)) || (seconds >= 55)) { + System.out.println(ConsoleColors.YELLOW + "Light is YELLOW, be careful, please!" + ConsoleColors.RESET); + break; + } else { + System.out.println(ConsoleColors.RED + "Light is RED, stay where you are!!!" + ConsoleColors.RESET); + break; + } + } + } + + public static class ConsoleColors{ + // Reset + public static final String RESET = "\033[0m"; // Text Reset + + // Colors + public static final String RED = "\033[0;31m"; // RED + public static final String GREEN = "\033[0;32m"; // GREEN + public static final String YELLOW = "\033[0;33m"; // YELLOW + } +} From 1f1bf78f7964038bf1c04f6f4ff896a36282a41f Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Wed, 14 Jul 2021 21:11:49 +0300 Subject: [PATCH 07/34] Some package and readme changes --- README.md | 4 ++-- .../java/homework/{Homework_2_1.java => task2/Task_2_1.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/homework/{Homework_2_1.java => task2/Task_2_1.java} (98%) diff --git a/README.md b/README.md index c721bfb6..c2bb1235 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,6 @@ | Number | Solution | Short description | --- | --- | --- | -| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task1/Task1.java) | The app that reads input arguments and prints them, until "error" argument | - +| HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task1/Task1.java) | The app that reads input arguments and prints them, until "error" argument | +| HW 2.1 |[Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task2/Task_2_1.java) | Traffic Light app, the simple one. [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework/Homework_2_1.java b/src/main/java/homework/task2/Task_2_1.java similarity index 98% rename from src/main/java/homework/Homework_2_1.java rename to src/main/java/homework/task2/Task_2_1.java index 2b8b4672..0e789c18 100644 --- a/src/main/java/homework/Homework_2_1.java +++ b/src/main/java/homework/task2/Task_2_1.java @@ -1,9 +1,9 @@ -package homework; +package homework.task2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -public class Homework_2_1 { +public class Task_2_1 { public static void main(String[] args) { int allSeconds = getInput(); From 2a866b0625be499e014f215722b0217a5e757bc3 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Wed, 14 Jul 2021 21:35:47 +0300 Subject: [PATCH 08/34] HW 2 task 2 --- README.md | 5 ++- src/main/java/homework/task2/Task_2_2.java | 52 ++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/main/java/homework/task2/Task_2_2.java diff --git a/README.md b/README.md index c2bb1235..659a3744 100644 --- a/README.md +++ b/README.md @@ -5,5 +5,8 @@ | Number | Solution | Short description | --- | --- | --- | | HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task1/Task1.java) | The app that reads input arguments and prints them, until "error" argument | -| HW 2.1 |[Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task2/Task_2_1.java) | Traffic Light app, the simple one. +| HW 2_1 |[Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task2/Task_2_1.java) | Traffic Light app, the simple one. +|HW 2_2|[Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task2/Task_2_2.java)| The Pyramid printer, prints triangles only, btw. + + [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework/task2/Task_2_2.java b/src/main/java/homework/task2/Task_2_2.java new file mode 100644 index 00000000..8bdd0edb --- /dev/null +++ b/src/main/java/homework/task2/Task_2_2.java @@ -0,0 +1,52 @@ +package homework.task2; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Task_2_2 { + // The Pyramid printer, or rather triangle printer. + + public static void main(String[] args){ + int sizeOfPyramid = getInput(); + + printPyramid(sizeOfPyramid); + } + + public static int getInput(){ + String pSize = null; + int result = 0; + + try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){ + pSize = reader.readLine(); + } + catch (IOException e) { + e.printStackTrace(); + } + try { + if (pSize != null) { + result = Integer.parseInt(pSize); + } + } + catch (NumberFormatException e) { + System.out.println("Wrong input, only integers are allowed!"); + System.exit(0); // I don't know how to manage this place w/o System.exit, but would like to ;) + } // once again, yep + return result; + } + + public static void printPyramid(int i){ + int rows = i; + for (int j = 0; j < rows; j++ ){ + System.out.println(getRow(j)); + } + } + + public static String getRow(int i){ + StringBuilder row = new StringBuilder(); + for (int j = 0; j <= i; j++){ + row.append('x'); + } + return row.toString(); + } +} From 460d1ef6956a7b3fb47e6159bb019a06a8a10234 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 18 Jul 2021 23:30:17 +0300 Subject: [PATCH 09/34] HW 2 done tasks and HW 1 fixed. --- README.md | 2 +- src/main/java/homework/ConsoleColors.java | 10 ++ .../task1/{Task1.java => ConsolePrinter.java} | 11 +- .../{Task_2_2.java => PyramidPrinter.java} | 5 +- .../java/homework/task2/RandomCharsTable.java | 114 ++++++++++++++++++ .../{Task_2_1.java => TrafficLight.java} | 48 +++----- 6 files changed, 150 insertions(+), 40 deletions(-) create mode 100644 src/main/java/homework/ConsoleColors.java rename src/main/java/homework/task1/{Task1.java => ConsolePrinter.java} (59%) rename src/main/java/homework/task2/{Task_2_2.java => PyramidPrinter.java} (94%) create mode 100644 src/main/java/homework/task2/RandomCharsTable.java rename src/main/java/homework/task2/{Task_2_1.java => TrafficLight.java} (67%) diff --git a/README.md b/README.md index 659a3744..626ec035 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Java Core June 2021 -## *Vaschenko Dmitriy* +## *Vashchenko Dmitriy* | Number | Solution | Short description | --- | --- | --- | diff --git a/src/main/java/homework/ConsoleColors.java b/src/main/java/homework/ConsoleColors.java new file mode 100644 index 00000000..59293a7c --- /dev/null +++ b/src/main/java/homework/ConsoleColors.java @@ -0,0 +1,10 @@ +package homework; + + public class ConsoleColors{ + + public static final String RESET = "\033[0m"; + public static final String RED = "\033[0;31m"; + public static final String GREEN = "\033[0;32m"; + public static final String YELLOW = "\033[0;33m"; + } + diff --git a/src/main/java/homework/task1/Task1.java b/src/main/java/homework/task1/ConsolePrinter.java similarity index 59% rename from src/main/java/homework/task1/Task1.java rename to src/main/java/homework/task1/ConsolePrinter.java index f89a81a4..076b0704 100644 --- a/src/main/java/homework/task1/Task1.java +++ b/src/main/java/homework/task1/ConsolePrinter.java @@ -1,6 +1,7 @@ package homework.task1; +import homework.ConsoleColors; -public class Task1 { +public class ConsolePrinter { public static void main(String[] args){ if(args.length > 0) { @@ -8,7 +9,7 @@ public static void main(String[] args){ String toPrint = args[i]; if (toPrint.matches("error")){ //checking for error - System.out.println(ConsoleCollors.RED + "Alarm!" + ConsoleCollors.RESET); + System.out.println(ConsoleColors.RED + "Alarm!" + ConsoleColors.RESET); break; } @@ -16,11 +17,5 @@ public static void main(String[] args){ } } } - public static class ConsoleCollors{ - // Reset - public static final String RESET = "\033[0m"; // Text Reset - // Red - public static final String RED = "\033[0;31m"; // RED - } } diff --git a/src/main/java/homework/task2/Task_2_2.java b/src/main/java/homework/task2/PyramidPrinter.java similarity index 94% rename from src/main/java/homework/task2/Task_2_2.java rename to src/main/java/homework/task2/PyramidPrinter.java index 8bdd0edb..42fae633 100644 --- a/src/main/java/homework/task2/Task_2_2.java +++ b/src/main/java/homework/task2/PyramidPrinter.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.io.InputStreamReader; -public class Task_2_2 { +public class PyramidPrinter { // The Pyramid printer, or rather triangle printer. public static void main(String[] args){ @@ -36,8 +36,7 @@ public static int getInput(){ } public static void printPyramid(int i){ - int rows = i; - for (int j = 0; j < rows; j++ ){ + for (int j = 0; j < i; j++ ){ System.out.println(getRow(j)); } } diff --git a/src/main/java/homework/task2/RandomCharsTable.java b/src/main/java/homework/task2/RandomCharsTable.java new file mode 100644 index 00000000..a150e581 --- /dev/null +++ b/src/main/java/homework/task2/RandomCharsTable.java @@ -0,0 +1,114 @@ +package homework.task2; + +import homework.ConsoleColors; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; + +public class RandomCharsTable { + + public static void main(String[] args) throws IOException { + RandomCharsTable table = new RandomCharsTable(); + + char[][] toPrint = table.getTable(); + + System.out.println("There is an unsorted table:"); + + for (char[] ch : toPrint + ) { + System.out.println(ch); + } + + String method = table.getMethod(); + + String sorted = table.getSorted(toPrint, method); + + System.out.println(sorted); + + } + + + public char[][] getTable() throws IOException { + int len; + int wid; + System.out.println("Enter table's length and width, please, 2 integers are expected."); + + BufferedReader reader = getReader(); + len = Integer.parseInt(reader.readLine()); + wid = Integer.parseInt(reader.readLine()); + + char[][] res = new char[len][wid]; + + for (int i = 0; i < len; i++) { + for (int j = 0; j < wid; j++) { + res[i][j] = (char) ((Math.random() * (91 - 65) + 65)); + } + } + + return res; + } + + public String getMethod() throws IOException { + String method = ""; + + System.out.println("Enter even or odd, please."); + + BufferedReader reader = getReader(); + String methodRAW = reader.readLine(); + + if (methodRAW.equals("even") || methodRAW.equals("odd")) { + method = methodRAW; + } else { + System.out.println(ConsoleColors.RED + "Wrong input, enter even or odd, please!" + ConsoleColors.RESET); + getMethod(); + } + + reader.close(); + + return method; + } + + public String getSorted(char[][] table, String method) { + StringBuilder result = new StringBuilder(); + + switch (method) { + case ("odd"): + result.append("Odd letters - "); + for (char[] ch : table + ) + for (char c : ch + ) { + + if ((c % 2) != 0) { + result.append(c); + result.append(','); + } + } + break; + case ("even"): + result.append("Even letters - "); + for (char[] ch : table + ) + for (char c : ch + ) { + if ((c % 2) == 0) { + + result.append(c); + result.append(','); + } + } + break; + } + String res = result.toString(); + return res.substring(0, res.length() - 1); + + + } + + public static BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(System.in)); + } + +} diff --git a/src/main/java/homework/task2/Task_2_1.java b/src/main/java/homework/task2/TrafficLight.java similarity index 67% rename from src/main/java/homework/task2/Task_2_1.java rename to src/main/java/homework/task2/TrafficLight.java index 0e789c18..1cbbb696 100644 --- a/src/main/java/homework/task2/Task_2_1.java +++ b/src/main/java/homework/task2/TrafficLight.java @@ -1,53 +1,54 @@ package homework.task2; + +import homework.ConsoleColors; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -public class Task_2_1 { +public class TrafficLight { public static void main(String[] args) { - + System.out.println("Enter the number, please."); int allSeconds = getInput(); getLight(allSeconds); } - public static int getInput(){ + public static int getInput() { String numbOfSeconds = null; int allSeconds = 0; - try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { numbOfSeconds = reader.readLine(); - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); } try { if (numbOfSeconds != null) { allSeconds = Integer.parseInt(numbOfSeconds); } - } - catch (NumberFormatException e) { + } catch (NumberFormatException e) { System.out.println(ConsoleColors.RED + "Wrong input, only integers are allowed!" + ConsoleColors.RESET); System.exit(0); // I don't know how to manage this place w/o System.exit, but would like to ;) } return allSeconds; } - public static int getOnlySeconds(int i){ //recursively subtracts full minutes from input - if (i < 60){ - return i; - } - int secs = i - 60; - if (secs < 60) { - return secs; - } - secs = getOnlySeconds(secs); + public static int getOnlySeconds(int i) { //recursively subtracts full minutes from input + if (i < 60) { + return i; + } + int secs = i - 60; + if (secs < 60) { + return secs; + } + secs = getOnlySeconds(secs); - return secs; + return secs; } - public static void getLight (int i){ + public static void getLight(int i) { while (true) { if (i < 0) { System.out.println(ConsoleColors.RED + "Only positive numbers are allowed!" + ConsoleColors.RESET); @@ -71,13 +72,4 @@ public static void getLight (int i){ } } - public static class ConsoleColors{ - // Reset - public static final String RESET = "\033[0m"; // Text Reset - - // Colors - public static final String RED = "\033[0;31m"; // RED - public static final String GREEN = "\033[0;32m"; // GREEN - public static final String YELLOW = "\033[0;33m"; // YELLOW - } } From dec261fb79ab1a30633d7ce7ebaaaab5ded59286 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 18 Jul 2021 23:36:08 +0300 Subject: [PATCH 10/34] fixed output --- src/main/java/homework/task1/ConsolePrinter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/homework/task1/ConsolePrinter.java b/src/main/java/homework/task1/ConsolePrinter.java index 076b0704..7a1befc8 100644 --- a/src/main/java/homework/task1/ConsolePrinter.java +++ b/src/main/java/homework/task1/ConsolePrinter.java @@ -13,7 +13,7 @@ public static void main(String[] args){ break; } - System.out.println("Argument: " + toPrint +", "+ toPrint.length() + " letter(s)"); + System.out.println(toPrint +" : "+ toPrint.length() + " letter(s)"); } } } From c08445407038afaea1ca4b4f68fe76a1f49afce7 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 25 Jul 2021 12:14:26 +0300 Subject: [PATCH 11/34] Added some tests, HW 2 done --- README.md | 11 +- settings.gradle | 1 + src/main/java/homework/ConsoleColors.java | 1 + .../{task1 => homework_1}/ConsolePrinter.java | 11 +- .../homework_2/pyramid_printer/Main.java | 7 + .../pyramid_printer/PyramidPrinter.java | 59 ++++++++ .../homework_2/random_chars_table/Main.java | 9 ++ .../random_chars_table/RandomCharsTable.java | 133 ++++++++++++++++++ .../homework_2/traffic_light/Main.java | 4 + .../traffic_light}/TrafficLight.java | 2 +- .../java/homework/task2/PyramidPrinter.java | 51 ------- .../java/homework/task2/RandomCharsTable.java | 114 --------------- src/main/java/homework_1/Main.java | 9 -- .../homework_1/ConsolePrinterTest.java | 7 + .../pyramid_printer/PyramidPrinterTest.java | 94 +++++++++++++ .../RandomCharsTableTest.java | 32 +++++ .../traffic_light/TrafficLightTest.java | 7 + 17 files changed, 368 insertions(+), 184 deletions(-) rename src/main/java/homework/{task1 => homework_1}/ConsolePrinter.java (52%) create mode 100644 src/main/java/homework/homework_2/pyramid_printer/Main.java create mode 100644 src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java create mode 100644 src/main/java/homework/homework_2/random_chars_table/Main.java create mode 100644 src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java create mode 100644 src/main/java/homework/homework_2/traffic_light/Main.java rename src/main/java/homework/{task2 => homework_2/traffic_light}/TrafficLight.java (98%) delete mode 100644 src/main/java/homework/task2/PyramidPrinter.java delete mode 100644 src/main/java/homework/task2/RandomCharsTable.java delete mode 100644 src/main/java/homework_1/Main.java create mode 100644 src/test/java/homework/homework_1/ConsolePrinterTest.java create mode 100644 src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java create mode 100644 src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java create mode 100644 src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java diff --git a/README.md b/README.md index 4386e0b6..6967860c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ # Java Core June 2021 -## *Vashchenko Dmitriy* +## *Vaschenko Dmitriy* | Number | Solution | Short description | --- | --- | --- | -| HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task1/Task1.java) | The app that reads input arguments and prints them, until "error" argument | -| HW 2_1 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task2/Task_2_1.java) | Traffic Light app, the simple one. | -| HW 2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/task2/Task_2_2.java) | The Pyramid printer, prints triangles only, btw. | +| HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_1/ConsolePrinter.java) | The app that reads input arguments and prints them, until "error" argument | +| HW 2_1 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_2/traffic_light/TrafficLight.java) | Traffic Light app, the simple one. | +| HW 2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_2/pyramid_printer//PyramidPrinter.java) | The Pyramid printer, prints triangles only, btw. | +| HW 2_3| [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_2/random_chars_table//RandomCharsTable.java) | Random chars table, prints table with chars and then sorts them by even or odd. +[Link to CodingBat](https://codingbat.com/done?user=dvaschenko33@gmail.com&tag=4651459890) + [Link to markdown guide](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/settings.gradle b/settings.gradle index 61b34d09..f53a86ae 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ rootProject.name = 'Java Core June 2021' +include 'test' diff --git a/src/main/java/homework/ConsoleColors.java b/src/main/java/homework/ConsoleColors.java index 59293a7c..79acf1d3 100644 --- a/src/main/java/homework/ConsoleColors.java +++ b/src/main/java/homework/ConsoleColors.java @@ -6,5 +6,6 @@ public class ConsoleColors{ public static final String RED = "\033[0;31m"; public static final String GREEN = "\033[0;32m"; public static final String YELLOW = "\033[0;33m"; + //set red } diff --git a/src/main/java/homework/task1/ConsolePrinter.java b/src/main/java/homework/homework_1/ConsolePrinter.java similarity index 52% rename from src/main/java/homework/task1/ConsolePrinter.java rename to src/main/java/homework/homework_1/ConsolePrinter.java index 7a1befc8..72445451 100644 --- a/src/main/java/homework/task1/ConsolePrinter.java +++ b/src/main/java/homework/homework_1/ConsolePrinter.java @@ -1,19 +1,20 @@ -package homework.task1; +package homework.homework_1; + import homework.ConsoleColors; public class ConsolePrinter { - public static void main(String[] args){ + public static void main(String[] args) { - if(args.length > 0) { + if (args.length > 0) { for (int i = 0; i < args.length; i++) { String toPrint = args[i]; - if (toPrint.matches("error")){ //checking for error + if (toPrint.matches("error")) { //checking for error System.out.println(ConsoleColors.RED + "Alarm!" + ConsoleColors.RESET); break; } - System.out.println(toPrint +" : "+ toPrint.length() + " letter(s)"); + System.out.println(toPrint + " : " + toPrint.length() + " letter(s)"); } } } diff --git a/src/main/java/homework/homework_2/pyramid_printer/Main.java b/src/main/java/homework/homework_2/pyramid_printer/Main.java new file mode 100644 index 00000000..1c750dd5 --- /dev/null +++ b/src/main/java/homework/homework_2/pyramid_printer/Main.java @@ -0,0 +1,7 @@ +package homework.homework_2.pyramid_printer; + +public class Main { + public static void main(String[] args) { + new PyramidPrinter().run(); + } +} diff --git a/src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java new file mode 100644 index 00000000..bd53f269 --- /dev/null +++ b/src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java @@ -0,0 +1,59 @@ +package homework.homework_2.pyramid_printer; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class PyramidPrinter { + + + public static void main(String[] args) { + + } + + public void run() { + int sizeOfPyramid = getInput(); + + printPyramid(sizeOfPyramid); + } + + private static int getInput() { + String pSize = null; + int result = 0; + System.out.println("Enter the Pyramid size. please: "); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + pSize = reader.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (pSize != null) { + result = Integer.parseInt(pSize); + } + else { + System.out.println("Empty or too big inputs are not allowed!"); + } + } catch (NumberFormatException e) { + System.out.println("Wrong input, only integers are allowed!"); + } + if (result <0) { + System.out.println("Negative numbers are not allowed!"); + } + return result; + } + + private static void printPyramid(int i) { + for (int j = 0; j < i; j++) { + System.out.println(getRow(j)); + } + } + + private static String getRow(int i) { + StringBuilder row = new StringBuilder(); + for (int j = 0; j <= i; j++) { + row.append('x'); + } + return row.toString(); + } +} diff --git a/src/main/java/homework/homework_2/random_chars_table/Main.java b/src/main/java/homework/homework_2/random_chars_table/Main.java new file mode 100644 index 00000000..a7e50576 --- /dev/null +++ b/src/main/java/homework/homework_2/random_chars_table/Main.java @@ -0,0 +1,9 @@ +package homework.homework_2.random_chars_table; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + new RandomCharsTable().run(); + } +} diff --git a/src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java new file mode 100644 index 00000000..f9ee5456 --- /dev/null +++ b/src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java @@ -0,0 +1,133 @@ +package homework.homework_2.random_chars_table; + +import homework.ConsoleColors; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; + +public class RandomCharsTable { + private final String error = "Wrong input!"; + + public static void main(String[] args) { + + } + + public void run() { + + RandomCharsTable table = new RandomCharsTable(); + + String lenStr = null; + String widStr = null; + String method = null; + + String[] strings = table.getInput(); + + if(strings.length == 3){ + lenStr = strings[0]; + widStr = strings[1]; + method = strings[2]; + } + else { + System.out.println(error); + } + + char[][] toPrint = table.getTable(lenStr, widStr); + + System.out.println("There is an unsorted table:"); + + for (char[] ch : toPrint + ) { + System.out.println(ch); + } + + + table.printSorted(toPrint, method); + + } + + private String[] getInput() { + + String[] result = new String[3]; + + System.out.println("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + + String rawInput = reader.readLine(); + result = rawInput.split(" "); + + } catch (IOException e) { + System.out.println(error); + } + + return result; + } + + private char[][] getTable(String length, String width) { + int len = 0; + int wid = 0; + if (length != null && width != null) { + len = Integer.parseInt(length); + wid = Integer.parseInt(width); + } + else { + System.out.println(error); + } + + char[][] res = new char[len][wid]; + + for (int i = 0; i < len; i++) { + for (int j = 0; j < wid; j++) { + res[i][j] = (char) ((Math.random() * (91 - 65) + 65)); + } + } + + return res; + } + + private void printSorted(char[][] table, String method) { + StringBuilder result = new StringBuilder(); + if (method != null) { + switch (method) { + case ("odd"): + result.append("Odd letters - "); + for (char[] ch : table + ) + for (char c : ch + ) { + + if ((c % 2) != 0) { + result.append(c); + result.append(','); + } + } + String res = result.toString(); + System.out.println(res.substring(0, res.length() - 1) + "."); + break; + case ("even"): + result.append("Even letters - "); + for (char[] ch : table + ) + for (char c : ch + ) { + if ((c % 2) == 0) { + + result.append(c); + result.append(','); + } + } + String res1 = result.toString(); + System.out.println(res1.substring(0, res1.length() - 1) + "."); + break; + default: + System.out.println(error + " Unknown method!"); + } + } + else { + System.out.println(error); + } + } +} diff --git a/src/main/java/homework/homework_2/traffic_light/Main.java b/src/main/java/homework/homework_2/traffic_light/Main.java new file mode 100644 index 00000000..745907b0 --- /dev/null +++ b/src/main/java/homework/homework_2/traffic_light/Main.java @@ -0,0 +1,4 @@ +package homework.homework_2.traffic_light; + +public class Main { +} diff --git a/src/main/java/homework/task2/TrafficLight.java b/src/main/java/homework/homework_2/traffic_light/TrafficLight.java similarity index 98% rename from src/main/java/homework/task2/TrafficLight.java rename to src/main/java/homework/homework_2/traffic_light/TrafficLight.java index 1cbbb696..065ad6f7 100644 --- a/src/main/java/homework/task2/TrafficLight.java +++ b/src/main/java/homework/homework_2/traffic_light/TrafficLight.java @@ -1,4 +1,4 @@ -package homework.task2; +package homework.homework_2.traffic_light; import homework.ConsoleColors; diff --git a/src/main/java/homework/task2/PyramidPrinter.java b/src/main/java/homework/task2/PyramidPrinter.java deleted file mode 100644 index 42fae633..00000000 --- a/src/main/java/homework/task2/PyramidPrinter.java +++ /dev/null @@ -1,51 +0,0 @@ -package homework.task2; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -public class PyramidPrinter { - // The Pyramid printer, or rather triangle printer. - - public static void main(String[] args){ - int sizeOfPyramid = getInput(); - - printPyramid(sizeOfPyramid); - } - - public static int getInput(){ - String pSize = null; - int result = 0; - - try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){ - pSize = reader.readLine(); - } - catch (IOException e) { - e.printStackTrace(); - } - try { - if (pSize != null) { - result = Integer.parseInt(pSize); - } - } - catch (NumberFormatException e) { - System.out.println("Wrong input, only integers are allowed!"); - System.exit(0); // I don't know how to manage this place w/o System.exit, but would like to ;) - } // once again, yep - return result; - } - - public static void printPyramid(int i){ - for (int j = 0; j < i; j++ ){ - System.out.println(getRow(j)); - } - } - - public static String getRow(int i){ - StringBuilder row = new StringBuilder(); - for (int j = 0; j <= i; j++){ - row.append('x'); - } - return row.toString(); - } -} diff --git a/src/main/java/homework/task2/RandomCharsTable.java b/src/main/java/homework/task2/RandomCharsTable.java deleted file mode 100644 index a150e581..00000000 --- a/src/main/java/homework/task2/RandomCharsTable.java +++ /dev/null @@ -1,114 +0,0 @@ -package homework.task2; - -import homework.ConsoleColors; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; - -public class RandomCharsTable { - - public static void main(String[] args) throws IOException { - RandomCharsTable table = new RandomCharsTable(); - - char[][] toPrint = table.getTable(); - - System.out.println("There is an unsorted table:"); - - for (char[] ch : toPrint - ) { - System.out.println(ch); - } - - String method = table.getMethod(); - - String sorted = table.getSorted(toPrint, method); - - System.out.println(sorted); - - } - - - public char[][] getTable() throws IOException { - int len; - int wid; - System.out.println("Enter table's length and width, please, 2 integers are expected."); - - BufferedReader reader = getReader(); - len = Integer.parseInt(reader.readLine()); - wid = Integer.parseInt(reader.readLine()); - - char[][] res = new char[len][wid]; - - for (int i = 0; i < len; i++) { - for (int j = 0; j < wid; j++) { - res[i][j] = (char) ((Math.random() * (91 - 65) + 65)); - } - } - - return res; - } - - public String getMethod() throws IOException { - String method = ""; - - System.out.println("Enter even or odd, please."); - - BufferedReader reader = getReader(); - String methodRAW = reader.readLine(); - - if (methodRAW.equals("even") || methodRAW.equals("odd")) { - method = methodRAW; - } else { - System.out.println(ConsoleColors.RED + "Wrong input, enter even or odd, please!" + ConsoleColors.RESET); - getMethod(); - } - - reader.close(); - - return method; - } - - public String getSorted(char[][] table, String method) { - StringBuilder result = new StringBuilder(); - - switch (method) { - case ("odd"): - result.append("Odd letters - "); - for (char[] ch : table - ) - for (char c : ch - ) { - - if ((c % 2) != 0) { - result.append(c); - result.append(','); - } - } - break; - case ("even"): - result.append("Even letters - "); - for (char[] ch : table - ) - for (char c : ch - ) { - if ((c % 2) == 0) { - - result.append(c); - result.append(','); - } - } - break; - } - String res = result.toString(); - return res.substring(0, res.length() - 1); - - - } - - public static BufferedReader getReader() { - return new BufferedReader(new InputStreamReader(System.in)); - } - -} diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java deleted file mode 100644 index 07c029a2..00000000 --- a/src/main/java/homework_1/Main.java +++ /dev/null @@ -1,9 +0,0 @@ -package homework_1; - -public class Main { - - public static void main(String[] args) { - System.out.println("Hello homework!"); - } - -} diff --git a/src/test/java/homework/homework_1/ConsolePrinterTest.java b/src/test/java/homework/homework_1/ConsolePrinterTest.java new file mode 100644 index 00000000..f029361b --- /dev/null +++ b/src/test/java/homework/homework_1/ConsolePrinterTest.java @@ -0,0 +1,7 @@ +package homework.homework_1; + +import static org.junit.jupiter.api.Assertions.*; + +class ConsolePrinterTest { + +} \ No newline at end of file diff --git a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java new file mode 100644 index 00000000..ad73142b --- /dev/null +++ b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -0,0 +1,94 @@ +package homework.homework_2.pyramid_printer; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.*; + +class PyramidPrinterTest extends UnitBase { + @Test + void givenPositiveInt_whenInputIsThree_thenPrintPyramid() { + setInput("3"); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("x", getOutputLines()[0]); + assertEquals("xx", getOutputLines()[1]); + assertEquals("xxx", getOutputLines()[2]); + + } + + @Test + void givenZero_whenZeroInInput_thenDoNothing() { + setInput("0"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Enter the Pyramid size. please: "); + assertEquals("", getOutputLines()[0]); + } + + @Test + void givenNothing_whenEmptyInput_thenWriteErrMsgAndStop() { + setInput(""); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("Empty or too big inputs are not allowed!", getOutputLines()[0]); + } + + @Test + void givenString_whenStringInput_thenWriteErrMsgAndStop() { + setInput("Some string"); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + } + + @Test + void givenToBigNumber_whenInputBiggerIntMAX_thenWriteErrMsgAndStop() { + setInput("999999999999"); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + } + + @Test + void givenNegativeNumber_whenInputLessThanZero_thenWriteErrMsgAndStop() { + setInput("-1"); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("Negative numbers are not allowed!", getOutputLines()[0]); + } + + @Test + void givenNotOneArg_whenInputIsDivided_thenWriteErrMsgAndStop() { + setInput("2 3"); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + } + + @Test + void givenNotInteger_whenDouble_thenWriteErrMsgAndStop() { + setInput("0.6"); + + new PyramidPrinter().run(); + removeFromOutput("Enter the Pyramid size. please: "); + printOut(); + assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + } + + +} \ No newline at end of file diff --git a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java new file mode 100644 index 00000000..529a4b11 --- /dev/null +++ b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java @@ -0,0 +1,32 @@ +package homework.homework_2.random_chars_table; + +import base.UnitBase; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomCharsTableTest extends UnitBase { + char[] allChars = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', + 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; + + + @Test + public void givenCorrectInput_whenTwoIntAndCorrectString_thenAllGood() { + setInput("4 4 odd"); + + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + removeFromOutput("There is an unsorted table:"); + boolean inRange = false; + + + + } + +} \ No newline at end of file diff --git a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java new file mode 100644 index 00000000..5620c060 --- /dev/null +++ b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java @@ -0,0 +1,7 @@ +package homework.homework_2.traffic_light; + +import static org.junit.jupiter.api.Assertions.*; + +class TrafficLightTest { + +} \ No newline at end of file From 2f7c00c79e061c557b316b8b21f5279849fb942e Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 2 Aug 2021 20:23:19 +0300 Subject: [PATCH 12/34] PyramidPrinter with tests are done. --- .../ConsoleColors.java | 9 ++++-- .../homework_2/traffic_light/Main.java | 4 --- .../homework_1/ConsolePrinter.java | 4 +-- .../homework_2/pyramid_printer/Main.java | 2 +- .../pyramid_printer/PyramidPrinter.java | 20 +++++------- .../homework_2/random_chars_table/Main.java | 2 +- .../random_chars_table/RandomCharsTable.java | 32 +++++++++++-------- .../java/homework_2/traffic_light/Main.java | 7 ++++ .../traffic_light/TrafficLight.java | 14 ++++---- .../homework_1/ConsolePrinterTest.java | 2 -- .../pyramid_printer/PyramidPrinterTest.java | 13 ++++---- .../RandomCharsTableTest.java | 9 +----- .../traffic_light/TrafficLightTest.java | 2 -- 13 files changed, 59 insertions(+), 61 deletions(-) rename src/main/java/{homework => ConsoleColors}/ConsoleColors.java (65%) delete mode 100644 src/main/java/homework/homework_2/traffic_light/Main.java rename src/main/java/{homework => }/homework_1/ConsolePrinter.java (90%) rename src/main/java/{homework => }/homework_2/pyramid_printer/Main.java (70%) rename src/main/java/{homework => }/homework_2/pyramid_printer/PyramidPrinter.java (70%) rename src/main/java/{homework => }/homework_2/random_chars_table/Main.java (76%) rename src/main/java/{homework => }/homework_2/random_chars_table/RandomCharsTable.java (83%) create mode 100644 src/main/java/homework_2/traffic_light/Main.java rename src/main/java/{homework => }/homework_2/traffic_light/TrafficLight.java (88%) diff --git a/src/main/java/homework/ConsoleColors.java b/src/main/java/ConsoleColors/ConsoleColors.java similarity index 65% rename from src/main/java/homework/ConsoleColors.java rename to src/main/java/ConsoleColors/ConsoleColors.java index 79acf1d3..83c4c8d3 100644 --- a/src/main/java/homework/ConsoleColors.java +++ b/src/main/java/ConsoleColors/ConsoleColors.java @@ -1,11 +1,14 @@ -package homework; +package ConsoleColors; - public class ConsoleColors{ +import java.util.HashMap; +import java.util.concurrent.ThreadFactory; + +public class ConsoleColors{ public static final String RESET = "\033[0m"; public static final String RED = "\033[0;31m"; public static final String GREEN = "\033[0;32m"; public static final String YELLOW = "\033[0;33m"; - //set red + } diff --git a/src/main/java/homework/homework_2/traffic_light/Main.java b/src/main/java/homework/homework_2/traffic_light/Main.java deleted file mode 100644 index 745907b0..00000000 --- a/src/main/java/homework/homework_2/traffic_light/Main.java +++ /dev/null @@ -1,4 +0,0 @@ -package homework.homework_2.traffic_light; - -public class Main { -} diff --git a/src/main/java/homework/homework_1/ConsolePrinter.java b/src/main/java/homework_1/ConsolePrinter.java similarity index 90% rename from src/main/java/homework/homework_1/ConsolePrinter.java rename to src/main/java/homework_1/ConsolePrinter.java index 72445451..baf15176 100644 --- a/src/main/java/homework/homework_1/ConsolePrinter.java +++ b/src/main/java/homework_1/ConsolePrinter.java @@ -1,6 +1,6 @@ -package homework.homework_1; +package homework_1; -import homework.ConsoleColors; +import ConsoleColors.ConsoleColors; public class ConsolePrinter { public static void main(String[] args) { diff --git a/src/main/java/homework/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java similarity index 70% rename from src/main/java/homework/homework_2/pyramid_printer/Main.java rename to src/main/java/homework_2/pyramid_printer/Main.java index 1c750dd5..e50e37eb 100644 --- a/src/main/java/homework/homework_2/pyramid_printer/Main.java +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -1,4 +1,4 @@ -package homework.homework_2.pyramid_printer; +package homework_2.pyramid_printer; public class Main { public static void main(String[] args) { diff --git a/src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java similarity index 70% rename from src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java rename to src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index bd53f269..0f6e5cfd 100644 --- a/src/main/java/homework/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -1,15 +1,11 @@ -package homework.homework_2.pyramid_printer; +package homework_2.pyramid_printer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class PyramidPrinter { - - - public static void main(String[] args) { - - } + final String ERROR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; public void run() { int sizeOfPyramid = getInput(); @@ -17,7 +13,7 @@ public void run() { printPyramid(sizeOfPyramid); } - private static int getInput() { + private int getInput() { String pSize = null; int result = 0; System.out.println("Enter the Pyramid size. please: "); @@ -32,24 +28,24 @@ private static int getInput() { result = Integer.parseInt(pSize); } else { - System.out.println("Empty or too big inputs are not allowed!"); + System.out.println(ERROR_MSG); } } catch (NumberFormatException e) { - System.out.println("Wrong input, only integers are allowed!"); + System.out.println(ERROR_MSG); } if (result <0) { - System.out.println("Negative numbers are not allowed!"); + System.out.println(ERROR_MSG); } return result; } - private static void printPyramid(int i) { + private void printPyramid(int i) { for (int j = 0; j < i; j++) { System.out.println(getRow(j)); } } - private static String getRow(int i) { + private String getRow(int i) { StringBuilder row = new StringBuilder(); for (int j = 0; j <= i; j++) { row.append('x'); diff --git a/src/main/java/homework/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java similarity index 76% rename from src/main/java/homework/homework_2/random_chars_table/Main.java rename to src/main/java/homework_2/random_chars_table/Main.java index a7e50576..0deac1b2 100644 --- a/src/main/java/homework/homework_2/random_chars_table/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -1,4 +1,4 @@ -package homework.homework_2.random_chars_table; +package homework_2.random_chars_table; import java.io.IOException; diff --git a/src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java similarity index 83% rename from src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java rename to src/main/java/homework_2/random_chars_table/RandomCharsTable.java index f9ee5456..fa38c6f8 100644 --- a/src/main/java/homework/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,20 +1,12 @@ -package homework.homework_2.random_chars_table; - -import homework.ConsoleColors; +package homework_2.random_chars_table; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Arrays; public class RandomCharsTable { private final String error = "Wrong input!"; - public static void main(String[] args) { - - } - public void run() { RandomCharsTable table = new RandomCharsTable(); @@ -25,14 +17,11 @@ public void run() { String[] strings = table.getInput(); - if(strings.length == 3){ + if (isValid(strings)){ lenStr = strings[0]; widStr = strings[1]; method = strings[2]; } - else { - System.out.println(error); - } char[][] toPrint = table.getTable(lenStr, widStr); @@ -130,4 +119,21 @@ private void printSorted(char[][] table, String method) { System.out.println(error); } } + + private boolean isValid(String[] strings){ + boolean firstDigit = false; + boolean secondDigit = false; + boolean oddOrEven = false; + + if (strings.length < 3){ + return false; + } + else if(strings.length == 3){ + firstDigit = strings[0].chars().allMatch( Character::isDigit ); + secondDigit = strings[1].chars().allMatch( Character::isDigit ); + oddOrEven = (strings[2].equals("odd") || strings[2].equals("even")); + } + + return (firstDigit && secondDigit && oddOrEven); + } } diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java new file mode 100644 index 00000000..fa033081 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -0,0 +1,7 @@ +package homework_2.traffic_light; + +public class Main { + public static void main(String[] args) { + new TrafficLight().run(); + } +} diff --git a/src/main/java/homework/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java similarity index 88% rename from src/main/java/homework/homework_2/traffic_light/TrafficLight.java rename to src/main/java/homework_2/traffic_light/TrafficLight.java index 065ad6f7..30432074 100644 --- a/src/main/java/homework/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -1,21 +1,21 @@ -package homework.homework_2.traffic_light; +package homework_2.traffic_light; -import homework.ConsoleColors; +import ConsoleColors.ConsoleColors; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class TrafficLight { - public static void main(String[] args) { + + public void run(){ System.out.println("Enter the number, please."); int allSeconds = getInput(); getLight(allSeconds); - } - public static int getInput() { + private static int getInput() { String numbOfSeconds = null; int allSeconds = 0; @@ -35,7 +35,7 @@ public static int getInput() { return allSeconds; } - public static int getOnlySeconds(int i) { //recursively subtracts full minutes from input + private static int getOnlySeconds(int i) { //recursively subtracts full minutes from input if (i < 60) { return i; } @@ -48,7 +48,7 @@ public static int getOnlySeconds(int i) { //recursively subtracts full mi return secs; } - public static void getLight(int i) { + private static void getLight(int i) { while (true) { if (i < 0) { System.out.println(ConsoleColors.RED + "Only positive numbers are allowed!" + ConsoleColors.RESET); diff --git a/src/test/java/homework/homework_1/ConsolePrinterTest.java b/src/test/java/homework/homework_1/ConsolePrinterTest.java index f029361b..8bcb2b4a 100644 --- a/src/test/java/homework/homework_1/ConsolePrinterTest.java +++ b/src/test/java/homework/homework_1/ConsolePrinterTest.java @@ -1,7 +1,5 @@ package homework.homework_1; -import static org.junit.jupiter.api.Assertions.*; - class ConsolePrinterTest { } \ No newline at end of file diff --git a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java index ad73142b..b8d9b803 100644 --- a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java +++ b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -1,6 +1,7 @@ package homework.homework_2.pyramid_printer; import base.UnitBase; +import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; @@ -37,7 +38,7 @@ void givenNothing_whenEmptyInput_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Empty or too big inputs are not allowed!", getOutputLines()[0]); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @Test @@ -47,7 +48,7 @@ void givenString_whenStringInput_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @Test @@ -57,7 +58,7 @@ void givenToBigNumber_whenInputBiggerIntMAX_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @Test @@ -67,7 +68,7 @@ void givenNegativeNumber_whenInputLessThanZero_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Negative numbers are not allowed!", getOutputLines()[0]); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @Test @@ -77,7 +78,7 @@ void givenNotOneArg_whenInputIsDivided_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @Test @@ -87,7 +88,7 @@ void givenNotInteger_whenDouble_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Wrong input, only integers are allowed!", getOutputLines()[0]); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } diff --git a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java index 529a4b11..9e5768dc 100644 --- a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,16 +1,9 @@ package homework.homework_2.random_chars_table; import base.UnitBase; -import org.junit.jupiter.api.BeforeAll; +import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; - -import static org.junit.jupiter.api.Assertions.*; - class RandomCharsTableTest extends UnitBase { char[] allChars = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; diff --git a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java index 5620c060..70ac86ec 100644 --- a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java +++ b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java @@ -1,7 +1,5 @@ package homework.homework_2.traffic_light; -import static org.junit.jupiter.api.Assertions.*; - class TrafficLightTest { } \ No newline at end of file From 41db64e2e7cfb7bd4547e56a3ba4ebfd5bfefdf7 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 2 Aug 2021 22:22:40 +0300 Subject: [PATCH 13/34] RandomCharsTable with tests are done. --- .../random_chars_table/RandomCharsTable.java | 78 ++++----- .../RandomCharsTableTest.java | 158 +++++++++++++++++- 2 files changed, 193 insertions(+), 43 deletions(-) diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index fa38c6f8..7cb1ae11 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -3,38 +3,51 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.Locale; public class RandomCharsTable { - private final String error = "Wrong input!"; + private final String ERR_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; public void run() { RandomCharsTable table = new RandomCharsTable(); - String lenStr = null; - String widStr = null; - String method = null; + String lenStr; + String widStr; + String method; String[] strings = table.getInput(); - if (isValid(strings)){ + if (isValid(strings)) { + lenStr = strings[0]; widStr = strings[1]; - method = strings[2]; - } + method = strings[2].toLowerCase(Locale.ROOT); - char[][] toPrint = table.getTable(lenStr, widStr); + char[][] toPrint = table.getTable(lenStr, widStr); + if(toPrint.length == 0){ + System.out.println("Table is empty"); + return; + } + System.out.println("There is an unsorted table:"); + + for (char[] ch : toPrint + ) { + for (char character : ch + ) { + System.out.print("|" + character); + } + System.out.print("|"); + System.out.println(); + } - System.out.println("There is an unsorted table:"); - for (char[] ch : toPrint - ) { - System.out.println(ch); + table.printSorted(toPrint, method); + } else { + System.out.println(ERR_MSG); } - - table.printSorted(toPrint, method); - } private String[] getInput() { @@ -49,22 +62,16 @@ private String[] getInput() { result = rawInput.split(" "); } catch (IOException e) { - System.out.println(error); + System.out.println(ERR_MSG); } return result; } private char[][] getTable(String length, String width) { - int len = 0; - int wid = 0; - if (length != null && width != null) { - len = Integer.parseInt(length); - wid = Integer.parseInt(width); - } - else { - System.out.println(error); - } + + int len = Integer.parseInt(length); + int wid = Integer.parseInt(width); char[][] res = new char[len][wid]; @@ -79,7 +86,7 @@ private char[][] getTable(String length, String width) { private void printSorted(char[][] table, String method) { StringBuilder result = new StringBuilder(); - if (method != null) { + switch (method) { case ("odd"): result.append("Odd letters - "); @@ -111,29 +118,22 @@ private void printSorted(char[][] table, String method) { String res1 = result.toString(); System.out.println(res1.substring(0, res1.length() - 1) + "."); break; - default: - System.out.println(error + " Unknown method!"); - } - } - else { - System.out.println(error); } + } - private boolean isValid(String[] strings){ + private boolean isValid(String[] strings) { boolean firstDigit = false; boolean secondDigit = false; boolean oddOrEven = false; - if (strings.length < 3){ + if (strings.length < 3) { return false; - } - else if(strings.length == 3){ - firstDigit = strings[0].chars().allMatch( Character::isDigit ); - secondDigit = strings[1].chars().allMatch( Character::isDigit ); + } else if (strings.length == 3) { + firstDigit = strings[0].chars().allMatch(Character::isDigit); + secondDigit = strings[1].chars().allMatch(Character::isDigit); oddOrEven = (strings[2].equals("odd") || strings[2].equals("even")); } - return (firstDigit && secondDigit && oddOrEven); } } diff --git a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java index 9e5768dc..cc97d60a 100644 --- a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java @@ -4,22 +4,172 @@ import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; + class RandomCharsTableTest extends UnitBase { - char[] allChars = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', - 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; + final String ERR_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; + // tested cases : correct odd + // correct even + // one arg + // two args + // three args, wrong method string + // empty input + // more than 3 args + // three args, wrong order + // 0 0 odd table + // 10 0 0 even table @Test - public void givenCorrectInput_whenTwoIntAndCorrectString_thenAllGood() { + public void givenCorrectInputOddMethod_whenRun_thenAllGood() { setInput("4 4 odd"); + boolean isOddInOutput; + boolean areCharsOdd = false; + String expected = "Odd letters - "; new RandomCharsTable().run(); removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); removeFromOutput("There is an unsorted table:"); - boolean inRange = false; + String[] inOutput = getOutputLines(); + + for (String str : inOutput + ) { + if (str.contains("|")) { + removeFromOutput(str); + } + } + + String[] rest = getOutputLines(); + String restedString = rest[0]; + String beginning = restedString.substring(0, 14); + isOddInOutput = expected.equals(beginning); + + String restedChars = restedString.substring(14); + restedChars.replaceAll("\\p{P}", ""); + char[] charsRest = restedChars.toCharArray(); + for (char ch : charsRest + ) { + areCharsOdd = (ch / 2) != 0; + } + assertTrue(isOddInOutput && areCharsOdd); + } + + @Test + public void givenCorrectInputEvenMethod_whenRun_thenAllGood() { + setInput("4 4 even"); + boolean isEvenInOutput; + boolean areCharsEven = false; + String expected = "Even letters - "; + + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + removeFromOutput("There is an unsorted table:"); + String[] inOutput = getOutputLines(); + + for (String str : inOutput + ) { + if (str.contains("|")) { + removeFromOutput(str); + } + } + + String[] rest = getOutputLines(); + String restedString = rest[0]; + String beginning = restedString.substring(0, 15); + isEvenInOutput = expected.equals(beginning); + + String restedChars = restedString.substring(15); + restedChars.replaceAll("\\p{P}", ""); + char[] charsRest = restedChars.toCharArray(); + for (char ch : charsRest + ) { + areCharsEven = (ch % 2) == 0; + } + assertTrue(isEvenInOutput && areCharsEven); + } + + @Test + void givenOneArgument_whenRun_thenErrorOccurs() { + setInput("4"); + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + String inOutput = getOutput(); + + assertEquals(ERR_MSG, inOutput); + } + + @Test + void givenTwoArguments_whenRun_thenErrorOccurs() { + setInput("4 4"); + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + String inOutput = getOutput(); + + assertEquals(ERR_MSG, inOutput); + } + + @Test + void givenThreeArgsMethodIsWrong_whenRun_thenErrorOccurs() { + setInput("4 4 string"); + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + String inOutput = getOutput(); + + assertEquals(ERR_MSG, inOutput); + } + + @Test + void givenEmptyInput_whenRun_thenErrorOccurs() { + setInput(""); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + String inOutput = getOutput(); + + assertThrows(NullPointerException.class, () -> + new RandomCharsTable().run()); + } + + @Test + void givenMoreThenThreeArgs_whenRun_thenErrorOccurs() { + setInput("4 4 odd string"); + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + String inOutput = getOutput(); + + assertEquals(ERR_MSG, inOutput); + } + + @Test + void givenThreeArgsOrderIsWrong_whenRun_thenErrorOccurs() { + setInput("4 odd 4"); + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + String inOutput = getOutput(); + + assertEquals(ERR_MSG, inOutput); + } + @Test + public void givenZeroZeroOddMethod_whenRun_thenAllGood() { + setInput("0 0 odd"); + String expected = "Table is empty"; + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + + assertEquals(expected, getOutput()); + } + + @Test + public void givenZeroZeroEvenMethod_whenRun_thenAllGood() { + setInput("0 0 even"); + String expected = "Table is empty"; + + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + assertEquals(expected, getOutput()); } } \ No newline at end of file From d17bf0987278a85892072ca5f28d96c529dc846e Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Tue, 3 Aug 2021 20:03:58 +0300 Subject: [PATCH 14/34] HW 2 plus tests are done. --- .../pyramid_printer/PyramidPrinter.java | 5 +- .../random_chars_table/RandomCharsTable.java | 45 +++--- .../traffic_light/TrafficLight.java | 87 +++++------ .../pyramid_printer/PyramidPrinterTest.java | 38 +++-- .../traffic_light/TrafficLightTest.java | 135 +++++++++++++++++- 5 files changed, 220 insertions(+), 90 deletions(-) diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index 0f6e5cfd..a453cc97 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -26,14 +26,13 @@ private int getInput() { try { if (pSize != null) { result = Integer.parseInt(pSize); - } - else { + } else { System.out.println(ERROR_MSG); } } catch (NumberFormatException e) { System.out.println(ERROR_MSG); } - if (result <0) { + if (result < 0) { System.out.println(ERROR_MSG); } return result; diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 7cb1ae11..75ae547b 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -12,7 +12,6 @@ public class RandomCharsTable { public void run() { RandomCharsTable table = new RandomCharsTable(); - String lenStr; String widStr; String method; @@ -26,28 +25,26 @@ public void run() { method = strings[2].toLowerCase(Locale.ROOT); char[][] toPrint = table.getTable(lenStr, widStr); - if(toPrint.length == 0){ + if (toPrint.length == 0) { System.out.println("Table is empty"); return; } + System.out.println("There is an unsorted table:"); for (char[] ch : toPrint ) { for (char character : ch - ) { + ) { System.out.print("|" + character); } System.out.print("|"); System.out.println(); } - - table.printSorted(toPrint, method); } else { System.out.println(ERR_MSG); } - } private String[] getInput() { @@ -64,15 +61,29 @@ private String[] getInput() { } catch (IOException e) { System.out.println(ERR_MSG); } - return result; } + private boolean isValid(String[] strings) { + + boolean firstDigit = false; + boolean secondDigit = false; + boolean oddOrEven = false; + + if (strings.length < 3) { + return false; + } else if (strings.length == 3) { + firstDigit = strings[0].chars().allMatch(Character::isDigit); + secondDigit = strings[1].chars().allMatch(Character::isDigit); + oddOrEven = (strings[2].equals("odd") || strings[2].equals("even")); + } + return (firstDigit && secondDigit && oddOrEven); + } + private char[][] getTable(String length, String width) { int len = Integer.parseInt(length); int wid = Integer.parseInt(width); - char[][] res = new char[len][wid]; for (int i = 0; i < len; i++) { @@ -80,11 +91,11 @@ private char[][] getTable(String length, String width) { res[i][j] = (char) ((Math.random() * (91 - 65) + 65)); } } - return res; } private void printSorted(char[][] table, String method) { + StringBuilder result = new StringBuilder(); switch (method) { @@ -119,21 +130,5 @@ private void printSorted(char[][] table, String method) { System.out.println(res1.substring(0, res1.length() - 1) + "."); break; } - - } - - private boolean isValid(String[] strings) { - boolean firstDigit = false; - boolean secondDigit = false; - boolean oddOrEven = false; - - if (strings.length < 3) { - return false; - } else if (strings.length == 3) { - firstDigit = strings[0].chars().allMatch(Character::isDigit); - secondDigit = strings[1].chars().allMatch(Character::isDigit); - oddOrEven = (strings[2].equals("odd") || strings[2].equals("even")); - } - return (firstDigit && secondDigit && oddOrEven); } } diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 30432074..f0c8ab27 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -8,68 +8,59 @@ public class TrafficLight { - public void run(){ - System.out.println("Enter the number, please."); - int allSeconds = getInput(); + final String ERR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; - getLight(allSeconds); - } + public void run() { - private static int getInput() { - String numbOfSeconds = null; - int allSeconds = 0; + System.out.println("Enter the number, please."); + String stringSeconds = getInput(); + if (isValid(stringSeconds)) { + int seconds = Integer.parseInt(stringSeconds); + getLight(seconds); + } + } + private String getInput() { + String result = null; try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - numbOfSeconds = reader.readLine(); + result = reader.readLine(); } catch (IOException e) { - e.printStackTrace(); - } - try { - if (numbOfSeconds != null) { - allSeconds = Integer.parseInt(numbOfSeconds); - } - } catch (NumberFormatException e) { - System.out.println(ConsoleColors.RED + "Wrong input, only integers are allowed!" + ConsoleColors.RESET); - System.exit(0); // I don't know how to manage this place w/o System.exit, but would like to ;) + System.out.println(ERR_MSG); } - return allSeconds; + return result; } - private static int getOnlySeconds(int i) { //recursively subtracts full minutes from input - if (i < 60) { - return i; + + private void getLight(int seconds) { + + if (seconds < 0) { + System.out.println(ERR_MSG); + } else if (seconds > 86399) { + System.out.println("The day is over"); + return; } - int secs = i - 60; - if (secs < 60) { - return secs; + + int justSeconds = seconds % 60; + + if (justSeconds < 35) { + System.out.println(ConsoleColors.GREEN + "GREEN" + ConsoleColors.RESET); + } else if ((justSeconds < 40) || (justSeconds >= 55)) { + System.out.println(ConsoleColors.YELLOW + "YELLOW" + ConsoleColors.RESET); + } else { + System.out.println(ConsoleColors.RED + "RED" + ConsoleColors.RESET); } - secs = getOnlySeconds(secs); - return secs; } - private static void getLight(int i) { - while (true) { - if (i < 0) { - System.out.println(ConsoleColors.RED + "Only positive numbers are allowed!" + ConsoleColors.RESET); - break; - } else if (i > 86399) { - System.out.println(ConsoleColors.RED + "To late, the day is over!" + ConsoleColors.RESET); - break; - } - int seconds = getOnlySeconds(i); + private boolean isValid(String str) { - if ((seconds >= 0) && (seconds < 35)) { - System.out.println(ConsoleColors.GREEN + "Light is GREEN, go you may!" + ConsoleColors.RESET); - break; - } else if (((seconds >= 35) && (seconds < 40)) || (seconds >= 55)) { - System.out.println(ConsoleColors.YELLOW + "Light is YELLOW, be careful, please!" + ConsoleColors.RESET); - break; - } else { - System.out.println(ConsoleColors.RED + "Light is RED, stay where you are!!!" + ConsoleColors.RESET); - break; - } + boolean result = false; + if (str == null || !str.chars().allMatch(Character::isDigit)) { + System.out.println(ERR_MSG); + return false; + } else if (str.chars().allMatch(Character::isDigit)) { + result = true; } + return result; } - } diff --git a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java index b8d9b803..463ad7e8 100644 --- a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java +++ b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -8,6 +8,18 @@ import static org.junit.jupiter.api.Assertions.*; class PyramidPrinterTest extends UnitBase { + + final String ERR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; + + //tested cases correct input 3 + // zero input + // empty input + // string input + // input bigger INT_MAX.VALUE + // negative number + // more that one argument + // 8 double value + @Test void givenPositiveInt_whenInputIsThree_thenPrintPyramid() { setInput("3"); @@ -22,7 +34,7 @@ void givenPositiveInt_whenInputIsThree_thenPrintPyramid() { } @Test - void givenZero_whenZeroInInput_thenDoNothing() { + void givenZero_whenRun_thenDoNothing() { setInput("0"); new PyramidPrinter().run(); @@ -32,63 +44,63 @@ void givenZero_whenZeroInInput_thenDoNothing() { } @Test - void givenNothing_whenEmptyInput_thenWriteErrMsgAndStop() { + void givenNothing_whenRun_thenWriteErrMsgAndStop() { setInput(""); new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + assertEquals(ERR_MSG, getOutputLines()[0]); } @Test - void givenString_whenStringInput_thenWriteErrMsgAndStop() { + void givenString_whenRun_thenWriteErrMsgAndStop() { setInput("Some string"); new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + assertEquals(ERR_MSG, getOutputLines()[0]); } @Test - void givenToBigNumber_whenInputBiggerIntMAX_thenWriteErrMsgAndStop() { + void givenToBigNumber_whenRun_thenWriteErrMsgAndStop() { setInput("999999999999"); new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + assertEquals(ERR_MSG, getOutputLines()[0]); } @Test - void givenNegativeNumber_whenInputLessThanZero_thenWriteErrMsgAndStop() { + void givenNegativeNumber_whenRun_thenWriteErrMsgAndStop() { setInput("-1"); new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + assertEquals(ERR_MSG, getOutputLines()[0]); } @Test - void givenNotOneArg_whenInputIsDivided_thenWriteErrMsgAndStop() { + void givenMoreThatOne_whenRun_thenWriteErrMsgAndStop() { setInput("2 3"); new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + assertEquals(ERR_MSG, getOutputLines()[0]); } @Test - void givenNotInteger_whenDouble_thenWriteErrMsgAndStop() { + void givenNotAnInteger_whenRun_thenWriteErrMsgAndStop() { setInput("0.6"); new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + assertEquals(ERR_MSG, getOutputLines()[0]); } diff --git a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java index 70ac86ec..724070a9 100644 --- a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java +++ b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java @@ -1,5 +1,138 @@ package homework.homework_2.traffic_light; -class TrafficLightTest { +import base.UnitBase; +import homework_2.traffic_light.TrafficLight; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.*; + +class TrafficLightTest extends UnitBase { + + final String ERR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; + + //tested cases negative + // string + // more than 86399 + // 0 + // 60 + // 5 + // 30 + // 35 + // 57 + // 45 + // 11 52 seconds + + + @Test + public void givenNegative_whenRun_thenErrOccurs() { + setInput("-1"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenString_whenRun_thenErrOccurs() { + setInput("string"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenBiggerThen86399_whenRun_thenDayIsOver() { + setInput("86400"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertEquals("The day is over", getOutput()); + } + + @Test + public void givenZero_whenRun_thenIsGREEN() { + setInput("0"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("GREEN")); + } + + @Test + public void givenSixty_whenRun_thenIsGREEN() { + setInput("60"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("GREEN")); + } + + @Test + public void givenFive_whenRun_thenIsGREEN() { + setInput("5"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("GREEN")); + } + + @Test + public void givenThirty_whenRun_thenIsGREEN() { + setInput("30"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("GREEN")); + } + + @Test + public void givenThirtyFive_whenRun_thenIsYELLOW() { + setInput("35"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("YELLOW")); + } + + @Test + public void givenFiftySeven_whenRun_thenIsYELLOW() { + setInput("57"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("YELLOW")); + } + + @Test + public void givenFoutryFive_whenRun_thenIsRED() { + setInput("45"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("RED")); + } + + @Test + public void givenFiftyTwo_whenRun_thenIsRED() { + setInput("52"); + + new TrafficLight().run(); + removeFromOutput("Enter the number, please."); + printOut(); + assertTrue(getOutput().contains("RED")); + } + } \ No newline at end of file From 9267035a3d1a116a888d60097f87d17b9197a789 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Tue, 3 Aug 2021 21:09:43 +0300 Subject: [PATCH 15/34] ImmutableClassExample added. --- .../homework_3/ImmutableClassExample.java | 93 +++++++++++++++++++ .../homework_1/ConsolePrinterTest.java | 5 - .../homework_1}/UnitBase.java | 2 +- .../pyramid_printer/PyramidPrinterTest.java | 2 +- .../RandomCharsTableTest.java | 2 +- .../traffic_light/TrafficLightTest.java | 2 +- 6 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 src/main/java/homework_3/ImmutableClassExample.java delete mode 100644 src/test/java/homework/homework_1/ConsolePrinterTest.java rename src/test/java/{base => homework/homework_1}/UnitBase.java (98%) diff --git a/src/main/java/homework_3/ImmutableClassExample.java b/src/main/java/homework_3/ImmutableClassExample.java new file mode 100644 index 00000000..9e44e033 --- /dev/null +++ b/src/main/java/homework_3/ImmutableClassExample.java @@ -0,0 +1,93 @@ +package homework_3; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +// 1) The class must be declared as final so it can’t be extended. +// 2) All fields have to be private so that direct access is not allowed. +// 3) Setter methods for variables must not be provided. +// 4) All mutable fields must be final so that its value can be assigned only once. +// 5) All the fields must be initialized via a constructor performing deep copy. +// 6) Cloning of objects in the getter methods should be used to return a copy rather than returning the actual object reference. + +public final class ImmutableClassExample { + private final int id; + private final String name; + private final char[] password; + private final HashMap testMap; + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public HashMap getTestMap() { + return (HashMap) testMap.clone(); + } + + public char[] getPassword() { + return (char[]) password.clone(); + } + + public ImmutableClassExample() { + this.id = 0; + this.name = "User name"; + HashMap tMap = new HashMap<>(); + tMap.put("key", "value"); + this.testMap = tMap; + this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + } + + public ImmutableClassExample(int realId) { + + this.id = realId; + this.name = "User name"; + HashMap tMap = new HashMap<>(); + tMap.put("key", "value"); + this.testMap = tMap; + this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + } + + public ImmutableClassExample(int realId, String realName) { + this.id = realId; + this.name = realName; + HashMap tMap = new HashMap<>(); + tMap.put("key", "value"); + this.testMap = tMap; + this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + } + + public ImmutableClassExample(int realId, String realName, HashMap realMap) { + this.id = realId; + this.name = realName; + this.testMap = realMap; + this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + } + + + public ImmutableClassExample(int realId, String realName, HashMap realMap, char[] realPassword) { + this.id = realId; + this.name = realName; + this.testMap = realMap; + this.password = realPassword; + } + public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE){ + return new ImmutableClassExample(oldICE.getId(), oldICE.getName(), oldICE.getTestMap(), getPassword()); + } + public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId){ + return new ImmutableClassExample(newId, oldICE.getName(), oldICE.getTestMap(), oldICE.getPassword()); + } + public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId, String newName){ + return new ImmutableClassExample(newId, newName, oldICE.getTestMap(), oldICE.getPassword()); + } + public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId, String newName, HashMap newMap){ + return new ImmutableClassExample(newId, newName, newMap, oldICE.getPassword()); + } + public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId,String newName, HashMap newMap, char[] newPassword){ + return new ImmutableClassExample(newId, newName, newMap, newPassword); + } +} diff --git a/src/test/java/homework/homework_1/ConsolePrinterTest.java b/src/test/java/homework/homework_1/ConsolePrinterTest.java deleted file mode 100644 index 8bcb2b4a..00000000 --- a/src/test/java/homework/homework_1/ConsolePrinterTest.java +++ /dev/null @@ -1,5 +0,0 @@ -package homework.homework_1; - -class ConsolePrinterTest { - -} \ No newline at end of file diff --git a/src/test/java/base/UnitBase.java b/src/test/java/homework/homework_1/UnitBase.java similarity index 98% rename from src/test/java/base/UnitBase.java rename to src/test/java/homework/homework_1/UnitBase.java index 97e2685b..3a709e2c 100644 --- a/src/test/java/base/UnitBase.java +++ b/src/test/java/homework/homework_1/UnitBase.java @@ -1,4 +1,4 @@ -package base; +package homework.homework_1; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java index 463ad7e8..e74e8f24 100644 --- a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java +++ b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -1,6 +1,6 @@ package homework.homework_2.pyramid_printer; -import base.UnitBase; +import homework.homework_1.UnitBase; import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; diff --git a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java index cc97d60a..2e7b67c3 100644 --- a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,6 +1,6 @@ package homework.homework_2.random_chars_table; -import base.UnitBase; +import homework.homework_1.UnitBase; import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; diff --git a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java index 724070a9..24f1bcab 100644 --- a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java +++ b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java @@ -1,6 +1,6 @@ package homework.homework_2.traffic_light; -import base.UnitBase; +import homework.homework_1.UnitBase; import homework_2.traffic_light.TrafficLight; import org.junit.jupiter.api.Test; From 390246f42e9542ffb6106d9356f874a442b98270 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Tue, 3 Aug 2021 21:17:40 +0300 Subject: [PATCH 16/34] Readme fixed with correct links. --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6967860c..36ff1fc9 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,12 @@ | Number | Solution | Short description | --- | --- | --- | -| HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_1/ConsolePrinter.java) | The app that reads input arguments and prints them, until "error" argument | -| HW 2_1 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_2/traffic_light/TrafficLight.java) | Traffic Light app, the simple one. | -| HW 2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_2/pyramid_printer//PyramidPrinter.java) | The Pyramid printer, prints triangles only, btw. | -| HW 2_3| [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework/homework_2/random_chars_table//RandomCharsTable.java) | Random chars table, prints table with chars and then sorts them by even or odd. +| HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework_1/ConsolePrinter.java) | The app that reads input arguments and prints them, until "error" argument | +| HW 2_1 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/traffic_light) | Traffic Light app, the simple one. | +| HW 2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/pyramid_printer) | The Pyramid printer, prints triangles only, btw. | +| HW 2_3| [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/random_chars_table) | Random chars table, prints table with chars and then sorts them by even or odd. +| HW 3, tests|[Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/test/java/homework/homework_2) | Tests for homework 2 +| HW 3, Immutable Class Example| [ImutableClassExample](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_3) | Immutable class. [Link to CodingBat](https://codingbat.com/done?user=dvaschenko33@gmail.com&tag=4651459890) From 147c3bc889ea83ebd9164d1088a4464b8583fa78 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sat, 7 Aug 2021 11:52:07 +0300 Subject: [PATCH 17/34] Small fixes --- .../java/ConsoleColors/ConsoleColors.java | 5 +-- src/main/java/homework_1/ConsolePrinter.java | 4 +-- .../pyramid_printer/PyramidPrinter.java | 33 ++++++++----------- .../traffic_light/TrafficLight.java | 8 ++--- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/main/java/ConsoleColors/ConsoleColors.java b/src/main/java/ConsoleColors/ConsoleColors.java index 83c4c8d3..8d3d27de 100644 --- a/src/main/java/ConsoleColors/ConsoleColors.java +++ b/src/main/java/ConsoleColors/ConsoleColors.java @@ -1,9 +1,6 @@ package ConsoleColors; -import java.util.HashMap; -import java.util.concurrent.ThreadFactory; - -public class ConsoleColors{ +public final class ConsoleColors{ public static final String RESET = "\033[0m"; public static final String RED = "\033[0;31m"; diff --git a/src/main/java/homework_1/ConsolePrinter.java b/src/main/java/homework_1/ConsolePrinter.java index baf15176..5e1055f6 100644 --- a/src/main/java/homework_1/ConsolePrinter.java +++ b/src/main/java/homework_1/ConsolePrinter.java @@ -9,12 +9,12 @@ public static void main(String[] args) { for (int i = 0; i < args.length; i++) { String toPrint = args[i]; - if (toPrint.matches("error")) { //checking for error + if (toPrint.equalsIgnoreCase("error")) { //checking for error System.out.println(ConsoleColors.RED + "Alarm!" + ConsoleColors.RESET); break; } - System.out.println(toPrint + " : " + toPrint.length() + " letter(s)"); + System.out.println(toPrint + ": " + toPrint.length() + " letter(s)"); } } } diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index a453cc97..79bd5fc5 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -5,35 +5,24 @@ import java.io.InputStreamReader; public class PyramidPrinter { - final String ERROR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; + private final String ERR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; public void run() { - int sizeOfPyramid = getInput(); + String sizeOfPyramid = getInput(); - printPyramid(sizeOfPyramid); + if (isValid(sizeOfPyramid)) { + printPyramid(Integer.parseInt(sizeOfPyramid)); + } } - private int getInput() { - String pSize = null; - int result = 0; + private String getInput() { + String result = null; System.out.println("Enter the Pyramid size. please: "); try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - pSize = reader.readLine(); + result = reader.readLine(); } catch (IOException e) { - e.printStackTrace(); - } - try { - if (pSize != null) { - result = Integer.parseInt(pSize); - } else { - System.out.println(ERROR_MSG); - } - } catch (NumberFormatException e) { - System.out.println(ERROR_MSG); - } - if (result < 0) { - System.out.println(ERROR_MSG); + System.out.println(ERR_MSG); } return result; } @@ -51,4 +40,8 @@ private String getRow(int i) { } return row.toString(); } + + private boolean isValid(String input) { + return input != null && input.chars().allMatch(Character::isDigit); + } } diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index f0c8ab27..caefd4ad 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -8,7 +8,7 @@ public class TrafficLight { - final String ERR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; + private final String ERR_MSG = "Only 1 non-negative integer is allowed as passed parameter"; public void run() { @@ -54,13 +54,11 @@ private void getLight(int seconds) { private boolean isValid(String str) { - boolean result = false; if (str == null || !str.chars().allMatch(Character::isDigit)) { System.out.println(ERR_MSG); return false; - } else if (str.chars().allMatch(Character::isDigit)) { - result = true; } - return result; + + return true; } } From b1cc640ec32ca1b55b8c8dbc97cbe5b0ef6369ef Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 16 Aug 2021 13:27:48 +0300 Subject: [PATCH 18/34] CustomFileReader added --- .../CustomFileReader/CustomFileReader.java | 96 +++++++++++++++++++ .../homework_4/CustomFileReader/Main.java | 9 ++ src/main/resources/file.txt | 4 + 3 files changed, 109 insertions(+) create mode 100644 src/main/java/homework_4/CustomFileReader/CustomFileReader.java create mode 100644 src/main/java/homework_4/CustomFileReader/Main.java create mode 100644 src/main/resources/file.txt diff --git a/src/main/java/homework_4/CustomFileReader/CustomFileReader.java b/src/main/java/homework_4/CustomFileReader/CustomFileReader.java new file mode 100644 index 00000000..9eb1a2d9 --- /dev/null +++ b/src/main/java/homework_4/CustomFileReader/CustomFileReader.java @@ -0,0 +1,96 @@ +package homework_4.CustomFileReader; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; + +public class CustomFileReader { + private final String ERR_MSG = "File by the path doesn't exists!"; + private String content; + private File source; + private String filePath = "./src/main/resources/file.txt"; + + public CustomFileReader() { + + } + + public CustomFileReader(File source) { + this.filePath = source.getPath(); + } + + public CustomFileReader(String filePath) { + this.filePath = filePath; + } + + // Using InputStreams - binary stream + public void run1() { + if (fileExists(filePath)) { + + source = new File(filePath); + StringBuilder stringBuilder = new StringBuilder(); + try (FileInputStream fis = new FileInputStream(filePath)) { + int i; + while ((i = fis.read()) != -1) { + stringBuilder.append((char) i); + } + content = stringBuilder.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.println(ERR_MSG); + } + printResult(content); + } + + // Using Reader - character stream + public void run2() { + if (fileExists(filePath)) { + StringBuilder stringBuilder = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + while (reader.ready()) { + stringBuilder.append((char) reader.read()); + } + content = stringBuilder.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.println(ERR_MSG); + } + printResult(content); + } + + // Using NIO, read bytes from path. + public void run3() { + if (fileExists(filePath)) { + Path path = Paths.get(filePath); + try { + byte[] characters = Files.readAllBytes(path); + StringBuilder stringBuilder = new StringBuilder(); + for (byte by : characters + ) { + stringBuilder.append((char) by); + } + content = stringBuilder.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.println(ERR_MSG); + } + printResult(content); + } + + private boolean fileExists(String filePath) { + return new File(filePath).exists(); + } + + private void printResult(String content) { + System.out.println(content.replaceAll("(\\.)|(,)", "")); + } + + +} diff --git a/src/main/java/homework_4/CustomFileReader/Main.java b/src/main/java/homework_4/CustomFileReader/Main.java new file mode 100644 index 00000000..22012d94 --- /dev/null +++ b/src/main/java/homework_4/CustomFileReader/Main.java @@ -0,0 +1,9 @@ +package homework_4.CustomFileReader; + +public class Main { + public static void main(String[] args) { + new CustomFileReader().run1(); + new CustomFileReader().run2(); + new CustomFileReader().run3(); + } +} diff --git a/src/main/resources/file.txt b/src/main/resources/file.txt new file mode 100644 index 00000000..5a4b0105 --- /dev/null +++ b/src/main/resources/file.txt @@ -0,0 +1,4 @@ +simple text that contains comas - ,,, , dots - ... and some more punctuation marks like "" '' () ? ! : ;/ +comas and dots must be gone after run1() or run2() or run3(). + + From cf568ea4670417dfd32fa3b4421633be6d468474 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 16 Aug 2021 15:57:12 +0300 Subject: [PATCH 19/34] Singleton added --- .../homework_4/Singleton/EnumSingleton.java | 18 +++++++++++++++ .../homework_4/Singleton/NaiveSingleton.java | 22 +++++++++++++++++++ .../java/homework_4/Singleton/Singleton.java | 17 ++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/main/java/homework_4/Singleton/EnumSingleton.java create mode 100644 src/main/java/homework_4/Singleton/NaiveSingleton.java create mode 100644 src/main/java/homework_4/Singleton/Singleton.java diff --git a/src/main/java/homework_4/Singleton/EnumSingleton.java b/src/main/java/homework_4/Singleton/EnumSingleton.java new file mode 100644 index 00000000..d21a267f --- /dev/null +++ b/src/main/java/homework_4/Singleton/EnumSingleton.java @@ -0,0 +1,18 @@ +package homework_4.Singleton; + +public enum EnumSingleton { + + //This approach has serialization and thread-safety guaranteed by the enum implementation itself, + // which ensures internally that only the single instance is available, + // correcting the problems pointed out in the class-based implementation. + + INSTANCE; + + private EnumSingleton() { + } + + public EnumSingleton getInstance() { + return INSTANCE; + } + +} diff --git a/src/main/java/homework_4/Singleton/NaiveSingleton.java b/src/main/java/homework_4/Singleton/NaiveSingleton.java new file mode 100644 index 00000000..10a773d8 --- /dev/null +++ b/src/main/java/homework_4/Singleton/NaiveSingleton.java @@ -0,0 +1,22 @@ +package homework_4.Singleton; + +public final class NaiveSingleton { + + //A private constructor + //A static field containing its only instance + //A static factory method for obtaining the instance + //Note that it can be problematic in multithreading scenarios. + private static NaiveSingleton INSTANCE; + + private NaiveSingleton() { + } + + public static NaiveSingleton getInstance() { + if (INSTANCE == null) { + INSTANCE = new NaiveSingleton(); + } + + return INSTANCE; + } + +} diff --git a/src/main/java/homework_4/Singleton/Singleton.java b/src/main/java/homework_4/Singleton/Singleton.java new file mode 100644 index 00000000..4dd056ac --- /dev/null +++ b/src/main/java/homework_4/Singleton/Singleton.java @@ -0,0 +1,17 @@ +package homework_4.Singleton; + +public class Singleton { + + private static volatile Singleton INSTANCE; + private Singleton(){} + public static Singleton getInstance(){ + if (INSTANCE == null){ + synchronized (Singleton.class) { + if (INSTANCE == null){ + INSTANCE = new Singleton(); + } + } + } + return INSTANCE; + } +} From f25e851630433792a4a7bfebc591a37e109903fc Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Thu, 19 Aug 2021 15:35:16 +0300 Subject: [PATCH 20/34] Tests added --- build.gradle | 1 + .../homework_4/custom_annotation/Init.java | 9 +++ .../custom_annotation/JsonElement.java | 9 +++ .../custom_annotation/JsonSerializable.java | 9 +++ .../JsonSerializationException.java | 10 +++ .../ObjectToJsonConverter.java | 68 +++++++++++++++++++ .../homework_4/custom_annotation/Person.java | 66 ++++++++++++++++++ .../CustomFileReader.java | 32 ++++----- .../Main.java | 2 +- .../EnumSingleton.java | 6 +- .../NaiveSingleton.java | 2 +- .../{Singleton => singleton}/Singleton.java | 2 +- .../resources/custom_file_reader/file.txt | 3 + src/main/resources/file.txt | 4 -- .../CustomAnnotationTest.java | 33 +++++++++ .../singleton/EnumSingletonTest.java | 19 ++++++ .../singleton/NaiveSingletonTest.java | 32 +++++++++ .../homework_4/singleton/SingletonTest.java | 28 ++++++++ 18 files changed, 306 insertions(+), 29 deletions(-) create mode 100644 src/main/java/homework_4/custom_annotation/Init.java create mode 100644 src/main/java/homework_4/custom_annotation/JsonElement.java create mode 100644 src/main/java/homework_4/custom_annotation/JsonSerializable.java create mode 100644 src/main/java/homework_4/custom_annotation/JsonSerializationException.java create mode 100644 src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java create mode 100644 src/main/java/homework_4/custom_annotation/Person.java rename src/main/java/homework_4/{CustomFileReader => custom_file_reader}/CustomFileReader.java (78%) rename src/main/java/homework_4/{CustomFileReader => custom_file_reader}/Main.java (83%) rename src/main/java/homework_4/{Singleton => singleton}/EnumSingleton.java (77%) rename src/main/java/homework_4/{Singleton => singleton}/NaiveSingleton.java (94%) rename src/main/java/homework_4/{Singleton => singleton}/Singleton.java (92%) create mode 100644 src/main/resources/custom_file_reader/file.txt delete mode 100644 src/main/resources/file.txt create mode 100644 src/test/java/homework/homework_4/custom_annotation/CustomAnnotationTest.java create mode 100644 src/test/java/homework/homework_4/singleton/EnumSingletonTest.java create mode 100644 src/test/java/homework/homework_4/singleton/NaiveSingletonTest.java create mode 100644 src/test/java/homework/homework_4/singleton/SingletonTest.java diff --git a/build.gradle b/build.gradle index b91dc843..09a7c4e3 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + } test { diff --git a/src/main/java/homework_4/custom_annotation/Init.java b/src/main/java/homework_4/custom_annotation/Init.java new file mode 100644 index 00000000..1ae28e1b --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/Init.java @@ -0,0 +1,9 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) + +public @interface Init { +} diff --git a/src/main/java/homework_4/custom_annotation/JsonElement.java b/src/main/java/homework_4/custom_annotation/JsonElement.java new file mode 100644 index 00000000..c5612895 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/JsonElement.java @@ -0,0 +1,9 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface JsonElement { + String key() default ""; +} diff --git a/src/main/java/homework_4/custom_annotation/JsonSerializable.java b/src/main/java/homework_4/custom_annotation/JsonSerializable.java new file mode 100644 index 00000000..58300247 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/JsonSerializable.java @@ -0,0 +1,9 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) + +public @interface JsonSerializable { +} diff --git a/src/main/java/homework_4/custom_annotation/JsonSerializationException.java b/src/main/java/homework_4/custom_annotation/JsonSerializationException.java new file mode 100644 index 00000000..61b2be3f --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/JsonSerializationException.java @@ -0,0 +1,10 @@ +package homework_4.custom_annotation; + +public class JsonSerializationException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public JsonSerializationException(String message) { + super(message); + } +} diff --git a/src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java b/src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java new file mode 100644 index 00000000..4ba3f671 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java @@ -0,0 +1,68 @@ +package homework_4.custom_annotation; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ObjectToJsonConverter { + public String convertToJson(Object object) throws JsonSerializationException { + try { + + checkIfSerializable(object); + initializeObject(object); + return getJsonString(object); + + } catch (JsonSerializationException | IllegalAccessException | InvocationTargetException e) { + throw new JsonSerializationException(e.getMessage()); + } + } + + private void checkIfSerializable(Object object) { + if (Objects.isNull(object)) { + throw new JsonSerializationException("Can't serialize a null object"); + } + + Class clazz = object.getClass(); + if (!clazz.isAnnotationPresent(JsonSerializable.class)) { + throw new JsonSerializationException("The class " + clazz.getSimpleName() + " is not annotated with JsonSerializable"); + } + } + + private void initializeObject(Object object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Class clazz = object.getClass(); + for (Method method : clazz.getDeclaredMethods()) { + if (method.isAnnotationPresent(Init.class)) { + method.setAccessible(true); + method.invoke(object); + } + } + } + + private String getJsonString(Object object) throws IllegalArgumentException, IllegalAccessException { + Class clazz = object.getClass(); + Map jsonElementsMap = new HashMap<>(); + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + if (field.isAnnotationPresent(JsonElement.class)) { + jsonElementsMap.put(getKey(field), (String) field.get(object)); + } + } + + String jsonString = jsonElementsMap.entrySet() + .stream() + .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"") + .collect(Collectors.joining(",")); + return "{" + jsonString + "}"; + } + + private String getKey(Field field) { + String value = field.getAnnotation(JsonElement.class) + .key(); + return value.isEmpty() ? field.getName() : value; + } + +} \ No newline at end of file diff --git a/src/main/java/homework_4/custom_annotation/Person.java b/src/main/java/homework_4/custom_annotation/Person.java new file mode 100644 index 00000000..3fc2c248 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/Person.java @@ -0,0 +1,66 @@ +package homework_4.custom_annotation; + +@JsonSerializable +public class Person { + @JsonElement + private String firstName; + @JsonElement + private String lastName; + @JsonElement(key = "personAge") + private String age; + + private String address; + + public Person(String firstName, String lastName) { + super(); + this.firstName = firstName; + this.lastName = lastName; + } + + public Person(String firstName, String lastName, String age) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + } + + @Init + private void initNames() { + this.firstName = this.firstName.substring(0, 1) + .toUpperCase() + this.firstName.substring(1); + this.lastName = this.lastName.substring(0, 1) + .toUpperCase() + this.lastName.substring(1); + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + +} diff --git a/src/main/java/homework_4/CustomFileReader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java similarity index 78% rename from src/main/java/homework_4/CustomFileReader/CustomFileReader.java rename to src/main/java/homework_4/custom_file_reader/CustomFileReader.java index 9eb1a2d9..7a9794d4 100644 --- a/src/main/java/homework_4/CustomFileReader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -1,28 +1,15 @@ -package homework_4.CustomFileReader; +package homework_4.custom_file_reader; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; public class CustomFileReader { private final String ERR_MSG = "File by the path doesn't exists!"; private String content; private File source; - private String filePath = "./src/main/resources/file.txt"; - - public CustomFileReader() { - - } - - public CustomFileReader(File source) { - this.filePath = source.getPath(); - } - - public CustomFileReader(String filePath) { - this.filePath = filePath; - } + private String filePath = "./src/main/resources/custom_file_reader/file.txt"; // Using InputStreams - binary stream public void run1() { @@ -33,7 +20,9 @@ public void run1() { try (FileInputStream fis = new FileInputStream(filePath)) { int i; while ((i = fis.read()) != -1) { - stringBuilder.append((char) i); + if (i <= 127) { + stringBuilder.append((char) i); + } } content = stringBuilder.toString(); } catch (IOException e) { @@ -51,7 +40,10 @@ public void run2() { StringBuilder stringBuilder = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { while (reader.ready()) { - stringBuilder.append((char) reader.read()); + int read = reader.read(); + if (read >= 0 && read <= 127) { + stringBuilder.append((char) read); + } } content = stringBuilder.toString(); } catch (IOException e) { @@ -72,7 +64,9 @@ public void run3() { StringBuilder stringBuilder = new StringBuilder(); for (byte by : characters ) { - stringBuilder.append((char) by); + if (by >= 0 && by <= 127) { + stringBuilder.append((char) by); + } } content = stringBuilder.toString(); } catch (IOException e) { @@ -89,7 +83,7 @@ private boolean fileExists(String filePath) { } private void printResult(String content) { - System.out.println(content.replaceAll("(\\.)|(,)", "")); + System.out.println(content.replaceAll("(\\.)|(,)", "").trim()); } diff --git a/src/main/java/homework_4/CustomFileReader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java similarity index 83% rename from src/main/java/homework_4/CustomFileReader/Main.java rename to src/main/java/homework_4/custom_file_reader/Main.java index 22012d94..01087a42 100644 --- a/src/main/java/homework_4/CustomFileReader/Main.java +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -1,4 +1,4 @@ -package homework_4.CustomFileReader; +package homework_4.custom_file_reader; public class Main { public static void main(String[] args) { diff --git a/src/main/java/homework_4/Singleton/EnumSingleton.java b/src/main/java/homework_4/singleton/EnumSingleton.java similarity index 77% rename from src/main/java/homework_4/Singleton/EnumSingleton.java rename to src/main/java/homework_4/singleton/EnumSingleton.java index d21a267f..52194de3 100644 --- a/src/main/java/homework_4/Singleton/EnumSingleton.java +++ b/src/main/java/homework_4/singleton/EnumSingleton.java @@ -1,4 +1,4 @@ -package homework_4.Singleton; +package homework_4.singleton; public enum EnumSingleton { @@ -8,10 +8,10 @@ public enum EnumSingleton { INSTANCE; - private EnumSingleton() { + EnumSingleton() { } - public EnumSingleton getInstance() { + public static EnumSingleton getInstance() { return INSTANCE; } diff --git a/src/main/java/homework_4/Singleton/NaiveSingleton.java b/src/main/java/homework_4/singleton/NaiveSingleton.java similarity index 94% rename from src/main/java/homework_4/Singleton/NaiveSingleton.java rename to src/main/java/homework_4/singleton/NaiveSingleton.java index 10a773d8..232dd728 100644 --- a/src/main/java/homework_4/Singleton/NaiveSingleton.java +++ b/src/main/java/homework_4/singleton/NaiveSingleton.java @@ -1,4 +1,4 @@ -package homework_4.Singleton; +package homework_4.singleton; public final class NaiveSingleton { diff --git a/src/main/java/homework_4/Singleton/Singleton.java b/src/main/java/homework_4/singleton/Singleton.java similarity index 92% rename from src/main/java/homework_4/Singleton/Singleton.java rename to src/main/java/homework_4/singleton/Singleton.java index 4dd056ac..21d84934 100644 --- a/src/main/java/homework_4/Singleton/Singleton.java +++ b/src/main/java/homework_4/singleton/Singleton.java @@ -1,4 +1,4 @@ -package homework_4.Singleton; +package homework_4.singleton; public class Singleton { diff --git a/src/main/resources/custom_file_reader/file.txt b/src/main/resources/custom_file_reader/file.txt new file mode 100644 index 00000000..775149f9 --- /dev/null +++ b/src/main/resources/custom_file_reader/file.txt @@ -0,0 +1,3 @@ +Simple text that contains comas - ,,, , dots - ... and some more punctuation marks like "" '' () ? ! : ;/ Comas and dots must be gone after run1() or run2() or run3(). + + diff --git a/src/main/resources/file.txt b/src/main/resources/file.txt deleted file mode 100644 index 5a4b0105..00000000 --- a/src/main/resources/file.txt +++ /dev/null @@ -1,4 +0,0 @@ -simple text that contains comas - ,,, , dots - ... and some more punctuation marks like "" '' () ? ! : ;/ -comas and dots must be gone after run1() or run2() or run3(). - - diff --git a/src/test/java/homework/homework_4/custom_annotation/CustomAnnotationTest.java b/src/test/java/homework/homework_4/custom_annotation/CustomAnnotationTest.java new file mode 100644 index 00000000..5766010c --- /dev/null +++ b/src/test/java/homework/homework_4/custom_annotation/CustomAnnotationTest.java @@ -0,0 +1,33 @@ +package homework.homework_4.custom_annotation; + +import homework_4.custom_annotation.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CustomAnnotationTest { + + + @Test + public void givenObjectNotSerializedThenExceptionThrown() throws JsonSerializationException { + Object object = new Object(); + ObjectToJsonConverter serializer = new ObjectToJsonConverter(); + assertThrows(JsonSerializationException.class, () -> serializer.convertToJson(object)); + } + + @Test + public void givenObjectSerializedThenTrueReturned() throws JsonSerializationException { + Person dvasch = new Person("dima", "vaschenko", "35"); + ObjectToJsonConverter converter = new ObjectToJsonConverter(); + String jsonString = converter.convertToJson(dvasch); + System.out.println(jsonString); + assertEquals("{\"personAge\":\"35\",\"firstName\":\"Dima\",\"lastName\":\"Vaschenko\"}", jsonString); + } + + + + + + + +} diff --git a/src/test/java/homework/homework_4/singleton/EnumSingletonTest.java b/src/test/java/homework/homework_4/singleton/EnumSingletonTest.java new file mode 100644 index 00000000..c64309e8 --- /dev/null +++ b/src/test/java/homework/homework_4/singleton/EnumSingletonTest.java @@ -0,0 +1,19 @@ +package homework.homework_4.singleton; + +import homework_4.singleton.EnumSingleton; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class EnumSingletonTest { + + @Test + public void compareInstances(){ + + EnumSingleton singleton1 = EnumSingleton.getInstance(); + EnumSingleton singleton2 = EnumSingleton.getInstance(); + + assertSame(singleton1, singleton2); + } + +} diff --git a/src/test/java/homework/homework_4/singleton/NaiveSingletonTest.java b/src/test/java/homework/homework_4/singleton/NaiveSingletonTest.java new file mode 100644 index 00000000..02168cb9 --- /dev/null +++ b/src/test/java/homework/homework_4/singleton/NaiveSingletonTest.java @@ -0,0 +1,32 @@ +package homework.homework_4.singleton; + +import homework_4.singleton.NaiveSingleton; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class NaiveSingletonTest { + + @Test + public void compareInstancesWithEqualSign(){ + NaiveSingleton singleton1 = NaiveSingleton.getInstance(); + NaiveSingleton singleton2 = NaiveSingleton.getInstance(); + NaiveSingleton singletonX = NaiveSingleton.getInstance(); + + assertSame(singleton1, singleton2); + assertSame(singleton1, singletonX); + + } + + @Test + public void compareInstancesWithEqualsMethod(){ + NaiveSingleton singleton1 = NaiveSingleton.getInstance(); + NaiveSingleton singleton2 = NaiveSingleton.getInstance(); + NaiveSingleton singletonX = NaiveSingleton.getInstance(); + + assertEquals(singleton2, singleton1); + assertSame(singleton1, singletonX); + + } + +} diff --git a/src/test/java/homework/homework_4/singleton/SingletonTest.java b/src/test/java/homework/homework_4/singleton/SingletonTest.java new file mode 100644 index 00000000..1e036897 --- /dev/null +++ b/src/test/java/homework/homework_4/singleton/SingletonTest.java @@ -0,0 +1,28 @@ +package homework.homework_4.singleton; + +import homework_4.singleton.Singleton; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class SingletonTest { + + @Test + public void compareInstances() { + + Singleton singleton1 = Singleton.getInstance(); + Singleton singleton2 = Singleton.getInstance(); + + assertSame(singleton1, singleton2); +} + @Test + public void compareWithNull(){ + + Singleton singleton1 = null; + Singleton singleton2 = Singleton.getInstance(); + + assertNotSame(singleton1, singleton2); + } + + +} From 5518ae7fea9fef21a85ebcc88329e275b6fe24bd Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Thu, 19 Aug 2021 15:42:11 +0300 Subject: [PATCH 21/34] Tests added --- .../homework_4/CustomFileReaderTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/test/java/homework/homework_4/CustomFileReaderTest.java diff --git a/src/test/java/homework/homework_4/CustomFileReaderTest.java b/src/test/java/homework/homework_4/CustomFileReaderTest.java new file mode 100644 index 00000000..935df9a5 --- /dev/null +++ b/src/test/java/homework/homework_4/CustomFileReaderTest.java @@ -0,0 +1,56 @@ +package homework.homework_4; + +import homework.homework_1.UnitBase; +import homework_4.custom_file_reader.CustomFileReader; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CustomFileReaderTest extends UnitBase { + + @Test + public void givenRunAllThree_whenRun_thenResultsAreTheSame() { + new CustomFileReader().run1(); + new CustomFileReader().run2(); + new CustomFileReader().run3(); + + String[] resultStrings = getOutputLines(); + String resultAfterRun1 = resultStrings[0]; + String resultAfterRun2 = resultStrings[1]; + String resultAfterRun3 = resultStrings[2]; + + assertEquals(resultAfterRun1, resultAfterRun2); + assertEquals(resultAfterRun1, resultAfterRun3); + } + + @Test + public void givenRun1_whenRun_thenOutputDoesntContainsComasAndDots() { + new CustomFileReader().run1(); + + String[] resultStrings = getOutputLines(); + String result = resultStrings[0]; + + assertFalse(result.contains("(\\.)|(,)")); + } + + @Test + public void givenRun2_whenRun_thenOutputDoesntContainsComasAndDots() { + new CustomFileReader().run2(); + + String[] resultStrings = getOutputLines(); + String result = resultStrings[0]; + + assertFalse(result.contains("(\\.)|(,)")); + } + + @Test + public void givenRun3_whenRun_thenOutputDoesntContainsComasAndDots() { + new CustomFileReader().run3(); + + String[] resultStrings = getOutputLines(); + String result = resultStrings[0]; + + assertFalse(result.contains("(\\.)|(,)")); + } + +} From 53889714d155fff3fe0bc70cca9c2a0ea899924f Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Thu, 19 Aug 2021 17:55:53 +0300 Subject: [PATCH 22/34] README fixes --- README.md | 6 ++- .../homework_1/ConsolePrinterTest.java | 53 +++++++++++++++++++ .../pyramid_printer/PyramidPrinterTest.java | 4 +- .../RandomCharsTableTest.java | 2 +- .../traffic_light/TrafficLightTest.java | 2 +- .../homework_4/CustomFileReaderTest.java | 2 +- .../{homework_1 => unit_base}/UnitBase.java | 2 +- 7 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 src/test/java/homework/homework_1/ConsolePrinterTest.java rename src/test/java/homework/{homework_1 => unit_base}/UnitBase.java (98%) diff --git a/README.md b/README.md index 36ff1fc9..5dee3dbb 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,11 @@ | HW 2_1 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/traffic_light) | Traffic Light app, the simple one. | | HW 2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/pyramid_printer) | The Pyramid printer, prints triangles only, btw. | | HW 2_3| [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/random_chars_table) | Random chars table, prints table with chars and then sorts them by even or odd. -| HW 3, tests|[Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/test/java/homework/homework_2) | Tests for homework 2 | HW 3, Immutable Class Example| [ImutableClassExample](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_3) | Immutable class. - +| HW 4_1| [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_annotation)| Annotation for JSON Serialization +| HW 4_2| [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_file_reader) | File Reader which removes full stops and comas fro TXT file +| HW 4_3| [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/singleton)| Three singleton classes +| Tests|[Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/test/java/homework) | Tests for homework [Link to CodingBat](https://codingbat.com/done?user=dvaschenko33@gmail.com&tag=4651459890) diff --git a/src/test/java/homework/homework_1/ConsolePrinterTest.java b/src/test/java/homework/homework_1/ConsolePrinterTest.java new file mode 100644 index 00000000..d7a8b7f4 --- /dev/null +++ b/src/test/java/homework/homework_1/ConsolePrinterTest.java @@ -0,0 +1,53 @@ +package homework.homework_1; + +import ConsoleColors.ConsoleColors; +import homework.unit_base.UnitBase; +import homework_1.ConsolePrinter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class ConsolePrinterTest extends UnitBase { + + @Test + void givenNoArgs_whenRun_thenExitWOPrint() { + String[] args = new String[]{}; + ConsolePrinter.main(args); + assertEquals("", getOutputLines()[0]); + } + + @Test + void givenNullArg_whenRun_thenNPEThrown() { + String[] args = new String[]{null}; + assertThrows(NullPointerException.class, () -> { + ConsolePrinter.main(args); + }); + } + + @Test + void givenOne_NOT_ERROR_Line_whenRun_thenPrintsOneLine() { + String[] args = new String[]{"oneNotErrorLine"}; + ConsolePrinter.main(args); + String expected = args[0] + ": " + args[0].length() + " letter(s)" ; + assertEquals(expected, getOutputLines()[0]); + } + + @Test + void givenError_whenRun_thenRedAlarmPrinted() { + String[] args = new String[]{"error"}; + ConsolePrinter.main(args); + String expected = "[0;31mAlarm!"; + assertEquals(expected, getOutputLines()[0]); + } + + @Test + void givenThreeStringsAndError_whenRun_thenStringsPrintedAndRedAlarmPrinted() { + String[] args = new String[]{"first","second","third","error"}; + ConsolePrinter.main(args); + assertEquals(getOutputLines()[0], "first" + ": " + "first".length() + " letter(s)"); + assertEquals(getOutputLines()[1], "second" + ": " + "second".length() + " letter(s)"); + assertEquals(getOutputLines()[2], "third" + ": " + "third".length() + " letter(s)"); + assertTrue(getOutputLines()[3].contains("Alarm!")); + } + +} diff --git a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java index e74e8f24..eeb685bd 100644 --- a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java +++ b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -1,6 +1,6 @@ package homework.homework_2.pyramid_printer; -import homework.homework_1.UnitBase; +import homework.unit_base.UnitBase; import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; @@ -21,7 +21,7 @@ class PyramidPrinterTest extends UnitBase { // 8 double value @Test - void givenPositiveInt_whenInputIsThree_thenPrintPyramid() { + void givenPositiveInt_whenRun_thenPrintPyramid() { setInput("3"); new PyramidPrinter().run(); diff --git a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java index 2e7b67c3..effee842 100644 --- a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,6 +1,6 @@ package homework.homework_2.random_chars_table; -import homework.homework_1.UnitBase; +import homework.unit_base.UnitBase; import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; diff --git a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java index 24f1bcab..ab55fd0b 100644 --- a/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java +++ b/src/test/java/homework/homework_2/traffic_light/TrafficLightTest.java @@ -1,6 +1,6 @@ package homework.homework_2.traffic_light; -import homework.homework_1.UnitBase; +import homework.unit_base.UnitBase; import homework_2.traffic_light.TrafficLight; import org.junit.jupiter.api.Test; diff --git a/src/test/java/homework/homework_4/CustomFileReaderTest.java b/src/test/java/homework/homework_4/CustomFileReaderTest.java index 935df9a5..fc0f03dc 100644 --- a/src/test/java/homework/homework_4/CustomFileReaderTest.java +++ b/src/test/java/homework/homework_4/CustomFileReaderTest.java @@ -1,6 +1,6 @@ package homework.homework_4; -import homework.homework_1.UnitBase; +import homework.unit_base.UnitBase; import homework_4.custom_file_reader.CustomFileReader; import org.junit.jupiter.api.Test; diff --git a/src/test/java/homework/homework_1/UnitBase.java b/src/test/java/homework/unit_base/UnitBase.java similarity index 98% rename from src/test/java/homework/homework_1/UnitBase.java rename to src/test/java/homework/unit_base/UnitBase.java index 3a709e2c..1daac521 100644 --- a/src/test/java/homework/homework_1/UnitBase.java +++ b/src/test/java/homework/unit_base/UnitBase.java @@ -1,4 +1,4 @@ -package homework.homework_1; +package homework.unit_base; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; From c569b233e61167ceddd24a1277683a42ed28461f Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 23 Aug 2021 16:46:16 +0300 Subject: [PATCH 23/34] PowerOfNumber with tests --- build.gradle | 2 +- .../CustomRegexMatcher.java | 4 + .../homework_5/custom_regex_matcher/Main.java | 4 + .../java/homework_5/power_of_number/Main.java | 8 ++ .../power_of_number/PowerOfNumber.java | 64 ++++++++++++ .../CustomRegexMatcherTest.java | 4 + .../power_of_number/PowerOfNumberTest.java | 97 +++++++++++++++++++ 7 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java create mode 100644 src/main/java/homework_5/custom_regex_matcher/Main.java create mode 100644 src/main/java/homework_5/power_of_number/Main.java create mode 100644 src/main/java/homework_5/power_of_number/PowerOfNumber.java create mode 100644 src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java create mode 100644 src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java diff --git a/build.gradle b/build.gradle index 09a7c4e3..522c2e14 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' - + testCompile 'org.junit.jupiter:junit-jupiter-params:5.7.0' } test { diff --git a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java new file mode 100644 index 00000000..9a88174b --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -0,0 +1,4 @@ +package homework_5.custom_regex_matcher; + +public class CustomRegexMatcher { +} diff --git a/src/main/java/homework_5/custom_regex_matcher/Main.java b/src/main/java/homework_5/custom_regex_matcher/Main.java new file mode 100644 index 00000000..fdf993d2 --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/Main.java @@ -0,0 +1,4 @@ +package homework_5.custom_regex_matcher; + +public class Main { +} diff --git a/src/main/java/homework_5/power_of_number/Main.java b/src/main/java/homework_5/power_of_number/Main.java new file mode 100644 index 00000000..89300565 --- /dev/null +++ b/src/main/java/homework_5/power_of_number/Main.java @@ -0,0 +1,8 @@ +package homework_5.power_of_number; + +public class Main { + + public static void main(String[] args) { + new PowerOfNumber().run(); + } +} diff --git a/src/main/java/homework_5/power_of_number/PowerOfNumber.java b/src/main/java/homework_5/power_of_number/PowerOfNumber.java new file mode 100644 index 00000000..fa4f6393 --- /dev/null +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -0,0 +1,64 @@ +package homework_5.power_of_number; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.math.BigInteger; + +public class PowerOfNumber { + private final String ERR_MSG = "Only 2 non-negative integers are allowed"; + + public void run() { + System.out.println("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + String[] input = getInput(); + if (isValid(input)) { + BigInteger val = BigInteger.valueOf(Integer.parseInt(input[0])); + BigInteger pow = BigInteger.valueOf(Integer.parseInt(input[1])); + System.out.println(recPow(val, pow)); + } + } + + + private String[] getInput() { + String[] result = new String[2]; //only 2 arguments are allowed + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + try { + String rawInput = reader.readLine().trim(); + String[] toMeasure = rawInput.split("\\s"); + if (toMeasure.length != 2) { + System.out.println(ERR_MSG); + return result; + } else { + result = rawInput.split("\\s"); + } + + } + catch (IOException e) { + System.out.println(ERR_MSG); + } + return result; + } + + private boolean isValid(String[] input) { + if (input[0] != null && input[1] != null) { + if (input[0].chars().allMatch(Character::isDigit) && + input[1].chars().allMatch(Character::isDigit)) { + return true; + } + System.out.println(ERR_MSG); + } + return false; + } + + public BigInteger recPow(BigInteger val, BigInteger pow) { + + if (pow.compareTo(BigInteger.valueOf(0)) == 0) { + return BigInteger.valueOf(1); + } + pow = pow.subtract(BigInteger.valueOf(1)); + val = val.multiply(recPow(val, pow)); //recursion + + return val; + } + +} diff --git a/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java b/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java new file mode 100644 index 00000000..28d0deb0 --- /dev/null +++ b/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -0,0 +1,4 @@ +package homework.homework_5.custom_regex_matcher; + +public class CustomRegexMatcherTest { +} diff --git a/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java b/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java new file mode 100644 index 00000000..32cae6a2 --- /dev/null +++ b/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java @@ -0,0 +1,97 @@ +package homework.homework_5.power_of_number; + + +import homework.unit_base.UnitBase; +import homework_5.power_of_number.PowerOfNumber; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class PowerOfNumberTest extends UnitBase { + private final String ERR_MSG = "Only 2 non-negative integers are allowed"; + private PowerOfNumber powerOfNumber = new PowerOfNumber(); + // tested cases : string in input + // single integer + // three integers + // empty input + // three args, wrong method string + // empty input + // double numbers + // negative numbers + // 2 3 + // 10 123 21, result bigger then int + + @Test + public void givenString_whenRun_thenErrorOccurs(){ + setInput("string"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenOneInteger_whenRun_thenErrorOccurs(){ + setInput("12"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenThreeIntegers_whenRun_thenErrorOccurs(){ + setInput("12 12 12"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenEmptyInput_whenRun_thenErrorOccurs(){ + setInput(""); + + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertThrows(NullPointerException.class,() -> + new PowerOfNumber().run()); + } + + @Test + public void givenTwoDoubles_whenRun_thenErrorOccurs(){ + setInput("12.1 12.1"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenNegativeInInput_whenRun_thenErrorOccurs(){ + setInput("-2 12"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals(ERR_MSG, getOutput()); + removeFromOutput(ERR_MSG); + setInput("2 -12"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals(ERR_MSG, getOutput()); + + } + + @Test + public void givenTwoAndThree_whenRun_thenErrorOccurs(){ + setInput("2 3"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals("8", getOutput()); + } + + @Test + public void given123and21_whenRun_thenErrorOccurs(){ + setInput("123 21"); + powerOfNumber.run(); + removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); + assertEquals("77269364466549865653073473388030061522211723", getOutput()); + } + + + +} From d1783ffa5720bb08575b71680f212318182cc9fb Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 23 Aug 2021 17:14:38 +0300 Subject: [PATCH 24/34] CustomRegexMatcher with tests --- .../CustomRegexMatcher.java | 21 +++++ .../homework_5/custom_regex_matcher/Main.java | 4 + .../power_of_number/PowerOfNumber.java | 3 +- .../CustomRegexMatcherTest.java | 87 ++++++++++++++++++- .../power_of_number/PowerOfNumberTest.java | 21 +++-- 5 files changed, 122 insertions(+), 14 deletions(-) diff --git a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java index 9a88174b..bca7f8b8 100644 --- a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -1,4 +1,25 @@ package homework_5.custom_regex_matcher; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +//Moderate password matcher public class CustomRegexMatcher { + private final String regex = "(?=(.*[0-9]))((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.{8,}$"; + public void run(){ + System.out.println("Enter password-ish string, should have 1 lowercase letter, 1 uppercase letter, 1 number, and be at least 8 characters long"); + String input = getInput(); + System.out.println(input.matches(regex)); + } + + private String getInput() { + String result = "defaultString"; + try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){ + result = reader.readLine(); + } + catch (IOException e){ + e.printStackTrace(); + } + return result; + } } diff --git a/src/main/java/homework_5/custom_regex_matcher/Main.java b/src/main/java/homework_5/custom_regex_matcher/Main.java index fdf993d2..e1e20462 100644 --- a/src/main/java/homework_5/custom_regex_matcher/Main.java +++ b/src/main/java/homework_5/custom_regex_matcher/Main.java @@ -1,4 +1,8 @@ package homework_5.custom_regex_matcher; public class Main { + + public static void main(String[] args) { + new CustomRegexMatcher().run(); + } } diff --git a/src/main/java/homework_5/power_of_number/PowerOfNumber.java b/src/main/java/homework_5/power_of_number/PowerOfNumber.java index fa4f6393..3f0055e1 100644 --- a/src/main/java/homework_5/power_of_number/PowerOfNumber.java +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -32,8 +32,7 @@ private String[] getInput() { result = rawInput.split("\\s"); } - } - catch (IOException e) { + } catch (IOException e) { System.out.println(ERR_MSG); } return result; diff --git a/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java b/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java index 28d0deb0..6c8f14ef 100644 --- a/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java +++ b/src/test/java/homework/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -1,4 +1,89 @@ package homework.homework_5.custom_regex_matcher; +import homework.unit_base.UnitBase; + +import homework_5.custom_regex_matcher.CustomRegexMatcher; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CustomRegexMatcherTest extends UnitBase { + String greet = "Enter password-ish string, should have 1 lowercase letter, 1 uppercase letter, 1 number, and be at least 8 characters long"; + + CustomRegexMatcher crm = new CustomRegexMatcher(); + @Test + public void givenEmptyInput_whenRun_thenNPEThrown() { + setInput(""); + assertThrows(NullPointerException.class, () -> + crm.run()); + } + + @Test + public void givenSignsNotInRegex_whenRun_thenFalse() { + setInput("!!123tr>>?"); + crm.run(); + removeFromOutput(greet); + assertEquals("false", getOutput()); + } + + @Test + public void givenShortString_whenRun_thenFalse() { + setInput("string"); + crm.run(); + removeFromOutput(greet); + assertEquals("false", getOutput()); + } + + @Test + public void given8PlusLengthLowercase_whenRun_thenFalse() { + setInput("abcdefabcdef"); + crm.run(); + removeFromOutput(greet); + assertEquals("false", getOutput()); + } + + @Test + public void given8PlusLengthUppercase_whenRun_thenFalse() { + setInput("ABCDABCDE"); + crm.run(); + removeFromOutput(greet); + assertEquals("false", getOutput()); + } + + @Test + public void given8PlusDigits_whenRun_thenFalse() { + setInput("123456789"); + crm.run(); + removeFromOutput(greet); + assertEquals("false", getOutput()); + } + + @Test + public void givenCorrectOne_whenRun_thenTrue() { + setInput("A1asdasdasd"); + crm.run(); + removeFromOutput(greet); + assertEquals("true", getOutput()); + } + + @Test + public void givenCorrectTwo_whenRun_thenTrue() { + setInput("passworD123"); + crm.run(); + removeFromOutput(greet); + assertEquals("true", getOutput()); + } + + @Test + public void givenCorrectThree_whenRun_thenTrue() { + setInput("PassWord0123"); + crm.run(); + removeFromOutput(greet); + assertEquals("true", getOutput()); + } + + + + + -public class CustomRegexMatcherTest { } diff --git a/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java b/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java index 32cae6a2..5ec5a1b7 100644 --- a/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java +++ b/src/test/java/homework/homework_5/power_of_number/PowerOfNumberTest.java @@ -22,7 +22,7 @@ public class PowerOfNumberTest extends UnitBase { // 10 123 21, result bigger then int @Test - public void givenString_whenRun_thenErrorOccurs(){ + public void givenString_whenRun_thenErrorOccurs() { setInput("string"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -30,7 +30,7 @@ public void givenString_whenRun_thenErrorOccurs(){ } @Test - public void givenOneInteger_whenRun_thenErrorOccurs(){ + public void givenOneInteger_whenRun_thenErrorOccurs() { setInput("12"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -38,7 +38,7 @@ public void givenOneInteger_whenRun_thenErrorOccurs(){ } @Test - public void givenThreeIntegers_whenRun_thenErrorOccurs(){ + public void givenThreeIntegers_whenRun_thenErrorOccurs() { setInput("12 12 12"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -46,16 +46,16 @@ public void givenThreeIntegers_whenRun_thenErrorOccurs(){ } @Test - public void givenEmptyInput_whenRun_thenErrorOccurs(){ + public void givenEmptyInput_whenRun_thenErrorOccurs() { setInput(""); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); - assertThrows(NullPointerException.class,() -> - new PowerOfNumber().run()); + assertThrows(NullPointerException.class, () -> + new PowerOfNumber().run()); } @Test - public void givenTwoDoubles_whenRun_thenErrorOccurs(){ + public void givenTwoDoubles_whenRun_thenErrorOccurs() { setInput("12.1 12.1"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -63,7 +63,7 @@ public void givenTwoDoubles_whenRun_thenErrorOccurs(){ } @Test - public void givenNegativeInInput_whenRun_thenErrorOccurs(){ + public void givenNegativeInInput_whenRun_thenErrorOccurs() { setInput("-2 12"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -77,7 +77,7 @@ public void givenNegativeInInput_whenRun_thenErrorOccurs(){ } @Test - public void givenTwoAndThree_whenRun_thenErrorOccurs(){ + public void givenTwoAndThree_whenRun_thenErrorOccurs() { setInput("2 3"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -85,7 +85,7 @@ public void givenTwoAndThree_whenRun_thenErrorOccurs(){ } @Test - public void given123and21_whenRun_thenErrorOccurs(){ + public void given123and21_whenRun_thenErrorOccurs() { setInput("123 21"); powerOfNumber.run(); removeFromOutput("Enter the number and degree, please, only 2 non-negative integers are allowed:"); @@ -93,5 +93,4 @@ public void given123and21_whenRun_thenErrorOccurs(){ } - } From eae2a8af6e67d556423a929ffa66476d5d8b1fbf Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Mon, 23 Aug 2021 17:22:23 +0300 Subject: [PATCH 25/34] README revisions --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5dee3dbb..604891ca 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ | HW 4_1| [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_annotation)| Annotation for JSON Serialization | HW 4_2| [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_file_reader) | File Reader which removes full stops and comas fro TXT file | HW 4_3| [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/singleton)| Three singleton classes +| HW 5_1| [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_5/custom_regex_matcher)| App is checking if input matches moderate password +| HW 5_2| [PowerOfNumber](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_5/power_of_number)|Recursively counts given degree of a given number | Tests|[Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/test/java/homework) | Tests for homework [Link to CodingBat](https://codingbat.com/done?user=dvaschenko33@gmail.com&tag=4651459890) From 04089a09381b854cdbfde91fefcbd245910f7e7f Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 5 Sep 2021 15:07:22 +0300 Subject: [PATCH 26/34] small fixes --- src/main/java/homework_1/ConsolePrinter.java | 2 +- .../pyramid_printer/PyramidPrinter.java | 9 +++++- .../random_chars_table/RandomCharsTable.java | 22 +++++++------ .../pyramid_printer/PyramidPrinterTest.java | 2 +- .../RandomCharsTableTest.java | 31 ++++++++++++++++--- 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/main/java/homework_1/ConsolePrinter.java b/src/main/java/homework_1/ConsolePrinter.java index 5e1055f6..b84f8fa5 100644 --- a/src/main/java/homework_1/ConsolePrinter.java +++ b/src/main/java/homework_1/ConsolePrinter.java @@ -9,7 +9,7 @@ public static void main(String[] args) { for (int i = 0; i < args.length; i++) { String toPrint = args[i]; - if (toPrint.equalsIgnoreCase("error")) { //checking for error + if (toPrint.equalsIgnoreCase("error")) { System.out.println(ConsoleColors.RED + "Alarm!" + ConsoleColors.RESET); break; } diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index 79bd5fc5..52fcef0d 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -12,6 +12,8 @@ public void run() { if (isValid(sizeOfPyramid)) { printPyramid(Integer.parseInt(sizeOfPyramid)); + } else { + System.out.println(ERR_MSG); } } @@ -42,6 +44,11 @@ private String getRow(int i) { } private boolean isValid(String input) { - return input != null && input.chars().allMatch(Character::isDigit); + + if (input != null && input.chars().allMatch(Character::isDigit)){ + long intRes = Long.parseLong(input); + return intRes >= 0 && intRes < Integer.MAX_VALUE; + } + return false; } } diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 75ae547b..9b40317d 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -7,14 +7,12 @@ import java.util.Locale; public class RandomCharsTable { - private final String ERR_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; + private static final String ERR_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; public void run() { RandomCharsTable table = new RandomCharsTable(); - String lenStr; - String widStr; - String method; + String lenStr, widStr, method; String[] strings = table.getInput(); @@ -25,8 +23,8 @@ public void run() { method = strings[2].toLowerCase(Locale.ROOT); char[][] toPrint = table.getTable(lenStr, widStr); - if (toPrint.length == 0) { - System.out.println("Table is empty"); + if (toPrint.length <= 1) { + System.out.println(ERR_MSG); return; } @@ -56,7 +54,7 @@ private String[] getInput() { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { String rawInput = reader.readLine(); - result = rawInput.split(" "); + return rawInput.split(" "); } catch (IOException e) { System.out.println(ERR_MSG); @@ -73,8 +71,14 @@ private boolean isValid(String[] strings) { if (strings.length < 3) { return false; } else if (strings.length == 3) { - firstDigit = strings[0].chars().allMatch(Character::isDigit); - secondDigit = strings[1].chars().allMatch(Character::isDigit); + if(strings[0].chars().allMatch(Character::isDigit)){ + long intResFirst = Long.parseLong(strings[0]); + firstDigit = intResFirst > 0 && intResFirst < Integer.MAX_VALUE; + } + if(strings[1].chars().allMatch(Character::isDigit)){ + long intResSecond = Long.parseLong(strings[0]); + secondDigit = intResSecond > 0 && intResSecond < Integer.MAX_VALUE; + } oddOrEven = (strings[2].equals("odd") || strings[2].equals("even")); } return (firstDigit && secondDigit && oddOrEven); diff --git a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java index eeb685bd..54776ea2 100644 --- a/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java +++ b/src/test/java/homework/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -70,7 +70,7 @@ void givenToBigNumber_whenRun_thenWriteErrMsgAndStop() { new PyramidPrinter().run(); removeFromOutput("Enter the Pyramid size. please: "); printOut(); - assertEquals(ERR_MSG, getOutputLines()[0]); + assertTrue(getOutput().contains(ERR_MSG)); } @Test diff --git a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java index effee842..370355bc 100644 --- a/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework/homework_2/random_chars_table/RandomCharsTableTest.java @@ -19,7 +19,9 @@ class RandomCharsTableTest extends UnitBase { // more than 3 args // three args, wrong order // 0 0 odd table - // 10 0 0 even table + // 0 0 even table + // 0 1 even table + //12 1 0 even table @Test @@ -153,23 +155,42 @@ void givenThreeArgsOrderIsWrong_whenRun_thenErrorOccurs() { @Test public void givenZeroZeroOddMethod_whenRun_thenAllGood() { setInput("0 0 odd"); - String expected = "Table is empty"; new RandomCharsTable().run(); removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); - assertEquals(expected, getOutput()); + assertEquals(ERR_MSG, getOutput()); } @Test public void givenZeroZeroEvenMethod_whenRun_thenAllGood() { setInput("0 0 even"); - String expected = "Table is empty"; new RandomCharsTable().run(); removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); - assertEquals(expected, getOutput()); + assertEquals(ERR_MSG, getOutput()); } + @Test + public void givenZeroOneEvenMethod_whenRun_thenAllGood() { + setInput("0 1 even"); + + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + + assertEquals(ERR_MSG, getOutput()); + } + + @Test + public void givenOneZeroEvenMethod_whenRun_thenAllGood() { + setInput("1 0 even"); + + new RandomCharsTable().run(); + removeFromOutput("Enter two Integers and sorting method, even or odd, e.g. 12 12 odd"); + + assertEquals(ERR_MSG, getOutput()); + } + + } \ No newline at end of file From 3e9e559cea58f1a93b977fed3501dab71e1067a5 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Thu, 23 Sep 2021 17:51:55 +0300 Subject: [PATCH 27/34] Project is in process --- src/main/java/course_project/Main.java | 8 + src/main/java/course_project/SeaBattle.java | 29 ++++ .../Utils/ConsoleHandling/InReader.java | 89 +++++++++++ .../Utils/ConsoleHandling/Printer.java | 141 ++++++++++++++++++ .../Utils/GameHandler/Handler.java | 37 +++++ .../Utils/ShipPlacers/ComputerShipPlacer.java | 109 ++++++++++++++ .../Utils/ShipPlacers/Placer.java | 62 ++++++++ .../Utils/ShipPlacers/PlayerShipPlacer.java | 107 +++++++++++++ .../components/Coordinates.java | 47 ++++++ .../java/course_project/components/Field.java | 27 ++++ .../java/course_project/components/Ship.java | 48 ++++++ .../java/course_project/enums/ShipType.java | 31 ++++ src/main/java/course_project/enums/State.java | 24 +++ 13 files changed, 759 insertions(+) create mode 100644 src/main/java/course_project/Main.java create mode 100644 src/main/java/course_project/SeaBattle.java create mode 100644 src/main/java/course_project/Utils/ConsoleHandling/InReader.java create mode 100644 src/main/java/course_project/Utils/ConsoleHandling/Printer.java create mode 100644 src/main/java/course_project/Utils/GameHandler/Handler.java create mode 100644 src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java create mode 100644 src/main/java/course_project/Utils/ShipPlacers/Placer.java create mode 100644 src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java create mode 100644 src/main/java/course_project/components/Coordinates.java create mode 100644 src/main/java/course_project/components/Field.java create mode 100644 src/main/java/course_project/components/Ship.java create mode 100644 src/main/java/course_project/enums/ShipType.java create mode 100644 src/main/java/course_project/enums/State.java diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java new file mode 100644 index 00000000..c63a450e --- /dev/null +++ b/src/main/java/course_project/Main.java @@ -0,0 +1,8 @@ +package course_project; + +public class Main { + public static void main(String[] args) { + new SeaBattle().play(); + } + +} diff --git a/src/main/java/course_project/SeaBattle.java b/src/main/java/course_project/SeaBattle.java new file mode 100644 index 00000000..d8ab9ec9 --- /dev/null +++ b/src/main/java/course_project/SeaBattle.java @@ -0,0 +1,29 @@ +package course_project; + +import course_project.Utils.ConsoleHandling.Printer; +import course_project.Utils.GameHandler.Handler; + +public class SeaBattle { + final Printer printer = new Printer(); + final Handler handler = new Handler(); + + public void play(){ + printer.printGreeting(); + + handler.start(); + do{ + handler.makeMoves(); + } + while (!handler.endOfGame()); + + + + + printer.printGoodbye(); + + + } + + + +} diff --git a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java new file mode 100644 index 00000000..2df07f5e --- /dev/null +++ b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java @@ -0,0 +1,89 @@ +package course_project.Utils.ConsoleHandling; + +import course_project.components.Coordinates; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class InReader { + Printer printer = new Printer(); + private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + + public Coordinates readCoordinates() { + String[] strings = verifyInput(readInput()); + int x = -1; + int y = -1; + if (strings[0].length() >= 2) { + int [] coord = parseToCoord(strings[0]); + x = coord[0]; + y = coord[1]; + } + else { + printer.printInputError(); + readInput(); + } + + return new Coordinates(x,y); + } + + public List getCoordinatesByDestination(Coordinates start, int size){ + List result = new ArrayList<>(); + for (int i = 1; i <= size; i++){ + String input = readInput(); + String[] strings = verifyInput(input); + int x = -1; + int y = -1; + if (strings[0].length() >= 2) { + int [] coord = parseToCoord(strings[0]); + x = coord[0]; + y = coord[1]; + } else { + printer.printInputError(); + readInput(); + } + result.add(new Coordinates(x, y)); + } + return result; + } + + private int[] parseToCoord(String string) { + int[] result = new int[2]; + int first = string.toUpperCase(Locale.ROOT).charAt(0) - 65; + int second = Integer.parseInt(string.substring(1)) -1; + result[0] = first; + result[1] = second; + + return result; + } + + + private String readInput(){ + String input = ""; + { + try { + input = reader.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return input; + } + + private String[] verifyInput(String str){ + if (str == null && !str.matches("[a-jA-J]([1-9]|10) (up|down|left|right)")){ + printer.printInputError(); + readInput(); + } + return str.split(" "); + } + + + public boolean getMode() { + String mode = readInput(); + return mode.isEmpty(); + } +} diff --git a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java new file mode 100644 index 00000000..66a14056 --- /dev/null +++ b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java @@ -0,0 +1,141 @@ +package course_project.Utils.ConsoleHandling; + +import course_project.components.Field; +import course_project.enums.ShipType; + +public class Printer { + + public void printGreeting() { + String GREETING = "Welcome to Sea Battle, stranger!"; + System.out.println(GREETING); + } + + public void printAskHowFill() { + String ASK_HOW_TO_FILL = "How Would you like to place your ships? " + + "Please, enter \" man \" to place them manually or just press enter to place them automatically"; + System.out.println(ASK_HOW_TO_FILL); + } + + public void printHeader() { + String HEADER = " A B C D E F G H I J "; + + System.out.println(HEADER); + } + + public void printYuoMiss() { + String YOU_MISS = "Oh no, you missed :("; + System.out.println(YOU_MISS); + } + + public void printPCMiss() { + String AI_MISSED = "Computer missed, thank goodness!"; + System.out.println(AI_MISSED); + } + + public void printYouHit() { + String YOU_HIT = "What a shoot, you hit it!"; + System.out.println(YOU_HIT); + } + + public void printYouWasHit() { + String YOU_WAS_HIT = "Uh, oh, your ship is falling apart!"; + System.out.println(YOU_WAS_HIT); + } + + public void printDestroyed() { + String DESTROYED = "Ship destroyed, did you that explosion? Huge, ain't it?"; + System.out.println(DESTROYED); + } + + public void printWin() { + String WON = "Oh yes, you is a winner! Never doubt it."; + System.out.println(WON); + } + + public void printLose() { + String LOSE = "What a shame, you lose!"; + System.out.println(LOSE); + } + + public void printShoot() { + String SHOOT = "Piu piu piu"; + System.out.println(SHOOT); + } + + public void askShipHead() { + String ASK_PLACE_SHIP_HEAD = "Insert ship head coordinates, use header letter and a row number, like A 1 or c 4"; + System.out.println(ASK_PLACE_SHIP_HEAD); + } + + public void printAskDestination() { + String ASK_DESTINATION = "Which side would you like a Ship to be turned? Enter \"up\" , \"down\", \"left\" or \"right\""; + System.out.println(ASK_DESTINATION); + } + + public void printAskContinue() { + String ASK_CONTINUE = "How about one more game?"; + System.out.println(ASK_CONTINUE); + } + + public void printGoodbye() { + String SAY_GOODBYE = "Thanks for a playing and have a nice day!"; + System.out.println(SAY_GOODBYE); + } + + public void printSep() { + String SEPARATOR = "-----------------------------"; + System.out.println(SEPARATOR); + } + + public void printInputError() { + String INPUT_ERROR_MESSAGE = "Something is wrong with input, try again"; + System.out.println(INPUT_ERROR_MESSAGE); + } + + public void printPlacing(ShipType type) { + String PLACING = "Now Placing : "; + System.out.println(PLACING + type.getType()); + } + + public void printPlaced(ShipType type) { + String PLACED = "Correctly placed : "; + System.out.println(PLACED + type.getType()); + } + + public void printYouField(Field field) { + printHeader(); + int[][] toPrint = field.getField(); + int rowNumber = 1; + for (int[] row : toPrint + ) { + System.out.print( rowNumber); + for (int i : row + ) { + if (i == 0) { + i += 126; + } + System.out.print(" " + (char) i + " "); + } + System.out.println(); + ++rowNumber; + } + } + + public void printEnemyField(Field field) { + printHeader(); + int[][] toPrint = field.getField(); + for (int[] row : toPrint + ) { + for (int i : row + ) { + if (i == 0 || i == '#') { + i = 126; + } + + System.out.print(" " + (char) i + " "); + } + System.out.println(); + } + } + +} diff --git a/src/main/java/course_project/Utils/GameHandler/Handler.java b/src/main/java/course_project/Utils/GameHandler/Handler.java new file mode 100644 index 00000000..f630b5ca --- /dev/null +++ b/src/main/java/course_project/Utils/GameHandler/Handler.java @@ -0,0 +1,37 @@ +package course_project.Utils.GameHandler; + +import course_project.Utils.ConsoleHandling.InReader; +import course_project.Utils.ConsoleHandling.Printer; +import course_project.Utils.ShipPlacers.ComputerShipPlacer; +import course_project.Utils.ShipPlacers.PlayerShipPlacer; +import course_project.components.Field; + +public class Handler { + private Field playerField = new Field(); + private Field computerField = new Field(); + private final Printer printer = new Printer(); + ComputerShipPlacer cPlacer = new ComputerShipPlacer(); + PlayerShipPlacer plPacer = new PlayerShipPlacer(); + InReader reader = new InReader(); + + public void start() { + printer.printAskHowFill(); + boolean auto = reader.getMode(); + if(!auto){ + playerField = plPacer.placeShips(reader); + } else { + playerField = cPlacer.placeShips(); //places Ship with ComputerShipPlacer automatically + } + computerField = plPacer.placeShips(); + printer.printYouField(playerField); + printer.printEnemyField(computerField); + } + + public void makeMoves() { + + } + + public boolean endOfGame() { + return false; + } +} diff --git a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java new file mode 100644 index 00000000..4ad984ae --- /dev/null +++ b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java @@ -0,0 +1,109 @@ +package course_project.Utils.ShipPlacers; + +import course_project.Utils.ConsoleHandling.InReader; +import course_project.components.Coordinates; +import course_project.components.Field; +import course_project.components.Ship; +import course_project.enums.ShipType; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class ComputerShipPlacer implements Placer { + private final Random random = new Random(); + private Field computerField = new Field(); + private final List allShipsCoordinates = new ArrayList<>(); + private final List notAllowed = new ArrayList<>(); + private List allShips = new ArrayList<>(10); + + private List createAllShips() { + + for (ShipType type : ShipType.values() + ) { + for (int i = 1; i <= type.getCount(); i++) { + List coordinates; + + do { + coordinates = new ArrayList<>(generateShipCoordinates(i)); + } while (!isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinates)); + + Ship ship = new Ship(type, coordinates); + + allShips.add(ship); + allShipsCoordinates.addAll(coordinates); + fillForbiddenCoordinates(coordinates, notAllowed); + } + } + return allShips; + } + + @Override + public Field placeShips() { + allShips = createAllShips(); + for (Ship ship : allShips + ) { + computerField.place(ship); + } + + return computerField; + } + + @Override + public Field placeShips(InReader reader) { + throw new UnsupportedOperationException("Not supported for ComputerShipPlacer!"); + } + + + private ArrayList generateShipCoordinates(int size) { + ArrayList shipCoordinates = new ArrayList<>(); + Coordinates start = getFirstDeck(); + if (size == 1) { + shipCoordinates.add(start); + return shipCoordinates; + } else { + shipCoordinates = createRest(start, size); + } + return shipCoordinates; + + } + + private Coordinates getFirstDeck() { + Coordinates firstDeck; + do { + int x = random.nextInt(10); + int y = random.nextInt(10); + + firstDeck = new Coordinates(x, y); + } + while (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)); + return firstDeck; + } + + + + private ArrayList createRest(Coordinates start, int size) { + ArrayList coordinatesList = new ArrayList<>(); + coordinatesList.add(start); + + if (random.nextBoolean()) { + for (int i = 1; i < size; i++) { + coordinatesList.add(new Coordinates(start.getX() + i, start.getY())); + } + } else for (int i = 1; i < size; i++) { + coordinatesList.add(new Coordinates(start.getX(), start.getY() + i)); + } + return coordinatesList; + } + + public Field cleanField() { + allShips.clear(); + allShipsCoordinates.clear(); + notAllowed.clear(); + computerField = new Field(); + return computerField; + } + +} + diff --git a/src/main/java/course_project/Utils/ShipPlacers/Placer.java b/src/main/java/course_project/Utils/ShipPlacers/Placer.java new file mode 100644 index 00000000..999602e1 --- /dev/null +++ b/src/main/java/course_project/Utils/ShipPlacers/Placer.java @@ -0,0 +1,62 @@ +package course_project.Utils.ShipPlacers; + +import course_project.Utils.ConsoleHandling.InReader; +import course_project.components.Coordinates; +import course_project.components.Field; + +import java.util.ArrayList; +import java.util.List; + +public interface Placer { + Field placeShips(); + Field placeShips(InReader reader); + + default boolean isValidCoordinatesOfPoint(List listShips, List listAdjusted,Coordinates point) { + return !listShips.contains(point) && !listAdjusted.contains(point) && + point.getY() >= 0 && point.getY() <= 9 && point.getX() >= 0 && point.getX() <= 9; + } + + default boolean isValidCoordinatesOfList(List listShips, List listAdjusted,List coordinates) { + for (Coordinates point : coordinates + ) { + if(!isValidCoordinatesOfPoint(listShips, listAdjusted, point)){ + return false; + } + } + return true; + } + default List fillForbiddenCoordinates(List shipCoordinates, List notAllowed ) { + for (Coordinates coord : shipCoordinates + ) { + int x = coord.getX(); + int y = coord.getY(); + List rawNotAdd = new ArrayList<>(); + Coordinates c1 = new Coordinates(x + 1, y + 1); + rawNotAdd.add(c1); + Coordinates c2 = new Coordinates(x + 1, y); + rawNotAdd.add(c2); + Coordinates c3 = new Coordinates(x + 1, y - 1); + rawNotAdd.add(c3); + Coordinates c4 = new Coordinates(x, y + 1); + rawNotAdd.add(c4); + Coordinates c5 = new Coordinates(x, y - 1); + rawNotAdd.add(c5); + Coordinates c6 = new Coordinates(x - 1, y + 1); + rawNotAdd.add(c6); + Coordinates c7 = new Coordinates(x - 1, y); + rawNotAdd.add(c7); + Coordinates c8 = new Coordinates(x - 1, y - 1); + rawNotAdd.add(c8); + + for (Coordinates c : rawNotAdd + ) { + if (!notAllowed.contains(c)) { + notAllowed.add(c); + } + } + } + return notAllowed; + } + + +} diff --git a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java new file mode 100644 index 00000000..c10154f6 --- /dev/null +++ b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java @@ -0,0 +1,107 @@ +package course_project.Utils.ShipPlacers; + + +import course_project.Utils.ConsoleHandling.InReader; +import course_project.Utils.ConsoleHandling.Printer; +import course_project.components.Coordinates; +import course_project.components.Field; +import course_project.components.Ship; +import course_project.enums.ShipType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class PlayerShipPlacer implements Placer { + + private final Printer printer = new Printer(); + private Field playerField = new Field(); + private final List allShipsCoordinates = new ArrayList<>(); + private final List notAllowed = new ArrayList<>(); + + private List allShips = new ArrayList<>(10); + + @Override + public Field placeShips() { + return new ComputerShipPlacer().placeShips(); + } + + @Override + public Field placeShips(InReader reader) { + return placeShipsManually(reader); + } + private Field placeShipsManually(InReader reader) { + + allShips = createAllShips(reader); + + for (Ship ship : allShips + ) { + playerField.place(ship); + } + + return playerField; + } + + private List createAllShips(InReader reader) { + + for (ShipType type : ShipType.values() + ) { + + for (int i = 1; i <= type.getCount(); i++) { + List coordinates; + printer.printPlacing(type); + + coordinates = new ArrayList<>(getShipCoordinates(i, reader)); + Ship ship = new Ship(type, coordinates); + + allShips.add(ship); + + printer.printPlaced(type); + + allShipsCoordinates.addAll(coordinates); + fillForbiddenCoordinates(coordinates, notAllowed); + } + } + return allShips; + } + + private List getShipCoordinates(int size, InReader reader) { + List shipCoordinates = new ArrayList<>(); + + Coordinates firstDeck = getFirstDeck(reader); + if (size == 1) { + shipCoordinates.add(firstDeck); + return shipCoordinates; + } else { + shipCoordinates = createRest(firstDeck, size, reader); + } + return shipCoordinates; + + } + + private Coordinates getFirstDeck(InReader reader) { + printer.askShipHead(); + printer.printYouField(playerField); + Coordinates firstDeck; + do { + firstDeck = reader.readCoordinates(); + if (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)){ + printer.printInputError(); + } + } + while (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)); + return firstDeck; + } + + private List createRest(Coordinates start, int size, InReader reader) { + printer.printAskDestination(); + List coordinatesList = new ArrayList<>(); + coordinatesList.add(start); + coordinatesList = reader.getCoordinatesByDestination(start, size); + if(!isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinatesList)){ + printer.printInputError(); + } + + return coordinatesList; + } +} diff --git a/src/main/java/course_project/components/Coordinates.java b/src/main/java/course_project/components/Coordinates.java new file mode 100644 index 00000000..073e3cdd --- /dev/null +++ b/src/main/java/course_project/components/Coordinates.java @@ -0,0 +1,47 @@ +package course_project.components; + +import course_project.SeaBattle; + +import java.util.Objects; + +public class Coordinates { + + public final int x; + public final int y; + + public Coordinates(int row, int column) { + this.x = row; + this.y = column; + } + + + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + @Override + public String toString() { + return "Coordinates{" + + "x=" + x + + ", y=" + y + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Coordinates that = (Coordinates) o; + return x == that.x && y == that.y; + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} diff --git a/src/main/java/course_project/components/Field.java b/src/main/java/course_project/components/Field.java new file mode 100644 index 00000000..9aeb8319 --- /dev/null +++ b/src/main/java/course_project/components/Field.java @@ -0,0 +1,27 @@ +package course_project.components; + + +import course_project.enums.State; + +import java.util.Arrays; + +public class Field { + final private int SIZE = 10; + private String state; + private final int[][] field = new int[SIZE][SIZE]; + + public void place(Ship ship) { + for (Coordinates point : ship.getCoordinates() + ) { + field[point.getX()][point.getY()] = State.DECK.getState(); + } + } + + public String getState() { + return state; + } + + public int[][] getField() { + return field; + } +} diff --git a/src/main/java/course_project/components/Ship.java b/src/main/java/course_project/components/Ship.java new file mode 100644 index 00000000..2d1ac866 --- /dev/null +++ b/src/main/java/course_project/components/Ship.java @@ -0,0 +1,48 @@ +package course_project.components; + +import course_project.enums.ShipType; + +import java.util.ArrayList; +import java.util.List; + +public class Ship { + private final List coordinates; + public ShipType type; + private int health; + private final int size; + private boolean alive = true; + + + public Ship(ShipType type, List coordinates){ + this.size = type.getSize(); + this.health = size; + this.coordinates = new ArrayList<>(coordinates); + this.type = type; + + } + + public List getCoordinates() { + return new ArrayList<>(coordinates); + } + public void gotShot() { + health--; + if (health == 0) { + alive = false; + } + } + + public ShipType getType() { + return this.type; + } + + public int getSize() { + return size; + } + + public boolean isAlive() { + return alive; + } + + + +} diff --git a/src/main/java/course_project/enums/ShipType.java b/src/main/java/course_project/enums/ShipType.java new file mode 100644 index 00000000..27f86a09 --- /dev/null +++ b/src/main/java/course_project/enums/ShipType.java @@ -0,0 +1,31 @@ +package course_project.enums; + +public enum ShipType { + AIR_CARRIER(1, "Huge air-carrier", 4), + CRUISER(2, "Cruiser, big one", 3), + DESTROYER(3, "Destroyer, not a big one", 2), + TORPEDO0_BOAT(4, "Nothing but a small bot", 1); + + private final int count; + private final String type; + private final int size; + + ShipType(int count, String type, int size) { + this.count = count; + this.type = type; + this.size = size; + } + + public int getSize() { + return size; + } + + public int getCount() { + return count; + } + + public String getType() { + return type; + } + +} diff --git a/src/main/java/course_project/enums/State.java b/src/main/java/course_project/enums/State.java new file mode 100644 index 00000000..79678eb1 --- /dev/null +++ b/src/main/java/course_project/enums/State.java @@ -0,0 +1,24 @@ +package course_project.enums; + +public enum State { + EMPTY ('~'), + DECK ('#'), + MISS ('*'), + HIT ('X'); + + private final char state; + + State(char state) { + this.state = state; + } + + public char getState() { + return state; + } + + @Override + public String toString() { + return String.valueOf(state); + } +} + From 7009de9ce208e1c05d86091a5f44dd79099b9502 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Thu, 23 Sep 2021 17:56:28 +0300 Subject: [PATCH 28/34] nano fix --- .../course_project/Utils/ConsoleHandling/Printer.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java index 66a14056..82834786 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java @@ -17,7 +17,7 @@ public void printAskHowFill() { } public void printHeader() { - String HEADER = " A B C D E F G H I J "; + String HEADER = " A B C D E F G H I J "; System.out.println(HEADER); } @@ -108,7 +108,12 @@ public void printYouField(Field field) { int rowNumber = 1; for (int[] row : toPrint ) { - System.out.print( rowNumber); + if (rowNumber < 10) { + System.out.print(rowNumber + " "); + } + else { + System.out.print(rowNumber + " "); + } for (int i : row ) { if (i == 0) { From 651039a52a315821b163e2c1dca3c0ce9bede233 Mon Sep 17 00:00:00 2001 From: dvaschenko Date: Sat, 25 Sep 2021 18:36:44 +0300 Subject: [PATCH 29/34] 90 % done, wo tests --- build.gradle | 5 +- gradlew | 2 +- gradlew.bat | 178 +++++++++--------- src/main/java/course_project/Main.java | 30 +++ src/main/java/course_project/SeaBattle.java | 135 ++++++++++++- .../Utils/ConsoleHandling/InReader.java | 70 ++++--- .../Utils/ConsoleHandling/Printer.java | 55 +++++- .../Utils/GameHandler/Handler.java | 37 ---- .../Utils/ShipPlacers/ComputerShipPlacer.java | 11 +- .../Utils/ShipPlacers/Placer.java | 2 +- .../Utils/ShipPlacers/PlayerShipPlacer.java | 80 +++++--- .../components/Coordinates.java | 4 +- .../java/course_project/components/Field.java | 19 +- .../java/course_project/components/Ship.java | 20 +- 14 files changed, 427 insertions(+), 221 deletions(-) mode change 100644 => 100755 gradlew delete mode 100644 src/main/java/course_project/Utils/GameHandler/Handler.java diff --git a/build.gradle b/build.gradle index 522c2e14..e52c8a03 100644 --- a/build.gradle +++ b/build.gradle @@ -10,9 +10,8 @@ repositories { } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' - testCompile 'org.junit.jupiter:junit-jupiter-params:5.7.0' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0' } test { diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 4f906e0c..744e882e --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) diff --git a/gradlew.bat b/gradlew.bat index 107acd32..ac1b06f9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java index c63a450e..7a153e14 100644 --- a/src/main/java/course_project/Main.java +++ b/src/main/java/course_project/Main.java @@ -1,8 +1,38 @@ package course_project; +import course_project.Utils.ConsoleHandling.Printer; +import course_project.Utils.ShipPlacers.ComputerShipPlacer; +import course_project.components.Coordinates; +import course_project.components.Field; + +import java.util.ArrayList; +import java.util.List; + public class Main { public static void main(String[] args) { + +// Printer printer = new Printer(); +// ComputerShipPlacer placer = new ComputerShipPlacer(); +// Field testField = placer.placeShips(); +// printer.printYouField(testField); +// List coords; +// coords = placer.getAllShipsCoordinates(); +// System.out.println(coords); +// +// while (true){ +// new SeaBattle().playerMove(testField, coords); +// printer.printYouField(testField); +// } + + + new SeaBattle().play(); } + + + + + + } diff --git a/src/main/java/course_project/SeaBattle.java b/src/main/java/course_project/SeaBattle.java index d8ab9ec9..4cd525fc 100644 --- a/src/main/java/course_project/SeaBattle.java +++ b/src/main/java/course_project/SeaBattle.java @@ -1,29 +1,148 @@ package course_project; +import course_project.Utils.ConsoleHandling.InReader; import course_project.Utils.ConsoleHandling.Printer; -import course_project.Utils.GameHandler.Handler; +import course_project.Utils.ShipPlacers.ComputerShipPlacer; +import course_project.Utils.ShipPlacers.PlayerShipPlacer; +import course_project.components.Coordinates; +import course_project.components.Field; +import course_project.components.Ship; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; public class SeaBattle { final Printer printer = new Printer(); - final Handler handler = new Handler(); + private final Random random = new Random(); + private final ComputerShipPlacer cPlacer = new ComputerShipPlacer(); + private final PlayerShipPlacer plPlacer = new PlayerShipPlacer(); + private Field playerField = new Field(); + private Field computerField = new Field(); + private List playerShips; + private List compShips; + private List playersShipsCoordinates; + private List computerShipsCoordinates; + private final InReader reader = new InReader(); + private final List allCompShoots = new ArrayList<>(); public void play(){ - printer.printGreeting(); + printer.printGreeting(); + + start(); + while (!shipsDestroyed(playerShips, compShips)) { + makeMoves(); + } + + printer.printGoodbye(); + } + + public void start() { + printer.printAskHowFill(); + boolean auto = reader.getMode(); + if(!auto){ + playerField = plPlacer.placeShips(reader); + } else { + playerField = plPlacer.placeShips(); //this line does place Ships with ComputerShipPlacer automatically + } + + computerField = cPlacer.placeShips(); + + //Coordinates and ships fields initialization after placing + playerShips = plPlacer.getAllShips(); + compShips = cPlacer.getAllShips(); + playersShipsCoordinates = plPlacer.getAllShipsCoordinates(); + computerShipsCoordinates = cPlacer.getAllShipsCoordinates(); + + System.out.println("Here is yours Playing field :"); + printer.printOpenField(playerField); + System.out.println("And here is yours opponent Playing field :"); + printer.printOpenField(computerField); + } + + private void makeMoves( + ) { + playerMove(computerField, computerShipsCoordinates); + dealWithShips(compShips); + System.out.println("And here is yours opponent Playing field :"); + printer.printOpenField(computerField); + System.out.println(compShips.size()); + + computerMove(playerField, playersShipsCoordinates); + dealWithShips(playerShips); + System.out.println("Here is yours Playing field :"); + printer.printOpenField(playerField); + System.out.println(playerShips.size()); + - handler.start(); - do{ - handler.makeMoves(); } - while (!handler.endOfGame()); + public void playerMove(Field computerField, List computerShipsCoordinates) { + printer.playerMoves(); + printer.askWhereToShoot(); + Coordinates playerShoot = reader.readCoordinates(); + if (computerShipsCoordinates.contains(playerShoot)){ + computerField.placeHit(playerShoot); + for (Ship compShip : compShips + ) { + if (compShip.getCoordinates().contains(playerShoot)) { + compShip.gotShot(); + } + } + } else { + computerField.placeMiss(playerShoot); + } + } + private void computerMove(Field playerField, List playersShipsCoordinates) { + printer.compMoves(); + Coordinates compShoot = getCompShot(); - printer.printGoodbye(); + if (!allCompShoots.contains(compShoot)){ //not to shot same coordinate again + allCompShoots.add(compShoot); + } else { + compShoot = getCompShot(); + } + System.out.println((char)(compShoot.getX() + 65) + "" + (compShoot.getY() + 1)); + if (playersShipsCoordinates.contains(compShoot)){ + playerField.placeHit(compShoot); + for (Ship plShip : playerShips + ) { + if (plShip.getCoordinates().contains(compShoot)){ // todo pull out ship by coordinates + plShip.gotShot(); //todo next shot logic + } + } + } else { + playerField.placeMiss(compShoot); + } + } + private void dealWithShips(List ships) { + ships.removeIf(ship -> !ship.isAlive()); + for (Ship s:ships + ) { + System.out.print(s.getHealth() + " "); + } } + private boolean shipsDestroyed(List playerShips, List compShips) { + if (playerShips.isEmpty()){ + printer.printLose(); + return true; + } + if (compShips.isEmpty()){ + printer.printWin(); + return true; + } + return false; + } + private Coordinates getCompShot (){ + int x = random.nextInt(10); + int y = random.nextInt(10); + return new Coordinates(x,y); + } } diff --git a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java index 2df07f5e..1d79c6db 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java @@ -14,39 +14,45 @@ public class InReader { private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); public Coordinates readCoordinates() { - String[] strings = verifyInput(readInput()); - int x = -1; - int y = -1; - if (strings[0].length() >= 2) { - int [] coord = parseToCoord(strings[0]); + Coordinates result; + String input = readInput(); + + if(StringIsFine(input)) { + int x; + int y; + int[] coord = parseToCoord(input); x = coord[0]; y = coord[1]; - } - else { + result = new Coordinates(x, y); + return result; + } else { printer.printInputError(); - readInput(); } - - return new Coordinates(x,y); + return readCoordinates(); } - public List getCoordinatesByDestination(Coordinates start, int size){ + public List getCoordinatesByDestination(Coordinates start, int size, String destination){ List result = new ArrayList<>(); - for (int i = 1; i <= size; i++){ - String input = readInput(); - String[] strings = verifyInput(input); - int x = -1; - int y = -1; - if (strings[0].length() >= 2) { - int [] coord = parseToCoord(strings[0]); - x = coord[0]; - y = coord[1]; - } else { - printer.printInputError(); - readInput(); + int startX = start.getX(); + int startY = start.getY(); + + for (int i = 0; i < size; i++){ + switch (destination) { + case "up" : + result.add(new Coordinates(startX - i, startY)); + break; + case "down" : + result.add(new Coordinates(startX + i, startY)); + break; + case "left" : + result.add(new Coordinates(startX, startY - i)); + break; + case "right" : + result.add(new Coordinates(startX, startY + i)); + break; } - result.add(new Coordinates(x, y)); } + return result; } @@ -73,14 +79,18 @@ private String readInput(){ return input; } - private String[] verifyInput(String str){ - if (str == null && !str.matches("[a-jA-J]([1-9]|10) (up|down|left|right)")){ - printer.printInputError(); - readInput(); - } - return str.split(" "); + private boolean StringIsFine(String str){ + return str.matches("[a-jA-J]([1-9]|10)") && (str.length() == 2 || str.length() == 3); } + public String getDestination(){ + String result = readInput().toLowerCase(Locale.ROOT).trim(); + if(!result.matches("up") && !result.matches("down") && !result.matches("right") && !result.matches("left")){ + System.out.println("Wrong destination input, try again!"); + result = getDestination(); + } + return result; + } public boolean getMode() { String mode = readInput(); diff --git a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java index 82834786..8b0ec0e9 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java @@ -1,10 +1,16 @@ package course_project.Utils.ConsoleHandling; +import ConsoleColors.ConsoleColors; import course_project.components.Field; +import course_project.components.Ship; import course_project.enums.ShipType; +import java.util.List; +import java.util.stream.IntStream; + public class Printer { + public void printGreeting() { String GREETING = "Welcome to Sea Battle, stranger!"; System.out.println(GREETING); @@ -12,7 +18,8 @@ public void printGreeting() { public void printAskHowFill() { String ASK_HOW_TO_FILL = "How Would you like to place your ships? " + - "Please, enter \" man \" to place them manually or just press enter to place them automatically"; + "Please, enter \" anything \" to place them manually or just press enter to place them automatically \n" + + ConsoleColors.RED + "Bear in mind, that any input will be counted like manual mode!" + ConsoleColors.RESET ; System.out.println(ASK_HOW_TO_FILL); } @@ -63,7 +70,7 @@ public void printShoot() { } public void askShipHead() { - String ASK_PLACE_SHIP_HEAD = "Insert ship head coordinates, use header letter and a row number, like A 1 or c 4"; + String ASK_PLACE_SHIP_HEAD = "Insert ship head coordinates, insert column and row, like A1 or c4"; System.out.println(ASK_PLACE_SHIP_HEAD); } @@ -83,7 +90,7 @@ public void printGoodbye() { } public void printSep() { - String SEPARATOR = "-----------------------------"; + String SEPARATOR = "---------------------------------"; System.out.println(SEPARATOR); } @@ -101,10 +108,25 @@ public void printPlaced(ShipType type) { String PLACED = "Correctly placed : "; System.out.println(PLACED + type.getType()); } + public void compMoves() { + String COMP_MOVES = "Now is a computer move: "; + System.out.println(COMP_MOVES); + } + public void playerMoves() { + String PLAYER_MOVES = "Now is your move: "; + System.out.println(PLAYER_MOVES); + } + + public void askWhereToShoot() { + String ASK_WHERE_TO_SHOOT = "Insert shot coordinates, insert column and row, like A1 or c4"; + System.out.println(ASK_WHERE_TO_SHOOT); + } - public void printYouField(Field field) { + public void printOpenField(Field field) { printHeader(); - int[][] toPrint = field.getField(); + int[][] rawMatrix = field.getField(); + int [][] toPrint = turnMatrix(rawMatrix); + int rowNumber = 1; for (int[] row : toPrint ) { @@ -126,11 +148,19 @@ public void printYouField(Field field) { } } - public void printEnemyField(Field field) { + public void printHiddenField(Field field) { printHeader(); - int[][] toPrint = field.getField(); + int[][] rawMatrix = field.getField(); + int [][] toPrint = turnMatrix(rawMatrix); + int rowNumber = 1; for (int[] row : toPrint ) { + if (rowNumber < 10) { + System.out.print(rowNumber + " "); + } + else { + System.out.print(rowNumber + " "); + } for (int i : row ) { if (i == 0 || i == '#') { @@ -140,7 +170,16 @@ public void printEnemyField(Field field) { System.out.print(" " + (char) i + " "); } System.out.println(); + ++rowNumber; } } - + private int[][] turnMatrix(int[][] rawMatrix) { + int[][]result = new int[10][10]; + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + result[i][j] = rawMatrix[j][i]; + } + } + return result; + } } diff --git a/src/main/java/course_project/Utils/GameHandler/Handler.java b/src/main/java/course_project/Utils/GameHandler/Handler.java deleted file mode 100644 index f630b5ca..00000000 --- a/src/main/java/course_project/Utils/GameHandler/Handler.java +++ /dev/null @@ -1,37 +0,0 @@ -package course_project.Utils.GameHandler; - -import course_project.Utils.ConsoleHandling.InReader; -import course_project.Utils.ConsoleHandling.Printer; -import course_project.Utils.ShipPlacers.ComputerShipPlacer; -import course_project.Utils.ShipPlacers.PlayerShipPlacer; -import course_project.components.Field; - -public class Handler { - private Field playerField = new Field(); - private Field computerField = new Field(); - private final Printer printer = new Printer(); - ComputerShipPlacer cPlacer = new ComputerShipPlacer(); - PlayerShipPlacer plPacer = new PlayerShipPlacer(); - InReader reader = new InReader(); - - public void start() { - printer.printAskHowFill(); - boolean auto = reader.getMode(); - if(!auto){ - playerField = plPacer.placeShips(reader); - } else { - playerField = cPlacer.placeShips(); //places Ship with ComputerShipPlacer automatically - } - computerField = plPacer.placeShips(); - printer.printYouField(playerField); - printer.printEnemyField(computerField); - } - - public void makeMoves() { - - } - - public boolean endOfGame() { - return false; - } -} diff --git a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java index 4ad984ae..a2298ecf 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java @@ -18,6 +18,14 @@ public class ComputerShipPlacer implements Placer { private final List notAllowed = new ArrayList<>(); private List allShips = new ArrayList<>(10); + public List getAllShipsCoordinates() { + return allShipsCoordinates; + } + + public List getAllShips() { + return allShips; + } + private List createAllShips() { for (ShipType type : ShipType.values() @@ -32,6 +40,7 @@ private List createAllShips() { Ship ship = new Ship(type, coordinates); allShips.add(ship); + ship.setHealth(type.getSize()); allShipsCoordinates.addAll(coordinates); fillForbiddenCoordinates(coordinates, notAllowed); } @@ -44,7 +53,7 @@ public Field placeShips() { allShips = createAllShips(); for (Ship ship : allShips ) { - computerField.place(ship); + computerField.placeShip(ship); } return computerField; diff --git a/src/main/java/course_project/Utils/ShipPlacers/Placer.java b/src/main/java/course_project/Utils/ShipPlacers/Placer.java index 999602e1..389db46f 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/Placer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/Placer.java @@ -13,7 +13,7 @@ public interface Placer { default boolean isValidCoordinatesOfPoint(List listShips, List listAdjusted,Coordinates point) { return !listShips.contains(point) && !listAdjusted.contains(point) && - point.getY() >= 0 && point.getY() <= 9 && point.getX() >= 0 && point.getX() <= 9; + (point.getY() >= 0 && point.getY() <= 9) && (point.getX() >= 0 && point.getX() <= 9); } default boolean isValidCoordinatesOfList(List listShips, List listAdjusted,List coordinates) { diff --git a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java index c10154f6..ac6d9dd1 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java @@ -16,53 +16,65 @@ public class PlayerShipPlacer implements Placer { private final Printer printer = new Printer(); private Field playerField = new Field(); - private final List allShipsCoordinates = new ArrayList<>(); + private List allShipsCoordinates = new ArrayList<>(); private final List notAllowed = new ArrayList<>(); + private List playerShips = new ArrayList<>(10); + private ComputerShipPlacer computerShipPlacer = new ComputerShipPlacer(); - private List allShips = new ArrayList<>(10); + public List getAllShipsCoordinates() { + return allShipsCoordinates; + } + + public List getAllShips() { + return playerShips; + } @Override public Field placeShips() { - return new ComputerShipPlacer().placeShips(); + playerField = computerShipPlacer.placeShips(); + playerShips = computerShipPlacer.getAllShips(); + allShipsCoordinates = computerShipPlacer.getAllShipsCoordinates(); + return playerField; } @Override public Field placeShips(InReader reader) { return placeShipsManually(reader); } - private Field placeShipsManually(InReader reader) { - allShips = createAllShips(reader); - for (Ship ship : allShips + private Field placeShipsManually(InReader reader) { + Ship ship; + + for (ShipType type : ShipType.values() ) { - playerField.place(ship); + for (int i = 1; i <= type.getCount(); i++) { + ship = createShip(type, reader); + playerShips.add(ship); + ship.setHealth(type.getSize()); + playerField.placeShip(ship); + printer.printOpenField(playerField); + printer.printSep(); + } } + return playerField; } - private List createAllShips(InReader reader) { - - for (ShipType type : ShipType.values() - ) { + private Ship createShip(ShipType type,InReader reader) { + Ship ship; + int size = type.getSize(); - for (int i = 1; i <= type.getCount(); i++) { List coordinates; printer.printPlacing(type); - - coordinates = new ArrayList<>(getShipCoordinates(i, reader)); - Ship ship = new Ship(type, coordinates); - - allShips.add(ship); - + coordinates = new ArrayList<>(getShipCoordinates(size, reader)); + ship = new Ship(type, coordinates); printer.printPlaced(type); - allShipsCoordinates.addAll(coordinates); fillForbiddenCoordinates(coordinates, notAllowed); - } - } - return allShips; + + return ship; } private List getShipCoordinates(int size, InReader reader) { @@ -80,13 +92,14 @@ private List getShipCoordinates(int size, InReader reader) { } private Coordinates getFirstDeck(InReader reader) { - printer.askShipHead(); - printer.printYouField(playerField); + Coordinates firstDeck; do { + printer.askShipHead(); firstDeck = reader.readCoordinates(); if (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)){ printer.printInputError(); + printer.printSep(); } } while (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)); @@ -95,13 +108,24 @@ private Coordinates getFirstDeck(InReader reader) { private List createRest(Coordinates start, int size, InReader reader) { printer.printAskDestination(); + String destination = reader.getDestination(); List coordinatesList = new ArrayList<>(); coordinatesList.add(start); - coordinatesList = reader.getCoordinatesByDestination(start, size); - if(!isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinatesList)){ - printer.printInputError(); + + coordinatesList = reader.getCoordinatesByDestination(start, size, destination); + + if(isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinatesList)){ + return coordinatesList; } + System.out.println("Can not fill the ship in there, try again!"); + return createRest(start, size, reader); + } - return coordinatesList; + public Field cleanField() { + playerShips.clear(); + allShipsCoordinates.clear(); + notAllowed.clear(); + playerField = new Field(); + return playerField; } } diff --git a/src/main/java/course_project/components/Coordinates.java b/src/main/java/course_project/components/Coordinates.java index 073e3cdd..6c77a6ec 100644 --- a/src/main/java/course_project/components/Coordinates.java +++ b/src/main/java/course_project/components/Coordinates.java @@ -6,8 +6,8 @@ public class Coordinates { - public final int x; - public final int y; + private final int x; + private final int y; public Coordinates(int row, int column) { this.x = row; diff --git a/src/main/java/course_project/components/Field.java b/src/main/java/course_project/components/Field.java index 9aeb8319..2a55a1d8 100644 --- a/src/main/java/course_project/components/Field.java +++ b/src/main/java/course_project/components/Field.java @@ -1,22 +1,39 @@ package course_project.components; +import course_project.Utils.ShipPlacers.Placer; import course_project.enums.State; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class Field { final private int SIZE = 10; private String state; private final int[][] field = new int[SIZE][SIZE]; - public void place(Ship ship) { + public void placeShip(Ship ship) { for (Coordinates point : ship.getCoordinates() ) { field[point.getX()][point.getY()] = State.DECK.getState(); } } + public void placeMiss(Coordinates missCoordinate){ + field[missCoordinate.getX()][missCoordinate.getY()] = State.MISS.getState(); + } + + public void placeHit(Coordinates hitCoordinate){ + field[hitCoordinate.getX()][hitCoordinate.getY()] = State.HIT.getState(); + } + + public void placeEmpty(Coordinates empty){ + field[empty.getX()][empty.getY()] = State.EMPTY.getState(); + } + + + public String getState() { return state; } diff --git a/src/main/java/course_project/components/Ship.java b/src/main/java/course_project/components/Ship.java index 2d1ac866..f04a4f0a 100644 --- a/src/main/java/course_project/components/Ship.java +++ b/src/main/java/course_project/components/Ship.java @@ -9,21 +9,19 @@ public class Ship { private final List coordinates; public ShipType type; private int health; - private final int size; private boolean alive = true; public Ship(ShipType type, List coordinates){ - this.size = type.getSize(); - this.health = size; - this.coordinates = new ArrayList<>(coordinates); this.type = type; + this.coordinates = new ArrayList<>(coordinates); } public List getCoordinates() { return new ArrayList<>(coordinates); } + public void gotShot() { health--; if (health == 0) { @@ -31,18 +29,16 @@ public void gotShot() { } } - public ShipType getType() { - return this.type; - } - - public int getSize() { - return size; - } public boolean isAlive() { return alive; } + public void setHealth(int health) { + this.health = health; + } - + public int getHealth() { + return health; + } } From 9f8e8d9ceb07027f406611324b15d91cd4eda733 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 26 Sep 2021 14:19:51 +0300 Subject: [PATCH 30/34] Functional is done, tests to do --- src/main/java/course_project/Main.java | 32 +----- src/main/java/course_project/SeaBattle.java | 101 ++++++++++++------ .../Utils/ConsoleHandling/InReader.java | 28 ++--- .../Utils/ConsoleHandling/Printer.java | 14 ++- .../Utils/ShipPlacers/ComputerShipPlacer.java | 8 +- .../Utils/ShipPlacers/PlayerShipPlacer.java | 22 ++-- .../components/Coordinates.java | 11 +- .../java/course_project/components/Field.java | 21 +--- .../java/course_project/components/Ship.java | 23 +++- src/main/java/course_project/enums/State.java | 29 +++-- 10 files changed, 146 insertions(+), 143 deletions(-) diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java index 7a153e14..21dd9ddd 100644 --- a/src/main/java/course_project/Main.java +++ b/src/main/java/course_project/Main.java @@ -1,38 +1,8 @@ package course_project; -import course_project.Utils.ConsoleHandling.Printer; -import course_project.Utils.ShipPlacers.ComputerShipPlacer; -import course_project.components.Coordinates; -import course_project.components.Field; - -import java.util.ArrayList; -import java.util.List; - public class Main { public static void main(String[] args) { -// Printer printer = new Printer(); -// ComputerShipPlacer placer = new ComputerShipPlacer(); -// Field testField = placer.placeShips(); -// printer.printYouField(testField); -// List coords; -// coords = placer.getAllShipsCoordinates(); -// System.out.println(coords); -// -// while (true){ -// new SeaBattle().playerMove(testField, coords); -// printer.printYouField(testField); -// } - - - - new SeaBattle().play(); + new SeaBattle().play(); } - - - - - - - } diff --git a/src/main/java/course_project/SeaBattle.java b/src/main/java/course_project/SeaBattle.java index 4cd525fc..3a96b901 100644 --- a/src/main/java/course_project/SeaBattle.java +++ b/src/main/java/course_project/SeaBattle.java @@ -26,7 +26,7 @@ public class SeaBattle { private final InReader reader = new InReader(); private final List allCompShoots = new ArrayList<>(); - public void play(){ + public void play() { printer.printGreeting(); start(); @@ -34,15 +34,23 @@ public void play(){ makeMoves(); } - printer.printGoodbye(); + printer.printAskContinue(); + boolean exitGame = reader.getMode(); + if (exitGame) { + printer.printGoodbye(); + } + else { + + new SeaBattle().play(); + } } public void start() { printer.printAskHowFill(); boolean auto = reader.getMode(); - if(!auto){ + if (!auto) { playerField = plPlacer.placeShips(reader); - } else { + } else { playerField = plPlacer.placeShips(); //this line does place Ships with ComputerShipPlacer automatically } @@ -57,92 +65,123 @@ public void start() { System.out.println("Here is yours Playing field :"); printer.printOpenField(playerField); System.out.println("And here is yours opponent Playing field :"); - printer.printOpenField(computerField); + printer.printHiddenField(computerField); + printer.printSep(); + printer.printSep(); + printer.printSep(); + waitASecond(); } private void makeMoves( ) { - playerMove(computerField, computerShipsCoordinates); - dealWithShips(compShips); - System.out.println("And here is yours opponent Playing field :"); - printer.printOpenField(computerField); - System.out.println(compShips.size()); - + playerMove(computerField, computerShipsCoordinates); computerMove(playerField, playersShipsCoordinates); - dealWithShips(playerShips); - System.out.println("Here is yours Playing field :"); - printer.printOpenField(playerField); - System.out.println(playerShips.size()); - - } public void playerMove(Field computerField, List computerShipsCoordinates) { + printer.playerMoves(); + System.out.println("And here is yours opponent Playing field :"); + printer.printHiddenField(computerField); + printer.askWhereToShoot(); Coordinates playerShoot = reader.readCoordinates(); - if (computerShipsCoordinates.contains(playerShoot)){ + if (computerShipsCoordinates.contains(playerShoot)) { computerField.placeHit(playerShoot); for (Ship compShip : compShips ) { if (compShip.getCoordinates().contains(playerShoot)) { compShip.gotShot(); + printer.printYouHit(); } } + dealWithShips(compShips); + playerMove(computerField, computerShipsCoordinates); //one more turn after hit } else { computerField.placeMiss(playerShoot); + printer.printYouMiss(); + printer.printSep(); } + } private void computerMove(Field playerField, List playersShipsCoordinates) { printer.compMoves(); + waitASecond(); + System.out.println("Here is yours Playing field :"); + printer.printOpenField(playerField); Coordinates compShoot = getCompShot(); - if (!allCompShoots.contains(compShoot)){ //not to shot same coordinate again + if (!allCompShoots.contains(compShoot)) { //not to shot same coordinate again allCompShoots.add(compShoot); } else { compShoot = getCompShot(); } - System.out.println((char)(compShoot.getX() + 65) + "" + (compShoot.getY() + 1)); - if (playersShipsCoordinates.contains(compShoot)){ + printer.printShoot(); + System.out.println((char) (compShoot.getX() + 65) + "" + (compShoot.getY() + 1)); + if (playersShipsCoordinates.contains(compShoot)) { playerField.placeHit(compShoot); for (Ship plShip : playerShips ) { - if (plShip.getCoordinates().contains(compShoot)){ // todo pull out ship by coordinates - plShip.gotShot(); //todo next shot logic + if (plShip.getCoordinates().contains(compShoot)) { + plShip.gotShot(); + printer.printYouWasHit(); + waitASecond(); + } } + dealWithShips(playerShips); + waitASecond(); + computerMove(playerField, playersShipsCoordinates); //one more turn after hit } else { playerField.placeMiss(compShoot); + printer.printPCMiss(); + printer.printSep(); + waitASecond(); + } + } + + private void waitASecond() { + try { + Thread.sleep(1500); + } catch (InterruptedException e) { + e.printStackTrace(); } } private void dealWithShips(List ships) { - ships.removeIf(ship -> !ship.isAlive()); - for (Ship s:ships - ) { - System.out.print(s.getHealth() + " "); + Ship destroyed = null; + for (Ship ship : ships + ) { + if (!ship.isAlive()) { + destroyed = ship; + } + } + if (destroyed != null) { + printer.printDestroyed(destroyed); + ships.remove(destroyed); } + } private boolean shipsDestroyed(List playerShips, List compShips) { - if (playerShips.isEmpty()){ + if (playerShips.isEmpty()) { printer.printLose(); return true; } - if (compShips.isEmpty()){ + if (compShips.isEmpty()) { printer.printWin(); return true; } return false; } - private Coordinates getCompShot (){ + private Coordinates getCompShot() { int x = random.nextInt(10); int y = random.nextInt(10); - return new Coordinates(x,y); + return new Coordinates(x, y); } } diff --git a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java index 1d79c6db..73711cf4 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java @@ -17,7 +17,7 @@ public Coordinates readCoordinates() { Coordinates result; String input = readInput(); - if(StringIsFine(input)) { + if (StringIsFine(input)) { int x; int y; int[] coord = parseToCoord(input); @@ -31,23 +31,23 @@ public Coordinates readCoordinates() { return readCoordinates(); } - public List getCoordinatesByDestination(Coordinates start, int size, String destination){ + public List getCoordinatesByDestination(Coordinates start, int size, String destination) { List result = new ArrayList<>(); int startX = start.getX(); int startY = start.getY(); - - for (int i = 0; i < size; i++){ + //destinations are inverted, only case names + for (int i = 0; i < size; i++) { switch (destination) { - case "up" : + case "left": result.add(new Coordinates(startX - i, startY)); break; - case "down" : + case "right": result.add(new Coordinates(startX + i, startY)); break; - case "left" : + case "up": result.add(new Coordinates(startX, startY - i)); break; - case "right" : + case "down": result.add(new Coordinates(startX, startY + i)); break; } @@ -59,7 +59,7 @@ public List getCoordinatesByDestination(Coordinates start, int size private int[] parseToCoord(String string) { int[] result = new int[2]; int first = string.toUpperCase(Locale.ROOT).charAt(0) - 65; - int second = Integer.parseInt(string.substring(1)) -1; + int second = Integer.parseInt(string.substring(1)) - 1; result[0] = first; result[1] = second; @@ -67,7 +67,7 @@ private int[] parseToCoord(String string) { } - private String readInput(){ + private String readInput() { String input = ""; { try { @@ -79,17 +79,17 @@ private String readInput(){ return input; } - private boolean StringIsFine(String str){ + private boolean StringIsFine(String str) { return str.matches("[a-jA-J]([1-9]|10)") && (str.length() == 2 || str.length() == 3); } - public String getDestination(){ + public String getDestination() { String result = readInput().toLowerCase(Locale.ROOT).trim(); - if(!result.matches("up") && !result.matches("down") && !result.matches("right") && !result.matches("left")){ + if (!result.matches("up") && !result.matches("down") && !result.matches("right") && !result.matches("left")) { System.out.println("Wrong destination input, try again!"); result = getDestination(); } - return result; + return result; } public boolean getMode() { diff --git a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java index 8b0ec0e9..a2a12afa 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java @@ -5,9 +5,6 @@ import course_project.components.Ship; import course_project.enums.ShipType; -import java.util.List; -import java.util.stream.IntStream; - public class Printer { @@ -29,7 +26,7 @@ public void printHeader() { System.out.println(HEADER); } - public void printYuoMiss() { + public void printYouMiss() { String YOU_MISS = "Oh no, you missed :("; System.out.println(YOU_MISS); } @@ -49,13 +46,13 @@ public void printYouWasHit() { System.out.println(YOU_WAS_HIT); } - public void printDestroyed() { - String DESTROYED = "Ship destroyed, did you that explosion? Huge, ain't it?"; + public void printDestroyed(Ship ship) { + String DESTROYED = "Ship " + ship.getType() + " at " + ship.getCoordinates() + " is destroyed, did you see that explosion? Huge, ain't it?"; System.out.println(DESTROYED); } public void printWin() { - String WON = "Oh yes, you is a winner! Never doubt it."; + String WON = "Oh yes, you are a winner! Never doubt it."; System.out.println(WON); } @@ -80,7 +77,8 @@ public void printAskDestination() { } public void printAskContinue() { - String ASK_CONTINUE = "How about one more game?"; + String ASK_CONTINUE = "How about one more game?" + "Please, enter \" anything \" to play one more time or just press enter to exit \n" + + ConsoleColors.RED + "Bear in mind, that any input will be counted like continue mode!" + ConsoleColors.RESET; System.out.println(ASK_CONTINUE); } diff --git a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java index a2298ecf..588a9c94 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java @@ -32,15 +32,15 @@ private List createAllShips() { ) { for (int i = 1; i <= type.getCount(); i++) { List coordinates; - + int size = type.getSize(); do { - coordinates = new ArrayList<>(generateShipCoordinates(i)); + coordinates = new ArrayList<>(generateShipCoordinates(size)); } while (!isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinates)); - Ship ship = new Ship(type, coordinates); + Ship ship = new Ship(i, type, type.getSize(), coordinates); allShips.add(ship); - ship.setHealth(type.getSize()); + ship.setHealth(coordinates.size()); allShipsCoordinates.addAll(coordinates); fillForbiddenCoordinates(coordinates, notAllowed); } diff --git a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java index ac6d9dd1..c5e4ec5d 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Random; public class PlayerShipPlacer implements Placer { @@ -29,6 +28,7 @@ public List getAllShips() { return playerShips; } + // field auto creating in the auto case, no reader send in method @Override public Field placeShips() { playerField = computerShipPlacer.placeShips(); @@ -62,17 +62,17 @@ private Field placeShipsManually(InReader reader) { return playerField; } - private Ship createShip(ShipType type,InReader reader) { + private Ship createShip(ShipType type, InReader reader) { Ship ship; int size = type.getSize(); - List coordinates; - printer.printPlacing(type); - coordinates = new ArrayList<>(getShipCoordinates(size, reader)); - ship = new Ship(type, coordinates); - printer.printPlaced(type); - allShipsCoordinates.addAll(coordinates); - fillForbiddenCoordinates(coordinates, notAllowed); + List coordinates; + printer.printPlacing(type); + coordinates = new ArrayList<>(getShipCoordinates(size, reader)); + ship = new Ship(type.getCount(), type, type.getSize(), coordinates); + printer.printPlaced(type); + allShipsCoordinates.addAll(coordinates); + fillForbiddenCoordinates(coordinates, notAllowed); return ship; } @@ -97,7 +97,7 @@ private Coordinates getFirstDeck(InReader reader) { do { printer.askShipHead(); firstDeck = reader.readCoordinates(); - if (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)){ + if (!isValidCoordinatesOfPoint(allShipsCoordinates, notAllowed, firstDeck)) { printer.printInputError(); printer.printSep(); } @@ -114,7 +114,7 @@ private List createRest(Coordinates start, int size, InReader reade coordinatesList = reader.getCoordinatesByDestination(start, size, destination); - if(isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinatesList)){ + if (isValidCoordinatesOfList(allShipsCoordinates, notAllowed, coordinatesList)) { return coordinatesList; } System.out.println("Can not fill the ship in there, try again!"); diff --git a/src/main/java/course_project/components/Coordinates.java b/src/main/java/course_project/components/Coordinates.java index 6c77a6ec..142e46c9 100644 --- a/src/main/java/course_project/components/Coordinates.java +++ b/src/main/java/course_project/components/Coordinates.java @@ -1,9 +1,5 @@ package course_project.components; -import course_project.SeaBattle; - -import java.util.Objects; - public class Coordinates { private final int x; @@ -14,8 +10,6 @@ public Coordinates(int row, int column) { this.y = column; } - - public int getX() { return x; } @@ -24,11 +18,12 @@ public int getY() { return y; } + // For print A1 C7 etc. @Override public String toString() { return "Coordinates{" + - "x=" + x + - ", y=" + y + + "x=" + (char) (x + 65) + + ", y=" + (y + 1) + '}'; } diff --git a/src/main/java/course_project/components/Field.java b/src/main/java/course_project/components/Field.java index 2a55a1d8..194d1553 100644 --- a/src/main/java/course_project/components/Field.java +++ b/src/main/java/course_project/components/Field.java @@ -1,16 +1,9 @@ package course_project.components; - -import course_project.Utils.ShipPlacers.Placer; import course_project.enums.State; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - public class Field { final private int SIZE = 10; - private String state; private final int[][] field = new int[SIZE][SIZE]; public void placeShip(Ship ship) { @@ -20,24 +13,14 @@ public void placeShip(Ship ship) { } } - public void placeMiss(Coordinates missCoordinate){ + public void placeMiss(Coordinates missCoordinate) { field[missCoordinate.getX()][missCoordinate.getY()] = State.MISS.getState(); } - public void placeHit(Coordinates hitCoordinate){ + public void placeHit(Coordinates hitCoordinate) { field[hitCoordinate.getX()][hitCoordinate.getY()] = State.HIT.getState(); } - public void placeEmpty(Coordinates empty){ - field[empty.getX()][empty.getY()] = State.EMPTY.getState(); - } - - - - public String getState() { - return state; - } - public int[][] getField() { return field; } diff --git a/src/main/java/course_project/components/Ship.java b/src/main/java/course_project/components/Ship.java index f04a4f0a..53c5f4c5 100644 --- a/src/main/java/course_project/components/Ship.java +++ b/src/main/java/course_project/components/Ship.java @@ -7,13 +7,17 @@ public class Ship { private final List coordinates; - public ShipType type; + private final int count; + private final ShipType type; + private final int size; private int health; private boolean alive = true; - public Ship(ShipType type, List coordinates){ + public Ship(int count, ShipType type, int size, List coordinates) { + this.count = count; this.type = type; + this.size = size; this.coordinates = new ArrayList<>(coordinates); } @@ -29,6 +33,21 @@ public void gotShot() { } } + @Override + public String toString() { + return "Ship{" + + "coordinates=" + coordinates + + ", count=" + count + + ", type=" + type + + ", size=" + size + + ", health=" + health + + ", alive=" + alive + + '}'; + } + + public ShipType getType() { + return type; + } public boolean isAlive() { return alive; diff --git a/src/main/java/course_project/enums/State.java b/src/main/java/course_project/enums/State.java index 79678eb1..c5a2af3d 100644 --- a/src/main/java/course_project/enums/State.java +++ b/src/main/java/course_project/enums/State.java @@ -1,24 +1,23 @@ package course_project.enums; public enum State { - EMPTY ('~'), - DECK ('#'), - MISS ('*'), - HIT ('X'); + DECK('#'), + MISS('*'), + HIT('X'); - private final char state; + private final char state; - State(char state) { - this.state = state; - } + State(char state) { + this.state = state; + } - public char getState() { - return state; - } + public char getState() { + return state; + } - @Override - public String toString() { - return String.valueOf(state); - } + @Override + public String toString() { + return String.valueOf(state); + } } From 0bb647747dce99ec86c4b41272268ca0a1d62b0f Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 26 Sep 2021 15:28:16 +0300 Subject: [PATCH 31/34] HW 3 revisited ,6,7 added --- .../Utils/ConsoleHandling/Printer.java | 17 +++-- .../Utils/ShipPlacers/ComputerShipPlacer.java | 2 - .../Utils/ShipPlacers/Placer.java | 10 ++- .../homework_3/ImmutableClassExample.java | 73 +++++-------------- src/main/java/homework_6/Main.java | 31 ++++++++ .../MapProblemsCollisionGenerator.java | 32 ++++++++ .../MapProblemsMutableGenerator.java | 28 +++++++ src/main/java/homework_7/Cat.java | 35 +++++++++ src/main/java/homework_7/Kitten.java | 34 +++++++++ .../java/homework_7/KittenToCatFunction.java | 5 ++ src/main/java/homework_7/Main.java | 12 +++ 11 files changed, 209 insertions(+), 70 deletions(-) create mode 100644 src/main/java/homework_6/Main.java create mode 100644 src/main/java/homework_6/MapProblemsCollisionGenerator.java create mode 100644 src/main/java/homework_6/MapProblemsMutableGenerator.java create mode 100644 src/main/java/homework_7/Cat.java create mode 100644 src/main/java/homework_7/Kitten.java create mode 100644 src/main/java/homework_7/KittenToCatFunction.java create mode 100644 src/main/java/homework_7/Main.java diff --git a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java index a2a12afa..9a09d1b3 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/Printer.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/Printer.java @@ -16,7 +16,7 @@ public void printGreeting() { public void printAskHowFill() { String ASK_HOW_TO_FILL = "How Would you like to place your ships? " + "Please, enter \" anything \" to place them manually or just press enter to place them automatically \n" + - ConsoleColors.RED + "Bear in mind, that any input will be counted like manual mode!" + ConsoleColors.RESET ; + ConsoleColors.RED + "Bear in mind, that any input will be counted like manual mode!" + ConsoleColors.RESET; System.out.println(ASK_HOW_TO_FILL); } @@ -106,10 +106,12 @@ public void printPlaced(ShipType type) { String PLACED = "Correctly placed : "; System.out.println(PLACED + type.getType()); } + public void compMoves() { String COMP_MOVES = "Now is a computer move: "; System.out.println(COMP_MOVES); } + public void playerMoves() { String PLAYER_MOVES = "Now is your move: "; System.out.println(PLAYER_MOVES); @@ -123,15 +125,14 @@ public void askWhereToShoot() { public void printOpenField(Field field) { printHeader(); int[][] rawMatrix = field.getField(); - int [][] toPrint = turnMatrix(rawMatrix); + int[][] toPrint = turnMatrix(rawMatrix); int rowNumber = 1; for (int[] row : toPrint ) { if (rowNumber < 10) { System.out.print(rowNumber + " "); - } - else { + } else { System.out.print(rowNumber + " "); } for (int i : row @@ -149,14 +150,13 @@ public void printOpenField(Field field) { public void printHiddenField(Field field) { printHeader(); int[][] rawMatrix = field.getField(); - int [][] toPrint = turnMatrix(rawMatrix); + int[][] toPrint = turnMatrix(rawMatrix); int rowNumber = 1; for (int[] row : toPrint ) { if (rowNumber < 10) { System.out.print(rowNumber + " "); - } - else { + } else { System.out.print(rowNumber + " "); } for (int i : row @@ -171,8 +171,9 @@ public void printHiddenField(Field field) { ++rowNumber; } } + private int[][] turnMatrix(int[][] rawMatrix) { - int[][]result = new int[10][10]; + int[][] result = new int[10][10]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { result[i][j] = rawMatrix[j][i]; diff --git a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java index 588a9c94..dcd5dbd2 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java @@ -6,7 +6,6 @@ import course_project.components.Ship; import course_project.enums.ShipType; - import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -91,7 +90,6 @@ private Coordinates getFirstDeck() { } - private ArrayList createRest(Coordinates start, int size) { ArrayList coordinatesList = new ArrayList<>(); coordinatesList.add(start); diff --git a/src/main/java/course_project/Utils/ShipPlacers/Placer.java b/src/main/java/course_project/Utils/ShipPlacers/Placer.java index 389db46f..7188c545 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/Placer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/Placer.java @@ -9,23 +9,25 @@ public interface Placer { Field placeShips(); + Field placeShips(InReader reader); - default boolean isValidCoordinatesOfPoint(List listShips, List listAdjusted,Coordinates point) { + default boolean isValidCoordinatesOfPoint(List listShips, List listAdjusted, Coordinates point) { return !listShips.contains(point) && !listAdjusted.contains(point) && (point.getY() >= 0 && point.getY() <= 9) && (point.getX() >= 0 && point.getX() <= 9); } - default boolean isValidCoordinatesOfList(List listShips, List listAdjusted,List coordinates) { + default boolean isValidCoordinatesOfList(List listShips, List listAdjusted, List coordinates) { for (Coordinates point : coordinates ) { - if(!isValidCoordinatesOfPoint(listShips, listAdjusted, point)){ + if (!isValidCoordinatesOfPoint(listShips, listAdjusted, point)) { return false; } } return true; } - default List fillForbiddenCoordinates(List shipCoordinates, List notAllowed ) { + + default List fillForbiddenCoordinates(List shipCoordinates, List notAllowed) { for (Coordinates coord : shipCoordinates ) { int x = coord.getX(); diff --git a/src/main/java/homework_3/ImmutableClassExample.java b/src/main/java/homework_3/ImmutableClassExample.java index 9e44e033..23b9285f 100644 --- a/src/main/java/homework_3/ImmutableClassExample.java +++ b/src/main/java/homework_3/ImmutableClassExample.java @@ -14,7 +14,6 @@ public final class ImmutableClassExample { private final int id; private final String name; - private final char[] password; private final HashMap testMap; public int getId() { @@ -26,68 +25,30 @@ public String getName() { } public HashMap getTestMap() { - return (HashMap) testMap.clone(); + return new HashMap<>(testMap); } - public char[] getPassword() { - return (char[]) password.clone(); + public ImmutableClassExample(int id, String name, HashMap testMap) { + this.id = id; + this.name = name; + this.testMap = new HashMap<>(testMap); } - public ImmutableClassExample() { - this.id = 0; - this.name = "User name"; - HashMap tMap = new HashMap<>(); - tMap.put("key", "value"); - this.testMap = tMap; - this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + public ImmutableClassExample(int id, String name){ + this.id = id; + this.name = name; + this.testMap = new HashMap<>(); } - public ImmutableClassExample(int realId) { - - this.id = realId; - this.name = "User name"; - HashMap tMap = new HashMap<>(); - tMap.put("key", "value"); - this.testMap = tMap; - this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; - } - - public ImmutableClassExample(int realId, String realName) { - this.id = realId; - this.name = realName; - HashMap tMap = new HashMap<>(); - tMap.put("key", "value"); - this.testMap = tMap; - this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + public ImmutableClassExample(int id){ + this.id = id; + this.name = "some name"; + this.testMap = new HashMap<>(); } - public ImmutableClassExample(int realId, String realName, HashMap realMap) { - this.id = realId; - this.name = realName; - this.testMap = realMap; - this.password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; - } - - - public ImmutableClassExample(int realId, String realName, HashMap realMap, char[] realPassword) { - this.id = realId; - this.name = realName; - this.testMap = realMap; - this.password = realPassword; - } - public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE){ - return new ImmutableClassExample(oldICE.getId(), oldICE.getName(), oldICE.getTestMap(), getPassword()); - } - public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId){ - return new ImmutableClassExample(newId, oldICE.getName(), oldICE.getTestMap(), oldICE.getPassword()); - } - public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId, String newName){ - return new ImmutableClassExample(newId, newName, oldICE.getTestMap(), oldICE.getPassword()); - } - public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId, String newName, HashMap newMap){ - return new ImmutableClassExample(newId, newName, newMap, oldICE.getPassword()); - } - public ImmutableClassExample getImmutableClassExample(ImmutableClassExample oldICE, int newId,String newName, HashMap newMap, char[] newPassword){ - return new ImmutableClassExample(newId, newName, newMap, newPassword); + public ImmutableClassExample(){ + this.id = -1; + this.name = "name"; + this.testMap = new HashMap<>(); } } diff --git a/src/main/java/homework_6/Main.java b/src/main/java/homework_6/Main.java new file mode 100644 index 00000000..b6915509 --- /dev/null +++ b/src/main/java/homework_6/Main.java @@ -0,0 +1,31 @@ +package homework_6; + +import java.util.HashMap; +import java.util.Map; + +public class Main { + public static void main(String[] args) { + + HashMap mutableMap = new HashMap<>(); + + MapProblemsMutableGenerator first = new MapProblemsMutableGenerator(new StringBuilder("first")); + MapProblemsMutableGenerator second = new MapProblemsMutableGenerator(new StringBuilder("second")); + + mutableMap.put(first, 1); + mutableMap.put(second, 2); + + System.out.println("Before key mutation: "); + System.out.println("mutableMap.get(first) = " + mutableMap.get(first)); + System.out.println("mutableMap.get(second) = " + mutableMap.get(second)); + + + first.getMapKey().append("a"); + second.getMapKey().append("a"); + + System.out.println("After key mutation: "); + System.out.println("mutableMap.get(first) = " + mutableMap.get(first)); + System.out.println("mutableMap.get(second) = " + mutableMap.get(second)); + + } + +} diff --git a/src/main/java/homework_6/MapProblemsCollisionGenerator.java b/src/main/java/homework_6/MapProblemsCollisionGenerator.java new file mode 100644 index 00000000..6ad9f1d8 --- /dev/null +++ b/src/main/java/homework_6/MapProblemsCollisionGenerator.java @@ -0,0 +1,32 @@ +package homework_6; + +import java.util.Objects; + +public class MapProblemsCollisionGenerator { + + private final String name; + + public MapProblemsCollisionGenerator(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapProblemsCollisionGenerator that = (MapProblemsCollisionGenerator) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return 2; // collision generation + } + + @Override + public String toString() { + return "MapProblemsCollisionGenerator{" + + "name='" + name + '\'' + + '}'; + } +} diff --git a/src/main/java/homework_6/MapProblemsMutableGenerator.java b/src/main/java/homework_6/MapProblemsMutableGenerator.java new file mode 100644 index 00000000..2f328318 --- /dev/null +++ b/src/main/java/homework_6/MapProblemsMutableGenerator.java @@ -0,0 +1,28 @@ +package homework_6; + +import java.util.Objects; + +public class MapProblemsMutableGenerator { + private StringBuilder mapKey; + + public MapProblemsMutableGenerator(StringBuilder mapKey) { + this.mapKey = mapKey; + } + + public StringBuilder getMapKey() { + return mapKey; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapProblemsMutableGenerator that = (MapProblemsMutableGenerator) o; + return mapKey.equals(that.mapKey); //suspicious it is, indeed + } + + @Override + public int hashCode() { + return mapKey.toString().hashCode(); + } +} diff --git a/src/main/java/homework_7/Cat.java b/src/main/java/homework_7/Cat.java new file mode 100644 index 00000000..21c2ff34 --- /dev/null +++ b/src/main/java/homework_7/Cat.java @@ -0,0 +1,35 @@ +package homework_7; + +public class Cat { + private String name; + private int age; + + public Cat(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return "Cat{" + + "name='" + name + '\'' + + ", age=" + age + + '}'; + } +} diff --git a/src/main/java/homework_7/Kitten.java b/src/main/java/homework_7/Kitten.java new file mode 100644 index 00000000..c9939f4e --- /dev/null +++ b/src/main/java/homework_7/Kitten.java @@ -0,0 +1,34 @@ +package homework_7; + +public class Kitten { + private String name; + private int age = 0; + private double tailLength; + + public Kitten(String name, int age, double tailLength) { + this.name = name; + this.age = 0; // kittens are small + this.tailLength = tailLength; + } + + public String getName() { + return name; + } + + public int getAge() { + return 0; + } + + public double getTailLength() { + return tailLength; + } + + @Override + public String toString() { + return "Kitten{" + + "name='" + name + '\'' + + ", age=" + age + + ", tailLength=" + tailLength + + '}'; + } +} diff --git a/src/main/java/homework_7/KittenToCatFunction.java b/src/main/java/homework_7/KittenToCatFunction.java new file mode 100644 index 00000000..74e872b9 --- /dev/null +++ b/src/main/java/homework_7/KittenToCatFunction.java @@ -0,0 +1,5 @@ +package homework_7; + +public interface KittenToCatFunction { + Cat grow(Kitten kitten); +} diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java new file mode 100644 index 00000000..65122b71 --- /dev/null +++ b/src/main/java/homework_7/Main.java @@ -0,0 +1,12 @@ +package homework_7; + +public class Main { + public static void main(String[] args) { + Kitten kitten = new Kitten("Pupa", 0, 2.5); + + KittenToCatFunction function = (k) -> new Cat(k.getName(), k.getAge() + 4); + Cat cat = function.grow(kitten); + System.out.println("kitten = " + kitten); + System.out.println("cat = " + cat); + } +} From ceef6d1a55c4921dd58668e56bb2ad7e2651757a Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 26 Sep 2021 16:48:52 +0300 Subject: [PATCH 32/34] Some tests added --- README.md | 5 +- src/main/java/course_project/SeaBattle.java | 3 +- .../Utils/ShipPlacers/ComputerShipPlacer.java | 1 - .../Utils/ShipPlacers/PlayerShipPlacer.java | 1 - .../java/course_project/components/Ship.java | 4 +- .../course_project/SeaBattleTest.java | 4 + .../component_tests/CoordinatesTest.java | 44 ++++++++ .../component_tests/FieldTest.java | 106 ++++++++++++++++++ .../component_tests/ShipTest.java | 46 ++++++++ .../console_handling_tests/InReaderTest.java | 6 + .../console_handling_tests/PrinterTest.java | 4 + .../placer_tests/ComputerShipPlacerTest.java | 4 + .../placer_tests/PlayerShipPlacerTest.java | 4 + 13 files changed, 225 insertions(+), 7 deletions(-) create mode 100644 src/test/java/homework/course_project/SeaBattleTest.java create mode 100644 src/test/java/homework/course_project/component_tests/CoordinatesTest.java create mode 100644 src/test/java/homework/course_project/component_tests/FieldTest.java create mode 100644 src/test/java/homework/course_project/component_tests/ShipTest.java create mode 100644 src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java create mode 100644 src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java create mode 100644 src/test/java/homework/course_project/util_tests/placer_tests/ComputerShipPlacerTest.java create mode 100644 src/test/java/homework/course_project/util_tests/placer_tests/PlayerShipPlacerTest.java diff --git a/README.md b/README.md index 604891ca..04fd4c1f 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,19 @@ | Number | Solution | Short description | --- | --- | --- | +| Course project|[Sea battle](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/course_project)| Sea battle realisation, fight VS computer | HW 1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/blob/feature/DmitriyVaschenko/src/main/java/homework_1/ConsolePrinter.java) | The app that reads input arguments and prints them, until "error" argument | | HW 2_1 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/traffic_light) | Traffic Light app, the simple one. | | HW 2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/pyramid_printer) | The Pyramid printer, prints triangles only, btw. | | HW 2_3| [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_2/random_chars_table) | Random chars table, prints table with chars and then sorts them by even or odd. | HW 3, Immutable Class Example| [ImutableClassExample](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_3) | Immutable class. | HW 4_1| [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_annotation)| Annotation for JSON Serialization -| HW 4_2| [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_file_reader) | File Reader which removes full stops and comas fro TXT file +| HW 4_2| [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/custom_file_reader) | File Reader which removes all full stops and comas from TXT file | HW 4_3| [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_4/singleton)| Three singleton classes | HW 5_1| [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_5/custom_regex_matcher)| App is checking if input matches moderate password | HW 5_2| [PowerOfNumber](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_5/power_of_number)|Recursively counts given degree of a given number +| HW 6 |[Map problems](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_6)| Map collision generation and Map with mutable key +| HW 7 |[Kitten to Cat function](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/main/java/homework_7)| Functional interface to map kittens into cats | Tests|[Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/DmitriyVaschenko/src/test/java/homework) | Tests for homework [Link to CodingBat](https://codingbat.com/done?user=dvaschenko33@gmail.com&tag=4651459890) diff --git a/src/main/java/course_project/SeaBattle.java b/src/main/java/course_project/SeaBattle.java index 3a96b901..373ad9df 100644 --- a/src/main/java/course_project/SeaBattle.java +++ b/src/main/java/course_project/SeaBattle.java @@ -40,7 +40,8 @@ public void play() { printer.printGoodbye(); } else { - + cPlacer.cleanField(); + plPlacer.cleanField(); new SeaBattle().play(); } } diff --git a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java index dcd5dbd2..29b81290 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/ComputerShipPlacer.java @@ -39,7 +39,6 @@ private List createAllShips() { Ship ship = new Ship(i, type, type.getSize(), coordinates); allShips.add(ship); - ship.setHealth(coordinates.size()); allShipsCoordinates.addAll(coordinates); fillForbiddenCoordinates(coordinates, notAllowed); } diff --git a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java index c5e4ec5d..79712379 100644 --- a/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java +++ b/src/main/java/course_project/Utils/ShipPlacers/PlayerShipPlacer.java @@ -51,7 +51,6 @@ private Field placeShipsManually(InReader reader) { for (int i = 1; i <= type.getCount(); i++) { ship = createShip(type, reader); playerShips.add(ship); - ship.setHealth(type.getSize()); playerField.placeShip(ship); printer.printOpenField(playerField); printer.printSep(); diff --git a/src/main/java/course_project/components/Ship.java b/src/main/java/course_project/components/Ship.java index 53c5f4c5..a524372c 100644 --- a/src/main/java/course_project/components/Ship.java +++ b/src/main/java/course_project/components/Ship.java @@ -18,6 +18,7 @@ public Ship(int count, ShipType type, int size, List coordinates) { this.count = count; this.type = type; this.size = size; + this.health = size; this.coordinates = new ArrayList<>(coordinates); } @@ -57,7 +58,4 @@ public void setHealth(int health) { this.health = health; } - public int getHealth() { - return health; - } } diff --git a/src/test/java/homework/course_project/SeaBattleTest.java b/src/test/java/homework/course_project/SeaBattleTest.java new file mode 100644 index 00000000..5bb0982b --- /dev/null +++ b/src/test/java/homework/course_project/SeaBattleTest.java @@ -0,0 +1,4 @@ +package homework.course_project; + +public class SeaBattleTest { +} diff --git a/src/test/java/homework/course_project/component_tests/CoordinatesTest.java b/src/test/java/homework/course_project/component_tests/CoordinatesTest.java new file mode 100644 index 00000000..9752f07a --- /dev/null +++ b/src/test/java/homework/course_project/component_tests/CoordinatesTest.java @@ -0,0 +1,44 @@ +package homework.course_project.component_tests; +import course_project.components.Coordinates; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CoordinatesTest { + + + @Test + void givenTwoInts_whenCreateCoordinates_thenCreated(){ + int x = 1; + int y = 1; + + Coordinates coordinates = new Coordinates(x,y); + assertNotNull(coordinates); + } + + @Test + void givenTwoDifferentCoordinates_whenCompare_thenNotSame(){ + int x1 = 1; + int y1 = 1; + int x2 = 2; + int y2 = 2; + + Coordinates coordinatesFirst = new Coordinates(x1,y2); + Coordinates coordinatesSecond = new Coordinates(x2, y2); + + assertNotSame(coordinatesFirst, coordinatesSecond); + } + + @Test + void givenTwoSameCoordinates_whenCompare_thenSame(){ + int x1 = 1; + int y1 = 1; + int x2 = 1; + int y2 = 1; + + Coordinates coordinatesFirst = new Coordinates(x1,y2); + Coordinates coordinatesSecond = new Coordinates(x2, y2); + + assertEquals(coordinatesFirst, coordinatesSecond); + } +} diff --git a/src/test/java/homework/course_project/component_tests/FieldTest.java b/src/test/java/homework/course_project/component_tests/FieldTest.java new file mode 100644 index 00000000..28b43d3b --- /dev/null +++ b/src/test/java/homework/course_project/component_tests/FieldTest.java @@ -0,0 +1,106 @@ +package homework.course_project.component_tests; + +import course_project.components.Coordinates; +import course_project.components.Field; +import course_project.components.Ship; +import course_project.enums.ShipType; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class FieldTest { + final Field field = new Field(); + + + @Test + void givenFieldCreated_whenCheckCells_thenItIsEmpty(){ + for (int[] row: field.getField() + ) { + for (int i: row + ) { + assertEquals(0, i); + } + } + } + @Test + void givenShipPlaced_whenCheckCells_thenContainsDecks(){ + List shipCoords = new ArrayList<>(); + shipCoords.add(new Coordinates(1,1)); + shipCoords.add(new Coordinates(1,2)); + shipCoords.add(new Coordinates(1,3)); + shipCoords.add(new Coordinates(1,4)); + Ship ship = new Ship(1, ShipType.AIR_CARRIER, 4, shipCoords); + + field.placeShip(ship); + int countDecks = 0; + for (int[] row: field.getField() + ) { + for (int i: row + ) { + if (i == '#'){ + countDecks++; + } + } + } + assertEquals(4, countDecks); + } + + @Test + void givenHitPlaced_whenCheckCells_thenContainsDecks(){ + Coordinates hitCoordinates1 = new Coordinates(2,3); + Coordinates hitCoordinates2 = new Coordinates(1,3); + Coordinates hitCoordinates3 = new Coordinates(5,3); + Coordinates hitCoordinates4 = new Coordinates(2,5); + + field.placeHit(hitCoordinates1); + field.placeHit(hitCoordinates2); + field.placeHit(hitCoordinates3); + field.placeHit(hitCoordinates4); + + int countHits = 0; + for (int[] row: field.getField() + ) { + for (int i: row + ) { + if (i == 'X'){ + countHits++; + } + } + } + assertEquals(4, countHits); + } + @Test + void givenMissPlaced_whenCheckCells_thenContainsDecks(){ + Coordinates missCoordinates1 = new Coordinates(2,3); + Coordinates missCoordinates2 = new Coordinates(1,3); + Coordinates missCoordinates3 = new Coordinates(5,3); + Coordinates missCoordinates4 = new Coordinates(2,5); + + field.placeMiss(missCoordinates1); + field.placeMiss(missCoordinates2); + field.placeMiss(missCoordinates3); + field.placeMiss(missCoordinates4); + + int countMisses = 0; + for (int[] row: field.getField() + ) { + for (int i: row + ) { + if (i == '*'){ + countMisses++; + } + } + } + assertEquals(4, countMisses); + } + +} + + + + + + diff --git a/src/test/java/homework/course_project/component_tests/ShipTest.java b/src/test/java/homework/course_project/component_tests/ShipTest.java new file mode 100644 index 00000000..1d12fcc8 --- /dev/null +++ b/src/test/java/homework/course_project/component_tests/ShipTest.java @@ -0,0 +1,46 @@ +package homework.course_project.component_tests; + +import course_project.components.Coordinates; +import course_project.components.Ship; +import course_project.enums.ShipType; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class ShipTest { + + + @Test + void givenNewShip_whenCreate_thenItIsExist(){ + List shipCoords = new ArrayList<>(); + shipCoords.add(new Coordinates(1,1)); + shipCoords.add(new Coordinates(1,2)); + shipCoords.add(new Coordinates(1,3)); + shipCoords.add(new Coordinates(1,4)); + Ship ship = new Ship(1, ShipType.AIR_CARRIER, 4, shipCoords); + + assertNotNull(ship); + } + + @Test + void whenShipGetEnoughShots_thenItDies(){ + List shipCoords = new ArrayList<>(); + shipCoords.add(new Coordinates(1,1)); + shipCoords.add(new Coordinates(1,2)); + shipCoords.add(new Coordinates(1,3)); + + Ship ship = new Ship(1, ShipType.CRUISER, 3, shipCoords); + ship.gotShot(); + ship.gotShot(); + ship.gotShot(); + System.out.println(ship.isAlive()); + assertFalse(ship.isAlive()); + } + + + + +} diff --git a/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java b/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java new file mode 100644 index 00000000..3724ff8c --- /dev/null +++ b/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java @@ -0,0 +1,6 @@ +package homework.course_project.util_tests.console_handling_tests; + +public class InReaderTest { + + +} diff --git a/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java b/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java new file mode 100644 index 00000000..c3e35639 --- /dev/null +++ b/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java @@ -0,0 +1,4 @@ +package homework.course_project.util_tests.console_handling_tests; + +public class PrinterTest { +} diff --git a/src/test/java/homework/course_project/util_tests/placer_tests/ComputerShipPlacerTest.java b/src/test/java/homework/course_project/util_tests/placer_tests/ComputerShipPlacerTest.java new file mode 100644 index 00000000..195f14d1 --- /dev/null +++ b/src/test/java/homework/course_project/util_tests/placer_tests/ComputerShipPlacerTest.java @@ -0,0 +1,4 @@ +package homework.course_project.util_tests.placer_tests; + +public class ComputerShipPlacerTest { +} diff --git a/src/test/java/homework/course_project/util_tests/placer_tests/PlayerShipPlacerTest.java b/src/test/java/homework/course_project/util_tests/placer_tests/PlayerShipPlacerTest.java new file mode 100644 index 00000000..b438e03d --- /dev/null +++ b/src/test/java/homework/course_project/util_tests/placer_tests/PlayerShipPlacerTest.java @@ -0,0 +1,4 @@ +package homework.course_project.util_tests.placer_tests; + +public class PlayerShipPlacerTest { +} From 5d7c2c76543c8c9db7d5c9510a20b0fd250320ec Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 26 Sep 2021 20:00:33 +0300 Subject: [PATCH 33/34] Some more tests added --- src/main/java/course_project/Main.java | 8 +- .../Utils/ConsoleHandling/InReader.java | 2 +- .../console_handling_tests/InReaderTest.java | 110 +++++++++++++++++- .../console_handling_tests/PrinterTest.java | 44 ++++++- 4 files changed, 160 insertions(+), 4 deletions(-) diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java index 21dd9ddd..de4a4b55 100644 --- a/src/main/java/course_project/Main.java +++ b/src/main/java/course_project/Main.java @@ -1,8 +1,14 @@ package course_project; +import course_project.Utils.ConsoleHandling.Printer; +import course_project.components.Field; + public class Main { public static void main(String[] args) { - new SeaBattle().play(); + //new SeaBattle().play(); + + Field f = new Field(); + new Printer().printHiddenField(f); } } diff --git a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java index 73711cf4..965df2fb 100644 --- a/src/main/java/course_project/Utils/ConsoleHandling/InReader.java +++ b/src/main/java/course_project/Utils/ConsoleHandling/InReader.java @@ -94,6 +94,6 @@ public String getDestination() { public boolean getMode() { String mode = readInput(); - return mode.isEmpty(); + return mode == null || mode.isEmpty(); } } diff --git a/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java b/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java index 3724ff8c..afdeb2da 100644 --- a/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java +++ b/src/test/java/homework/course_project/util_tests/console_handling_tests/InReaderTest.java @@ -1,6 +1,114 @@ package homework.course_project.util_tests.console_handling_tests; -public class InReaderTest { +import course_project.Utils.ConsoleHandling.InReader; +import course_project.components.Coordinates; +import homework.unit_base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + + +public class InReaderTest extends UnitBase { + final String ERR_MSG = "Something is wrong with input, try again"; + final String WRONG_DESTINATION = "Wrong destination input, try again!"; + @Test + void givenString_whenStringA1_thenCoordinateReturned() { + String input = "A1"; + Coordinates result; + setInput(input); + result = new InReader().readCoordinates(); + + assertNotNull(result); + } + + @Test + void givenBadString_whenStringSTR_thenErrorPrinted() { + String input = "String\n" + "a1"; + + setInput(input); + new InReader().readCoordinates(); //recursively called, need second argument in case of mistaken input + + assertEquals(ERR_MSG, getOutputLines()[0]); + } + + @Test + void givenNothing_whenStringIsEmpty_thenErrorPrinted() { + String input = "\n" + "a1"; + + setInput(input); + new InReader().readCoordinates(); //recursively called, need second argument in case of mistaken input + + assertEquals(ERR_MSG, getOutputLines()[0]); + } + + @Test + void givenArguments_whenGetCoordinatesByDestinationCalled_thenCoordinatesListReturned(){ + Coordinates start = new Coordinates(1,1); + int size = 4; + String destination = "right"; + + List expected = new ArrayList<>(); + expected.add(start); + Coordinates c1 = new Coordinates(2,1); + expected.add(c1); + Coordinates c2 = new Coordinates(3,1); + expected.add(c2); + Coordinates c3 = new Coordinates(4,1); + expected.add(c3); + + List result = new InReader().getCoordinatesByDestination(start, size, destination); + + assertEquals(expected, result); + } + + @Test + void givenBadString_whenGetDestinationCalled_thenErrorPrinted() { + String input = "String\n" + "left"; + + setInput(input); + new InReader().getDestination(); //recursively called, need second argument in case of mistaken input + + assertEquals(WRONG_DESTINATION, getOutputLines()[0]); + } + + @Test + void givenEmptyString_whenGetDestinationCalled_thenErrorPrinted() { + String input = "\n" + "left"; + + setInput(input); + new InReader().getDestination(); //recursively called, need second argument in case of mistaken input + + assertEquals(WRONG_DESTINATION, getOutputLines()[0]); + } + + @Test + void givenCorrectInput_whenGetDestinationCalled_thenStringReturned() { + String input = "LefT"; + String expected = "left"; + setInput(input); + String result = new InReader().getDestination(); + + assertEquals(expected, result); + } + + @Test + void givenSomeInput_whenGetModeCalled_thenFalseReturned() { + String input = "anything"; + setInput(input); + + assertFalse(new InReader().getMode()); + } + + @Test + void givenNoInput_whenGetModeCalled_thenTrueReturned() { + String input = ""; + setInput(input); + + assertTrue(new InReader().getMode()); + } } diff --git a/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java b/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java index c3e35639..b4d74170 100644 --- a/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java +++ b/src/test/java/homework/course_project/util_tests/console_handling_tests/PrinterTest.java @@ -1,4 +1,46 @@ package homework.course_project.util_tests.console_handling_tests; +import course_project.Utils.ConsoleHandling.Printer; +import course_project.components.Field; +import homework.unit_base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +public class PrinterTest extends UnitBase{ + + @Test + void givenNewField_whenPrintAnyway_thenPrinted(){ + Field testFieldEmpty = new Field(); + String expected = " A B C D E F G H I J \n" + + "1 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "2 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "3 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "4 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "5 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "6 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "7 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "8 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "9 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n" + + "10 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~"; + new Printer().printOpenField(testFieldEmpty); + assertEquals(expected, " " + getOutput()); + + + + new Printer().printHiddenField(testFieldEmpty); + + + + + + + + + + + + } -public class PrinterTest { } From edf0cc012848f637481da204759318b974119c23 Mon Sep 17 00:00:00 2001 From: Dmitriy Vaschenko Date: Sun, 26 Sep 2021 20:05:35 +0300 Subject: [PATCH 34/34] Workable main --- src/main/java/course_project/Main.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java index de4a4b55..f92d5edf 100644 --- a/src/main/java/course_project/Main.java +++ b/src/main/java/course_project/Main.java @@ -6,9 +6,7 @@ public class Main { public static void main(String[] args) { - //new SeaBattle().play(); + new SeaBattle().play(); - Field f = new Field(); - new Printer().printHiddenField(f); } }