From 3b3c1faa15494dd46295bfe81e9d3448211e43cc Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Fri, 9 Jul 2021 17:43:57 +0300 Subject: [PATCH 01/67] upd --- gradlew | 0 src/main/java/homework_1/Main.java | 22 +++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index 07c029a2..cdbc764f 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -3,7 +3,27 @@ public class Main { public static void main(String[] args) { - System.out.println("Hello homework!"); + for (String arg : args) { + if (arg.equals("ошибка") || arg.equals("error")) { + System.err.println("Тревога!"); + return; + } + + System.out.println(arg + ": " + arg.length() + ending(arg.length())); + } + } + + static String ending(int len) { + String word = " букв"; + // First check to avoid creating new variable(less memory) + // and no more if statements (better performance) + if (len >= 5 && len < 20) { return word; } + // + int n = Math.abs(len) % 100; + n = n%10; + if (n > 1 && n < 5) { return word + "ы"; } + if (n == 1) { return word + "а"; } + return word; } } From 3155bb3cff19bf4b981224db7c157a94222687e8 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Fri, 9 Jul 2021 17:52:50 +0300 Subject: [PATCH 02/67] upd ReadMe.md --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5d686e9f..0476c8b8 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ # Java Core June 2021 -## *Nikolaev Artem* +### Andropov Vsevolod -| Number | Solution | Short description +| Type | Task | Solution | --- | --- | --- | -| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/master/src/main/java/homework_1) | 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) +| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/master/src/main/java/homework_1) | [hw1_solution](./src/main/java/homework_1/) | From 066e239fb3ad377118db775007f4ffb5613e8bbf Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 12 Jul 2021 14:36:45 +0300 Subject: [PATCH 03/67] readme fix. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0476c8b8..befae548 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ ### Andropov Vsevolod -| Type | Task | Solution +| Type | Solution | Task description | --- | --- | --- | -| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/master/src/main/java/homework_1) | [hw1_solution](./src/main/java/homework_1/) | +HW1 | [hw1_solution](./src/main/java/homework_1/) | The app that reads input arguments and prints them, until "error" argument | From 4671e18ff86e51247d4c15c3005e87f823019ff1 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 12 Jul 2021 15:40:53 +0300 Subject: [PATCH 04/67] upd --- README.md | 4 ++-- src/main/java/homework_1/Main.java | 26 ++++++++------------------ 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index befae548..08133757 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ ### Andropov Vsevolod -| Type | Solution | Task description +| Number | Solution | Short description | --- | --- | --- | -HW1 | [hw1_solution](./src/main/java/homework_1/) | The app that reads input arguments and prints them, until "error" argument | +HW1 | [Console printer](./src/main/java/homework_1/) | The app that reads input arguments and prints them, until "error" argument | diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index cdbc764f..ffebe605 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -2,28 +2,18 @@ public class Main { + static final String RED = "\u001b[31m"; + static final String RESET = "\u001b[0m"; + public static void main(String[] args) { for (String arg : args) { - if (arg.equals("ошибка") || arg.equals("error")) { - System.err.println("Тревога!"); - return; + if (arg.equalsIgnoreCase("ошибка") || arg.equalsIgnoreCase("error")) { + System.out.println(RED + "Alarm!" + RESET); + break; } - System.out.println(arg + ": " + arg.length() + ending(arg.length())); + System.out.println(arg + ": " + arg.length() + " letters"); } } - static String ending(int len) { - String word = " букв"; - // First check to avoid creating new variable(less memory) - // and no more if statements (better performance) - if (len >= 5 && len < 20) { return word; } - // - int n = Math.abs(len) % 100; - n = n%10; - if (n > 1 && n < 5) { return word + "ы"; } - if (n == 1) { return word + "а"; } - return word; - } - -} +} \ No newline at end of file From f98562ab991d8d8a84e2091a1bae1ba868bdc528 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 13 Jul 2021 11:24:46 +0300 Subject: [PATCH 05/67] upd --- src/main/java/homework_1/Main.java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 src/main/java/homework_1/Main.java diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java deleted file mode 100644 index ffebe605..00000000 --- a/src/main/java/homework_1/Main.java +++ /dev/null @@ -1,19 +0,0 @@ -package homework_1; - -public class Main { - - static final String RED = "\u001b[31m"; - static final String RESET = "\u001b[0m"; - - public static void main(String[] args) { - for (String arg : args) { - if (arg.equalsIgnoreCase("ошибка") || arg.equalsIgnoreCase("error")) { - System.out.println(RED + "Alarm!" + RESET); - break; - } - - System.out.println(arg + ": " + arg.length() + " letters"); - } - } - -} \ No newline at end of file From 6e8ac3cb40f458720e8cd023843f95a00057ab8f Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 13 Jul 2021 11:32:59 +0300 Subject: [PATCH 06/67] upd --- src/main/java/homework_1/Main.java | 19 +++++++++++++++++++ src/main/java/homework_2/Main.java | 7 +++++++ src/main/java/homework_2/TrafficLight.java | 5 +++++ 3 files changed, 31 insertions(+) create mode 100644 src/main/java/homework_1/Main.java create mode 100644 src/main/java/homework_2/Main.java create mode 100644 src/main/java/homework_2/TrafficLight.java diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java new file mode 100644 index 00000000..874fa646 --- /dev/null +++ b/src/main/java/homework_1/Main.java @@ -0,0 +1,19 @@ +package homework_1; + +public class Main { + + static final String RED = "\u001b[31m"; + static final String RESET = "\u001b[0m"; + + public static void main(String[] args) { + for (String arg : args) { + if (arg.equalsIgnoreCase("ошибка") || arg.equalsIgnoreCase("error")) { + System.out.println(RED + "Alarm!" + RESET); + break; + } + + System.out.println(arg + ": " + arg.length() + " letters"); + } + } + +} diff --git a/src/main/java/homework_2/Main.java b/src/main/java/homework_2/Main.java new file mode 100644 index 00000000..9ce26170 --- /dev/null +++ b/src/main/java/homework_2/Main.java @@ -0,0 +1,7 @@ +package homework_2; + +public class Main { + public static void main(String[] args) { + TrafficLight tf = new TrafficLight(); + } +} diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/TrafficLight.java new file mode 100644 index 00000000..27db6527 --- /dev/null +++ b/src/main/java/homework_2/TrafficLight.java @@ -0,0 +1,5 @@ +package homework_2; + +public class TrafficLight { + +} From 8155c0ee46d8af20bdfa8b24e8c270a649e41d97 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 13 Jul 2021 14:13:21 +0300 Subject: [PATCH 07/67] upd --- src/main/java/homework_2/IOMod.java | 49 +++++++++++++++++++ src/main/java/homework_2/Main.java | 7 --- src/main/java/homework_2/PyramidPrinter.java | 21 ++++++++ .../java/homework_2/RandomCharsTable.java | 10 ++++ src/main/java/homework_2/TrafficLight.java | 31 ++++++++++++ 5 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/main/java/homework_2/IOMod.java delete mode 100644 src/main/java/homework_2/Main.java create mode 100644 src/main/java/homework_2/PyramidPrinter.java create mode 100644 src/main/java/homework_2/RandomCharsTable.java diff --git a/src/main/java/homework_2/IOMod.java b/src/main/java/homework_2/IOMod.java new file mode 100644 index 00000000..050bfc02 --- /dev/null +++ b/src/main/java/homework_2/IOMod.java @@ -0,0 +1,49 @@ +package homework_2; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class IOMod { + + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + + static int bufferedReaderIntReader() throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + int i = Integer.parseInt(reader.readLine()); + if (i >= 0 && i < 86400) { + return i; + } + if (i < 0) { + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "INCORRECT VALUE! ONLY POSITIVE INTEGER NUMBERS AVAILABLE AS A VALUE"); + } else { + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "INCORRECT VALUE! SHOULD BE IN RANGE: 0 <= value < 86400"); + } + return -1; + } catch (NumberFormatException e) { + // throw new RuntimeException(e); + System.out.println(ANSI_RED + "ERROR: " + ANSI_RESET + + "ONLY INTEGER NUMBERS AVAILABLE AS A VALUE"); + return -1; + } + } + + static int bufferedReaderPyramidHeight() throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + int i = Integer.parseInt(reader.readLine()); + if (i > 0) { + return i; + } + return -1; + } catch (NumberFormatException e) { + //throw new RuntimeException(e); + return -1; + } + } + +} diff --git a/src/main/java/homework_2/Main.java b/src/main/java/homework_2/Main.java deleted file mode 100644 index 9ce26170..00000000 --- a/src/main/java/homework_2/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package homework_2; - -public class Main { - public static void main(String[] args) { - TrafficLight tf = new TrafficLight(); - } -} diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java new file mode 100644 index 00000000..7377d0d3 --- /dev/null +++ b/src/main/java/homework_2/PyramidPrinter.java @@ -0,0 +1,21 @@ +package homework_2; + +import java.io.IOException; + +public class PyramidPrinter { + + public static void main(String[] args) throws IOException { + System.out.print("Please, input pyramids height value: "); + int pyramidHeight = IOMod.bufferedReaderPyramidHeight(); + if (pyramidHeight <= 0) { + return; + } + for (int i = 1; i <= pyramidHeight; i++) { + for (int j = 1; j <= i; j++) { + System.out.print("x"); + } + System.out.println(); + } + } + +} diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java new file mode 100644 index 00000000..e682e387 --- /dev/null +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -0,0 +1,10 @@ +package homework_2; + +public class RandomCharsTable { + + public static void main(String[] args) { + System.out.println("Random Chars Table"); + System.out.println(); + } + +} diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/TrafficLight.java index 27db6527..0de42843 100644 --- a/src/main/java/homework_2/TrafficLight.java +++ b/src/main/java/homework_2/TrafficLight.java @@ -1,5 +1,36 @@ package homework_2; +import java.io.IOException; + +import static homework_2.IOMod.*; + public class TrafficLight { + public static void main(String[] args) throws IOException { + System.out.print("Please, input seconds gone from the day start: "); + int secondsGone = IOMod.bufferedReaderIntReader(); + if (secondsGone == -1) { + return; + } else if (secondsGone >= 0 && secondsGone < 60) { + colorPick(secondsGone); + } else { + colorPick(secondsGone % 60); + } + } + + private static void colorPick(int secs) { + System.out.print("Traffic Lights set to: "); + // 0 <= light < 35 зеленый, 35 <= light < 40 желтый, 40 <= light < 60 красный. + if (secs >= 0 && secs < 35) { + System.out.println(ANSI_GREEN + "GREEN"); + } + if (secs >= 35 && secs < 40) { + System.out.println(ANSI_YELLOW + "YELLOW"); + } + if (secs >= 40 && secs < 60) { + System.out.println(ANSI_RED + "RED"); + } + System.out.print(ANSI_RESET); + } + } From 46775050ce1040060b5fc4d94ac132262275dc9c Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 13 Jul 2021 18:15:38 +0300 Subject: [PATCH 08/67] homework_2 --- README.md | 5 +- src/main/java/homework_2/IOMod.java | 34 +++----- src/main/java/homework_2/PyramidPrinter.java | 7 +- .../java/homework_2/RandomCharsTable.java | 81 ++++++++++++++++++- src/main/java/homework_2/TrafficLight.java | 10 ++- 5 files changed, 103 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 08133757..84c8cd6d 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,7 @@ | Number | Solution | Short description | --- | --- | --- | -HW1 | [Console printer](./src/main/java/homework_1/) | The app that reads input arguments and prints them, until "error" argument | +HW1 | [Console printer](./src/main/java/homework_1/Main.java) | The app that reads input arguments and prints them, until "error" argument | +HW2 | [Traffic Light](./src/main/java/homework_2/TrafficLight.java) | The app that switching colors on different number value (input from keyboard) | +HW2 | [Pyramid Printer](./src/main/java/homework_2/PyramidPrinter.java) | Printing 'x' with the input parameter as Pyramid of 'x' length | +HW2 | [Random Chars Table](./src/main/java/homework_2/RandomCharsTable.java) | The app that creates 2-dimensional array made of random Character values (from 65 to 90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | diff --git a/src/main/java/homework_2/IOMod.java b/src/main/java/homework_2/IOMod.java index 050bfc02..ff49800a 100644 --- a/src/main/java/homework_2/IOMod.java +++ b/src/main/java/homework_2/IOMod.java @@ -14,36 +14,22 @@ public class IOMod { static int bufferedReaderIntReader() throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { int i = Integer.parseInt(reader.readLine()); - if (i >= 0 && i < 86400) { - return i; - } - if (i < 0) { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "INCORRECT VALUE! ONLY POSITIVE INTEGER NUMBERS AVAILABLE AS A VALUE"); - } else { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "INCORRECT VALUE! SHOULD BE IN RANGE: 0 <= value < 86400"); - } - return -1; + return i; } catch (NumberFormatException e) { - // throw new RuntimeException(e); - System.out.println(ANSI_RED + "ERROR: " + ANSI_RESET + - "ONLY INTEGER NUMBERS AVAILABLE AS A VALUE"); - return -1; + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "ONLY INTEGER NUMBER AS VALUE AVAILABLE."); + throw new IOException(e); } } - static int bufferedReaderPyramidHeight() throws IOException { + static String bufferedReaderStringReader() throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - int i = Integer.parseInt(reader.readLine()); - if (i > 0) { - return i; - } - return -1; - } catch (NumberFormatException e) { - //throw new RuntimeException(e); - return -1; + String s = reader.readLine(); + return s; + } catch (IOException e) { + System.out.println("Something is wrong: " + e); } + return ""; } } diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java index 7377d0d3..50abfcb5 100644 --- a/src/main/java/homework_2/PyramidPrinter.java +++ b/src/main/java/homework_2/PyramidPrinter.java @@ -1,15 +1,14 @@ package homework_2; import java.io.IOException; +import static homework_2.IOMod.bufferedReaderIntReader; public class PyramidPrinter { public static void main(String[] args) throws IOException { System.out.print("Please, input pyramids height value: "); - int pyramidHeight = IOMod.bufferedReaderPyramidHeight(); - if (pyramidHeight <= 0) { - return; - } + int pyramidHeight = bufferedReaderIntReader(); + assert (pyramidHeight > 0); // need nothing to do if input is less then 1 for (int i = 1; i <= pyramidHeight; i++) { for (int j = 1; j <= i; j++) { System.out.print("x"); diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java index e682e387..8a7e0d47 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -1,10 +1,85 @@ package homework_2; +import java.io.IOException; +import java.util.Random; + +import static homework_2.IOMod.*; + public class RandomCharsTable { - public static void main(String[] args) { - System.out.println("Random Chars Table"); - System.out.println(); + private static final int randMinValue = 65; // A + private static final int randMaxValue = 90; // Z + private static boolean strategy; + private static String result = ""; + + public static void main(String[] args) throws IOException { + System.out.println("Input table length, table width, table strategy (even/odd):"); + String s = bufferedReaderStringReader(); + String[] parameters = s.split(" "); + int table_length = Integer.parseInt(parameters[0]); + int table_width = Integer.parseInt(parameters[1]); + if ("odd".equalsIgnoreCase(parameters[2])) { + strategy = false; + } else if ("even".equalsIgnoreCase(parameters[2])) { + strategy = true; + } else { + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "Wrong strategy value.\tYou should use only \"even\" or \"odd\" !"); + return; + } + + printRandomABC(table_length, table_width); + printResult(); + } + + private static void printRandomABC(int length, int width) { + Character[][] randAbc = new Character[length][width]; + Random random = new Random(); + + for (int i = 0; i < length; i++) { + for (int j = 0; j < width; j++) { + randAbc[i][j] = (char) (random.nextInt((randMaxValue - randMinValue) + 1) + randMinValue); + System.out.print(randAbc[i][j] + " "); + // result generating on-the-go + resultGen(randAbc[i][j]); + } + System.out.println(); + } + } + + private static void resultGen(char ch) { + if (strategy) { + if ((ch % 2) == 0) { // even + // add if result doesn't contains value + if (!result.contains(String.valueOf(ch))) { + result += ch; + } + } + } else { + if ((ch % 2) == 1) { // odd + if (!result.contains(String.valueOf(ch))) { + result += ch; + } + } + } + } + + private static void printResult() { + if (strategy) { + System.out.print("Even letters - "); + } else { + System.out.print("Odd letters - "); + } + + int i = 0; + while (i < result.length()) { // to avoid exception in a case when result.length() = 0 ;) + if (i == result.length() - 1) { + System.out.print(result.charAt(i)); + break; + } + System.out.print(result.charAt(i) + ", "); + i++; + } } } diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/TrafficLight.java index 0de42843..062be984 100644 --- a/src/main/java/homework_2/TrafficLight.java +++ b/src/main/java/homework_2/TrafficLight.java @@ -9,7 +9,13 @@ public class TrafficLight { public static void main(String[] args) throws IOException { System.out.print("Please, input seconds gone from the day start: "); int secondsGone = IOMod.bufferedReaderIntReader(); - if (secondsGone == -1) { + if (secondsGone < 0) { + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "INCORRECT VALUE! ONLY POSITIVE INTEGER NUMBERS AVAILABLE AS A VALUE"); + return; + } else if (secondsGone >= 86400) { + System.out.println(ANSI_YELLOW + "ATTENTION: " + ANSI_RESET + + "Day has been already finished."); return; } else if (secondsGone >= 0 && secondsGone < 60) { colorPick(secondsGone); @@ -20,7 +26,7 @@ public static void main(String[] args) throws IOException { private static void colorPick(int secs) { System.out.print("Traffic Lights set to: "); - // 0 <= light < 35 зеленый, 35 <= light < 40 желтый, 40 <= light < 60 красный. + // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 60 red if (secs >= 0 && secs < 35) { System.out.println(ANSI_GREEN + "GREEN"); } From fe59928b2e1e1482644ada03f923b24edd3ef720 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 19 Jul 2021 17:09:06 +0300 Subject: [PATCH 09/67] PyramidPrinter optimised: + Using 2 functions that makes able to faster processing; + Using Math.abs for input value for being sure input number is positive (previous version was just stopping program execution by assert); + Assert now just checking input value is not zero; - Current version using much more memory then previous; --- src/main/java/homework_2/PyramidPrinter.java | 23 ++++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java index 50abfcb5..d6527804 100644 --- a/src/main/java/homework_2/PyramidPrinter.java +++ b/src/main/java/homework_2/PyramidPrinter.java @@ -7,14 +7,23 @@ public class PyramidPrinter { public static void main(String[] args) throws IOException { System.out.print("Please, input pyramids height value: "); - int pyramidHeight = bufferedReaderIntReader(); - assert (pyramidHeight > 0); // need nothing to do if input is less then 1 - for (int i = 1; i <= pyramidHeight; i++) { - for (int j = 1; j <= i; j++) { - System.out.print("x"); - } - System.out.println(); + int pyramidHeight = Math.abs(bufferedReaderIntReader()); + assert (pyramidHeight != 0) : "the plane is still a plane"; + printPyramid(pyramidHeight); + } + + private static void printPyramid(int height) { + for (int i = 1; i <= height; i ++) { + System.out.println(genPyramidRow(i)); + } + } + + private static String genPyramidRow(int row_len) { + StringBuilder x_row = new StringBuilder(); + for (int i = 0; i < row_len; i++) { + x_row.append('x'); } + return x_row.toString(); } } From ee41b0cadcfa8ecbe3da0ee8909b9774ff470917 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 19 Jul 2021 20:43:35 +0300 Subject: [PATCH 10/67] codingbat profile added --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 84c8cd6d..d18d69fc 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,9 @@ HW1 | [Console printer](./src/main/java/homework_1/Main.java) | The app that rea HW2 | [Traffic Light](./src/main/java/homework_2/TrafficLight.java) | The app that switching colors on different number value (input from keyboard) | HW2 | [Pyramid Printer](./src/main/java/homework_2/PyramidPrinter.java) | Printing 'x' with the input parameter as Pyramid of 'x' length | HW2 | [Random Chars Table](./src/main/java/homework_2/RandomCharsTable.java) | The app that creates 2-dimensional array made of random Character values (from 65 to 90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | + +
+ +___ + +[codingbat profile](https://codingbat.com/done?user=devngrow@gmail.com&tag=1205090974) \ No newline at end of file From a71dbfa1bbcb7a6fa88c2fd6f8363be9cd73cc61 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 21 Jul 2021 22:50:46 +0300 Subject: [PATCH 11/67] _ --- build.gradle | 2 + src/main/java/homework_2/IOMod.java | 28 +++++----- src/main/java/homework_2/TrafficLight.java | 42 --------------- .../java/homework_2/pyramid_printer/Main.java | 9 ++++ .../{ => pyramid_printer}/PyramidPrinter.java | 22 +++++--- .../homework_2/random_chars_table/Main.java | 11 ++++ .../RandomCharsTable.java | 49 +++++++++-------- .../java/homework_2/traffic_light/Main.java | 7 +++ .../traffic_light/TrafficLight.java | 54 +++++++++++++++++++ src/main/java/homework_3/ImmutableClass.java | 5 ++ 10 files changed, 140 insertions(+), 89 deletions(-) delete mode 100644 src/main/java/homework_2/TrafficLight.java create mode 100644 src/main/java/homework_2/pyramid_printer/Main.java rename src/main/java/homework_2/{ => pyramid_printer}/PyramidPrinter.java (55%) create mode 100644 src/main/java/homework_2/random_chars_table/Main.java rename src/main/java/homework_2/{ => random_chars_table}/RandomCharsTable.java (57%) create mode 100644 src/main/java/homework_2/traffic_light/Main.java create mode 100644 src/main/java/homework_2/traffic_light/TrafficLight.java create mode 100644 src/main/java/homework_3/ImmutableClass.java diff --git a/build.gradle b/build.gradle index b91dc843..bb9c2c2e 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,8 @@ repositories { } dependencies { + implementation 'org.junit.jupiter:junit-jupiter:5.7.0' + implementation 'junit:junit:4.13.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' } diff --git a/src/main/java/homework_2/IOMod.java b/src/main/java/homework_2/IOMod.java index ff49800a..7e79485d 100644 --- a/src/main/java/homework_2/IOMod.java +++ b/src/main/java/homework_2/IOMod.java @@ -7,29 +7,29 @@ public class IOMod { public static final String ANSI_RESET = "\u001B[0m"; - public static final String ANSI_RED = "\u001B[31m"; - public static final String ANSI_GREEN = "\u001B[32m"; - public static final String ANSI_YELLOW = "\u001B[33m"; + public static final String ANSI_RED = "\033[1;91m"; + public static final String ANSI_GREEN = "\033[1;92m"; + public static final String ANSI_YELLOW = "\033[1;93m"; + public static final String BLUE_BG = "\033[0;104m"; + public static final String PURPLE_BG = "\033[0;105m"; + public static final String CYAN_BG = "\033[0;106m"; - static int bufferedReaderIntReader() throws IOException { + public static int bufferedReaderIntReader() throws IOException, NumberFormatException { + int i; try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - int i = Integer.parseInt(reader.readLine()); - return i; - } catch (NumberFormatException e) { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "ONLY INTEGER NUMBER AS VALUE AVAILABLE."); - throw new IOException(e); + i = Integer.parseInt(reader.readLine()); } + return i; } - static String bufferedReaderStringReader() throws IOException { + public static String bufferedReaderStringReader() { + String s = ""; try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - String s = reader.readLine(); - return s; + s = reader.readLine(); } catch (IOException e) { System.out.println("Something is wrong: " + e); } - return ""; + return s; } } diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/TrafficLight.java deleted file mode 100644 index 062be984..00000000 --- a/src/main/java/homework_2/TrafficLight.java +++ /dev/null @@ -1,42 +0,0 @@ -package homework_2; - -import java.io.IOException; - -import static homework_2.IOMod.*; - -public class TrafficLight { - - public static void main(String[] args) throws IOException { - System.out.print("Please, input seconds gone from the day start: "); - int secondsGone = IOMod.bufferedReaderIntReader(); - if (secondsGone < 0) { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "INCORRECT VALUE! ONLY POSITIVE INTEGER NUMBERS AVAILABLE AS A VALUE"); - return; - } else if (secondsGone >= 86400) { - System.out.println(ANSI_YELLOW + "ATTENTION: " + ANSI_RESET + - "Day has been already finished."); - return; - } else if (secondsGone >= 0 && secondsGone < 60) { - colorPick(secondsGone); - } else { - colorPick(secondsGone % 60); - } - } - - private static void colorPick(int secs) { - System.out.print("Traffic Lights set to: "); - // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 60 red - if (secs >= 0 && secs < 35) { - System.out.println(ANSI_GREEN + "GREEN"); - } - if (secs >= 35 && secs < 40) { - System.out.println(ANSI_YELLOW + "YELLOW"); - } - if (secs >= 40 && secs < 60) { - System.out.println(ANSI_RED + "RED"); - } - System.out.print(ANSI_RESET); - } - -} diff --git a/src/main/java/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java new file mode 100644 index 00000000..3aac3590 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -0,0 +1,9 @@ +package homework_2.pyramid_printer; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + new PyramidPrinter().run(); + } +} diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java similarity index 55% rename from src/main/java/homework_2/PyramidPrinter.java rename to src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index d6527804..decf96ba 100644 --- a/src/main/java/homework_2/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -1,29 +1,35 @@ -package homework_2; +package homework_2.pyramid_printer; import java.io.IOException; + import static homework_2.IOMod.bufferedReaderIntReader; public class PyramidPrinter { - public static void main(String[] args) throws IOException { + public void run() throws IOException { + menu(); + } + + private void menu() throws IOException { System.out.print("Please, input pyramids height value: "); int pyramidHeight = Math.abs(bufferedReaderIntReader()); assert (pyramidHeight != 0) : "the plane is still a plane"; printPyramid(pyramidHeight); } - private static void printPyramid(int height) { + private void printPyramid(int height) { for (int i = 1; i <= height; i ++) { System.out.println(genPyramidRow(i)); } } - private static String genPyramidRow(int row_len) { - StringBuilder x_row = new StringBuilder(); - for (int i = 0; i < row_len; i++) { - x_row.append('x'); + private String genPyramidRow(int rowLen) { + StringBuilder xRow = new StringBuilder(); + for (int i = 0; i < rowLen; i++) { + xRow.append('x'); } - return x_row.toString(); + return xRow.toString(); } + } diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java new file mode 100644 index 00000000..a1fb1d62 --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -0,0 +1,11 @@ +package 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_2/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java similarity index 57% rename from src/main/java/homework_2/RandomCharsTable.java rename to src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 8a7e0d47..9ef8e88d 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,4 +1,4 @@ -package homework_2; +package homework_2.random_chars_table; import java.io.IOException; import java.util.Random; @@ -7,20 +7,24 @@ public class RandomCharsTable { - private static final int randMinValue = 65; // A - private static final int randMaxValue = 90; // Z - private static boolean strategy; - private static String result = ""; + private static final int RAND_MIN_VALUE = 65; // A + private static final int RAND_MAX_VALUE = 90; // Z + private static boolean strategy; // even/odd + private static StringBuilder result = new StringBuilder(); - public static void main(String[] args) throws IOException { - System.out.println("Input table length, table width, table strategy (even/odd):"); + public void run() throws IOException { + menu(); + } + + private void menu() throws IOException { + System.out.print("Input table length, table width, table strategy (even/odd): "); String s = bufferedReaderStringReader(); String[] parameters = s.split(" "); - int table_length = Integer.parseInt(parameters[0]); - int table_width = Integer.parseInt(parameters[1]); - if ("odd".equalsIgnoreCase(parameters[2])) { + int tableLength = Integer.parseInt(parameters[0]); + int tableWidth = Integer.parseInt(parameters[1]); + if (parameters[2].equalsIgnoreCase("odd")) { strategy = false; - } else if ("even".equalsIgnoreCase(parameters[2])) { + } else if (parameters[2].equalsIgnoreCase("even")) { strategy = true; } else { System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + @@ -28,7 +32,7 @@ public static void main(String[] args) throws IOException { return; } - printRandomABC(table_length, table_width); + printRandomABC(tableLength, tableWidth); printResult(); } @@ -38,7 +42,7 @@ private static void printRandomABC(int length, int width) { for (int i = 0; i < length; i++) { for (int j = 0; j < width; j++) { - randAbc[i][j] = (char) (random.nextInt((randMaxValue - randMinValue) + 1) + randMinValue); + randAbc[i][j] = (char) (random.nextInt((RAND_MAX_VALUE - RAND_MIN_VALUE) + 1) + RAND_MIN_VALUE); System.out.print(randAbc[i][j] + " "); // result generating on-the-go resultGen(randAbc[i][j]); @@ -48,18 +52,14 @@ private static void printRandomABC(int length, int width) { } private static void resultGen(char ch) { - if (strategy) { - if ((ch % 2) == 0) { // even - // add if result doesn't contains value - if (!result.contains(String.valueOf(ch))) { - result += ch; - } + if (strategy && (ch % 2) == 0) { //even + // add if result doesn't contains value + if (!String.valueOf(result).contains(String.valueOf(ch))) { + result.append(ch); } - } else { - if ((ch % 2) == 1) { // odd - if (!result.contains(String.valueOf(ch))) { - result += ch; - } + } else { // odd + if (!String.valueOf(result).contains(String.valueOf(ch))) { + result.append(ch); } } } @@ -70,7 +70,6 @@ private static void printResult() { } else { System.out.print("Odd letters - "); } - int i = 0; while (i < result.length()) { // to avoid exception in a case when result.length() = 0 ;) if (i == result.length() - 1) { 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_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java new file mode 100644 index 00000000..9a4ac6c4 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -0,0 +1,54 @@ +package homework_2.traffic_light; + +import homework_2.IOMod; + +import java.io.IOException; + +import static homework_2.IOMod.*; + +public class TrafficLight { + + void run() { + menu(); + } + + private void menu() { + System.out.print("Please, input seconds gone from the day start: "); + try { + int secondsGone = IOMod.bufferedReaderIntReader(); + if (secondsGone < 0) { + System.out.println(BLUE_BG + ANSI_YELLOW + "WARNING: " + ANSI_RESET + BLUE_BG + + "INCORRECT VALUE! ONLY POSITIVE INTEGER NUMBERS AVAILABLE AS A VALUE" + ANSI_RESET); + return; + } else if (secondsGone >= 86400) { + System.out.println(PURPLE_BG + ANSI_YELLOW + "ATTENTION: " + ANSI_RESET + PURPLE_BG + + "Day has been already finished." + ANSI_RESET); + return; + } else if (secondsGone >= 0 && secondsGone < 60) { + colorPick(secondsGone); + } else { + colorPick(secondsGone % 60); + } + } catch (NumberFormatException nfe) { + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "ONLY INTEGER NUMBER AS VALUE AVAILABLE."); + } catch (IOException e) { + System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + + "IOException!"); + } + } + + private static void colorPick(int secs) { + System.out.print("Traffic Lights set to: "); + // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 60 red + if (secs >= 0 && secs < 35) { + System.out.println(ANSI_GREEN + "GREEN"); + } else if (secs >= 35 && secs < 40) { + System.out.println(ANSI_YELLOW + "YELLOW"); + } else if (secs >= 40 && secs < 60) { + System.out.println(ANSI_RED + "RED"); + } + System.out.print(ANSI_RESET); + } + +} diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java new file mode 100644 index 00000000..2e861a4e --- /dev/null +++ b/src/main/java/homework_3/ImmutableClass.java @@ -0,0 +1,5 @@ +package homework_3; + +public class ImmutableClass { + +} From 790f9b1d62ef6958b92db9c1d1dc90d75044ae6d Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Thu, 22 Jul 2021 21:11:38 +0300 Subject: [PATCH 12/67] hw3 partly done --- build.gradle | 1 - src/main/java/homework_2/Colors.java | 13 +++ src/main/java/homework_2/IOMod.java | 17 ++-- src/main/java/homework_2/UnitBase.java | 70 +++++++++++++++ .../java/homework_2/pyramid_printer/Main.java | 9 -- .../pyramid_printer/PyramidPrinter.java | 35 -------- .../java/homework_2/pyramid_printer/README.md | 15 ++++ .../homework_2/pyramid_printer/bin/Main.java | 14 +++ .../sources/OptimizedPyramidPrinter.java | 46 ++++++++++ .../sources/PyramidPrinter.java | 39 ++++++++ .../tests/PyramidPrintTest.java | 67 ++++++++++++++ .../homework_2/random_chars_table/Main.java | 11 --- .../homework_2/random_chars_table/README.md | 11 +++ .../random_chars_table/bin/Main.java | 11 +++ .../{ => sources}/RandomCharsTable.java | 50 ++++++----- .../tests/RandomCharsTableTest.java | 65 ++++++++++++++ .../java/homework_2/traffic_light/Main.java | 7 -- .../java/homework_2/traffic_light/README.md | 23 +++++ .../traffic_light/TrafficLight.java | 54 ----------- .../homework_2/traffic_light/bin/Main.java | 22 +++++ .../sources/ExtraTrafficLight.java | 42 +++++++++ .../traffic_light/sources/TrafficLight.java | 47 ++++++++++ .../traffic_light/tests/TrafficLightTest.java | 89 +++++++++++++++++++ 23 files changed, 611 insertions(+), 147 deletions(-) create mode 100644 src/main/java/homework_2/Colors.java create mode 100644 src/main/java/homework_2/UnitBase.java delete mode 100644 src/main/java/homework_2/pyramid_printer/Main.java delete mode 100644 src/main/java/homework_2/pyramid_printer/PyramidPrinter.java create mode 100644 src/main/java/homework_2/pyramid_printer/README.md create mode 100644 src/main/java/homework_2/pyramid_printer/bin/Main.java create mode 100644 src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java create mode 100644 src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java create mode 100644 src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java delete mode 100644 src/main/java/homework_2/random_chars_table/Main.java create mode 100644 src/main/java/homework_2/random_chars_table/README.md create mode 100644 src/main/java/homework_2/random_chars_table/bin/Main.java rename src/main/java/homework_2/random_chars_table/{ => sources}/RandomCharsTable.java (63%) create mode 100644 src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java delete mode 100644 src/main/java/homework_2/traffic_light/Main.java create mode 100644 src/main/java/homework_2/traffic_light/README.md delete mode 100644 src/main/java/homework_2/traffic_light/TrafficLight.java create mode 100644 src/main/java/homework_2/traffic_light/bin/Main.java create mode 100644 src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java create mode 100644 src/main/java/homework_2/traffic_light/sources/TrafficLight.java create mode 100644 src/main/java/homework_2/traffic_light/tests/TrafficLightTest.java diff --git a/build.gradle b/build.gradle index bb9c2c2e..2b34ac84 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,6 @@ repositories { dependencies { implementation 'org.junit.jupiter:junit-jupiter:5.7.0' - implementation 'junit:junit:4.13.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' } diff --git a/src/main/java/homework_2/Colors.java b/src/main/java/homework_2/Colors.java new file mode 100644 index 00000000..3851f231 --- /dev/null +++ b/src/main/java/homework_2/Colors.java @@ -0,0 +1,13 @@ +package homework_2; + +public class Colors { + + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_RED = "\033[1;91m"; + public static final String ANSI_GREEN = "\033[1;92m"; + public static final String ANSI_YELLOW = "\033[1;93m"; + public static final String BLUE_BG = "\033[0;104m"; + public static final String PURPLE_BG = "\033[0;105m"; + public static final String CYAN_BG = "\033[0;106m"; + +} diff --git a/src/main/java/homework_2/IOMod.java b/src/main/java/homework_2/IOMod.java index 7e79485d..4e8fb30b 100644 --- a/src/main/java/homework_2/IOMod.java +++ b/src/main/java/homework_2/IOMod.java @@ -6,18 +6,15 @@ public class IOMod { - public static final String ANSI_RESET = "\u001B[0m"; - public static final String ANSI_RED = "\033[1;91m"; - public static final String ANSI_GREEN = "\033[1;92m"; - public static final String ANSI_YELLOW = "\033[1;93m"; - public static final String BLUE_BG = "\033[0;104m"; - public static final String PURPLE_BG = "\033[0;105m"; - public static final String CYAN_BG = "\033[0;106m"; + public static final String ERROR = "Only 1 non-negative integer is allowed as passed parameter"; + public static final String FORMAT_ERROR = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; - public static int bufferedReaderIntReader() throws IOException, NumberFormatException { - int i; + public static int bufferedReaderIntReader() { + int i = -1; try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { i = Integer.parseInt(reader.readLine()); + } catch (NumberFormatException | IOException e) { + System.out.println(ERROR); } return i; } @@ -27,7 +24,7 @@ public static String bufferedReaderStringReader() { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { s = reader.readLine(); } catch (IOException e) { - System.out.println("Something is wrong: " + e); + System.out.println(FORMAT_ERROR); } return s; } diff --git a/src/main/java/homework_2/UnitBase.java b/src/main/java/homework_2/UnitBase.java new file mode 100644 index 00000000..c6009d9f --- /dev/null +++ b/src/main/java/homework_2/UnitBase.java @@ -0,0 +1,70 @@ +package homework_2; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import java.io.*; + +public abstract class UnitBase { + + protected ByteArrayOutputStream mockedOut = new ByteArrayOutputStream(); + protected final PrintStream originalOut = System.out; + protected final InputStream originalIn = System.in; + + @BeforeEach + void setUpStreams() { + System.setOut(new PrintStream(mockedOut)); + } + + @AfterEach + void restoreStreams() { + System.setOut(originalOut); + System.setIn(originalIn); + } + + // mock input as if you wrote it to console by hand + protected void setInput(String input) { + System.setIn(new ByteArrayInputStream(input.getBytes())); + } + + // returns whole output as string, will all line separators and etc + protected String getOutput() { + return mockedOut.toString().trim(); + } + + // output as array, separated by lines. First line - getOutputLines()[0], and so on + protected String[] getOutputLines() { + return getOutput().split("\\r?\\n"); + } + + // can be used to remove some strings from output (ex. remove "Please input number"). Put after run() + protected void removeFromOutput(String s) { + try { + String output = mockedOut.toString(); + mockedOut.reset(); + mockedOut.write(output.replace(s, "").getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // can be used to print output to testing console. Useful for debugging. Put after run(); + protected void printOut() { + System.setOut(originalOut); + System.out.println(mockedOut); + System.setOut(new PrintStream(mockedOut)); + } + +// @Test +// void example() { +// setInput("2"); +// +// new PyramidPrinter().run(); +// printOut(); +// removeFromOutput("Please input number"): +// +// assertEquals("x", getOutputLines()[0]); +// assertEquals("xx", getOutputLines()[1]); +// } + +} diff --git a/src/main/java/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java deleted file mode 100644 index 3aac3590..00000000 --- a/src/main/java/homework_2/pyramid_printer/Main.java +++ /dev/null @@ -1,9 +0,0 @@ -package homework_2.pyramid_printer; - -import java.io.IOException; - -public class Main { - public static void main(String[] args) throws IOException { - new PyramidPrinter().run(); - } -} diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java deleted file mode 100644 index decf96ba..00000000 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ /dev/null @@ -1,35 +0,0 @@ -package homework_2.pyramid_printer; - -import java.io.IOException; - -import static homework_2.IOMod.bufferedReaderIntReader; - -public class PyramidPrinter { - - public void run() throws IOException { - menu(); - } - - private void menu() throws IOException { - System.out.print("Please, input pyramids height value: "); - int pyramidHeight = Math.abs(bufferedReaderIntReader()); - assert (pyramidHeight != 0) : "the plane is still a plane"; - printPyramid(pyramidHeight); - } - - private void printPyramid(int height) { - for (int i = 1; i <= height; i ++) { - System.out.println(genPyramidRow(i)); - } - } - - private String genPyramidRow(int rowLen) { - StringBuilder xRow = new StringBuilder(); - for (int i = 0; i < rowLen; i++) { - xRow.append('x'); - } - return xRow.toString(); - } - - -} diff --git a/src/main/java/homework_2/pyramid_printer/README.md b/src/main/java/homework_2/pyramid_printer/README.md new file mode 100644 index 00000000..b4420c32 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/README.md @@ -0,0 +1,15 @@ +### Pyramid Printer App + +__Task:__ + +- read a number from the command line once + +- print Pyramid with this number as a height + +- on any error print to command line "Only 1 non-negative integer is allowed as passed parameter" + +- if input value = 0 prints nothing + +__Extra arguments:__ +- Much faster then the regular App but uses more RAM resource; + can be called by "java Main -o" or "java Main -optimized" \ No newline at end of file diff --git a/src/main/java/homework_2/pyramid_printer/bin/Main.java b/src/main/java/homework_2/pyramid_printer/bin/Main.java new file mode 100644 index 00000000..a6ad39e3 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/bin/Main.java @@ -0,0 +1,14 @@ +package homework_2.pyramid_printer.bin; + +import homework_2.pyramid_printer.sources.OptimizedPyramidPrinter; +import homework_2.pyramid_printer.sources.PyramidPrinter; + +public class Main { + public static void main(String[] args) { + if (args.length == 0) { + new PyramidPrinter().run(); + } else { + new OptimizedPyramidPrinter().run(args[0]); + } + } +} diff --git a/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java new file mode 100644 index 00000000..27d43fa1 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java @@ -0,0 +1,46 @@ +package homework_2.pyramid_printer.sources; + +import java.io.IOException; + +import static homework_2.IOMod.*; +import static homework_2.Colors.*; + +public class OptimizedPyramidPrinter { + + public void run(String arg) { + if (arg.equalsIgnoreCase("o") || arg.equalsIgnoreCase("optimized")) { + try { + int h = inputHeight(); + printPyramid(h); + } catch (IOException e) { + System.out.println(CYAN_BG + ERROR + ANSI_RESET); + } + } else { + System.out.println("Incorrect argument. You can call this app as:\n" + + PURPLE_BG + "java Main -o" + ANSI_RESET + "\nor\n" + + BLUE_BG + "java Main -optimized" + ANSI_RESET); + } + } + + private int inputHeight() throws IOException { + System.out.print("Please, input pyramids height value: "); + int pyramidHeight = bufferedReaderIntReader(); + assert (pyramidHeight < 0) : ERROR; + return pyramidHeight; + } + + private void printPyramid(int height) { + for (int i = 0; i < height; i++) { + System.out.println(genPyramidRow(i + 1)); + } + } + + private String genPyramidRow(int rowLen) { + StringBuilder xRow = new StringBuilder(); + for (int i = 0; i < rowLen; i++) { + xRow.append('x'); + } + return xRow.toString(); + } + +} diff --git a/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java new file mode 100644 index 00000000..e55bc512 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java @@ -0,0 +1,39 @@ +package homework_2.pyramid_printer.sources; + +import java.io.IOException; + +import static homework_2.IOMod.ERROR; +import static homework_2.IOMod.bufferedReaderIntReader; + +public class PyramidPrinter { + + public void run() { + try { + int height = inputHeight(); + printPyramid(height); + } catch (IOException e) { + System.out.println(ERROR); + return; + } + } + + private int inputHeight() throws IOException { + System.out.print("Please, input pyramids height value: "); + int pyramidHeight = bufferedReaderIntReader(); + if (pyramidHeight < 0) { + System.out.println(ERROR); + throw new IOException(); + } + return pyramidHeight; + } + + private void printPyramid(int height) { + for (int i = 1; i <= height; i++) { + for (int j = 1; j <= i; j++) { + System.out.print("x"); + } + System.out.println(); + } + } + +} diff --git a/src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java b/src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java new file mode 100644 index 00000000..397941b9 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java @@ -0,0 +1,67 @@ +package homework_2.pyramid_printer.tests; + +import homework_2.UnitBase; +import homework_2.pyramid_printer.sources.PyramidPrinter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class PyramidPrintTest extends UnitBase { + + @Test + void testZero() { + setInput("0"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Please, input pyramids height value: "); + assertEquals("", getOutputLines()[0]); + } + + @Test + void testNegative() { + setInput("-278"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Please, input pyramids height value: "); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void test7() { + setInput("7"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Please, input pyramids height value: "); + assertEquals("x", getOutputLines()[0]); + assertEquals("xx", getOutputLines()[1]); + assertEquals("xxx", getOutputLines()[2]); + assertEquals("xxxx", getOutputLines()[3]); + assertEquals("xxxxx", getOutputLines()[4]); + assertEquals("xxxxxx", getOutputLines()[5]); + assertEquals("xxxxxxx", getOutputLines()[6]); + } + + @Test + void testMAXIntegerPlusOne() { + setInput(String.valueOf(Integer.MAX_VALUE + 1)); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Please, input pyramids height value: "); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void testString() { + setInput("anytext"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Please, input pyramids height value: "); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[1]); + } + +} diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java deleted file mode 100644 index a1fb1d62..00000000 --- a/src/main/java/homework_2/random_chars_table/Main.java +++ /dev/null @@ -1,11 +0,0 @@ -package 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_2/random_chars_table/README.md b/src/main/java/homework_2/random_chars_table/README.md new file mode 100644 index 00000000..1014f2ba --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/README.md @@ -0,0 +1,11 @@ +### Random Chars Table App + +__Task:__ + +- read in one line 2 numbers and string - length and width of the table/2d-matrix and strategy (even/odd) + +- print table filled with random chars from A to Z + +- print in a command line in one line with commas all odd or even chars from table depended on chosen strategy + +- on any error should print in a command line "Passed parameters should match the format [positive integer] [positive integer] [even|odd]" \ No newline at end of file diff --git a/src/main/java/homework_2/random_chars_table/bin/Main.java b/src/main/java/homework_2/random_chars_table/bin/Main.java new file mode 100644 index 00000000..68bb0300 --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/bin/Main.java @@ -0,0 +1,11 @@ +package homework_2.random_chars_table.bin; + +import homework_2.random_chars_table.sources.RandomCharsTable; + +public class Main { + + public static void main(String[] args) { + new RandomCharsTable().run(); + } + +} diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java similarity index 63% rename from src/main/java/homework_2/random_chars_table/RandomCharsTable.java rename to src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java index 9ef8e88d..7699865e 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java @@ -1,6 +1,5 @@ -package homework_2.random_chars_table; +package homework_2.random_chars_table.sources; -import java.io.IOException; import java.util.Random; import static homework_2.IOMod.*; @@ -12,28 +11,39 @@ public class RandomCharsTable { private static boolean strategy; // even/odd private static StringBuilder result = new StringBuilder(); - public void run() throws IOException { - menu(); + public void run() { + inputData(); } - private void menu() throws IOException { + private void inputData() { System.out.print("Input table length, table width, table strategy (even/odd): "); String s = bufferedReaderStringReader(); - String[] parameters = s.split(" "); - int tableLength = Integer.parseInt(parameters[0]); - int tableWidth = Integer.parseInt(parameters[1]); - if (parameters[2].equalsIgnoreCase("odd")) { - strategy = false; - } else if (parameters[2].equalsIgnoreCase("even")) { - strategy = true; - } else { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "Wrong strategy value.\tYou should use only \"even\" or \"odd\" !"); - return; - } - printRandomABC(tableLength, tableWidth); - printResult(); + try { + String[] parameters = s.split(" "); + if (parameters.length != 3) { + System.out.println(FORMAT_ERROR); + return; + } + int tableLength = Integer.parseInt(parameters[0]); + int tableWidth = Integer.parseInt(parameters[1]); + if (tableLength <= 0 || tableWidth <= 0) { + System.out.println(FORMAT_ERROR); + return; + } + if (parameters[2].equalsIgnoreCase("odd")) { + strategy = false; + } else if (parameters[2].equalsIgnoreCase("even")) { + strategy = true; + } else { + System.out.println(FORMAT_ERROR); + return; + } + printRandomABC(tableLength, tableWidth); + printResult(); + } catch (NumberFormatException | NullPointerException ex) { + System.out.println(FORMAT_ERROR); + } } private static void printRandomABC(int length, int width) { @@ -57,7 +67,7 @@ private static void resultGen(char ch) { if (!String.valueOf(result).contains(String.valueOf(ch))) { result.append(ch); } - } else { // odd + } else if (!strategy && (ch % 2) == 1) { // odd if (!String.valueOf(result).contains(String.valueOf(ch))) { result.append(ch); } diff --git a/src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java b/src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java new file mode 100644 index 00000000..407ac9fe --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java @@ -0,0 +1,65 @@ +package homework_2.random_chars_table.tests; + +import homework_2.UnitBase; +import homework_2.random_chars_table.sources.RandomCharsTable; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RandomCharsTableTest extends UnitBase { + + @Test + void testFormatCount() { + setInput("1 2 even 12even"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy (even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void testNegative() { + setInput("-1 -2 odd"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy (even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void testZero() { + setInput("0 0 odd"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy (even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void testWrongStrategy() { + setInput("1 3 omg"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy (even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void testEmpty() { + setInput(""); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy (even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + +} diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java deleted file mode 100644 index fa033081..00000000 --- a/src/main/java/homework_2/traffic_light/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package homework_2.traffic_light; - -public class Main { - public static void main(String[] args) { - new TrafficLight().run(); - } -} diff --git a/src/main/java/homework_2/traffic_light/README.md b/src/main/java/homework_2/traffic_light/README.md new file mode 100644 index 00000000..83a2c387 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/README.md @@ -0,0 +1,23 @@ +### Traffic Light App + +__Task:__ + +- read input how much time gone from the day start from the command line, +parse to Integer, print to the command line traffic light color (GREEN, YELLOW, RED - with different colors) + +- traffic lights cycle: 60 seconds: + + 0 <= light < 35 - green + + 35 <= light < 40 - yellow + + 40 <= light < 55 - red + + 55 <= light < 60 - yellow + +- input limitations: + + minimal value is 0 + + maximal value is 24*60*60 - 1 = 86399 + +- if over then 86399 should print "The day is over" + +- if input value is incorrect should print "Only 1 non-negative integer is allowed as passed parameter" + +__Extra arguments:__ +- App will count the traffic lights result for the current time if call "java Main -now" \ No newline at end of file diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java deleted file mode 100644 index 9a4ac6c4..00000000 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ /dev/null @@ -1,54 +0,0 @@ -package homework_2.traffic_light; - -import homework_2.IOMod; - -import java.io.IOException; - -import static homework_2.IOMod.*; - -public class TrafficLight { - - void run() { - menu(); - } - - private void menu() { - System.out.print("Please, input seconds gone from the day start: "); - try { - int secondsGone = IOMod.bufferedReaderIntReader(); - if (secondsGone < 0) { - System.out.println(BLUE_BG + ANSI_YELLOW + "WARNING: " + ANSI_RESET + BLUE_BG + - "INCORRECT VALUE! ONLY POSITIVE INTEGER NUMBERS AVAILABLE AS A VALUE" + ANSI_RESET); - return; - } else if (secondsGone >= 86400) { - System.out.println(PURPLE_BG + ANSI_YELLOW + "ATTENTION: " + ANSI_RESET + PURPLE_BG + - "Day has been already finished." + ANSI_RESET); - return; - } else if (secondsGone >= 0 && secondsGone < 60) { - colorPick(secondsGone); - } else { - colorPick(secondsGone % 60); - } - } catch (NumberFormatException nfe) { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "ONLY INTEGER NUMBER AS VALUE AVAILABLE."); - } catch (IOException e) { - System.out.println(ANSI_YELLOW + "WARNING: " + ANSI_RESET + - "IOException!"); - } - } - - private static void colorPick(int secs) { - System.out.print("Traffic Lights set to: "); - // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 60 red - if (secs >= 0 && secs < 35) { - System.out.println(ANSI_GREEN + "GREEN"); - } else if (secs >= 35 && secs < 40) { - System.out.println(ANSI_YELLOW + "YELLOW"); - } else if (secs >= 40 && secs < 60) { - System.out.println(ANSI_RED + "RED"); - } - System.out.print(ANSI_RESET); - } - -} diff --git a/src/main/java/homework_2/traffic_light/bin/Main.java b/src/main/java/homework_2/traffic_light/bin/Main.java new file mode 100644 index 00000000..3aa5c848 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/bin/Main.java @@ -0,0 +1,22 @@ +package homework_2.traffic_light.bin; + +import homework_2.traffic_light.sources.ExtraTrafficLight; +import homework_2.traffic_light.sources.TrafficLight; + +/* +Traffic Lights App + +you can use 'now' argument to get result for the current time ;) +java Main -now + + */ + +public class Main { + public static void main(String[] args) { + if (args.length == 0) { + new TrafficLight().run(); + } else { + new ExtraTrafficLight().run(args[0]); + } + } +} diff --git a/src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java b/src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java new file mode 100644 index 00000000..76a56160 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java @@ -0,0 +1,42 @@ +package homework_2.traffic_light.sources; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import static homework_2.Colors.*; + +public class ExtraTrafficLight { + + public void run(String arg) { + if (arg.equalsIgnoreCase("now")) { + int seconds = getTime(); + colorPick(seconds%60); + } else { + System.out.println("Incorrect argument. You can call this app as:\n" + + PURPLE_BG + "java Main -now" + ANSI_RESET); + } + } + + private int getTime() { + LocalDateTime now = LocalDateTime.now(); + String nowStr = now.format(DateTimeFormatter.ofPattern("hh:mm:ss a")); + System.out.println("Current time is: " + nowStr); + return now.toLocalTime().toSecondOfDay(); + } + + private void colorPick(int secs) { + // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 55 red, 55 <= light < 60 yellow + if (secs >= 0 && secs < 35) { + lightPrint(ANSI_GREEN, "GREEN"); + } else if ((secs >= 35 && secs < 40) || (secs >= 55 && secs < 60)) { + lightPrint(ANSI_YELLOW, "YELLOW"); + } else { + lightPrint(ANSI_RED, "RED"); + } + } + + private void lightPrint(String consoleColor, String lightColor) { + System.out.println(consoleColor + lightColor + ANSI_RESET); + } + +} diff --git a/src/main/java/homework_2/traffic_light/sources/TrafficLight.java b/src/main/java/homework_2/traffic_light/sources/TrafficLight.java new file mode 100644 index 00000000..5ef522ca --- /dev/null +++ b/src/main/java/homework_2/traffic_light/sources/TrafficLight.java @@ -0,0 +1,47 @@ +package homework_2.traffic_light.sources; + +import homework_2.IOMod; + +import static homework_2.IOMod.*; +import static homework_2.Colors.*; + +public class TrafficLight { + + public void run() { + inputSeconds(); + } + + private void inputSeconds() { + System.out.print("Please, input seconds gone from the day start: "); + try { + int secondsGone = IOMod.bufferedReaderIntReader(); + if (secondsGone < 0) { + System.out.println(ERROR); + return; + } else if (secondsGone >= 86400) { + System.out.println("The day is over"); + return; + } else { + colorPick(secondsGone % 60); + } + } catch (NumberFormatException exc) { + System.out.println(ERROR); + } + } + + private void colorPick(int secs) { + // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 55 red, 55 <= light < 60 yellow + if (secs >= 0 && secs < 35) { + lightPrint(ANSI_GREEN, "GREEN"); + } else if ((secs >= 35 && secs < 40) || (secs >= 55 && secs < 60)) { + lightPrint(ANSI_YELLOW, "YELLOW"); + } else { + lightPrint(ANSI_RED, "RED"); + } + } + + private void lightPrint(String consoleColor, String lightColor) { + System.out.println(consoleColor + lightColor + ANSI_RESET); + } + +} diff --git a/src/main/java/homework_2/traffic_light/tests/TrafficLightTest.java b/src/main/java/homework_2/traffic_light/tests/TrafficLightTest.java new file mode 100644 index 00000000..513dc2ed --- /dev/null +++ b/src/main/java/homework_2/traffic_light/tests/TrafficLightTest.java @@ -0,0 +1,89 @@ +package homework_2.traffic_light.tests; + +import homework_2.UnitBase; +import homework_2.traffic_light.sources.TrafficLight; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +public class TrafficLightTest extends UnitBase { + + @Test + void testNegative1() { + setInput("-1"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void testString() { + setInput("anytext"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void testOverTheDay() { + setInput("86400"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("The day is over", getOutputLines()[0]); + } + + @Test + void testZero() { + setInput("0"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("[1;92mGREEN\u001B[0m", getOutputLines()[0]); + } + + @Test + void test121() { + setInput("121"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("[1;92mGREEN\u001B[0m", getOutputLines()[0]); + } + + @Test + void test86399() { + setInput("86399"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("[1;93mYELLOW\u001B[0m", getOutputLines()[0]); + } + + @Test + void test155() { + setInput("155"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("[1;93mYELLOW\u001B[0m", getOutputLines()[0]); + } + + @Test + void test101() { + setInput("101"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals("[1;91mRED\u001B[0m", getOutputLines()[0]); + } +} From a2c06db0b80c0af40d8704fd83585e6a77725fdf Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Thu, 22 Jul 2021 21:36:25 +0300 Subject: [PATCH 13/67] builder.gradle lombok added immutable class basic created --- build.gradle | 5 ++++ src/main/java/homework_3/ImmutableClass.java | 31 +++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2b34ac84..8237198e 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,11 @@ dependencies { implementation 'org.junit.jupiter:junit-jupiter:5.7.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + + compileOnly 'org.projectlombok:lombok:1.18.20' + annotationProcessor 'org.projectlombok:lombok:1.18.20' + testCompileOnly 'org.projectlombok:lombok:1.18.20' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' } test { diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index 2e861a4e..6e45a80c 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,5 +1,34 @@ package homework_3; -public class ImmutableClass { +public final class ImmutableClass { + final String name; + final int number; + + public ImmutableClass() { + this.name = "DefaultName"; + this.number = 0; + } + + public ImmutableClass(String str, int number) { + this.name = str; + this.number = number; + } + + public ImmutableClass(int number, String str) { + this.number = number; + this.name = str; + } + + public String getData() { + return name; + } + + public int getNumber() { + return number; + } + + public final Object newObjectMethod() { + return new ImmutableClass("fromMethodCreated", 1); + } } From 16a3ac94c4b6fe1479007f7bbb30529b81baed13 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Thu, 22 Jul 2021 22:00:14 +0300 Subject: [PATCH 14/67] changed tests directories; fixed gradle testing. --- build.gradle | 1 + .../homework_2/pyramid_printer/sources}/PyramidPrintTest.java | 3 +-- .../random_chars_table/sources}/RandomCharsTableTest.java | 3 +-- .../java/homework_2/traffic_light/tests/TrafficLightTest.java | 0 4 files changed, 3 insertions(+), 4 deletions(-) rename src/{main/java/homework_2/pyramid_printer/tests => test/java/homework_2/pyramid_printer/sources}/PyramidPrintTest.java (94%) rename src/{main/java/homework_2/random_chars_table/tests => test/java/homework_2/random_chars_table/sources}/RandomCharsTableTest.java (95%) rename src/{main => test}/java/homework_2/traffic_light/tests/TrafficLightTest.java (100%) diff --git a/build.gradle b/build.gradle index 8237198e..fc839d30 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + // lombok compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20' testCompileOnly 'org.projectlombok:lombok:1.18.20' diff --git a/src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java similarity index 94% rename from src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java rename to src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java index 397941b9..3f839b15 100644 --- a/src/main/java/homework_2/pyramid_printer/tests/PyramidPrintTest.java +++ b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java @@ -1,7 +1,6 @@ -package homework_2.pyramid_printer.tests; +package homework_2.pyramid_printer.sources; import homework_2.UnitBase; -import homework_2.pyramid_printer.sources.PyramidPrinter; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java similarity index 95% rename from src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java rename to src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 407ac9fe..4aa95ae2 100644 --- a/src/main/java/homework_2/random_chars_table/tests/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -1,7 +1,6 @@ -package homework_2.random_chars_table.tests; +package homework_2.random_chars_table.sources; import homework_2.UnitBase; -import homework_2.random_chars_table.sources.RandomCharsTable; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/main/java/homework_2/traffic_light/tests/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java similarity index 100% rename from src/main/java/homework_2/traffic_light/tests/TrafficLightTest.java rename to src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java From 6df5a3c5c46ff86b392cfe73a4ed101f32ae33f9 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Fri, 23 Jul 2021 12:32:22 +0300 Subject: [PATCH 15/67] refactored a little bit --- src/main/java/homework_2/IOMod.java | 6 +- src/main/java/homework_2/UnitBase.java | 70 ------------------- .../sources/OptimizedPyramidPrinter.java | 20 ++---- .../sources/PyramidPrinter.java | 20 ++---- .../sources/RandomCharsTable.java | 44 +++++++----- src/test/java/homework_1/MainTest.java | 49 +++++++++++++ .../sources/PyramidPrintTest.java | 12 ++-- .../sources/RandomCharsTableTest.java | 12 ++-- .../traffic_light/tests/TrafficLightTest.java | 5 +- 9 files changed, 103 insertions(+), 135 deletions(-) delete mode 100644 src/main/java/homework_2/UnitBase.java create mode 100644 src/test/java/homework_1/MainTest.java diff --git a/src/main/java/homework_2/IOMod.java b/src/main/java/homework_2/IOMod.java index 4e8fb30b..bf77f9ae 100644 --- a/src/main/java/homework_2/IOMod.java +++ b/src/main/java/homework_2/IOMod.java @@ -10,13 +10,13 @@ public class IOMod { public static final String FORMAT_ERROR = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; public static int bufferedReaderIntReader() { - int i = -1; + int inp = -1; try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - i = Integer.parseInt(reader.readLine()); + inp = Integer.parseInt(reader.readLine()); } catch (NumberFormatException | IOException e) { System.out.println(ERROR); } - return i; + return inp; } public static String bufferedReaderStringReader() { diff --git a/src/main/java/homework_2/UnitBase.java b/src/main/java/homework_2/UnitBase.java deleted file mode 100644 index c6009d9f..00000000 --- a/src/main/java/homework_2/UnitBase.java +++ /dev/null @@ -1,70 +0,0 @@ -package homework_2; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; - -import java.io.*; - -public abstract class UnitBase { - - protected ByteArrayOutputStream mockedOut = new ByteArrayOutputStream(); - protected final PrintStream originalOut = System.out; - protected final InputStream originalIn = System.in; - - @BeforeEach - void setUpStreams() { - System.setOut(new PrintStream(mockedOut)); - } - - @AfterEach - void restoreStreams() { - System.setOut(originalOut); - System.setIn(originalIn); - } - - // mock input as if you wrote it to console by hand - protected void setInput(String input) { - System.setIn(new ByteArrayInputStream(input.getBytes())); - } - - // returns whole output as string, will all line separators and etc - protected String getOutput() { - return mockedOut.toString().trim(); - } - - // output as array, separated by lines. First line - getOutputLines()[0], and so on - protected String[] getOutputLines() { - return getOutput().split("\\r?\\n"); - } - - // can be used to remove some strings from output (ex. remove "Please input number"). Put after run() - protected void removeFromOutput(String s) { - try { - String output = mockedOut.toString(); - mockedOut.reset(); - mockedOut.write(output.replace(s, "").getBytes()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - // can be used to print output to testing console. Useful for debugging. Put after run(); - protected void printOut() { - System.setOut(originalOut); - System.out.println(mockedOut); - System.setOut(new PrintStream(mockedOut)); - } - -// @Test -// void example() { -// setInput("2"); -// -// new PyramidPrinter().run(); -// printOut(); -// removeFromOutput("Please input number"): -// -// assertEquals("x", getOutputLines()[0]); -// assertEquals("xx", getOutputLines()[1]); -// } - -} diff --git a/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java index 27d43fa1..23f2d16b 100644 --- a/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java @@ -1,7 +1,5 @@ package homework_2.pyramid_printer.sources; -import java.io.IOException; - import static homework_2.IOMod.*; import static homework_2.Colors.*; @@ -9,12 +7,13 @@ public class OptimizedPyramidPrinter { public void run(String arg) { if (arg.equalsIgnoreCase("o") || arg.equalsIgnoreCase("optimized")) { - try { - int h = inputHeight(); - printPyramid(h); - } catch (IOException e) { - System.out.println(CYAN_BG + ERROR + ANSI_RESET); + System.out.print("Please, input Pyramid height: "); + int h = bufferedReaderIntReader(); + if (h < 0) { + System.out.println(ERROR); + return; } + printPyramid(h); } else { System.out.println("Incorrect argument. You can call this app as:\n" + PURPLE_BG + "java Main -o" + ANSI_RESET + "\nor\n" + @@ -22,13 +21,6 @@ public void run(String arg) { } } - private int inputHeight() throws IOException { - System.out.print("Please, input pyramids height value: "); - int pyramidHeight = bufferedReaderIntReader(); - assert (pyramidHeight < 0) : ERROR; - return pyramidHeight; - } - private void printPyramid(int height) { for (int i = 0; i < height; i++) { System.out.println(genPyramidRow(i + 1)); diff --git a/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java index e55bc512..f49a87fa 100644 --- a/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java @@ -1,30 +1,18 @@ package homework_2.pyramid_printer.sources; -import java.io.IOException; - import static homework_2.IOMod.ERROR; import static homework_2.IOMod.bufferedReaderIntReader; public class PyramidPrinter { public void run() { - try { - int height = inputHeight(); - printPyramid(height); - } catch (IOException e) { + System.out.print("Please, input Pyramid height: "); + int height = bufferedReaderIntReader(); + if (height < 0) { System.out.println(ERROR); return; } - } - - private int inputHeight() throws IOException { - System.out.print("Please, input pyramids height value: "); - int pyramidHeight = bufferedReaderIntReader(); - if (pyramidHeight < 0) { - System.out.println(ERROR); - throw new IOException(); - } - return pyramidHeight; + printPyramid(height); } private void printPyramid(int height) { diff --git a/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java index 7699865e..e8752f7f 100644 --- a/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java @@ -8,15 +8,13 @@ public class RandomCharsTable { private static final int RAND_MIN_VALUE = 65; // A private static final int RAND_MAX_VALUE = 90; // Z - private static boolean strategy; // even/odd - private static StringBuilder result = new StringBuilder(); public void run() { inputData(); } private void inputData() { - System.out.print("Input table length, table width, table strategy (even/odd): "); + System.out.print("Input table length, table width, table strategy(even/odd): "); String s = bufferedReaderStringReader(); try { @@ -25,12 +23,15 @@ private void inputData() { System.out.println(FORMAT_ERROR); return; } + int tableLength = Integer.parseInt(parameters[0]); int tableWidth = Integer.parseInt(parameters[1]); if (tableLength <= 0 || tableWidth <= 0) { System.out.println(FORMAT_ERROR); return; } + + boolean strategy; if (parameters[2].equalsIgnoreCase("odd")) { strategy = false; } else if (parameters[2].equalsIgnoreCase("even")) { @@ -39,42 +40,49 @@ private void inputData() { System.out.println(FORMAT_ERROR); return; } - printRandomABC(tableLength, tableWidth); - printResult(); + + printRandomAndGenerateResult(tableLength, tableWidth, strategy); } catch (NumberFormatException | NullPointerException ex) { System.out.println(FORMAT_ERROR); } } - private static void printRandomABC(int length, int width) { + private void printRandomAndGenerateResult(int length, int width, boolean strategy) { + // could be optimised for less memory usage with no creating Character[][] matrix + // and just printing random char and then adding to result StringBuilder Character[][] randAbc = new Character[length][width]; Random random = new Random(); + StringBuilder result = new StringBuilder(); for (int i = 0; i < length; i++) { for (int j = 0; j < width; j++) { randAbc[i][j] = (char) (random.nextInt((RAND_MAX_VALUE - RAND_MIN_VALUE) + 1) + RAND_MIN_VALUE); System.out.print(randAbc[i][j] + " "); // result generating on-the-go - resultGen(randAbc[i][j]); + if (strategy) { + generateEven(randAbc[i][j], result); + } else { + generateOdd(randAbc[i][j], result); + } } System.out.println(); } + printResult(strategy, result); } - private static void resultGen(char ch) { - if (strategy && (ch % 2) == 0) { //even - // add if result doesn't contains value - if (!String.valueOf(result).contains(String.valueOf(ch))) { - result.append(ch); - } - } else if (!strategy && (ch % 2) == 1) { // odd - if (!String.valueOf(result).contains(String.valueOf(ch))) { - result.append(ch); - } + private void generateEven(char ch, StringBuilder result) { + if ((ch % 2 == 0) && (!String.valueOf(result).contains(String.valueOf(ch)))) { + result.append(ch); + } + } + + private void generateOdd(char ch, StringBuilder result) { + if ((ch % 2 == 1) && (!String.valueOf(result).contains(String.valueOf(ch)))) { + result.append(ch); } } - private static void printResult() { + private void printResult(boolean strategy, StringBuilder result) { if (strategy) { System.out.print("Even letters - "); } else { diff --git a/src/test/java/homework_1/MainTest.java b/src/test/java/homework_1/MainTest.java new file mode 100644 index 00000000..67de6860 --- /dev/null +++ b/src/test/java/homework_1/MainTest.java @@ -0,0 +1,49 @@ +package homework_1; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MainTest extends UnitBase { + + @Test + void test1() { + String[] args = { + "abcdefg", + "hello", + "zero", + "", + "абвгдеёжзийклмнопрст", + "quit", + "eRrOr", + "ошибка" + }; + + Main.main(args); + printOut(); + assertEquals("abcdefg: 7 letters", getOutputLines()[0]); + assertEquals("hello: 5 letters", getOutputLines()[1]); + assertEquals("zero: 4 letters", getOutputLines()[2]); + assertEquals(": 0 letters", getOutputLines()[3]); + assertEquals("абвгдеёжзийклмнопрст: 20 letters", getOutputLines()[4]); + assertEquals("quit: 4 letters", getOutputLines()[5]); + assertEquals("\u001b[31mAlarm!\u001b[0m", getOutputLines()[6]); + } + + @Test + void test2() { + String[] args = { + "строка", + "0шибка", + "ошибкА", + }; + + Main.main(args); + printOut(); + assertEquals("строка: 6 letters", getOutputLines()[0]); + assertEquals("0шибка: 6 letters", getOutputLines()[1]); + assertEquals("\u001b[31mAlarm!\u001b[0m", getOutputLines()[2]); + } + +} \ No newline at end of file diff --git a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java index 3f839b15..4ebc9bd9 100644 --- a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java +++ b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java @@ -1,6 +1,6 @@ package homework_2.pyramid_printer.sources; -import homework_2.UnitBase; +import base.UnitBase; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -13,7 +13,7 @@ void testZero() { new PyramidPrinter().run(); printOut(); - removeFromOutput("Please, input pyramids height value: "); + removeFromOutput("Please, input Pyramid height: "); assertEquals("", getOutputLines()[0]); } @@ -23,7 +23,7 @@ void testNegative() { new PyramidPrinter().run(); printOut(); - removeFromOutput("Please, input pyramids height value: "); + removeFromOutput("Please, input Pyramid height: "); assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @@ -33,7 +33,7 @@ void test7() { new PyramidPrinter().run(); printOut(); - removeFromOutput("Please, input pyramids height value: "); + removeFromOutput("Please, input Pyramid height: "); assertEquals("x", getOutputLines()[0]); assertEquals("xx", getOutputLines()[1]); assertEquals("xxx", getOutputLines()[2]); @@ -49,7 +49,7 @@ void testMAXIntegerPlusOne() { new PyramidPrinter().run(); printOut(); - removeFromOutput("Please, input pyramids height value: "); + removeFromOutput("Please, input Pyramid height: "); assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @@ -59,7 +59,7 @@ void testString() { new PyramidPrinter().run(); printOut(); - removeFromOutput("Please, input pyramids height value: "); + removeFromOutput("Please, input Pyramid height: "); assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[1]); } diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 4aa95ae2..8532f2b8 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -1,6 +1,6 @@ package homework_2.random_chars_table.sources; -import homework_2.UnitBase; +import base.UnitBase; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -12,7 +12,7 @@ void testFormatCount() { new RandomCharsTable().run(); printOut(); - removeFromOutput("Input table length, table width, table strategy (even/odd): "); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); } @@ -23,7 +23,7 @@ void testNegative() { new RandomCharsTable().run(); printOut(); - removeFromOutput("Input table length, table width, table strategy (even/odd): "); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); } @@ -34,7 +34,7 @@ void testZero() { new RandomCharsTable().run(); printOut(); - removeFromOutput("Input table length, table width, table strategy (even/odd): "); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); } @@ -45,7 +45,7 @@ void testWrongStrategy() { new RandomCharsTable().run(); printOut(); - removeFromOutput("Input table length, table width, table strategy (even/odd): "); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); } @@ -56,7 +56,7 @@ void testEmpty() { new RandomCharsTable().run(); printOut(); - removeFromOutput("Input table length, table width, table strategy (even/odd): "); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); } diff --git a/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java index 513dc2ed..66b05e64 100644 --- a/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java +++ b/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java @@ -1,9 +1,10 @@ package homework_2.traffic_light.tests; -import homework_2.UnitBase; +import base.UnitBase; import homework_2.traffic_light.sources.TrafficLight; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class TrafficLightTest extends UnitBase { From 7ed4d2b070b2933044fcfc4fb6b9e5bd2ca57bb4 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 18:31:34 +0300 Subject: [PATCH 16/67] upd --- src/main/java/homework_3/ImmutableClass.java | 39 +++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index 6e45a80c..d84e924a 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,34 +1,47 @@ package homework_3; +/* +Immutable class +3 constuctors: (), (String, int, double), ("") +3 getMethods(): getName, getAge, getWeight +1 method returning a new obj: newObjectMethod() + */ public final class ImmutableClass { - final String name; - final int number; + + private final String name; // reference type + private final int age; // primitive type + private final double weight; // primitive type public ImmutableClass() { - this.name = "DefaultName"; - this.number = 0; + this.name = "Unknown"; + this.age = 0; + this.weight = 0.0; } - public ImmutableClass(String str, int number) { + public ImmutableClass(String str, int age, double weight) { this.name = str; - this.number = number; + this.age = age; + this.weight = weight; } - public ImmutableClass(int number, String str) { - this.number = number; - this.name = str; + public ImmutableClass(String str) { + this(str, 1, 1.0); } - public String getData() { + public String getName() { return name; } - public int getNumber() { - return number; + public int getAge() { + return age; + } + + public double getWeight() { + return weight; } public final Object newObjectMethod() { - return new ImmutableClass("fromMethodCreated", 1); + return new ImmutableClass(name, age, weight); } } From a7acc1f0d2b6c6613701cc6c9e2e50cfd2147f82 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 18:32:13 +0300 Subject: [PATCH 17/67] HW3 added, changed paths to HW2's. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d18d69fc..44393b92 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,10 @@ | Number | Solution | Short description | --- | --- | --- | HW1 | [Console printer](./src/main/java/homework_1/Main.java) | The app that reads input arguments and prints them, until "error" argument | -HW2 | [Traffic Light](./src/main/java/homework_2/TrafficLight.java) | The app that switching colors on different number value (input from keyboard) | -HW2 | [Pyramid Printer](./src/main/java/homework_2/PyramidPrinter.java) | Printing 'x' with the input parameter as Pyramid of 'x' length | -HW2 | [Random Chars Table](./src/main/java/homework_2/RandomCharsTable.java) | The app that creates 2-dimensional array made of random Character values (from 65 to 90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | +HW2 | [Traffic Light](./src/main/java/homework_2/traffic_light/) | The app that switching colors on different number value (input from keyboard) | +HW2 | [Pyramid Printer](./src/main/java/homework_2/pyramid_printer/) | Printing 'x' Pyramid with the input parameter as Pyramid height | +HW2 | [Random Chars Table](./src/main/java/homework_2/random_chars_table/) | The app that creates 2-dimensional array/matrix made of random Character values (from A=65 to Z=90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | +HW3 | [Immutable Class](./src/main/java/homework_3/ImmutableClass.java) | Create Immutable class: several fields, including reference type; several constructors; method returning a new object. |
From 34046f2e3de526cbe7370185d00f2ec33b3111a3 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 18:34:30 +0300 Subject: [PATCH 18/67] parametrized test implemented --- .../sources/TrafficLightTest.java | 40 +++++++++ .../traffic_light/tests/TrafficLightTest.java | 90 ------------------- 2 files changed, 40 insertions(+), 90 deletions(-) create mode 100644 src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java delete mode 100644 src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java diff --git a/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java new file mode 100644 index 00000000..27e7942e --- /dev/null +++ b/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java @@ -0,0 +1,40 @@ +package homework_2.traffic_light.sources; + +import base.UnitBase; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TrafficLightTest extends UnitBase { + + TrafficLight trafficLight = new TrafficLight(); + + public static Stream testCases() { + return Stream.of( + Arguments.of("0", "[1;92mGREEN\u001B[0m"), + Arguments.of("101", "[1;91mRED\u001B[0m"), + Arguments.of("121", "[1;92mGREEN\u001B[0m"), + Arguments.of("155", "[1;93mYELLOW\u001B[0m"), + Arguments.of("86399", "[1;93mYELLOW\u001B[0m"), + Arguments.of("86400", "The day is over"), + Arguments.of("anytext", "Only 1 non-negative integer is allowed as passed parameter"), + Arguments.of("-1", "Only 1 non-negative integer is allowed as passed parameter"), + Arguments.of("", "Only 1 non-negative integer is allowed as passed parameter") + ); + } + + @ParameterizedTest + @MethodSource("testCases") + void testFactorial(String in, String expected) { + setInput(in); + trafficLight.run(); + printOut(); + removeFromOutput("Please, input seconds gone from the day start: "); + assertEquals(expected, getOutputLines()[0]); + } + +} \ No newline at end of file diff --git a/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java deleted file mode 100644 index 66b05e64..00000000 --- a/src/test/java/homework_2/traffic_light/tests/TrafficLightTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package homework_2.traffic_light.tests; - -import base.UnitBase; -import homework_2.traffic_light.sources.TrafficLight; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class TrafficLightTest extends UnitBase { - - @Test - void testNegative1() { - setInput("-1"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); - } - - @Test - void testString() { - setInput("anytext"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); - } - - @Test - void testOverTheDay() { - setInput("86400"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("The day is over", getOutputLines()[0]); - } - - @Test - void testZero() { - setInput("0"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("[1;92mGREEN\u001B[0m", getOutputLines()[0]); - } - - @Test - void test121() { - setInput("121"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("[1;92mGREEN\u001B[0m", getOutputLines()[0]); - } - - @Test - void test86399() { - setInput("86399"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("[1;93mYELLOW\u001B[0m", getOutputLines()[0]); - } - - @Test - void test155() { - setInput("155"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("[1;93mYELLOW\u001B[0m", getOutputLines()[0]); - } - - @Test - void test101() { - setInput("101"); - - new TrafficLight().run(); - printOut(); - removeFromOutput("Please, input seconds gone from the day start: "); - assertEquals("[1;91mRED\u001B[0m", getOutputLines()[0]); - } -} From fcd59e3fe42f69002475265abf37032c79555fde Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 19:44:32 +0300 Subject: [PATCH 19/67] valid tests added --- .../sources/RandomCharsTableTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 8532f2b8..5f4ad1da 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -2,6 +2,7 @@ import base.UnitBase; import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; public class RandomCharsTableTest extends UnitBase { @@ -61,4 +62,42 @@ void testEmpty() { getOutputLines()[0]); } + @Test + void testValidEven() { + setInput("5 5 even"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); + for (int i = 0; i < 5; i++) { + String[] row = getOutputLines()[i].split(" "); + for (String el : row) { + assert (el.charAt(0) >= 65 && el.charAt(0) <= 90); + } + } + String[] result = getOutputLines()[5].split(" "); + for (int i = 3; i < result.length; i++) { + assert (result[i].charAt(0) % 2 == 0); + } + } + + @Test + void testValidOdd() { + setInput("7 5 odd"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); + for (int i = 0; i < 7; i++) { + String[] row = getOutputLines()[i].split(" "); + for (String el : row) { + assert (el.charAt(0) >= 65 && el.charAt(0) <= 90); + } + } + String[] result = getOutputLines()[7].split(" "); + for (int i = 3; i < result.length; i++) { + assert (result[i].charAt(0) % 2 == 1); + } + } + } From 09a26be01e47787b0e52fefe34cd569d2cbd05f3 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 19:48:06 +0300 Subject: [PATCH 20/67] structure changed --- src/main/java/homework_2/pyramid_printer/{bin => }/Main.java | 5 +---- .../{sources => }/OptimizedPyramidPrinter.java | 2 +- .../pyramid_printer/{sources => }/PyramidPrinter.java | 2 +- .../java/homework_2/random_chars_table/{bin => }/Main.java | 4 +--- .../random_chars_table/{sources => }/RandomCharsTable.java | 2 +- .../traffic_light/{sources => }/ExtraTrafficLight.java | 2 +- src/main/java/homework_2/traffic_light/{bin => }/Main.java | 5 +---- .../homework_2/traffic_light/{sources => }/TrafficLight.java | 2 +- .../homework_2/pyramid_printer/sources/PyramidPrintTest.java | 1 + .../random_chars_table/sources/RandomCharsTableTest.java | 1 + .../homework_2/traffic_light/sources/TrafficLightTest.java | 1 + 11 files changed, 11 insertions(+), 16 deletions(-) rename src/main/java/homework_2/pyramid_printer/{bin => }/Main.java (57%) rename src/main/java/homework_2/pyramid_printer/{sources => }/OptimizedPyramidPrinter.java (96%) rename src/main/java/homework_2/pyramid_printer/{sources => }/PyramidPrinter.java (93%) rename src/main/java/homework_2/random_chars_table/{bin => }/Main.java (51%) rename src/main/java/homework_2/random_chars_table/{sources => }/RandomCharsTable.java (98%) rename src/main/java/homework_2/traffic_light/{sources => }/ExtraTrafficLight.java (96%) rename src/main/java/homework_2/traffic_light/{bin => }/Main.java (68%) rename src/main/java/homework_2/traffic_light/{sources => }/TrafficLight.java (96%) diff --git a/src/main/java/homework_2/pyramid_printer/bin/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java similarity index 57% rename from src/main/java/homework_2/pyramid_printer/bin/Main.java rename to src/main/java/homework_2/pyramid_printer/Main.java index a6ad39e3..675fbc15 100644 --- a/src/main/java/homework_2/pyramid_printer/bin/Main.java +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -1,7 +1,4 @@ -package homework_2.pyramid_printer.bin; - -import homework_2.pyramid_printer.sources.OptimizedPyramidPrinter; -import homework_2.pyramid_printer.sources.PyramidPrinter; +package homework_2.pyramid_printer; public class Main { public static void main(String[] args) { diff --git a/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/OptimizedPyramidPrinter.java similarity index 96% rename from src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java rename to src/main/java/homework_2/pyramid_printer/OptimizedPyramidPrinter.java index 23f2d16b..80dfb85e 100644 --- a/src/main/java/homework_2/pyramid_printer/sources/OptimizedPyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/OptimizedPyramidPrinter.java @@ -1,4 +1,4 @@ -package homework_2.pyramid_printer.sources; +package homework_2.pyramid_printer; import static homework_2.IOMod.*; import static homework_2.Colors.*; diff --git a/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java similarity index 93% rename from src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java rename to src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index f49a87fa..cdc2c474 100644 --- a/src/main/java/homework_2/pyramid_printer/sources/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -1,4 +1,4 @@ -package homework_2.pyramid_printer.sources; +package homework_2.pyramid_printer; import static homework_2.IOMod.ERROR; import static homework_2.IOMod.bufferedReaderIntReader; diff --git a/src/main/java/homework_2/random_chars_table/bin/Main.java b/src/main/java/homework_2/random_chars_table/Main.java similarity index 51% rename from src/main/java/homework_2/random_chars_table/bin/Main.java rename to src/main/java/homework_2/random_chars_table/Main.java index 68bb0300..e3879e1b 100644 --- a/src/main/java/homework_2/random_chars_table/bin/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -1,6 +1,4 @@ -package homework_2.random_chars_table.bin; - -import homework_2.random_chars_table.sources.RandomCharsTable; +package homework_2.random_chars_table; public class Main { diff --git a/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java similarity index 98% rename from src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java rename to src/main/java/homework_2/random_chars_table/RandomCharsTable.java index e8752f7f..acb8dfbb 100644 --- a/src/main/java/homework_2/random_chars_table/sources/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,4 +1,4 @@ -package homework_2.random_chars_table.sources; +package homework_2.random_chars_table; import java.util.Random; diff --git a/src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java b/src/main/java/homework_2/traffic_light/ExtraTrafficLight.java similarity index 96% rename from src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java rename to src/main/java/homework_2/traffic_light/ExtraTrafficLight.java index 76a56160..1c9d64d4 100644 --- a/src/main/java/homework_2/traffic_light/sources/ExtraTrafficLight.java +++ b/src/main/java/homework_2/traffic_light/ExtraTrafficLight.java @@ -1,4 +1,4 @@ -package homework_2.traffic_light.sources; +package homework_2.traffic_light; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/homework_2/traffic_light/bin/Main.java b/src/main/java/homework_2/traffic_light/Main.java similarity index 68% rename from src/main/java/homework_2/traffic_light/bin/Main.java rename to src/main/java/homework_2/traffic_light/Main.java index 3aa5c848..4dc659df 100644 --- a/src/main/java/homework_2/traffic_light/bin/Main.java +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -1,7 +1,4 @@ -package homework_2.traffic_light.bin; - -import homework_2.traffic_light.sources.ExtraTrafficLight; -import homework_2.traffic_light.sources.TrafficLight; +package homework_2.traffic_light; /* Traffic Lights App diff --git a/src/main/java/homework_2/traffic_light/sources/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java similarity index 96% rename from src/main/java/homework_2/traffic_light/sources/TrafficLight.java rename to src/main/java/homework_2/traffic_light/TrafficLight.java index 5ef522ca..eaaa793f 100644 --- a/src/main/java/homework_2/traffic_light/sources/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -1,4 +1,4 @@ -package homework_2.traffic_light.sources; +package homework_2.traffic_light; import homework_2.IOMod; diff --git a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java index 4ebc9bd9..d7d3cbf9 100644 --- a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java +++ b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java @@ -1,6 +1,7 @@ package homework_2.pyramid_printer.sources; import base.UnitBase; +import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 5f4ad1da..20abc90b 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -1,6 +1,7 @@ package homework_2.random_chars_table.sources; import base.UnitBase; +import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java index 27e7942e..085bd343 100644 --- a/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java +++ b/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java @@ -1,6 +1,7 @@ package homework_2.traffic_light.sources; import base.UnitBase; +import homework_2.traffic_light.TrafficLight; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; From b8d7ab68924d0e388e56c144dfa3625d965d4007 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 21:58:38 +0300 Subject: [PATCH 21/67] 101 --- .../random_chars_table/RandomCharsTable.java | 17 +++- .../sources/RandomCharsTableTest.java | 94 +++++++++++++------ 2 files changed, 80 insertions(+), 31 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 acb8dfbb..16c082e4 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,5 +1,6 @@ package homework_2.random_chars_table; +import java.sql.SQLOutput; import java.util.Random; import static homework_2.IOMod.*; @@ -48,8 +49,6 @@ private void inputData() { } private void printRandomAndGenerateResult(int length, int width, boolean strategy) { - // could be optimised for less memory usage with no creating Character[][] matrix - // and just printing random char and then adding to result StringBuilder Character[][] randAbc = new Character[length][width]; Random random = new Random(); StringBuilder result = new StringBuilder(); @@ -57,7 +56,15 @@ private void printRandomAndGenerateResult(int length, int width, boolean strateg for (int i = 0; i < length; i++) { for (int j = 0; j < width; j++) { randAbc[i][j] = (char) (random.nextInt((RAND_MAX_VALUE - RAND_MIN_VALUE) + 1) + RAND_MIN_VALUE); - System.out.print(randAbc[i][j] + " "); + if (j == 0) { + System.out.print("| "); + } + if (j == width - 1) { + System.out.print(randAbc[i][j] + " |"); + } else { + System.out.print(randAbc[i][j] + " | "); + } + // result generating on-the-go if (strategy) { generateEven(randAbc[i][j], result); @@ -83,6 +90,10 @@ private void generateOdd(char ch, StringBuilder result) { } private void printResult(boolean strategy, StringBuilder result) { + if (result.length() == 0) { + System.out.println(""); + return; + } if (strategy) { System.out.print("Even letters - "); } else { diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 20abc90b..49f57049 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -3,16 +3,23 @@ import base.UnitBase; import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; public class RandomCharsTableTest extends UnitBase { + RandomCharsTable rct = new RandomCharsTable(); + @Test void testFormatCount() { setInput("1 2 even 12even"); - new RandomCharsTable().run(); + rct.run(); printOut(); removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", @@ -23,7 +30,7 @@ void testFormatCount() { void testNegative() { setInput("-1 -2 odd"); - new RandomCharsTable().run(); + rct.run(); printOut(); removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", @@ -34,7 +41,7 @@ void testNegative() { void testZero() { setInput("0 0 odd"); - new RandomCharsTable().run(); + rct.run(); printOut(); removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", @@ -45,7 +52,7 @@ void testZero() { void testWrongStrategy() { setInput("1 3 omg"); - new RandomCharsTable().run(); + rct.run(); printOut(); removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", @@ -56,49 +63,80 @@ void testWrongStrategy() { void testEmpty() { setInput(""); - new RandomCharsTable().run(); + rct.run(); printOut(); removeFromOutput("Input table length, table width, table strategy(even/odd): "); assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); } - @Test - void testValidEven() { - setInput("5 5 even"); - new RandomCharsTable().run(); - printOut(); - removeFromOutput("Input table length, table width, table strategy(even/odd): "); - for (int i = 0; i < 5; i++) { - String[] row = getOutputLines()[i].split(" "); - for (String el : row) { - assert (el.charAt(0) >= 65 && el.charAt(0) <= 90); - } + // robots will replace human beings ! + private void testInts(int length, int width) { + if (length <= 0 || width <= 0) { + throw new AssertionError(); } - String[] result = getOutputLines()[5].split(" "); - for (int i = 3; i < result.length; i++) { - assert (result[i].charAt(0) % 2 == 0); + } + + private int testStr(String strategy) { + if (strategy.equalsIgnoreCase("odd")) { + return 1; + } else if (strategy.equalsIgnoreCase("even")) { + return 0; + } else { + throw new AssertionError(); } } - @Test - void testValidOdd() { - setInput("7 5 odd"); + // free for adding new valid values + private static Stream validCases() { + return Stream.of( + Arguments.of(5, 5, "odd"), + Arguments.of(7, 5, "even"), + Arguments.of(13, 15, "even"), + Arguments.of(2, 3, "odd"), + Arguments.of(1, 8, "odd"), + Arguments.of(1, 1, "even") + ); + } + + @ParameterizedTest + @MethodSource("validCases") + void testValid(int rows, int columns, String strategy) { + testInts(rows, columns); + int remainder = testStr(strategy); + + setInput( + String.format( + "%d %d %s", + rows, columns, strategy + )); - new RandomCharsTable().run(); + rct.run(); printOut(); removeFromOutput("Input table length, table width, table strategy(even/odd): "); - for (int i = 0; i < 7; i++) { + for (int i = 0; i < rows; i++) { String[] row = getOutputLines()[i].split(" "); for (String el : row) { - assert (el.charAt(0) >= 65 && el.charAt(0) <= 90); + if (el.charAt(0) != '|') { + assert (el.charAt(0) >= 65 && el.charAt(0) <= 90); + } } } - String[] result = getOutputLines()[7].split(" "); - for (int i = 3; i < result.length; i++) { - assert (result[i].charAt(0) % 2 == 1); + + // check result could be empty + try { + if (getOutputLines()[rows] != "") { + String[] result = getOutputLines()[rows].split(" "); + for (int i = 3; i < result.length; i++) { + assert (result[i].charAt(0) % 2 == remainder); + } + } + } catch (ArrayIndexOutOfBoundsException e) { + return; } + } + } From 42f59e3803442728f7eae91fff7fe43d508097e0 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 22:00:49 +0300 Subject: [PATCH 22/67] deleted extra import ^_^ --- .../java/homework_2/random_chars_table/RandomCharsTable.java | 1 - 1 file changed, 1 deletion(-) 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 16c082e4..c7023024 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,6 +1,5 @@ package homework_2.random_chars_table; -import java.sql.SQLOutput; import java.util.Random; import static homework_2.IOMod.*; From 1ac795ad991cd1943ea9749f0292450ed186e642 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 22:31:40 +0300 Subject: [PATCH 23/67] small fixes --- .../random_chars_table/RandomCharsTable.java | 12 ++++-------- .../sources/RandomCharsTableTest.java | 9 +++------ 2 files changed, 7 insertions(+), 14 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 c7023024..da808236 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,5 +1,7 @@ package homework_2.random_chars_table; +import org.w3c.dom.ls.LSOutput; + import java.util.Random; import static homework_2.IOMod.*; @@ -53,16 +55,10 @@ private void printRandomAndGenerateResult(int length, int width, boolean strateg StringBuilder result = new StringBuilder(); for (int i = 0; i < length; i++) { + System.out.print("| "); for (int j = 0; j < width; j++) { randAbc[i][j] = (char) (random.nextInt((RAND_MAX_VALUE - RAND_MIN_VALUE) + 1) + RAND_MIN_VALUE); - if (j == 0) { - System.out.print("| "); - } - if (j == width - 1) { - System.out.print(randAbc[i][j] + " |"); - } else { - System.out.print(randAbc[i][j] + " | "); - } + System.out.print(randAbc[i][j] + " | "); // result generating on-the-go if (strategy) { diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 49f57049..7643119a 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -public class RandomCharsTableTest extends UnitBase { +class RandomCharsTableTest extends UnitBase { RandomCharsTable rct = new RandomCharsTable(); @@ -118,15 +118,13 @@ void testValid(int rows, int columns, String strategy) { for (int i = 0; i < rows; i++) { String[] row = getOutputLines()[i].split(" "); for (String el : row) { - if (el.charAt(0) != '|') { - assert (el.charAt(0) >= 65 && el.charAt(0) <= 90); - } + assert el.charAt(0) == '|' || (el.charAt(0) >= 65 && el.charAt(0) <= 90); } } // check result could be empty try { - if (getOutputLines()[rows] != "") { + if (!getOutputLines()[rows].equals("")) { String[] result = getOutputLines()[rows].split(" "); for (int i = 3; i < result.length; i++) { assert (result[i].charAt(0) % 2 == remainder); @@ -138,5 +136,4 @@ void testValid(int rows, int columns, String strategy) { } - } From 50d82f9d3a0724031b22efc691ced13d2ef20b02 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 22:32:08 +0300 Subject: [PATCH 24/67] _ --- .../java/homework_2/random_chars_table/RandomCharsTable.java | 2 -- 1 file changed, 2 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 da808236..c860bd18 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,7 +1,5 @@ package homework_2.random_chars_table; -import org.w3c.dom.ls.LSOutput; - import java.util.Random; import static homework_2.IOMod.*; From f505079765bae73db14cebe8ece082f738afbf12 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 24 Jul 2021 23:15:01 +0300 Subject: [PATCH 25/67] _ --- .../random_chars_table/RandomCharsTable.java | 2 +- src/main/java/homework_3/ImmutableClass.java | 10 +++++++--- 2 files changed, 8 insertions(+), 4 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 c860bd18..62441d3f 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -103,4 +103,4 @@ private void printResult(boolean strategy, StringBuilder result) { } } -} +} \ No newline at end of file diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index d84e924a..a7cbf867 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -2,10 +2,14 @@ /* Immutable class -3 constuctors: (), (String, int, double), ("") -3 getMethods(): getName, getAge, getWeight -1 method returning a new obj: newObjectMethod() + The class must be declared as final (So that child classes can’t be created) + Data members in the class must be declared as private (So that direct access is not allowed) + Data members in the class must be declared as final (So that we can’t change the value of it after object creation) + A parameterized constructor should initialize all the fields performing a deep copy (So that data members can’t be modified with object reference) + Deep Copy of objects should be performed in the getter methods (To return a copy rather than returning the actual object reference) + No setters (To not have the option to change the value of the instance variable) */ + public final class ImmutableClass { private final String name; // reference type From c07a1b4204ee1ea3af5154d616d8921760268fd5 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 25 Jul 2021 15:27:24 +0300 Subject: [PATCH 26/67] refactored: added parametrized test for not valid data; --- .../sources/RandomCharsTableTest.java | 102 ++++++++---------- 1 file changed, 46 insertions(+), 56 deletions(-) diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java index 7643119a..d89d440e 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java @@ -15,62 +15,6 @@ class RandomCharsTableTest extends UnitBase { RandomCharsTable rct = new RandomCharsTable(); - @Test - void testFormatCount() { - setInput("1 2 even 12even"); - - rct.run(); - printOut(); - removeFromOutput("Input table length, table width, table strategy(even/odd): "); - assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", - getOutputLines()[0]); - } - - @Test - void testNegative() { - setInput("-1 -2 odd"); - - rct.run(); - printOut(); - removeFromOutput("Input table length, table width, table strategy(even/odd): "); - assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", - getOutputLines()[0]); - } - - @Test - void testZero() { - setInput("0 0 odd"); - - rct.run(); - printOut(); - removeFromOutput("Input table length, table width, table strategy(even/odd): "); - assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", - getOutputLines()[0]); - } - - @Test - void testWrongStrategy() { - setInput("1 3 omg"); - - rct.run(); - printOut(); - removeFromOutput("Input table length, table width, table strategy(even/odd): "); - assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", - getOutputLines()[0]); - } - - @Test - void testEmpty() { - setInput(""); - - rct.run(); - printOut(); - removeFromOutput("Input table length, table width, table strategy(even/odd): "); - assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", - getOutputLines()[0]); - } - - // robots will replace human beings ! private void testInts(int length, int width) { if (length <= 0 || width <= 0) { @@ -133,7 +77,53 @@ void testValid(int rows, int columns, String strategy) { } catch (ArrayIndexOutOfBoundsException e) { return; } + } + + // free for adding new not valid cases in format Int, Int, String + private static Stream notValidCases() { + return Stream.of( + Arguments.of(-1, -2, "odd"), + Arguments.of(0, 0, "even"), + Arguments.of(1, 3, "omg"), + Arguments.of(1234, -2, "even") + ); + } + + @ParameterizedTest + @MethodSource("notValidCases") + void testNotValid(int rows, int columns, String strategy) { + setInput( + String.format( + "%d %d %s", + rows, columns, strategy + )); + rct.run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void testFormatCount() { + setInput("1 2 even 12even"); + + rct.run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void testEmpty() { + setInput(""); + rct.run(); + printOut(); + removeFromOutput("Input table length, table width, table strategy(even/odd): "); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); } } From 515ed77939038d5ce148c0d6e43da17e4271b036 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 25 Jul 2021 16:00:14 +0300 Subject: [PATCH 27/67] _ --- src/main/java/homework_2/pyramid_printer/PyramidPrinter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index cdc2c474..ce2facfc 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -16,8 +16,8 @@ public void run() { } private void printPyramid(int height) { - for (int i = 1; i <= height; i++) { - for (int j = 1; j <= i; j++) { + for (int i = 0; i < height; i++) { + for (int j = 1; j <= i + 1; j++) { System.out.print("x"); } System.out.println(); From 52a7a0c2d925fc98db7fda2a9b87f4ad4fa53167 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 25 Jul 2021 16:00:35 +0300 Subject: [PATCH 28/67] refactored tests to parametrized --- .../sources/PyramidPrintTest.java | 83 ++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java index d7d3cbf9..35f7c1f6 100644 --- a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java +++ b/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java @@ -3,65 +3,72 @@ import base.UnitBase; import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; -public class PyramidPrintTest extends UnitBase { +class PyramidPrintTest extends UnitBase { - @Test - void testZero() { - setInput("0"); + PyramidPrinter pyramidPrinter = new PyramidPrinter(); - new PyramidPrinter().run(); - printOut(); - removeFromOutput("Please, input Pyramid height: "); - assertEquals("", getOutputLines()[0]); + // testing valid input + private static Stream validCases() { + return Stream.of( + Arguments.of(7), + Arguments.of(4), + Arguments.of(33), + Arguments.of(1), + Arguments.of(188) + ); } - @Test - void testNegative() { - setInput("-278"); - - new PyramidPrinter().run(); + @ParameterizedTest + @MethodSource("validCases") + void validTest(int height) { + setInput(String.valueOf(height)); + pyramidPrinter.run(); printOut(); removeFromOutput("Please, input Pyramid height: "); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + for (int i = 0; i < height; i++) { + StringBuilder expectedStr = new StringBuilder(); + for (int j = 0; j < i + 1; j++) { + expectedStr.append("x"); + } + assertEquals(String.valueOf(expectedStr), getOutputLines()[i]); + } } - @Test - void test7() { - setInput("7"); - - new PyramidPrinter().run(); - printOut(); - removeFromOutput("Please, input Pyramid height: "); - assertEquals("x", getOutputLines()[0]); - assertEquals("xx", getOutputLines()[1]); - assertEquals("xxx", getOutputLines()[2]); - assertEquals("xxxx", getOutputLines()[3]); - assertEquals("xxxxx", getOutputLines()[4]); - assertEquals("xxxxxx", getOutputLines()[5]); - assertEquals("xxxxxxx", getOutputLines()[6]); + // testing not valid input values + private static Stream notValidCases() { + return Stream.of( + Arguments.of(String.valueOf(Integer.MAX_VALUE + 1)), + Arguments.of("anytext"), + Arguments.of(""), + Arguments.of("-278") + ); } - @Test - void testMAXIntegerPlusOne() { - setInput(String.valueOf(Integer.MAX_VALUE + 1)); - - new PyramidPrinter().run(); + @ParameterizedTest + @MethodSource("notValidCases") + void testNotValid(String input) { + setInput(input); + pyramidPrinter.run(); printOut(); removeFromOutput("Please, input Pyramid height: "); assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } @Test - void testString() { - setInput("anytext"); - - new PyramidPrinter().run(); + void testNull() { + setInput("0"); + pyramidPrinter.run(); printOut(); removeFromOutput("Please, input Pyramid height: "); - assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[1]); + assertEquals("", getOutputLines()[0]); } } From 871be7297bb4c2d151d323332c5d9425d2587bec Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 2 Aug 2021 23:01:04 +0300 Subject: [PATCH 29/67] text file add --- .../resources/custom_file_reader/example.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/resources/custom_file_reader/example.txt diff --git a/src/main/resources/custom_file_reader/example.txt b/src/main/resources/custom_file_reader/example.txt new file mode 100644 index 00000000..d46a8616 --- /dev/null +++ b/src/main/resources/custom_file_reader/example.txt @@ -0,0 +1,18 @@ +“знаешь, если искать врага – обретаешь его в любом…” + +знаешь, если искать врага – обретаешь его в любом. +вот, пожалуй, спроси меня – мне никто не страшен: +я спокоен и прям и знаю, что впереди. +я хожу без страховки с факелом надо лбом +по стальной струне, натянутой между башен, +когда снизу кричат только: «упади». +разве они знают, чего мне стоило ремесло. +разве они видели, сколько раз я орал и плакал. +разве ступят на ветер, нащупав его изгиб. +они думают, я дурак, которому повезло. +если я отвечу им, я не удержу над бровями факел. +если я отвечу им, я погиб. + +23 июня 2013. Ришикеш + +Вера Николаевна Полозкова. “Работа горя”. \ No newline at end of file From 05f709e37f358d1d0e9a04e4ca4c6ff25a431678 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Fri, 6 Aug 2021 16:48:57 +0300 Subject: [PATCH 30/67] hw 4 --- README.md | 13 +- build.gradle | 1 + .../custom_annotation/FilePath.java | 9 ++ .../custom_file_reader/CustomFileReader.java | 117 ++++++++++++++++++ src/main/java/homework_4/singleton/Main.java | 13 ++ .../homework_4/singleton/SingletonMenu.java | 75 +++++++++++ .../CustomFileReaderTest.java | 39 ++++++ .../singleton/SingletonMenuTest.java | 16 +++ 8 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 src/main/java/homework_4/custom_annotation/FilePath.java create mode 100644 src/main/java/homework_4/custom_file_reader/CustomFileReader.java create mode 100644 src/main/java/homework_4/singleton/Main.java create mode 100644 src/main/java/homework_4/singleton/SingletonMenu.java create mode 100644 src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java create mode 100644 src/test/java/homework_4/singleton/SingletonMenuTest.java diff --git a/README.md b/README.md index 44393b92..76cea2e5 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,14 @@ | Number | Solution | Short description | --- | --- | --- | -HW1 | [Console printer](./src/main/java/homework_1/Main.java) | The app that reads input arguments and prints them, until "error" argument | -HW2 | [Traffic Light](./src/main/java/homework_2/traffic_light/) | The app that switching colors on different number value (input from keyboard) | -HW2 | [Pyramid Printer](./src/main/java/homework_2/pyramid_printer/) | Printing 'x' Pyramid with the input parameter as Pyramid height | -HW2 | [Random Chars Table](./src/main/java/homework_2/random_chars_table/) | The app that creates 2-dimensional array/matrix made of random Character values (from A=65 to Z=90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | -HW3 | [Immutable Class](./src/main/java/homework_3/ImmutableClass.java) | Create Immutable class: several fields, including reference type; several constructors; method returning a new object. | +HW1 | [Console printer](./src/main/java/homework_1/Main.java)
[Tests](./src/test/java/homework_1/MainTest.java) | The app that reads input arguments and prints them, until "error" argument | +HW2.1 | [Traffic Light](./src/main/java/homework_2/traffic_light/)
[Tests](./src/test/java/homework_2/traffic_light/) | The app that switching colors on different number value (input from keyboard) | +HW2.2 | [Pyramid Printer](./src/main/java/homework_2/pyramid_printer/)
[Tests](./src/test/java/homework_2/pyramid_printer/) | Printing 'x' Pyramid with the input parameter as Pyramid height | +HW2.3 | [Random Chars Table](./src/main/java/homework_2/random_chars_table/)
[Tests](./src/test/java/homework_2/random_chars_table/) | The app that creates 2-dimensional array/matrix made of random Character values (from A=65 to Z=90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | +HW3 | [Immutable Class](./src/main/java/homework_3/ImmutableClass.java) | Create Immutable class: several fields, including reference type; several constructors; method returning a new object. | +HW4.1 | [Custom File Reader](./src/main/java/homework_4/custom_file_reader/)
[Tests](./src/test/java/homework_4/custom_file_reader/) | App reading data from file and prints to console. Text file path: main/resources/custom_file_reader/. Reading file in 3 ways (one of them using NIO) executable with methods: run1(), run2(), run3(). | +HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/test/java/homework_4/singleton/) | Singleton App: private constructor and public method getInstance() | +HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/) | Custom annotation class. |
diff --git a/build.gradle b/build.gradle index fc839d30..a8bb3555 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ repositories { dependencies { implementation 'org.junit.jupiter:junit-jupiter:5.7.0' + implementation 'org.jetbrains:annotations:20.1.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' diff --git a/src/main/java/homework_4/custom_annotation/FilePath.java b/src/main/java/homework_4/custom_annotation/FilePath.java new file mode 100644 index 00000000..b2d58d96 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/FilePath.java @@ -0,0 +1,9 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface FilePath { + String path() default "src/main/resources/custom_file_reader/example.txt"; +} diff --git a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java new file mode 100644 index 00000000..77d22c7d --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -0,0 +1,117 @@ +package homework_4.custom_file_reader; + +/* + Custom File Reader realizations provided by 3 methods: run1(), run2(), run3(); + Every realization is encapsulated; + There are different ways to get access to file and read it. + run1(): using FileInputStream, BufferedReader, StringBuilder; using FilePath custom annotation for strict file path; + run2(): using getFileFromResourcesAsStream method returning InputStream and prints it via printModifiedInputStream; + run3(): using getFileFromResource method returning File and prints it using String Collection in printModifiedFile; + */ + +import homework_4.custom_annotation.FilePath; +import org.jetbrains.annotations.NotNull; + +import java.io.*; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.util.List; + + +@FilePath +public class CustomFileReader { + + private final String fileName; + + public CustomFileReader() { + this.fileName = "custom_file_reader/example.txt"; + } + + public synchronized void run1() throws IOException { + printModifiedInputStreamWithCustomAnnotation(); + } + + // read file with input stream + public synchronized void run2() throws IOException { + try (InputStream inputStream = getFileFromResourcesAsStream(this.fileName)) { + printModifiedInputStream(inputStream); + } catch (IOException e) { + throw new IOException(); + } + } + + // using NIO + public synchronized void run3() throws IOException { + File textFile; + try { + textFile = getFileFromResource(this.fileName); + printModifiedFile(textFile); + } catch (IOException | URISyntaxException e) { + throw new IOException(); + } + } + + private @NotNull InputStream getFileFromResourcesAsStream(String fileName) { + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream(fileName); + if (inputStream == null) { + throw new IllegalArgumentException(); + } + return inputStream; + } + + private @NotNull File getFileFromResource(String fileName) throws URISyntaxException { + ClassLoader classLoader = getClass().getClassLoader(); + URL resource = classLoader.getResource(fileName); + if (resource == null) { + throw new IllegalArgumentException(); + } + return new File(resource.toURI()); + } + + // fastest file reading realization using FileInputStream and BufferedReader + // custom annotation implemented for strict path, instead of using method 'getFileFromResourcesAsStream' + private void printModifiedInputStreamWithCustomAnnotation() throws IOException { + FilePath filePath = (FilePath) this.getClass().getDeclaredAnnotations()[0]; + try (final FileInputStream fileInputStream = new FileInputStream(filePath.path()); + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream))) { + final StringBuilder stringBuilder = new StringBuilder(fileInputStream.available()); + while (bufferedReader.ready()) { + stringBuilder.append(stringModifier(bufferedReader.readLine())).append("\n"); + } + System.out.println(stringBuilder); + } catch (IOException e) { + throw new IOException(); + } + } + + private void printModifiedFile(@org.jetbrains.annotations.NotNull File textFile) throws IOException { + List lines; + try { + lines = Files.readAllLines(textFile.toPath()); + lines.forEach(line -> System.out.println(stringModifier(line))); + } catch (IOException e) { + throw new IOException(); + } + } + + private void printModifiedInputStream(InputStream inputStream) throws IOException { + try ( + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { + String line; + while (null != (line = bufferedReader.readLine())) { + System.out.println(stringModifier(line)); + } + } catch (IOException e) { + throw new IOException(); + } + } + + // returns string without '.' and ',' symbols + private String stringModifier(String str) { + return str.replaceAll("[,.]", ""); + } + +} diff --git a/src/main/java/homework_4/singleton/Main.java b/src/main/java/homework_4/singleton/Main.java new file mode 100644 index 00000000..b5e71e5d --- /dev/null +++ b/src/main/java/homework_4/singleton/Main.java @@ -0,0 +1,13 @@ +package homework_4.singleton; + +/* + Singleton provides access to CustomFileReader methods through GUI. + It's the only one instance of GUI able to run (thread-safe). + */ + + +public class Main { + public static void main(String[] args) { + SingletonMenu.getInstance(); + } +} diff --git a/src/main/java/homework_4/singleton/SingletonMenu.java b/src/main/java/homework_4/singleton/SingletonMenu.java new file mode 100644 index 00000000..aab994de --- /dev/null +++ b/src/main/java/homework_4/singleton/SingletonMenu.java @@ -0,0 +1,75 @@ +package homework_4.singleton; + +import homework_4.custom_file_reader.CustomFileReader; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +/* + Bill Pugh Singleton Implementation + */ + +public class SingletonMenu { + + private SingletonMenu() { + guiGenerator(); + } + + private static class SingletonHelper { + private static final SingletonMenu INSTANCE = new SingletonMenu(); + } + + public static SingletonMenu getInstance() { + return SingletonHelper.INSTANCE; + } + + private void guiGenerator() { + JFrame frame = new JFrame("Singleton Menu for CustomFileReader"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(500, 350); + + JPanel mainPanel = new JPanel(); + JButton button1 = new JButton("read file using FileInputStream and custom annotation"); + JButton button2 = new JButton("read file using InputStream"); + JButton button3 = new JButton("read file using NIO"); + mainPanel.add(button1); + mainPanel.add(button2); + mainPanel.add(button3); + + CustomFileReader customFileReader = new CustomFileReader(); + addButtonListener(button1, customFileReader, 1); + addButtonListener(button2, customFileReader, 2); + addButtonListener(button3, customFileReader, 3); + + // Adding Components to the frame + frame.getContentPane().add(BorderLayout.CENTER, mainPanel); + frame.setVisible(true); + } + + private void addButtonListener(JButton button, CustomFileReader customFileReader, int methodNumber) { + button.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + try { + buttonActionPerfromed(e); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + private void buttonActionPerfromed(ActionEvent e) throws IOException { + if (methodNumber == 1) { + customFileReader.run1(); + } else if (methodNumber == 2) { + customFileReader.run2(); + } else if (methodNumber == 3) { + customFileReader.run3(); + } else throw new IOException(); + } + }); + } + +} diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java new file mode 100644 index 00000000..93900b27 --- /dev/null +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -0,0 +1,39 @@ +package homework_4.custom_file_reader; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class CustomFileReaderTest extends UnitBase { + + CustomFileReader customFileReader = new CustomFileReader(); + + @Test + void testRun1() throws IOException { + customFileReader.run1(); + String result = getOutput(); + assertTrue(checkResult(result)); + } + + @Test + void testRun2() throws IOException { + customFileReader.run2(); + String result = getOutput(); + assertTrue(checkResult(result)); + } + + @Test + void testRun3() throws IOException { + customFileReader.run3(); + String result = getOutput(); + assertTrue(checkResult(result)); + } + + private boolean checkResult(String res) { + return !(res.contains(".") && res.contains(",")); + } + +} \ No newline at end of file diff --git a/src/test/java/homework_4/singleton/SingletonMenuTest.java b/src/test/java/homework_4/singleton/SingletonMenuTest.java new file mode 100644 index 00000000..cf0ad6e8 --- /dev/null +++ b/src/test/java/homework_4/singleton/SingletonMenuTest.java @@ -0,0 +1,16 @@ +package homework_4.singleton; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SingletonMenuTest { + + @Test + void testInstances() { + SingletonMenu expected = SingletonMenu.getInstance(); + SingletonMenu current = SingletonMenu.getInstance(); + assertSame(expected, current); + } + +} \ No newline at end of file From 28f0c99d798ed200fd56acde603f9699dccf7444 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 7 Aug 2021 14:58:13 +0300 Subject: [PATCH 31/67] small fix --- src/main/java/homework_2/Colors.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/homework_2/Colors.java b/src/main/java/homework_2/Colors.java index 3851f231..9edd640d 100644 --- a/src/main/java/homework_2/Colors.java +++ b/src/main/java/homework_2/Colors.java @@ -1,6 +1,6 @@ package homework_2; -public class Colors { +public final class Colors { public static final String ANSI_RESET = "\u001B[0m"; public static final String ANSI_RED = "\033[1;91m"; From 140faf5ca67f16d024a789c861ec21c76e37e43b Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 8 Aug 2021 13:42:07 +0300 Subject: [PATCH 32/67] add annotation test --- .../custom_annotation/FilePathTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/test/java/homework_4/custom_annotation/FilePathTest.java diff --git a/src/test/java/homework_4/custom_annotation/FilePathTest.java b/src/test/java/homework_4/custom_annotation/FilePathTest.java new file mode 100644 index 00000000..e845ac76 --- /dev/null +++ b/src/test/java/homework_4/custom_annotation/FilePathTest.java @@ -0,0 +1,30 @@ +package homework_4.custom_annotation; + +import homework_4.custom_file_reader.CustomFileReader; +import org.junit.jupiter.api.Test; + +import java.lang.annotation.Annotation; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +class FilePathTest { + + Class obj = CustomFileReader.class; + + @Test + void testAnnotation() { + if (obj.isAnnotationPresent(FilePath.class)) { + Annotation annotation = obj.getAnnotation(FilePath.class); + FilePath filePath = (FilePath) annotation; + + System.out.println("Class " + CustomFileReader.class.getSimpleName() + + " has annotation @" + FilePath.class.getSimpleName()); + assertFalse(filePath.path().isEmpty()); + System.out.println("path: " + filePath.path()); + } else { + System.out.println("NO ANNOTATION FOUND!"); + throw new AssertionError(); + } + } + +} From 75853ddb6ab5f5aabb46d71ab6a51ceeadab94e0 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 10 Aug 2021 01:46:03 +0300 Subject: [PATCH 33/67] upd --- src/main/java/homework_1/Main.java | 4 +- src/main/java/homework_2/IOMod.java | 2 +- .../random_chars_table/RandomCharsTable.java | 60 +++++++------------ .../traffic_light/TrafficLight.java | 6 +- src/main/java/homework_4/singleton/Main.java | 2 + .../singleton/SingletonMenuTest.java | 2 +- 6 files changed, 31 insertions(+), 45 deletions(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index 874fa646..123ea4ca 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -2,8 +2,8 @@ public class Main { - static final String RED = "\u001b[31m"; - static final String RESET = "\u001b[0m"; + private static final String RED = "\u001b[31m"; + private static final String RESET = "\u001b[0m"; public static void main(String[] args) { for (String arg : args) { diff --git a/src/main/java/homework_2/IOMod.java b/src/main/java/homework_2/IOMod.java index bf77f9ae..2a43845e 100644 --- a/src/main/java/homework_2/IOMod.java +++ b/src/main/java/homework_2/IOMod.java @@ -14,7 +14,7 @@ public static int bufferedReaderIntReader() { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { inp = Integer.parseInt(reader.readLine()); } catch (NumberFormatException | IOException e) { - System.out.println(ERROR); + return inp; } return inp; } 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 62441d3f..4caadfc2 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,5 +1,6 @@ package homework_2.random_chars_table; +import javax.xml.bind.ValidationException; import java.util.Random; import static homework_2.IOMod.*; @@ -15,38 +16,34 @@ public void run() { private void inputData() { System.out.print("Input table length, table width, table strategy(even/odd): "); - String s = bufferedReaderStringReader(); - try { + String s = bufferedReaderStringReader(); String[] parameters = s.split(" "); - if (parameters.length != 3) { - System.out.println(FORMAT_ERROR); - return; + if (!isInputValid(parameters)) { + throw new ValidationException(""); } - int tableLength = Integer.parseInt(parameters[0]); int tableWidth = Integer.parseInt(parameters[1]); - if (tableLength <= 0 || tableWidth <= 0) { - System.out.println(FORMAT_ERROR); - return; - } - - boolean strategy; - if (parameters[2].equalsIgnoreCase("odd")) { - strategy = false; - } else if (parameters[2].equalsIgnoreCase("even")) { - strategy = true; - } else { - System.out.println(FORMAT_ERROR); - return; - } + boolean strategy = parameters[2].equalsIgnoreCase("even"); printRandomAndGenerateResult(tableLength, tableWidth, strategy); - } catch (NumberFormatException | NullPointerException ex) { + } catch (NullPointerException | ValidationException e) { System.out.println(FORMAT_ERROR); + return; } } + private boolean isInputValid(String[] parameters) { + if (parameters.length == 3) { + return parameters[0].chars().allMatch(Character::isDigit) && + !parameters[0].equals("0") && + parameters[1].chars().allMatch(Character::isDigit) && + !parameters[1].equals("0") && + (parameters[2].equalsIgnoreCase("odd") || parameters[2].equalsIgnoreCase("even")); + } + return false; + } + private void printRandomAndGenerateResult(int length, int width, boolean strategy) { Character[][] randAbc = new Character[length][width]; Random random = new Random(); @@ -59,32 +56,21 @@ private void printRandomAndGenerateResult(int length, int width, boolean strateg System.out.print(randAbc[i][j] + " | "); // result generating on-the-go - if (strategy) { - generateEven(randAbc[i][j], result); - } else { - generateOdd(randAbc[i][j], result); - } + generateResult(strategy ? 0 : 1, randAbc[i][j], result); } System.out.println(); } printResult(strategy, result); } - private void generateEven(char ch, StringBuilder result) { - if ((ch % 2 == 0) && (!String.valueOf(result).contains(String.valueOf(ch)))) { - result.append(ch); - } - } - - private void generateOdd(char ch, StringBuilder result) { - if ((ch % 2 == 1) && (!String.valueOf(result).contains(String.valueOf(ch)))) { + private void generateResult(int strategy, char ch, StringBuilder result) { + if ((ch % 2 == strategy) && (!String.valueOf(result).contains(String.valueOf(ch)))) { result.append(ch); } } private void printResult(boolean strategy, StringBuilder result) { if (result.length() == 0) { - System.out.println(""); return; } if (strategy) { @@ -93,7 +79,7 @@ private void printResult(boolean strategy, StringBuilder result) { System.out.print("Odd letters - "); } int i = 0; - while (i < result.length()) { // to avoid exception in a case when result.length() = 0 ;) + while (true) { if (i == result.length() - 1) { System.out.print(result.charAt(i)); break; @@ -103,4 +89,4 @@ private void printResult(boolean strategy, StringBuilder result) { } } -} \ No newline at end of file +} diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index eaaa793f..46740556 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -17,10 +17,8 @@ private void inputSeconds() { int secondsGone = IOMod.bufferedReaderIntReader(); if (secondsGone < 0) { System.out.println(ERROR); - return; } else if (secondsGone >= 86400) { System.out.println("The day is over"); - return; } else { colorPick(secondsGone % 60); } @@ -31,9 +29,9 @@ private void inputSeconds() { private void colorPick(int secs) { // 0 <= light < 35 green, 35 <= light < 40 yellow, 40 <= light < 55 red, 55 <= light < 60 yellow - if (secs >= 0 && secs < 35) { + if (secs < 35) { lightPrint(ANSI_GREEN, "GREEN"); - } else if ((secs >= 35 && secs < 40) || (secs >= 55 && secs < 60)) { + } else if ((secs < 40) || (secs >= 55 && secs < 60)) { lightPrint(ANSI_YELLOW, "YELLOW"); } else { lightPrint(ANSI_RED, "RED"); diff --git a/src/main/java/homework_4/singleton/Main.java b/src/main/java/homework_4/singleton/Main.java index b5e71e5d..739623ee 100644 --- a/src/main/java/homework_4/singleton/Main.java +++ b/src/main/java/homework_4/singleton/Main.java @@ -7,7 +7,9 @@ public class Main { + public static void main(String[] args) { SingletonMenu.getInstance(); } + } diff --git a/src/test/java/homework_4/singleton/SingletonMenuTest.java b/src/test/java/homework_4/singleton/SingletonMenuTest.java index cf0ad6e8..6c8e5083 100644 --- a/src/test/java/homework_4/singleton/SingletonMenuTest.java +++ b/src/test/java/homework_4/singleton/SingletonMenuTest.java @@ -13,4 +13,4 @@ void testInstances() { assertSame(expected, current); } -} \ No newline at end of file +} From efa34468eb53cf156119e9f90f4e7fa68fcd390e Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 10 Aug 2021 01:46:37 +0300 Subject: [PATCH 34/67] upd --- .../homework_4/custom_file_reader/CustomFileReaderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java index 93900b27..8c8297d3 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -36,4 +36,4 @@ private boolean checkResult(String res) { return !(res.contains(".") && res.contains(",")); } -} \ No newline at end of file +} From 450f63652d0b6af26ec84682585723096110cbdb Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 11 Aug 2021 16:01:54 +0300 Subject: [PATCH 35/67] global hw4 refactoring; --- .../random_chars_table/RandomCharsTable.java | 1 - .../custom_annotation/FilePath.java | 9 -- .../custom_annotation/ResourcesPath.java | 12 ++ .../custom_file_reader/CustomFileReader.java | 136 ++++++------------ .../utils/BufferedReaderAsStreamFileRead.java | 22 +++ .../utils/DirectoryScan.java | 37 +++++ .../utils/FileReadability.java | 8 ++ .../utils/InputStreamReaderFileRead.java | 27 ++++ .../utils/ModifiedStringPrinter.java | 13 ++ .../custom_file_reader/utils/NIOFileRead.java | 26 ++++ .../utils/ScannerFileRead.java | 24 ++++ .../homework_4/singleton/SingletonMenu.java | 32 +++-- .../custom_file_reader/empty_file.txt | 0 .../custom_annotation/FilePathTest.java | 30 ---- .../custom_annotation/ResourcesPathTest.java | 38 +++++ .../CustomFileReaderTest.java | 113 ++++++++++++++- .../singleton/SingletonMenuTest.java | 1 + 17 files changed, 382 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/homework_4/custom_annotation/FilePath.java create mode 100644 src/main/java/homework_4/custom_annotation/ResourcesPath.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/BufferedReaderAsStreamFileRead.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/DirectoryScan.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/FileReadability.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/InputStreamReaderFileRead.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/ModifiedStringPrinter.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/NIOFileRead.java create mode 100644 src/main/java/homework_4/custom_file_reader/utils/ScannerFileRead.java create mode 100644 src/main/resources/custom_file_reader/empty_file.txt delete mode 100644 src/test/java/homework_4/custom_annotation/FilePathTest.java create mode 100644 src/test/java/homework_4/custom_annotation/ResourcesPathTest.java 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 4caadfc2..d90d61c0 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -29,7 +29,6 @@ private void inputData() { printRandomAndGenerateResult(tableLength, tableWidth, strategy); } catch (NullPointerException | ValidationException e) { System.out.println(FORMAT_ERROR); - return; } } diff --git a/src/main/java/homework_4/custom_annotation/FilePath.java b/src/main/java/homework_4/custom_annotation/FilePath.java deleted file mode 100644 index b2d58d96..00000000 --- a/src/main/java/homework_4/custom_annotation/FilePath.java +++ /dev/null @@ -1,9 +0,0 @@ -package homework_4.custom_annotation; - -import java.lang.annotation.*; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface FilePath { - String path() default "src/main/resources/custom_file_reader/example.txt"; -} diff --git a/src/main/java/homework_4/custom_annotation/ResourcesPath.java b/src/main/java/homework_4/custom_annotation/ResourcesPath.java new file mode 100644 index 00000000..89c7a5ce --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/ResourcesPath.java @@ -0,0 +1,12 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.*; + + +@Target({ElementType.LOCAL_VARIABLE, ElementType.FIELD, ElementType.CONSTRUCTOR}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ResourcesPath { + + String dirPath() default "./src/main/resources/custom_file_reader/"; + +} diff --git a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java index 77d22c7d..b454cf02 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -1,117 +1,75 @@ package homework_4.custom_file_reader; -/* - Custom File Reader realizations provided by 3 methods: run1(), run2(), run3(); - Every realization is encapsulated; - There are different ways to get access to file and read it. - run1(): using FileInputStream, BufferedReader, StringBuilder; using FilePath custom annotation for strict file path; - run2(): using getFileFromResourcesAsStream method returning InputStream and prints it via printModifiedInputStream; - run3(): using getFileFromResource method returning File and prints it using String Collection in printModifiedFile; - */ - -import homework_4.custom_annotation.FilePath; -import org.jetbrains.annotations.NotNull; - -import java.io.*; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Files; -import java.util.List; - - -@FilePath +import homework_4.custom_annotation.ResourcesPath; +import homework_4.custom_file_reader.utils.*; + +import static homework_4.custom_file_reader.utils.ModifiedStringPrinter.printModifiedString; + + public class CustomFileReader { + private static final String FILE_IS_EMPTY = "File is empty!"; + private final String fileName; + private final String dirPath; + @ResourcesPath public CustomFileReader() { - this.fileName = "custom_file_reader/example.txt"; + this.fileName = "example.txt"; + String tmpDirPath; + try { + ResourcesPath resourcesPath = (ResourcesPath) this.getClass().getConstructor().getDeclaredAnnotations()[0]; + tmpDirPath = resourcesPath.dirPath(); + } catch (NoSuchMethodException e) { + tmpDirPath = "./src/main/resources/"; // not including custom folder! + } + this.dirPath = tmpDirPath; } - public synchronized void run1() throws IOException { - printModifiedInputStreamWithCustomAnnotation(); + public CustomFileReader(String dirPath, String fileName) { + this.dirPath = dirPath; + this.fileName = fileName; } - // read file with input stream - public synchronized void run2() throws IOException { - try (InputStream inputStream = getFileFromResourcesAsStream(this.fileName)) { - printModifiedInputStream(inputStream); - } catch (IOException e) { - throw new IOException(); - } + // using scanner + public synchronized void run1() { + doExcellent(new ScannerFileRead().fileReader(this.dirPath, this.fileName)); } - // using NIO - public synchronized void run3() throws IOException { - File textFile; - try { - textFile = getFileFromResource(this.fileName); - printModifiedFile(textFile); - } catch (IOException | URISyntaxException e) { - throw new IOException(); - } + // using buffered reader + public synchronized void run2() { + doExcellent(new BufferedReaderAsStreamFileRead().fileReader(this.dirPath, this.fileName)); } - private @NotNull InputStream getFileFromResourcesAsStream(String fileName) { - ClassLoader classLoader = getClass().getClassLoader(); - InputStream inputStream = classLoader.getResourceAsStream(fileName); - if (inputStream == null) { - throw new IllegalArgumentException(); - } - return inputStream; + // using nio + public synchronized void run3() { + doExcellent(new NIOFileRead().fileReader(this.dirPath, this.fileName)); } - private @NotNull File getFileFromResource(String fileName) throws URISyntaxException { - ClassLoader classLoader = getClass().getClassLoader(); - URL resource = classLoader.getResource(fileName); - if (resource == null) { - throw new IllegalArgumentException(); - } - return new File(resource.toURI()); + // using InputStreamReader + public synchronized void run4() { + doExcellent(new InputStreamReaderFileRead().fileReader(this.dirPath, this.fileName)); } - // fastest file reading realization using FileInputStream and BufferedReader - // custom annotation implemented for strict path, instead of using method 'getFileFromResourcesAsStream' - private void printModifiedInputStreamWithCustomAnnotation() throws IOException { - FilePath filePath = (FilePath) this.getClass().getDeclaredAnnotations()[0]; - try (final FileInputStream fileInputStream = new FileInputStream(filePath.path()); - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream))) { - final StringBuilder stringBuilder = new StringBuilder(fileInputStream.available()); - while (bufferedReader.ready()) { - stringBuilder.append(stringModifier(bufferedReader.readLine())).append("\n"); - } - System.out.println(stringBuilder); - } catch (IOException e) { - throw new IOException(); - } + // prints all files and subdirectories from set directory + public void showDir() { + DirectoryScan.scanDir(this.dirPath); } - private void printModifiedFile(@org.jetbrains.annotations.NotNull File textFile) throws IOException { - List lines; - try { - lines = Files.readAllLines(textFile.toPath()); - lines.forEach(line -> System.out.println(stringModifier(line))); - } catch (IOException e) { - throw new IOException(); - } + private boolean isNotEmpty(String res) { + return !res.equals(""); } - private void printModifiedInputStream(InputStream inputStream) throws IOException { - try ( - InputStreamReader inputStreamReader = new InputStreamReader(inputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { - String line; - while (null != (line = bufferedReader.readLine())) { - System.out.println(stringModifier(line)); - } - } catch (IOException e) { - throw new IOException(); - } + private boolean isNotExists(String res) { + return res == null; } - // returns string without '.' and ',' symbols - private String stringModifier(String str) { - return str.replaceAll("[,.]", ""); + private void doExcellent(String result) { + if (isNotExists(result)) { + System.out.println("File " + this.fileName + " not found at: " + this.dirPath); + } else if (isNotEmpty(result)) { + printModifiedString(result); + } else System.out.println(FILE_IS_EMPTY); } } diff --git a/src/main/java/homework_4/custom_file_reader/utils/BufferedReaderAsStreamFileRead.java b/src/main/java/homework_4/custom_file_reader/utils/BufferedReaderAsStreamFileRead.java new file mode 100644 index 00000000..4783f3f2 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/BufferedReaderAsStreamFileRead.java @@ -0,0 +1,22 @@ +package homework_4.custom_file_reader.utils; + +import java.io.*; + + +public class BufferedReaderAsStreamFileRead implements FileReadability { + + @Override + public String fileReader(String dirPath, String fileName) { + try (final FileInputStream fileInputStream = new FileInputStream(dirPath + fileName); + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream))) { + final StringBuilder stringBuilder = new StringBuilder(fileInputStream.available()); + while (bufferedReader.ready()) { + stringBuilder.append(bufferedReader.readLine()).append("\n"); + } + return String.valueOf(stringBuilder); + } catch (IOException e) { + return null; + } + } + +} diff --git a/src/main/java/homework_4/custom_file_reader/utils/DirectoryScan.java b/src/main/java/homework_4/custom_file_reader/utils/DirectoryScan.java new file mode 100644 index 00000000..ec4bf265 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/DirectoryScan.java @@ -0,0 +1,37 @@ +package homework_4.custom_file_reader.utils; + +import java.io.File; + + +public class DirectoryScan { + + private DirectoryScan() { } + + public static void scanDir(String dirPath) { + File[] filesList = new File(dirPath).listFiles(); + if (filesList != null && filesList.length >= 1) { + System.out.println(dirPath + " contains:" + "\n--- --- ---"); + for (File file : filesList) { + System.out.println(file.getName() + "\tat: " + file.getAbsolutePath()); + System.out.println("---"); + } + System.out.println("--- --- ---"); + } else System.out.println(dirPath + " is empty!"); + } + + // additional method for extra usage + public static boolean isInDir(String dirPath, String fileName) { + File[] filesList = new File(dirPath).listFiles(); + if (filesList == null) { + System.out.println(dirPath + " is empty!"); + return false; + } + for (File file : filesList) { + if (file.getName().equalsIgnoreCase(fileName)) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/homework_4/custom_file_reader/utils/FileReadability.java b/src/main/java/homework_4/custom_file_reader/utils/FileReadability.java new file mode 100644 index 00000000..b2e8c1f0 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/FileReadability.java @@ -0,0 +1,8 @@ +package homework_4.custom_file_reader.utils; + + +public interface FileReadability { + + String fileReader(String dirPath, String fileName); + +} diff --git a/src/main/java/homework_4/custom_file_reader/utils/InputStreamReaderFileRead.java b/src/main/java/homework_4/custom_file_reader/utils/InputStreamReaderFileRead.java new file mode 100644 index 00000000..e7f53b8c --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/InputStreamReaderFileRead.java @@ -0,0 +1,27 @@ +package homework_4.custom_file_reader.utils; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + + +public class InputStreamReaderFileRead implements FileReadability { + + @Override + public String fileReader(String dirPath, String fileName) { + try (FileInputStream inputStream = new FileInputStream(dirPath + fileName); + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { + StringBuilder lines = new StringBuilder(); + String line; + while (null != (line = bufferedReader.readLine())) { + lines.append(line).append("\n"); + } + return String.valueOf(lines); + } catch (IOException e) { + return null; + } + } + +} diff --git a/src/main/java/homework_4/custom_file_reader/utils/ModifiedStringPrinter.java b/src/main/java/homework_4/custom_file_reader/utils/ModifiedStringPrinter.java new file mode 100644 index 00000000..021de505 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/ModifiedStringPrinter.java @@ -0,0 +1,13 @@ +package homework_4.custom_file_reader.utils; + + +public class ModifiedStringPrinter { + + private ModifiedStringPrinter() { } + + // printing string without '.' and ',' symbols + public static void printModifiedString(String str) { + System.out.println(str.replaceAll("[,.]", "")); + } + +} diff --git a/src/main/java/homework_4/custom_file_reader/utils/NIOFileRead.java b/src/main/java/homework_4/custom_file_reader/utils/NIOFileRead.java new file mode 100644 index 00000000..e792a9cf --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/NIOFileRead.java @@ -0,0 +1,26 @@ +package homework_4.custom_file_reader.utils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.List; + + +public class NIOFileRead implements FileReadability { + + @Override + public String fileReader(String dirPath, String fileName) { + File textFile; + try { + textFile = new File(dirPath + fileName); + List lines; + lines = Files.readAllLines(textFile.toPath()); + StringBuilder stringBuilder = new StringBuilder(); + lines.forEach(line -> stringBuilder.append(line).append("\n")); + return String.valueOf(stringBuilder); + } catch (IOException e) { + return null; + } + } + +} diff --git a/src/main/java/homework_4/custom_file_reader/utils/ScannerFileRead.java b/src/main/java/homework_4/custom_file_reader/utils/ScannerFileRead.java new file mode 100644 index 00000000..f0137449 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/utils/ScannerFileRead.java @@ -0,0 +1,24 @@ +package homework_4.custom_file_reader.utils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; + + +public class ScannerFileRead implements FileReadability { + + @Override + public String fileReader(String dirPath, String fileName) { + try (Scanner scanner = new Scanner(new File(dirPath + fileName))) { + StringBuilder stringBuilder = new StringBuilder(); + while (scanner.hasNextLine()) { + stringBuilder.append(scanner.nextLine()); + stringBuilder.append("\n"); + } + return String.valueOf(stringBuilder); + } catch (FileNotFoundException e) { + return null; + } + } + +} diff --git a/src/main/java/homework_4/singleton/SingletonMenu.java b/src/main/java/homework_4/singleton/SingletonMenu.java index aab994de..0e4a3c6e 100644 --- a/src/main/java/homework_4/singleton/SingletonMenu.java +++ b/src/main/java/homework_4/singleton/SingletonMenu.java @@ -1,17 +1,15 @@ package homework_4.singleton; import homework_4.custom_file_reader.CustomFileReader; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.IOException; -/* - Bill Pugh Singleton Implementation - */ +// Bill Pugh Singleton Implementation public class SingletonMenu { private SingletonMenu() { @@ -32,42 +30,48 @@ private void guiGenerator() { frame.setSize(500, 350); JPanel mainPanel = new JPanel(); - JButton button1 = new JButton("read file using FileInputStream and custom annotation"); - JButton button2 = new JButton("read file using InputStream"); + JButton button1 = new JButton("read file using Scanner"); + JButton button2 = new JButton("read file using BufferedReader"); JButton button3 = new JButton("read file using NIO"); + JButton button4 = new JButton("read file using InputStreamReader"); + JButton button5 = new JButton("show files in directory"); mainPanel.add(button1); mainPanel.add(button2); mainPanel.add(button3); + mainPanel.add(button4); + mainPanel.add(button5); CustomFileReader customFileReader = new CustomFileReader(); addButtonListener(button1, customFileReader, 1); addButtonListener(button2, customFileReader, 2); addButtonListener(button3, customFileReader, 3); + addButtonListener(button4, customFileReader, 4); + addButtonListener(button5, customFileReader, 10); // Adding Components to the frame frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setVisible(true); } - private void addButtonListener(JButton button, CustomFileReader customFileReader, int methodNumber) { + private void addButtonListener(@NotNull JButton button, CustomFileReader customFileReader, int methodNumber) { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - try { - buttonActionPerfromed(e); - } catch (IOException ex) { - ex.printStackTrace(); - } + buttonActionPerformed(); } - private void buttonActionPerfromed(ActionEvent e) throws IOException { + private void buttonActionPerformed() { if (methodNumber == 1) { customFileReader.run1(); } else if (methodNumber == 2) { customFileReader.run2(); } else if (methodNumber == 3) { customFileReader.run3(); - } else throw new IOException(); + } else if (methodNumber == 4) { + customFileReader.run4(); + } else if (methodNumber == 10) { + customFileReader.showDir(); + } else throw new IllegalArgumentException(); } }); } diff --git a/src/main/resources/custom_file_reader/empty_file.txt b/src/main/resources/custom_file_reader/empty_file.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/test/java/homework_4/custom_annotation/FilePathTest.java b/src/test/java/homework_4/custom_annotation/FilePathTest.java deleted file mode 100644 index e845ac76..00000000 --- a/src/test/java/homework_4/custom_annotation/FilePathTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package homework_4.custom_annotation; - -import homework_4.custom_file_reader.CustomFileReader; -import org.junit.jupiter.api.Test; - -import java.lang.annotation.Annotation; - -import static org.junit.jupiter.api.Assertions.assertFalse; - -class FilePathTest { - - Class obj = CustomFileReader.class; - - @Test - void testAnnotation() { - if (obj.isAnnotationPresent(FilePath.class)) { - Annotation annotation = obj.getAnnotation(FilePath.class); - FilePath filePath = (FilePath) annotation; - - System.out.println("Class " + CustomFileReader.class.getSimpleName() + - " has annotation @" + FilePath.class.getSimpleName()); - assertFalse(filePath.path().isEmpty()); - System.out.println("path: " + filePath.path()); - } else { - System.out.println("NO ANNOTATION FOUND!"); - throw new AssertionError(); - } - } - -} diff --git a/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java b/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java new file mode 100644 index 00000000..06dfb83f --- /dev/null +++ b/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java @@ -0,0 +1,38 @@ +package homework_4.custom_annotation; + +import homework_4.custom_file_reader.CustomFileReader; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Constructor; + +import static org.junit.jupiter.api.Assertions.assertTrue; + + +class ResourcesPathTest { + + @Test + void testAnnotation() { + Constructor[] constructors = CustomFileReader.class.getConstructors(); + Constructor myConstructor = null; + for (Constructor constructor : constructors) { + if (constructor.isAnnotationPresent(ResourcesPath.class)) { + myConstructor = constructor; + break; + } + } + + if (myConstructor != null) { + String constructorType = "Empty constructor"; + if (myConstructor.getParameterCount() != 0) { + constructorType = "Constructor with parameters"; + } + System.out.println(constructorType + " in " + CustomFileReader.class.getSimpleName() + " class " + + "has annotation @" + ResourcesPath.class.getSimpleName()); + } else { + System.out.println("No annotated constructor found in " + CustomFileReader.class.getSimpleName()); + throw new AssertionError(); + } + assertTrue(myConstructor.isAnnotationPresent(ResourcesPath.class)); + } + +} diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java index 8c8297d3..d4dfc901 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -1,37 +1,142 @@ package homework_4.custom_file_reader; import base.UnitBase; +import homework_4.custom_file_reader.utils.DirectoryScan; import org.junit.jupiter.api.Test; -import java.io.IOException; +import java.io.File; import static org.junit.jupiter.api.Assertions.*; + class CustomFileReaderTest extends UnitBase { CustomFileReader customFileReader = new CustomFileReader(); + String correctPath = "./src/main/resources/custom_file_reader/"; + String correctFileName = "example.txt"; @Test - void testRun1() throws IOException { + void testRun1() { customFileReader.run1(); String result = getOutput(); assertTrue(checkResult(result)); } @Test - void testRun2() throws IOException { + void testRun2() { customFileReader.run2(); String result = getOutput(); assertTrue(checkResult(result)); } @Test - void testRun3() throws IOException { + void testRun3() { customFileReader.run3(); String result = getOutput(); assertTrue(checkResult(result)); } + @Test + void testRun4() { + customFileReader.run4(); + String result = getOutput(); + assertTrue(checkResult(result)); + } + + @Test + void testNotValidDataForConstuctorWParams() { + CustomFileReader cfr1 = new CustomFileReader(correctPath, "passwords.txt"); + String expected = "File " + "passwords.txt" + " not found at: " + correctPath; + cfr1.run1(); + String output = getOutput(); + assertEquals(expected, output); + } + + @Test + void testNotValidDataForConstuctorWParams2() { + CustomFileReader cfr1 = new CustomFileReader("./src/", correctFileName); + String expected = "File " + correctFileName + " not found at: " + "./src/"; + cfr1.run4(); + String output = getOutput(); + System.out.println(output); + assertEquals(expected, output); + } + + @Test + void testEmptyConstuctor() { + new CustomFileReader(); + String notExpected = "File " + correctFileName + " not found at: " + correctPath; + assertNotEquals(notExpected, getOutput()); + } + + @Test + void testEmptyFileRun1() { + CustomFileReader cfr1 = new CustomFileReader(correctPath, "empty_file.txt"); + cfr1.run1(); + String expected = "File is empty!"; + String output = getOutput(); + assertEquals(expected, output); + } + + @Test + void testEmptyFileRun2() { + CustomFileReader cfr2 = new CustomFileReader(correctPath, "empty_file.txt"); + cfr2.run2(); + String expected = "File is empty!"; + String output = getOutput(); + assertEquals(expected, output); + } + + @Test + void testEmptyFileRun3() { + CustomFileReader cfr3 = new CustomFileReader(correctPath, "empty_file.txt"); + cfr3.run3(); + String expected = "File is empty!"; + String output = getOutput(); + assertEquals(expected, output); + } + + @Test + void testEmptyFileRun4() { + CustomFileReader cfr4 = new CustomFileReader(correctPath, "empty_file.txt"); + cfr4.run4(); + String expected = "File is empty!"; + String output = getOutput(); + assertEquals(expected, output); + } + + @Test + void testShowDirMethod() { + CustomFileReader cfr1 = new CustomFileReader(correctPath, correctFileName); + cfr1.showDir(); + String output = getOutput(); + + File directoryPath = new File(correctPath); + File[] filesList = directoryPath.listFiles(); + StringBuilder tmp = new StringBuilder(); + tmp.append(correctPath).append(" contains:").append("\n--- --- ---\n"); + for (File file : filesList) { + tmp.append(file.getName()).append("\tat: ").append(file.getAbsolutePath()).append("\n").append("---").append("\n"); + } + tmp.append("--- --- ---"); + String expected = String.valueOf(tmp); + assertEquals(expected, output); + } + + @Test + void testEmptyDir() { + String hm3testDir = "./src/test/homework_3/"; + String expected = hm3testDir + " is empty!"; + DirectoryScan.scanDir(hm3testDir); + String output = getOutput(); + assertEquals(expected, output); + } + + @Test + void testIsInDir() { + assertTrue(DirectoryScan.isInDir(correctPath, correctFileName)); + } + private boolean checkResult(String res) { return !(res.contains(".") && res.contains(",")); } diff --git a/src/test/java/homework_4/singleton/SingletonMenuTest.java b/src/test/java/homework_4/singleton/SingletonMenuTest.java index 6c8e5083..dd08016e 100644 --- a/src/test/java/homework_4/singleton/SingletonMenuTest.java +++ b/src/test/java/homework_4/singleton/SingletonMenuTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.*; + class SingletonMenuTest { @Test From e978957f2e81f303c0629bdf9009cb91ffab30db Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 11 Aug 2021 16:04:38 +0300 Subject: [PATCH 36/67] upd --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76cea2e5..15cf585b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ HW2.1 | [Traffic Light](./src/main/java/homework_2/traffic_light/)
[Tests] HW2.2 | [Pyramid Printer](./src/main/java/homework_2/pyramid_printer/)
[Tests](./src/test/java/homework_2/pyramid_printer/) | Printing 'x' Pyramid with the input parameter as Pyramid height | HW2.3 | [Random Chars Table](./src/main/java/homework_2/random_chars_table/)
[Tests](./src/test/java/homework_2/random_chars_table/) | The app that creates 2-dimensional array/matrix made of random Character values (from A=65 to Z=90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | HW3 | [Immutable Class](./src/main/java/homework_3/ImmutableClass.java) | Create Immutable class: several fields, including reference type; several constructors; method returning a new object. | -HW4.1 | [Custom File Reader](./src/main/java/homework_4/custom_file_reader/)
[Tests](./src/test/java/homework_4/custom_file_reader/) | App reading data from file and prints to console. Text file path: main/resources/custom_file_reader/. Reading file in 3 ways (one of them using NIO) executable with methods: run1(), run2(), run3(). | +HW4.1 | [Custom File Reader](./src/main/java/homework_4/custom_file_reader/)
[Tests](./src/test/java/homework_4/custom_file_reader/) | App reading data from file and prints to console. Text file path: main/resources/custom_file_reader/. Reading file in 4 different ways (one of them using NIO) executable with methods: run1(), run2(), run3(), run4() | HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/test/java/homework_4/singleton/) | Singleton App: private constructor and public method getInstance() | HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/) | Custom annotation class. | From f4c3f5d15a49a452e107670c4e7e3af197dc72fd Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 11 Aug 2021 16:23:26 +0300 Subject: [PATCH 37/67] mockito dependency added --- build.gradle | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index a8bb3555..7d78b575 100644 --- a/build.gradle +++ b/build.gradle @@ -10,16 +10,20 @@ repositories { } dependencies { - implementation 'org.junit.jupiter:junit-jupiter:5.7.0' - implementation 'org.jetbrains:annotations:20.1.0' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + implementation 'org.junit.jupiter:junit-jupiter:5.7.2' + implementation 'org.jetbrains:annotations:21.0.1' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2' // lombok compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20' testCompileOnly 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' + + // mockito + testImplementation 'org.mockito:mockito-core:3.11.2' + testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2' } test { From db6236983a73e1e647987074401d44066c39c8cb Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 16 Aug 2021 11:40:49 +0300 Subject: [PATCH 38/67] empty file: processing removed, test removed; text file renamed; --- .../custom_file_reader/CustomFileReader.java | 12 +---- .../{example.txt => file.txt} | 0 .../CustomFileReaderTest.java | 45 +++---------------- 3 files changed, 7 insertions(+), 50 deletions(-) rename src/main/resources/custom_file_reader/{example.txt => file.txt} (100%) diff --git a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java index b454cf02..6a86ca65 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -8,14 +8,12 @@ public class CustomFileReader { - private static final String FILE_IS_EMPTY = "File is empty!"; - private final String fileName; private final String dirPath; @ResourcesPath public CustomFileReader() { - this.fileName = "example.txt"; + this.fileName = "file.txt"; String tmpDirPath; try { ResourcesPath resourcesPath = (ResourcesPath) this.getClass().getConstructor().getDeclaredAnnotations()[0]; @@ -56,10 +54,6 @@ public void showDir() { DirectoryScan.scanDir(this.dirPath); } - private boolean isNotEmpty(String res) { - return !res.equals(""); - } - private boolean isNotExists(String res) { return res == null; } @@ -67,9 +61,7 @@ private boolean isNotExists(String res) { private void doExcellent(String result) { if (isNotExists(result)) { System.out.println("File " + this.fileName + " not found at: " + this.dirPath); - } else if (isNotEmpty(result)) { - printModifiedString(result); - } else System.out.println(FILE_IS_EMPTY); + } else printModifiedString(result); } } diff --git a/src/main/resources/custom_file_reader/example.txt b/src/main/resources/custom_file_reader/file.txt similarity index 100% rename from src/main/resources/custom_file_reader/example.txt rename to src/main/resources/custom_file_reader/file.txt diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java index d4dfc901..3b85d72f 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -13,7 +13,7 @@ class CustomFileReaderTest extends UnitBase { CustomFileReader customFileReader = new CustomFileReader(); String correctPath = "./src/main/resources/custom_file_reader/"; - String correctFileName = "example.txt"; + String correctFileName = "file.txt"; @Test void testRun1() { @@ -44,7 +44,7 @@ void testRun4() { } @Test - void testNotValidDataForConstuctorWParams() { + void testNotValidDataForConstructorWParams() { CustomFileReader cfr1 = new CustomFileReader(correctPath, "passwords.txt"); String expected = "File " + "passwords.txt" + " not found at: " + correctPath; cfr1.run1(); @@ -53,7 +53,7 @@ void testNotValidDataForConstuctorWParams() { } @Test - void testNotValidDataForConstuctorWParams2() { + void testNotValidDataForConstructorWParams2() { CustomFileReader cfr1 = new CustomFileReader("./src/", correctFileName); String expected = "File " + correctFileName + " not found at: " + "./src/"; cfr1.run4(); @@ -63,48 +63,12 @@ void testNotValidDataForConstuctorWParams2() { } @Test - void testEmptyConstuctor() { + void testEmptyConstructor() { new CustomFileReader(); String notExpected = "File " + correctFileName + " not found at: " + correctPath; assertNotEquals(notExpected, getOutput()); } - @Test - void testEmptyFileRun1() { - CustomFileReader cfr1 = new CustomFileReader(correctPath, "empty_file.txt"); - cfr1.run1(); - String expected = "File is empty!"; - String output = getOutput(); - assertEquals(expected, output); - } - - @Test - void testEmptyFileRun2() { - CustomFileReader cfr2 = new CustomFileReader(correctPath, "empty_file.txt"); - cfr2.run2(); - String expected = "File is empty!"; - String output = getOutput(); - assertEquals(expected, output); - } - - @Test - void testEmptyFileRun3() { - CustomFileReader cfr3 = new CustomFileReader(correctPath, "empty_file.txt"); - cfr3.run3(); - String expected = "File is empty!"; - String output = getOutput(); - assertEquals(expected, output); - } - - @Test - void testEmptyFileRun4() { - CustomFileReader cfr4 = new CustomFileReader(correctPath, "empty_file.txt"); - cfr4.run4(); - String expected = "File is empty!"; - String output = getOutput(); - assertEquals(expected, output); - } - @Test void testShowDirMethod() { CustomFileReader cfr1 = new CustomFileReader(correctPath, correctFileName); @@ -115,6 +79,7 @@ void testShowDirMethod() { File[] filesList = directoryPath.listFiles(); StringBuilder tmp = new StringBuilder(); tmp.append(correctPath).append(" contains:").append("\n--- --- ---\n"); + assertNotNull(filesList); for (File file : filesList) { tmp.append(file.getName()).append("\tat: ").append(file.getAbsolutePath()).append("\n").append("---").append("\n"); } From 1102432033c41359c81b8005b3359570e0f9534e Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 16 Aug 2021 21:34:55 +0300 Subject: [PATCH 39/67] recursion power added; test power added; --- src/main/java/homework_5/powered/Power.java | 13 +++++++++ .../java/homework_5/powered/PowerTest.java | 27 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/homework_5/powered/Power.java create mode 100644 src/test/java/homework_5/powered/PowerTest.java diff --git a/src/main/java/homework_5/powered/Power.java b/src/main/java/homework_5/powered/Power.java new file mode 100644 index 00000000..9defb5c0 --- /dev/null +++ b/src/main/java/homework_5/powered/Power.java @@ -0,0 +1,13 @@ +package homework_5.powered; + + +public class Power { + + private Power() {} + + public static double power(double base, int p) { + if (p != 0) return base * power(base, p-1); + return 1; + } + +} diff --git a/src/test/java/homework_5/powered/PowerTest.java b/src/test/java/homework_5/powered/PowerTest.java new file mode 100644 index 00000000..86317593 --- /dev/null +++ b/src/test/java/homework_5/powered/PowerTest.java @@ -0,0 +1,27 @@ +package homework_5.powered; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PowerTest { + + @Test + void test3_inPow_5() { + double expected = Math.pow(3, 5); + assertEquals(expected, Power.power(3, 5)); + } + + @Test + void test5_PoweredBy_10() { + double expected = Math.pow(5, 10); + assertEquals(expected, Power.power(5, 10)); + } + + @Test + void test9_PoweredBy_21() { + double expected = Math.pow(9, 12); + assertEquals(expected, Power.power(9, 12)); + } + +} \ No newline at end of file From 64b5e1236cd2e8744c48386f386bc2d94606997f Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 18 Aug 2021 12:52:15 +0300 Subject: [PATCH 40/67] negative power test added; negative power ability has been implemented; --- src/main/java/homework_5/powered/Power.java | 3 ++- .../java/homework_5/powered/PowerTest.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/homework_5/powered/Power.java b/src/main/java/homework_5/powered/Power.java index 9defb5c0..de8d5a24 100644 --- a/src/main/java/homework_5/powered/Power.java +++ b/src/main/java/homework_5/powered/Power.java @@ -6,7 +6,8 @@ public class Power { private Power() {} public static double power(double base, int p) { - if (p != 0) return base * power(base, p-1); + if (p > 0) return base * power(base, p-1); + if (p < 0) return 1/base * power(base, p+1); return 1; } diff --git a/src/test/java/homework_5/powered/PowerTest.java b/src/test/java/homework_5/powered/PowerTest.java index 86317593..9939ebb0 100644 --- a/src/test/java/homework_5/powered/PowerTest.java +++ b/src/test/java/homework_5/powered/PowerTest.java @@ -24,4 +24,22 @@ void test9_PoweredBy_21() { assertEquals(expected, Power.power(9, 12)); } + @Test + void test0_PoweredBy_1() { + double expected = Math.pow(0, 1); + assertEquals(expected, Power.power(0, 1)); + } + + @Test + void test0_PoweredBy_0() { + double expected = Math.pow(0, 0); + assertEquals(expected, Power.power(0, 0)); + } + + @Test + void test3_PoweredBy_Negative3() { + double expected = Math.pow(3, -3); + assertEquals(expected, Power.power(3, -3)); + } + } \ No newline at end of file From aa04eef7ad90f0d17c8b807a00ac6d5ff5815b42 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 18 Aug 2021 13:29:20 +0300 Subject: [PATCH 41/67] armstrong number realization; https://en.wikipedia.org/wiki/Narcissistic_number --- .../java/homework_5/armstrong/Armstrong.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/homework_5/armstrong/Armstrong.java diff --git a/src/main/java/homework_5/armstrong/Armstrong.java b/src/main/java/homework_5/armstrong/Armstrong.java new file mode 100644 index 00000000..c8f3b034 --- /dev/null +++ b/src/main/java/homework_5/armstrong/Armstrong.java @@ -0,0 +1,28 @@ +package homework_5.armstrong; + +import homework_5.powered.Power; + +public class Armstrong { + + public static void main(String[] args) { + int a = 135; + int b = 370; + int c = 12; + int d = 1234567; + System.out.println("arm(135, numLen(135)) = " + (long) arm(a, digitCounter(a))); + System.out.println("arm(370, numLen(370)) = " + (long) arm(b, digitCounter(b))); + System.out.println("arm(12, numLen(12)) = " + (long) arm(c, digitCounter(c))); + System.out.println("arm(1234567, digitCounter(1234567)) = " + (long) arm(d, digitCounter(d))); + } + + public static double arm(long n, int p) { + if (n < 10) return Power.power(n, p); + return Power.power(n%10, p) + arm(n/10, p); + } + + public static int digitCounter(int num) { + if (Math.abs(num) < 10) return 1; + return 1 + digitCounter(Math.abs(num)/10); + } + +} From 9ea484907f9904c122b7cdd4db2bbd1a0d60f0e9 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 18 Aug 2021 13:48:40 +0300 Subject: [PATCH 42/67] prints method name fix; --- src/main/java/homework_5/armstrong/Armstrong.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/homework_5/armstrong/Armstrong.java b/src/main/java/homework_5/armstrong/Armstrong.java index c8f3b034..6dd725d2 100644 --- a/src/main/java/homework_5/armstrong/Armstrong.java +++ b/src/main/java/homework_5/armstrong/Armstrong.java @@ -9,9 +9,9 @@ public static void main(String[] args) { int b = 370; int c = 12; int d = 1234567; - System.out.println("arm(135, numLen(135)) = " + (long) arm(a, digitCounter(a))); - System.out.println("arm(370, numLen(370)) = " + (long) arm(b, digitCounter(b))); - System.out.println("arm(12, numLen(12)) = " + (long) arm(c, digitCounter(c))); + System.out.println("arm(135, digitCounter(135)) = " + (long) arm(a, digitCounter(a))); + System.out.println("arm(370, digitCounter(370)) = " + (long) arm(b, digitCounter(b))); + System.out.println("arm(12, digitCounter(12)) = " + (long) arm(c, digitCounter(c))); System.out.println("arm(1234567, digitCounter(1234567)) = " + (long) arm(d, digitCounter(d))); } From fa218cb4c9df4f09e6bc0389e9167bd5a3f20bc6 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 21 Aug 2021 19:19:48 +0300 Subject: [PATCH 43/67] armstrong number computation app removed; --- .../java/homework_5/armstrong/Armstrong.java | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 src/main/java/homework_5/armstrong/Armstrong.java diff --git a/src/main/java/homework_5/armstrong/Armstrong.java b/src/main/java/homework_5/armstrong/Armstrong.java deleted file mode 100644 index 6dd725d2..00000000 --- a/src/main/java/homework_5/armstrong/Armstrong.java +++ /dev/null @@ -1,28 +0,0 @@ -package homework_5.armstrong; - -import homework_5.powered.Power; - -public class Armstrong { - - public static void main(String[] args) { - int a = 135; - int b = 370; - int c = 12; - int d = 1234567; - System.out.println("arm(135, digitCounter(135)) = " + (long) arm(a, digitCounter(a))); - System.out.println("arm(370, digitCounter(370)) = " + (long) arm(b, digitCounter(b))); - System.out.println("arm(12, digitCounter(12)) = " + (long) arm(c, digitCounter(c))); - System.out.println("arm(1234567, digitCounter(1234567)) = " + (long) arm(d, digitCounter(d))); - } - - public static double arm(long n, int p) { - if (n < 10) return Power.power(n, p); - return Power.power(n%10, p) + arm(n/10, p); - } - - public static int digitCounter(int num) { - if (Math.abs(num) < 10) return 1; - return 1 + digitCounter(Math.abs(num)/10); - } - -} From a258b855e99a9d05232de3eb0e78c02e2af87432 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 21 Aug 2021 19:20:06 +0300 Subject: [PATCH 44/67] org.jetbrains:annotations updated to 22.0.0; mockito removed; --- build.gradle | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 7d78b575..bbc25319 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ repositories { dependencies { implementation 'org.junit.jupiter:junit-jupiter:5.7.2' - implementation 'org.jetbrains:annotations:21.0.1' + implementation 'org.jetbrains:annotations:22.0.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2' @@ -20,10 +20,6 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.20' testCompileOnly 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' - - // mockito - testImplementation 'org.mockito:mockito-core:3.11.2' - testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2' } test { From 0f7e68cd59f675f0ae596c684e14154368135404 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 21 Aug 2021 19:20:37 +0300 Subject: [PATCH 45/67] custom regex matcher added; tests for custom regex matcher added; --- .../CustomRegexMatcher.java | 27 +++++++++ .../CustomRegexMatcherTest.java | 57 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java create mode 100644 src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java 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..4ddadbac --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -0,0 +1,27 @@ +package homework_5.custom_regex_matcher; + +import java.util.Scanner; + +public class CustomRegexMatcher { + + private CustomRegexMatcher() { } + + private static final String PHONE_NUMBER_FORMAT = "(\\+\\d)\\s\\(\\d{3}\\)\\s(\\d{3})-(\\d{4})"; + + public static void run() { + System.out.println(validate(getInput())); + } + + private static String getInput() { + try (Scanner scanner = new Scanner(System.in)) { + return scanner.nextLine().trim(); + } + } + + // should be written as: `+# (###) ###-####`, where # - is an integer number + private static Boolean validate(String str) { + return str.matches(PHONE_NUMBER_FORMAT); + } + + +} diff --git a/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java new file mode 100644 index 00000000..bfd96257 --- /dev/null +++ b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -0,0 +1,57 @@ +package homework_5.custom_regex_matcher; + +import base.UnitBase; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class CustomRegexMatcherTest extends UnitBase { + + @Test + void testValidPhoneNumber() { + String expected = "true"; + setInput("+1 (267) 759-9000"); + CustomRegexMatcher.run(); + printOut(); + assertEquals(expected, getOutput()); + } + + @Test + void testOneMoreValidPhoneNumber() { + String expected = "true"; + setInput("\u002B\u0031 \u0028\u0032\u0036\u0037\u0029 \u0037\u0035\u0039\u002D\u0038\u0039\u0038\u0039"); + CustomRegexMatcher.run(); + printOut(); + assertEquals(expected, getOutput()); + } + + public static Stream falseTestCases() { + return Stream.of( + Arguments.of("+9 (2902) 123-4567"), + Arguments.of("not number at all, ho-ho"), + Arguments.of("-2 (123) 456-7890"), + Arguments.of("(+1) (123) 456-7890"), + Arguments.of("_12345678901"), + Arguments.of("+1 234 567-8909"), + Arguments.of("+1 (3.14) 742-7580"), + Arguments.of("\u1F606") + ); + } + + @ParameterizedTest + @MethodSource("falseTestCases") + void testFactorial(String input) { + String expected = "false"; + setInput(input); + CustomRegexMatcher.run(); + printOut(); + assertEquals(expected, getOutput()); + } + + +} From f6fe947920367be8603a3ed83bb9c6abf2ca481d Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 21 Aug 2021 19:21:08 +0300 Subject: [PATCH 46/67] PowerOfNumber small fixes; --- .../power_of_number/PowerOfNumber.java | 49 ++++++++++++ src/main/java/homework_5/powered/Power.java | 14 ---- .../power_of_number/PowerOfNumberTest.java | 79 +++++++++++++++++++ .../java/homework_5/powered/PowerTest.java | 45 ----------- 4 files changed, 128 insertions(+), 59 deletions(-) create mode 100644 src/main/java/homework_5/power_of_number/PowerOfNumber.java delete mode 100644 src/main/java/homework_5/powered/Power.java create mode 100644 src/test/java/homework_5/power_of_number/PowerOfNumberTest.java delete mode 100644 src/test/java/homework_5/powered/PowerTest.java 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..5ee2a6a5 --- /dev/null +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -0,0 +1,49 @@ +package homework_5.power_of_number; + +import java.util.NoSuchElementException; +import java.util.Scanner; + +public class PowerOfNumber { + + private static final String ERROR = "Only 2 non-negative integers are allowed"; + + public void run() { + int[] array = getInput(); + if (array.length == 2) System.out.println(power(array[0], array[1])); + } + + private int[] getInput() { + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Please, input the values in format: number power"); + String[] input = scanner.nextLine().split(" "); + if (input.length == 2) { + int[] result = new int[2]; + for (int i = 0; i < input.length; i++) { + result[i] = Integer.parseInt(input[i]); + if (!isValid(result[i])) { + System.out.println(ERROR); + return new int[0]; + } + } + return result; + } else { + throw new NumberFormatException(); + } + } catch (NumberFormatException | NoSuchElementException e) { + System.out.println(ERROR); + return new int[0]; + } + } + + private boolean isValid(int num) { + return num >= 0; + } + + private int power(int base, int p) { + if (p > 0) return base * power(base, p-1); + if (p < 0) return 1/base * power(base, p+1); + return 1; + } + + +} diff --git a/src/main/java/homework_5/powered/Power.java b/src/main/java/homework_5/powered/Power.java deleted file mode 100644 index de8d5a24..00000000 --- a/src/main/java/homework_5/powered/Power.java +++ /dev/null @@ -1,14 +0,0 @@ -package homework_5.powered; - - -public class Power { - - private Power() {} - - public static double power(double base, int p) { - if (p > 0) return base * power(base, p-1); - if (p < 0) return 1/base * power(base, p+1); - return 1; - } - -} diff --git a/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java new file mode 100644 index 00000000..a3f0660a --- /dev/null +++ b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java @@ -0,0 +1,79 @@ +package homework_5.power_of_number; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PowerOfNumberTest extends UnitBase { + + PowerOfNumber powerOfNumber = new PowerOfNumber(); + + private static final String ERROR = "Only 2 non-negative integers are allowed"; + + @Test + void test3_inPow_5() { + String expected = String.valueOf((int) Math.pow(3, 5)); + setInput("3 5"); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(expected, getOutputLines()[0]); + } + + @Test + void test0_inPow_0() { + String expected = String.valueOf((int) Math.pow(0, 0)); + setInput("0 0"); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(expected, getOutputLines()[0]); + } + + @Test + void givenEmptyString_WhenGetInput_ThenError() { + setInput(""); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(ERROR, getOutputLines()[0]); + } + + @Test + void givenMoreValues_WhenGetInput_ThenError() { + setInput("1 2 3 4 str"); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(ERROR, getOutputLines()[0]); + } + + @Test + void givenLessValues_WhenGetInput_ThenError() { + setInput("1 "); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(ERROR, getOutputLines()[0]); + } + + @Test + void givenDoubles_WhenGetInput_ThenError() { + setInput("1.93 2.47"); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(ERROR, getOutputLines()[0]); + } + + @Test + void givenOverflowNumbers_WhenGetInput_ThenError() { + setInput("999999999999999999 999999999999999999"); + powerOfNumber.run(); + printOut(); + removeFromOutput("Please, input the values in format: number power\n"); + assertEquals(ERROR, getOutputLines()[0]); + } + +} diff --git a/src/test/java/homework_5/powered/PowerTest.java b/src/test/java/homework_5/powered/PowerTest.java deleted file mode 100644 index 9939ebb0..00000000 --- a/src/test/java/homework_5/powered/PowerTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package homework_5.powered; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class PowerTest { - - @Test - void test3_inPow_5() { - double expected = Math.pow(3, 5); - assertEquals(expected, Power.power(3, 5)); - } - - @Test - void test5_PoweredBy_10() { - double expected = Math.pow(5, 10); - assertEquals(expected, Power.power(5, 10)); - } - - @Test - void test9_PoweredBy_21() { - double expected = Math.pow(9, 12); - assertEquals(expected, Power.power(9, 12)); - } - - @Test - void test0_PoweredBy_1() { - double expected = Math.pow(0, 1); - assertEquals(expected, Power.power(0, 1)); - } - - @Test - void test0_PoweredBy_0() { - double expected = Math.pow(0, 0); - assertEquals(expected, Power.power(0, 0)); - } - - @Test - void test3_PoweredBy_Negative3() { - double expected = Math.pow(3, -3); - assertEquals(expected, Power.power(3, -3)); - } - -} \ No newline at end of file From 71172c161eda07f0960f8be54f74d618df7cf60d Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sat, 21 Aug 2021 19:21:30 +0300 Subject: [PATCH 47/67] hw5 added; --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 15cf585b..53f2c134 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ HW3 | [Immutable Class](./src/main/java/homework_3/ImmutableClass.java) | Crea HW4.1 | [Custom File Reader](./src/main/java/homework_4/custom_file_reader/)
[Tests](./src/test/java/homework_4/custom_file_reader/) | App reading data from file and prints to console. Text file path: main/resources/custom_file_reader/. Reading file in 4 different ways (one of them using NIO) executable with methods: run1(), run2(), run3(), run4() | HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/test/java/homework_4/singleton/) | Singleton App: private constructor and public method getInstance() | HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/) | Custom annotation class. | +HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Tests](./src/test/java/homework_5/power_of_number/) | Power of number recursion using App. Reads 2 non-negative integer numbers from console and prints out the result of exponentiation. Only for positive integer numbers. On any problem output message will be gotten: "Only 2 non-negative integers are allowed" | +HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. |
From cd78f32ca0ff729c31efac1042dea5a1918ee4ea Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 29 Aug 2021 17:43:01 +0300 Subject: [PATCH 48/67] hw6 added; --- .../GenerateCollisions.java | 29 +++++++++++++++++ .../map_problems_generator/Getable.java | 7 ++++ .../MapProblemsGenerator.java | 17 ++++++++++ .../map_problems_generator/MutableClass.java | 32 +++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 src/main/java/homework_6/map_problems_generator/GenerateCollisions.java create mode 100644 src/main/java/homework_6/map_problems_generator/Getable.java create mode 100644 src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java create mode 100644 src/main/java/homework_6/map_problems_generator/MutableClass.java diff --git a/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java b/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java new file mode 100644 index 00000000..fa0b0213 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java @@ -0,0 +1,29 @@ +package homework_6.map_problems_generator; + +public class GenerateCollisions implements Getable { + + private final String val; + + public GenerateCollisions(String s) { + this.val = s; + } + + public String getVal() { + return val; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + GenerateCollisions that = (GenerateCollisions) obj; + return this.getVal().equals(that.getVal()); + } + + +} diff --git a/src/main/java/homework_6/map_problems_generator/Getable.java b/src/main/java/homework_6/map_problems_generator/Getable.java new file mode 100644 index 00000000..2150d3f7 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/Getable.java @@ -0,0 +1,7 @@ +package homework_6.map_problems_generator; + +public interface Getable { + + String getVal(); + +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java new file mode 100644 index 00000000..314f4314 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java @@ -0,0 +1,17 @@ +package homework_6.map_problems_generator; + +public class MapProblemsGenerator { + + public GenerateCollisions getGenerateCollisions(String value) { + return new GenerateCollisions(value); + } + + public MutableClass getMutableClass(String value) { + MutableClass mutableClass = new MutableClass(); + mutableClass.setVal(value); + return mutableClass; + } + + +} + diff --git a/src/main/java/homework_6/map_problems_generator/MutableClass.java b/src/main/java/homework_6/map_problems_generator/MutableClass.java new file mode 100644 index 00000000..100c2b3f --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MutableClass.java @@ -0,0 +1,32 @@ +package homework_6.map_problems_generator; + +import java.util.Objects; +import java.util.Random; + +public class MutableClass implements Getable { + + private String val; + + public String getVal() { + return val; + } + + public void setVal(String s) { + this.val = s; + } + + @Override + public int hashCode() { + return new Random().nextInt(Integer.MAX_VALUE - 1); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MutableClass that = (MutableClass) o; + return Objects.equals(val, that.val); + } + + +} From ba36011066f34913cd0d8648828eb34cd0aa6f65 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 29 Aug 2021 17:43:24 +0300 Subject: [PATCH 49/67] hw6 tests added; --- .../MapProblemsGeneratorTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java diff --git a/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java b/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java new file mode 100644 index 00000000..44aa2587 --- /dev/null +++ b/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java @@ -0,0 +1,46 @@ +package homework_6.map_problems_generator; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class MapProblemsGeneratorTest { + + Map map = new HashMap<>(); + MapProblemsGenerator mapProblemsGenerator = new MapProblemsGenerator(); + + @SuppressWarnings("java:S5785") + @Test + void testOneHundredPercentCollisionsInHashMap() { + GenerateCollisions gc1 = mapProblemsGenerator.getGenerateCollisions("Hello"); + GenerateCollisions gc2 = mapProblemsGenerator.getGenerateCollisions("Goodbye"); + map.put(gc1, gc1.getVal()); + map.put(gc2, gc2.getVal()); + assertEquals(gc1.hashCode(), gc2.hashCode()); + assertFalse(gc1.equals(gc2)); + map.clear(); + } + + @Test + void testMutableClass() { + MutableClass mutableClass = mapProblemsGenerator.getMutableClass("default"); + map.put(mutableClass, mutableClass.getVal()); + assertNull(map.get(mutableClass)); + map.clear(); + } + + @SuppressWarnings("java:S5785") + @Test + void testMutableClassEqualsMethodWorksCorrectly() { + MutableClass mc1 = mapProblemsGenerator.getMutableClass("theonlyone"); + MutableClass mc2 = mapProblemsGenerator.getMutableClass("theonlyone"); + assertTrue(mc1.equals(mc2)); + MutableClass mcDifferent = mapProblemsGenerator.getMutableClass("anotherone"); + assertFalse(mc1.equals(mcDifferent)); + } + + +} From 2cbf01241ef41b3fe6f980c2a5f8eeb0c570d454 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 29 Aug 2021 18:43:27 +0300 Subject: [PATCH 50/67] interface renamed; interface method removed; --- .../map_problems_generator/GenerateCollisions.java | 2 +- .../java/homework_6/map_problems_generator/Getable.java | 7 ------- .../java/homework_6/map_problems_generator/MapKeyable.java | 4 ++++ .../map_problems_generator/MapProblemsGenerator.java | 1 - .../homework_6/map_problems_generator/MutableClass.java | 2 +- .../map_problems_generator/MapProblemsGeneratorTest.java | 2 +- 6 files changed, 7 insertions(+), 11 deletions(-) delete mode 100644 src/main/java/homework_6/map_problems_generator/Getable.java create mode 100644 src/main/java/homework_6/map_problems_generator/MapKeyable.java diff --git a/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java b/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java index fa0b0213..59f47e79 100644 --- a/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java +++ b/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java @@ -1,6 +1,6 @@ package homework_6.map_problems_generator; -public class GenerateCollisions implements Getable { +public class GenerateCollisions implements MapKeyable { private final String val; diff --git a/src/main/java/homework_6/map_problems_generator/Getable.java b/src/main/java/homework_6/map_problems_generator/Getable.java deleted file mode 100644 index 2150d3f7..00000000 --- a/src/main/java/homework_6/map_problems_generator/Getable.java +++ /dev/null @@ -1,7 +0,0 @@ -package homework_6.map_problems_generator; - -public interface Getable { - - String getVal(); - -} diff --git a/src/main/java/homework_6/map_problems_generator/MapKeyable.java b/src/main/java/homework_6/map_problems_generator/MapKeyable.java new file mode 100644 index 00000000..86d336cc --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapKeyable.java @@ -0,0 +1,4 @@ +package homework_6.map_problems_generator; + +public interface MapKeyable { +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java index 314f4314..f63b538f 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java @@ -14,4 +14,3 @@ public MutableClass getMutableClass(String value) { } - diff --git a/src/main/java/homework_6/map_problems_generator/MutableClass.java b/src/main/java/homework_6/map_problems_generator/MutableClass.java index 100c2b3f..00643cce 100644 --- a/src/main/java/homework_6/map_problems_generator/MutableClass.java +++ b/src/main/java/homework_6/map_problems_generator/MutableClass.java @@ -3,7 +3,7 @@ import java.util.Objects; import java.util.Random; -public class MutableClass implements Getable { +public class MutableClass implements MapKeyable { private String val; diff --git a/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java b/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java index 44aa2587..be5e0b88 100644 --- a/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java +++ b/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java @@ -9,7 +9,7 @@ class MapProblemsGeneratorTest { - Map map = new HashMap<>(); + Map map = new HashMap<>(); MapProblemsGenerator mapProblemsGenerator = new MapProblemsGenerator(); @SuppressWarnings("java:S5785") From 8da9436f6fbcc7bc8ba527edd8d0e138d96e5bf2 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 29 Aug 2021 19:14:27 +0300 Subject: [PATCH 51/67] hw6, hw6 tests added; --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 53f2c134..3453c037 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,10 @@ HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/t HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/) | Custom annotation class. | HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Tests](./src/test/java/homework_5/power_of_number/) | Power of number recursion using App. Reads 2 non-negative integer numbers from console and prints out the result of exponentiation. Only for positive integer numbers. On any problem output message will be gotten: "Only 2 non-negative integers are allowed" | HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. | +HW6 | [MapProblemsGenerator](./src/main/java/homework_6/map_problems_generator/)
[Tests](./src/test/java/homework_6/map_problems_generator/) | App which has:
1) Class creating 100% HashMap collisions
2) Mutable class with overridden HashCode/Equals. When put MutableClass object into HashMap as key - can't retrieve it (equals works correctly) |
___ -[codingbat profile](https://codingbat.com/done?user=devngrow@gmail.com&tag=1205090974) \ No newline at end of file +[codingbat profile](https://codingbat.com/done?user=devngrow@gmail.com&tag=1205090974) `done` From 9851efb403c825a9d01bef49fb2ac593bcd78cdb Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Mon, 30 Aug 2021 21:31:08 +0300 Subject: [PATCH 52/67] hw6 upd; hw6 tests removed; readme upd; --- README.md | 2 +- .../GenerateCollisions.java | 2 +- .../MapKeyable.java | 4 ++ .../MapProblemsCollisionGenerator.java} | 4 +- .../MutableClass.java | 2 +- .../map_problems_generator/MapKeyable.java | 4 -- .../MapProblemsGeneratorTest.java | 46 ------------------- 7 files changed, 9 insertions(+), 55 deletions(-) rename src/main/java/homework_6/{map_problems_generator => map_problems_collision_generator}/GenerateCollisions.java (91%) create mode 100644 src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java rename src/main/java/homework_6/{map_problems_generator/MapProblemsGenerator.java => map_problems_collision_generator/MapProblemsCollisionGenerator.java} (75%) rename src/main/java/homework_6/{map_problems_generator => map_problems_collision_generator}/MutableClass.java (92%) delete mode 100644 src/main/java/homework_6/map_problems_generator/MapKeyable.java delete mode 100644 src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java diff --git a/README.md b/README.md index 3453c037..39e0eeed 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/t HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/) | Custom annotation class. | HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Tests](./src/test/java/homework_5/power_of_number/) | Power of number recursion using App. Reads 2 non-negative integer numbers from console and prints out the result of exponentiation. Only for positive integer numbers. On any problem output message will be gotten: "Only 2 non-negative integers are allowed" | HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. | -HW6 | [MapProblemsGenerator](./src/main/java/homework_6/map_problems_generator/)
[Tests](./src/test/java/homework_6/map_problems_generator/) | App which has:
1) Class creating 100% HashMap collisions
2) Mutable class with overridden HashCode/Equals. When put MutableClass object into HashMap as key - can't retrieve it (equals works correctly) | +HW6 | [MapProblemsGenerator](./src/main/java/homework_6/map_problems_collision_generator/) | App which has:
1) Class creating 100% HashMap collisions
2) Mutable class with overridden HashCode/Equals. When put MutableClass object into HashMap as key - can't retrieve it (equals works correctly) |
diff --git a/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java b/src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java similarity index 91% rename from src/main/java/homework_6/map_problems_generator/GenerateCollisions.java rename to src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java index 59f47e79..323440d4 100644 --- a/src/main/java/homework_6/map_problems_generator/GenerateCollisions.java +++ b/src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java @@ -1,4 +1,4 @@ -package homework_6.map_problems_generator; +package homework_6.map_problems_collision_generator; public class GenerateCollisions implements MapKeyable { diff --git a/src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java b/src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java new file mode 100644 index 00000000..5ddd8f1e --- /dev/null +++ b/src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java @@ -0,0 +1,4 @@ +package homework_6.map_problems_collision_generator; + +public interface MapKeyable { +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java similarity index 75% rename from src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java rename to src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java index f63b538f..b88f1c7e 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java +++ b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java @@ -1,6 +1,6 @@ -package homework_6.map_problems_generator; +package homework_6.map_problems_collision_generator; -public class MapProblemsGenerator { +public class MapProblemsCollisionGenerator { public GenerateCollisions getGenerateCollisions(String value) { return new GenerateCollisions(value); diff --git a/src/main/java/homework_6/map_problems_generator/MutableClass.java b/src/main/java/homework_6/map_problems_collision_generator/MutableClass.java similarity index 92% rename from src/main/java/homework_6/map_problems_generator/MutableClass.java rename to src/main/java/homework_6/map_problems_collision_generator/MutableClass.java index 00643cce..a8b9b5d0 100644 --- a/src/main/java/homework_6/map_problems_generator/MutableClass.java +++ b/src/main/java/homework_6/map_problems_collision_generator/MutableClass.java @@ -1,4 +1,4 @@ -package homework_6.map_problems_generator; +package homework_6.map_problems_collision_generator; import java.util.Objects; import java.util.Random; diff --git a/src/main/java/homework_6/map_problems_generator/MapKeyable.java b/src/main/java/homework_6/map_problems_generator/MapKeyable.java deleted file mode 100644 index 86d336cc..00000000 --- a/src/main/java/homework_6/map_problems_generator/MapKeyable.java +++ /dev/null @@ -1,4 +0,0 @@ -package homework_6.map_problems_generator; - -public interface MapKeyable { -} diff --git a/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java b/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java deleted file mode 100644 index be5e0b88..00000000 --- a/src/test/java/homework_6/map_problems_generator/MapProblemsGeneratorTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package homework_6.map_problems_generator; - -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -class MapProblemsGeneratorTest { - - Map map = new HashMap<>(); - MapProblemsGenerator mapProblemsGenerator = new MapProblemsGenerator(); - - @SuppressWarnings("java:S5785") - @Test - void testOneHundredPercentCollisionsInHashMap() { - GenerateCollisions gc1 = mapProblemsGenerator.getGenerateCollisions("Hello"); - GenerateCollisions gc2 = mapProblemsGenerator.getGenerateCollisions("Goodbye"); - map.put(gc1, gc1.getVal()); - map.put(gc2, gc2.getVal()); - assertEquals(gc1.hashCode(), gc2.hashCode()); - assertFalse(gc1.equals(gc2)); - map.clear(); - } - - @Test - void testMutableClass() { - MutableClass mutableClass = mapProblemsGenerator.getMutableClass("default"); - map.put(mutableClass, mutableClass.getVal()); - assertNull(map.get(mutableClass)); - map.clear(); - } - - @SuppressWarnings("java:S5785") - @Test - void testMutableClassEqualsMethodWorksCorrectly() { - MutableClass mc1 = mapProblemsGenerator.getMutableClass("theonlyone"); - MutableClass mc2 = mapProblemsGenerator.getMutableClass("theonlyone"); - assertTrue(mc1.equals(mc2)); - MutableClass mcDifferent = mapProblemsGenerator.getMutableClass("anotherone"); - assertFalse(mc1.equals(mcDifferent)); - } - - -} From d44b458ec26d99c3be22de77f5d522963894ea4f Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 31 Aug 2021 21:59:53 +0300 Subject: [PATCH 53/67] methods name refactored; hw6 refactored, structure changed; --- .../power_of_number/PowerOfNumber.java | 5 +- .../GenerateCollisions.java | 29 --------- .../Main.java | 19 ++++++ .../MapKeyable.java | 4 -- .../MapProblemsCollisionGenerator.java | 28 ++++++-- ....java => MapProblemsMutableGenerator.java} | 13 ++-- .../custom_annotation/ResourcesPathTest.java | 1 - .../CustomFileReaderTest.java | 22 ++++--- .../singleton/SingletonMenuTest.java | 3 +- .../CustomRegexMatcherTest.java | 9 ++- .../power_of_number/PowerOfNumberTest.java | 64 +++++++------------ 11 files changed, 93 insertions(+), 104 deletions(-) delete mode 100644 src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java create mode 100644 src/main/java/homework_6/map_problems_collision_generator/Main.java delete mode 100644 src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java rename src/main/java/homework_6/map_problems_collision_generator/{MutableClass.java => MapProblemsMutableGenerator.java} (66%) 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 5ee2a6a5..701a87ac 100644 --- a/src/main/java/homework_5/power_of_number/PowerOfNumber.java +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -18,11 +18,10 @@ private int[] getInput() { String[] input = scanner.nextLine().split(" "); if (input.length == 2) { int[] result = new int[2]; - for (int i = 0; i < input.length; i++) { + for (int i = 0; i < 2; i++) { result[i] = Integer.parseInt(input[i]); if (!isValid(result[i])) { - System.out.println(ERROR); - return new int[0]; + throw new NumberFormatException(); } } return result; diff --git a/src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java b/src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java deleted file mode 100644 index 323440d4..00000000 --- a/src/main/java/homework_6/map_problems_collision_generator/GenerateCollisions.java +++ /dev/null @@ -1,29 +0,0 @@ -package homework_6.map_problems_collision_generator; - -public class GenerateCollisions implements MapKeyable { - - private final String val; - - public GenerateCollisions(String s) { - this.val = s; - } - - public String getVal() { - return val; - } - - @Override - public int hashCode() { - return 0; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || obj.getClass() != this.getClass()) return false; - GenerateCollisions that = (GenerateCollisions) obj; - return this.getVal().equals(that.getVal()); - } - - -} diff --git a/src/main/java/homework_6/map_problems_collision_generator/Main.java b/src/main/java/homework_6/map_problems_collision_generator/Main.java new file mode 100644 index 00000000..d0de1d27 --- /dev/null +++ b/src/main/java/homework_6/map_problems_collision_generator/Main.java @@ -0,0 +1,19 @@ +package homework_6.map_problems_collision_generator; + +import java.util.HashMap; +import java.util.Map; + +public class Main { + + public static void main(String[] args) { + + Map unluckyMap = new HashMap<>(); + + MapProblemsMutableGenerator mapProblemsMutableGenerator = new MapProblemsMutableGenerator(); + mapProblemsMutableGenerator.setVal("ложим!"); + + unluckyMap.put(mapProblemsMutableGenerator, mapProblemsMutableGenerator.getVal()); + System.out.println("не можИм! " + unluckyMap.get(mapProblemsMutableGenerator)); + } + +} diff --git a/src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java b/src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java deleted file mode 100644 index 5ddd8f1e..00000000 --- a/src/main/java/homework_6/map_problems_collision_generator/MapKeyable.java +++ /dev/null @@ -1,4 +0,0 @@ -package homework_6.map_problems_collision_generator; - -public interface MapKeyable { -} diff --git a/src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java index b88f1c7e..6fc72057 100644 --- a/src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java +++ b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsCollisionGenerator.java @@ -2,15 +2,31 @@ public class MapProblemsCollisionGenerator { - public GenerateCollisions getGenerateCollisions(String value) { - return new GenerateCollisions(value); + private final String val; + + public MapProblemsCollisionGenerator() { + this.val = "кладем?"; + } + + public MapProblemsCollisionGenerator(String s) { + this.val = s; } - public MutableClass getMutableClass(String value) { - MutableClass mutableClass = new MutableClass(); - mutableClass.setVal(value); - return mutableClass; + public String getVal() { + return val; } + @Override + public int hashCode() { + return 0; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + MapProblemsCollisionGenerator that = (MapProblemsCollisionGenerator) obj; + return this.getVal().equals(that.getVal()); + } } diff --git a/src/main/java/homework_6/map_problems_collision_generator/MutableClass.java b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java similarity index 66% rename from src/main/java/homework_6/map_problems_collision_generator/MutableClass.java rename to src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java index a8b9b5d0..9fb506e8 100644 --- a/src/main/java/homework_6/map_problems_collision_generator/MutableClass.java +++ b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java @@ -3,16 +3,20 @@ import java.util.Objects; import java.util.Random; -public class MutableClass implements MapKeyable { +public class MapProblemsMutableGenerator { private String val; + public MapProblemsMutableGenerator() { + setVal("кладем?"); + } + public String getVal() { return val; } - public void setVal(String s) { - this.val = s; + public void setVal(String val) { + this.val = val; } @Override @@ -24,9 +28,8 @@ public int hashCode() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MutableClass that = (MutableClass) o; + MapProblemsMutableGenerator that = (MapProblemsMutableGenerator) o; return Objects.equals(val, that.val); } - } diff --git a/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java b/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java index 06dfb83f..72359d64 100644 --- a/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java +++ b/src/test/java/homework_4/custom_annotation/ResourcesPathTest.java @@ -7,7 +7,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; - class ResourcesPathTest { @Test diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java index 3b85d72f..fdab46d9 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -8,7 +8,6 @@ import static org.junit.jupiter.api.Assertions.*; - class CustomFileReaderTest extends UnitBase { CustomFileReader customFileReader = new CustomFileReader(); @@ -16,35 +15,35 @@ class CustomFileReaderTest extends UnitBase { String correctFileName = "file.txt"; @Test - void testRun1() { + void testValidRun1Method() { customFileReader.run1(); String result = getOutput(); assertTrue(checkResult(result)); } @Test - void testRun2() { + void testValidRun2Method() { customFileReader.run2(); String result = getOutput(); assertTrue(checkResult(result)); } @Test - void testRun3() { + void testValidRun3Method() { customFileReader.run3(); String result = getOutput(); assertTrue(checkResult(result)); } @Test - void testRun4() { + void testValidRun4Method() { customFileReader.run4(); String result = getOutput(); assertTrue(checkResult(result)); } @Test - void testNotValidDataForConstructorWParams() { + void testNotExistingFileAsConstructorParameter() { CustomFileReader cfr1 = new CustomFileReader(correctPath, "passwords.txt"); String expected = "File " + "passwords.txt" + " not found at: " + correctPath; cfr1.run1(); @@ -53,12 +52,11 @@ void testNotValidDataForConstructorWParams() { } @Test - void testNotValidDataForConstructorWParams2() { + void testCorrectFileNameAndIncorrectFilePathAsConstuctorParameter() { CustomFileReader cfr1 = new CustomFileReader("./src/", correctFileName); String expected = "File " + correctFileName + " not found at: " + "./src/"; cfr1.run4(); String output = getOutput(); - System.out.println(output); assertEquals(expected, output); } @@ -81,7 +79,13 @@ void testShowDirMethod() { tmp.append(correctPath).append(" contains:").append("\n--- --- ---\n"); assertNotNull(filesList); for (File file : filesList) { - tmp.append(file.getName()).append("\tat: ").append(file.getAbsolutePath()).append("\n").append("---").append("\n"); + tmp + .append(file.getName()) + .append("\tat: ") + .append(file.getAbsolutePath()) + .append("\n") + .append("---") + .append("\n"); } tmp.append("--- --- ---"); String expected = String.valueOf(tmp); diff --git a/src/test/java/homework_4/singleton/SingletonMenuTest.java b/src/test/java/homework_4/singleton/SingletonMenuTest.java index dd08016e..b6160bfe 100644 --- a/src/test/java/homework_4/singleton/SingletonMenuTest.java +++ b/src/test/java/homework_4/singleton/SingletonMenuTest.java @@ -4,11 +4,10 @@ import static org.junit.jupiter.api.Assertions.*; - class SingletonMenuTest { @Test - void testInstances() { + void testCreatingInstancesOfSingletonClass() { SingletonMenu expected = SingletonMenu.getInstance(); SingletonMenu current = SingletonMenu.getInstance(); assertSame(expected, current); diff --git a/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java index bfd96257..1b73436b 100644 --- a/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java +++ b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -22,7 +22,7 @@ void testValidPhoneNumber() { } @Test - void testOneMoreValidPhoneNumber() { + void testValidUnicodeInputNumber() { String expected = "true"; setInput("\u002B\u0031 \u0028\u0032\u0036\u0037\u0029 \u0037\u0035\u0039\u002D\u0038\u0039\u0038\u0039"); CustomRegexMatcher.run(); @@ -30,7 +30,7 @@ void testOneMoreValidPhoneNumber() { assertEquals(expected, getOutput()); } - public static Stream falseTestCases() { + public static Stream incorrectPhoneNumbersFormats() { return Stream.of( Arguments.of("+9 (2902) 123-4567"), Arguments.of("not number at all, ho-ho"), @@ -44,8 +44,8 @@ public static Stream falseTestCases() { } @ParameterizedTest - @MethodSource("falseTestCases") - void testFactorial(String input) { + @MethodSource("incorrectPhoneNumbersFormats") + void testSetOfIncorrectPhoneNumbersFormats(String input) { String expected = "false"; setInput(input); CustomRegexMatcher.run(); @@ -53,5 +53,4 @@ void testFactorial(String input) { assertEquals(expected, getOutput()); } - } diff --git a/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java index a3f0660a..47e7ac8f 100644 --- a/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java +++ b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java @@ -2,8 +2,13 @@ import base.UnitBase; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import static org.junit.jupiter.api.Assertions.*; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; class PowerOfNumberTest extends UnitBase { @@ -12,8 +17,8 @@ class PowerOfNumberTest extends UnitBase { private static final String ERROR = "Only 2 non-negative integers are allowed"; @Test - void test3_inPow_5() { - String expected = String.valueOf((int) Math.pow(3, 5)); + void testPowerWithValidInput() { + String expected = convertDoubleToIntAndReturnAsString(Math.pow(3, 5)); setInput("3 5"); powerOfNumber.run(); printOut(); @@ -22,8 +27,8 @@ void test3_inPow_5() { } @Test - void test0_inPow_0() { - String expected = String.valueOf((int) Math.pow(0, 0)); + void testPowerWithValidInput_ZeroPowerOfZero() { + String expected = convertDoubleToIntAndReturnAsString(Math.pow(0, 0)); setInput("0 0"); powerOfNumber.run(); printOut(); @@ -31,49 +36,28 @@ void test0_inPow_0() { assertEquals(expected, getOutputLines()[0]); } - @Test - void givenEmptyString_WhenGetInput_ThenError() { - setInput(""); - powerOfNumber.run(); - printOut(); - removeFromOutput("Please, input the values in format: number power\n"); - assertEquals(ERROR, getOutputLines()[0]); - } - - @Test - void givenMoreValues_WhenGetInput_ThenError() { - setInput("1 2 3 4 str"); - powerOfNumber.run(); - printOut(); - removeFromOutput("Please, input the values in format: number power\n"); - assertEquals(ERROR, getOutputLines()[0]); - } - - @Test - void givenLessValues_WhenGetInput_ThenError() { - setInput("1 "); - powerOfNumber.run(); - printOut(); - removeFromOutput("Please, input the values in format: number power\n"); - assertEquals(ERROR, getOutputLines()[0]); + public static Stream incorrectInputs() { + return Stream.of( + Arguments.of(""), + Arguments.of("1 2 3 4 str"), + Arguments.of("1 "), + Arguments.of("1.93 2.47"), + Arguments.of("999999999999999999 999999999999999999") + ); } - @Test - void givenDoubles_WhenGetInput_ThenError() { - setInput("1.93 2.47"); + @ParameterizedTest + @MethodSource("incorrectInputs") + void testIncorrectInputs_ErrorExpected(String incorrectInput) { + setInput(incorrectInput); powerOfNumber.run(); printOut(); removeFromOutput("Please, input the values in format: number power\n"); assertEquals(ERROR, getOutputLines()[0]); } - @Test - void givenOverflowNumbers_WhenGetInput_ThenError() { - setInput("999999999999999999 999999999999999999"); - powerOfNumber.run(); - printOut(); - removeFromOutput("Please, input the values in format: number power\n"); - assertEquals(ERROR, getOutputLines()[0]); + private String convertDoubleToIntAndReturnAsString(double value) { + return String.valueOf((int) (value)); } } From c0dd12e28bde13ea7e510c502e121a43ef8a1427 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 12 Sep 2021 21:47:24 +0300 Subject: [PATCH 54/67] hw7 added --- .../java/homework_7/kitten_to_cat/Cat.java | 56 ++++++++++++++++ .../kitten_to_cat/CatToKittenFunction.java | 8 +++ .../java/homework_7/kitten_to_cat/Kitten.java | 67 +++++++++++++++++++ .../java/homework_7/kitten_to_cat/Main.java | 14 ++++ 4 files changed, 145 insertions(+) create mode 100644 src/main/java/homework_7/kitten_to_cat/Cat.java create mode 100644 src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java create mode 100644 src/main/java/homework_7/kitten_to_cat/Kitten.java create mode 100644 src/main/java/homework_7/kitten_to_cat/Main.java diff --git a/src/main/java/homework_7/kitten_to_cat/Cat.java b/src/main/java/homework_7/kitten_to_cat/Cat.java new file mode 100644 index 00000000..436b45e8 --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat/Cat.java @@ -0,0 +1,56 @@ +package homework_7.kitten_to_cat; + +import java.security.SecureRandom; +import java.util.Random; + +public class Cat { + + private final int age; + private final String name; + + public Cat(String name, int age) { + this.name = name; + this.age = age; + } + + public int getAge() { + return age; + } + + public String getName() { + return name; + } + + private boolean isNameValid() { + return this.name.length() > 2; + } + + @Override + public int hashCode() { + if (isNameValid()) { + return (this.age + this.name.charAt(0)) * 2 << 5; + } else { + try { + Random r = SecureRandom.getInstanceStrong(); + return r.nextInt(); + } catch (Exception e) { + throw new NumberFormatException("ERROR: SecureRandom @hashCode works incorrect for " + this.getClass()); + } + } + } + + @Override + public boolean equals(Object o) { + if (o == null || o.getClass() != this.getClass()) return false; + if (this == o) return true; + Cat that = (Cat) o; + return this.getAge() == that.getAge() && this.getName().equals(that.getName()); + } + + @Override + public String toString() { + return "Cat's name: " + this.getName() + + "\nCat's age: " + this.getAge(); + } + +} diff --git a/src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java b/src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java new file mode 100644 index 00000000..ae62b416 --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java @@ -0,0 +1,8 @@ +package homework_7.kitten_to_cat; + +@FunctionalInterface +public interface CatToKittenFunction { + + U grow(T t); + +} diff --git a/src/main/java/homework_7/kitten_to_cat/Kitten.java b/src/main/java/homework_7/kitten_to_cat/Kitten.java new file mode 100644 index 00000000..e7c2427a --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat/Kitten.java @@ -0,0 +1,67 @@ +package homework_7.kitten_to_cat; + +import java.security.SecureRandom; +import java.util.Random; + +public class Kitten { + + private final int age; + private final String name; + private final String breed; + + public int getAge() { + return age; + } + + public String getName() { + return name; + } + + public String getBreed() { + return breed; + } + + public Kitten(String name, int age, String breed) { + this.name = name; + this.age = age; + this.breed = breed; + } + + public Cat grow(CatToKittenFunction function) { + return function.grow(this); + } + + private boolean isNameValid() { + return this.name.length() > 2; + } + + @Override + public int hashCode() { + if (isNameValid()) { + return (this.age + this.name.charAt(0)) * 2 << 5; + } else { + try { + Random r = SecureRandom.getInstanceStrong(); + return r.nextInt(); + } catch (Exception e) { + throw new NumberFormatException("ERROR: SecureRandom @hashCode works incorrect for " + this.getClass()); + } + } + } + + @Override + public boolean equals(Object o) { + if (o == null || o.getClass() != this.getClass()) return false; + if (this == o) return true; + Kitten that = (Kitten) o; + return this.age == that.age && this.name.equals(that.name); + } + + @Override + public String toString() { + return "Kitten's name: " + this.getName() + + "\nKitten's age: " + this.getAge() + + "\nKitten's breed: " + this.getBreed(); + } + +} diff --git a/src/main/java/homework_7/kitten_to_cat/Main.java b/src/main/java/homework_7/kitten_to_cat/Main.java new file mode 100644 index 00000000..6352ae9e --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat/Main.java @@ -0,0 +1,14 @@ +package homework_7.kitten_to_cat; + +public class Main { + + public static void main(String[] args) { + Kitten kitten = new Kitten("Joe Bezos", 3, "Billionerra"); + System.out.println(kitten.getClass().getSimpleName() + "\n" + + kitten); + Cat kittyToCat = kitten.grow(kitty -> new Cat("Joseph Bezos", kitty.getAge() + 2)); + System.out.println(kittyToCat.getClass().getSimpleName() + "\n" + + kittyToCat); + } + +} From b5f2dffc85d468cfcf67f418ba984bbf7d231ea5 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Sun, 12 Sep 2021 21:51:34 +0300 Subject: [PATCH 55/67] hw7 added --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 39e0eeed..8d193742 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Tests](./src/test/java/homework_5/power_of_number/) | Power of number recursion using App. Reads 2 non-negative integer numbers from console and prints out the result of exponentiation. Only for positive integer numbers. On any problem output message will be gotten: "Only 2 non-negative integers are allowed" | HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. | HW6 | [MapProblemsGenerator](./src/main/java/homework_6/map_problems_collision_generator/) | App which has:
1) Class creating 100% HashMap collisions
2) Mutable class with overridden HashCode/Equals. When put MutableClass object into HashMap as key - can't retrieve it (equals works correctly) | +HW7 | [Kitten to Cat](./src/main/java/homework_7/kitten_to_cat/) | App using Functional Interface KittenToCatFunction with abstract method grow(). Realization in Main class through lambda function |
From 7c492c9b90992a56323884f69f30d22078844075 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 14 Sep 2021 19:52:21 +0300 Subject: [PATCH 56/67] hw7 refactored; hw7 tests added; --- .../kitten_to_cat/CatToKittenFunction.java | 8 --- .../java/homework_7/kitten_to_cat/Kitten.java | 4 -- .../kitten_to_cat/KittenToCatFunction.java | 8 +++ .../java/homework_7/kitten_to_cat/Main.java | 14 ---- .../KittenToCatTest.java | 69 +++++++++++++++++++ 5 files changed, 77 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java create mode 100644 src/main/java/homework_7/kitten_to_cat/KittenToCatFunction.java delete mode 100644 src/main/java/homework_7/kitten_to_cat/Main.java create mode 100644 src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java diff --git a/src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java b/src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java deleted file mode 100644 index ae62b416..00000000 --- a/src/main/java/homework_7/kitten_to_cat/CatToKittenFunction.java +++ /dev/null @@ -1,8 +0,0 @@ -package homework_7.kitten_to_cat; - -@FunctionalInterface -public interface CatToKittenFunction { - - U grow(T t); - -} diff --git a/src/main/java/homework_7/kitten_to_cat/Kitten.java b/src/main/java/homework_7/kitten_to_cat/Kitten.java index e7c2427a..4f2da7db 100644 --- a/src/main/java/homework_7/kitten_to_cat/Kitten.java +++ b/src/main/java/homework_7/kitten_to_cat/Kitten.java @@ -27,10 +27,6 @@ public Kitten(String name, int age, String breed) { this.breed = breed; } - public Cat grow(CatToKittenFunction function) { - return function.grow(this); - } - private boolean isNameValid() { return this.name.length() > 2; } diff --git a/src/main/java/homework_7/kitten_to_cat/KittenToCatFunction.java b/src/main/java/homework_7/kitten_to_cat/KittenToCatFunction.java new file mode 100644 index 00000000..7ba4af51 --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat/KittenToCatFunction.java @@ -0,0 +1,8 @@ +package homework_7.kitten_to_cat; + +@FunctionalInterface +public interface KittenToCatFunction { + + Cat grow(Kitten k); + +} diff --git a/src/main/java/homework_7/kitten_to_cat/Main.java b/src/main/java/homework_7/kitten_to_cat/Main.java deleted file mode 100644 index 6352ae9e..00000000 --- a/src/main/java/homework_7/kitten_to_cat/Main.java +++ /dev/null @@ -1,14 +0,0 @@ -package homework_7.kitten_to_cat; - -public class Main { - - public static void main(String[] args) { - Kitten kitten = new Kitten("Joe Bezos", 3, "Billionerra"); - System.out.println(kitten.getClass().getSimpleName() + "\n" + - kitten); - Cat kittyToCat = kitten.grow(kitty -> new Cat("Joseph Bezos", kitty.getAge() + 2)); - System.out.println(kittyToCat.getClass().getSimpleName() + "\n" + - kittyToCat); - } - -} diff --git a/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java b/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java new file mode 100644 index 00000000..df8cbbcd --- /dev/null +++ b/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java @@ -0,0 +1,69 @@ +package homework_7.kitten_to_cat; + +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class KittenToCatTest { + + private static final String expected = Cat.class.getSimpleName(); + + @Test + void testKittenToCat() { + Kitten kitten = new Kitten("Joe Bezos", 3, "Amazonerre"); + KittenToCatFunction kittyFoo = kitten1 -> new Cat("Joseph Bezos", kitten.getAge() + 2); + Cat cat = kittyFoo.grow(kitten); + assertEquals(expected, cat.getClass().getSimpleName()); + } + + @Test + void testKittenInheritedToCatCast() { + + class JustBornKitten extends Kitten { + + private final LocalDate bornDate; + + public JustBornKitten(String name, int age, String breed) { + super(name, age, breed); + bornDate = LocalDate.now(); + } + + public void printBornDate() { + System.out.println(this.bornDate); + } + + } + + JustBornKitten justBornKitten = new JustBornKitten("Billy", 0, "Microkitty"); + KittenToCatFunction kittyFoo = kitten -> new Cat("Bill Gates", justBornKitten.getAge() + 3); + Cat cat = kittyFoo.grow(justBornKitten); + assertEquals(expected, cat.getClass().getSimpleName()); + } + + @Test + void testKittenToInheritedCatCast() { + + class WildCat extends Cat { + + private final String location; + + public WildCat(String name, int age) { + super(name, age); + this.location = "Africa"; + } + + public void printLocation() { + System.out.println(this.location); + } + + } + + Kitten kitten = new Kitten("Ilon", 1, "Nikolesla"); + KittenToCatFunction kittyFoo = kit -> new Cat("Ilon Mask", kitten.getAge() + 3); + Cat cat = kittyFoo.grow(kitten); + assertEquals(expected, cat.getClass().getSimpleName()); + } + +} From 1d95d1a500ef206d5bfc2b98cf897353e5546733 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 14 Sep 2021 20:10:26 +0300 Subject: [PATCH 57/67] hw7 upd; --- .../KittenToCatTest.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java b/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java index df8cbbcd..d9ac1eca 100644 --- a/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java +++ b/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java @@ -30,10 +30,6 @@ public JustBornKitten(String name, int age, String breed) { bornDate = LocalDate.now(); } - public void printBornDate() { - System.out.println(this.bornDate); - } - } JustBornKitten justBornKitten = new JustBornKitten("Billy", 0, "Microkitty"); @@ -54,16 +50,12 @@ public WildCat(String name, int age) { this.location = "Africa"; } - public void printLocation() { - System.out.println(this.location); - } - } - Kitten kitten = new Kitten("Ilon", 1, "Nikolesla"); - KittenToCatFunction kittyFoo = kit -> new Cat("Ilon Mask", kitten.getAge() + 3); - Cat cat = kittyFoo.grow(kitten); - assertEquals(expected, cat.getClass().getSimpleName()); + Kitten kitty = new Kitten("Elon", 1, "Nikoleslie"); + KittenToCatFunction kittyFoo = kit -> new WildCat("Elon Mask", kitty.getAge() + 3); + WildCat wildCat = (WildCat) kittyFoo.grow(kitty); + assertEquals(wildCat.getClass().getSimpleName(), wildCat.getClass().getSimpleName()); } } From f36af952f468476dea9b806d9e8eb16a97abbeb6 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 15 Sep 2021 22:44:14 +0300 Subject: [PATCH 58/67] little folders reshuffle ;) readme upd --- README.md | 18 +++++++++--------- ...dPrintTest.java => PyramidPrinterTest.java} | 5 ++--- .../{sources => }/RandomCharsTableTest.java | 3 +-- .../{sources => }/TrafficLightTest.java | 3 +-- .../kitten_to_cat}/KittenToCatTest.java | 0 5 files changed, 13 insertions(+), 16 deletions(-) rename src/test/java/homework_2/pyramid_printer/{sources/PyramidPrintTest.java => PyramidPrinterTest.java} (93%) rename src/test/java/homework_2/random_chars_table/{sources => }/RandomCharsTableTest.java (97%) rename src/test/java/homework_2/traffic_light/{sources => }/TrafficLightTest.java (94%) rename src/test/java/{homework_7.kitten_to_cat => homework_7/kitten_to_cat}/KittenToCatTest.java (100%) diff --git a/README.md b/README.md index 8d193742..2d569290 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,17 @@ | Number | Solution | Short description | --- | --- | --- | HW1 | [Console printer](./src/main/java/homework_1/Main.java)
[Tests](./src/test/java/homework_1/MainTest.java) | The app that reads input arguments and prints them, until "error" argument | -HW2.1 | [Traffic Light](./src/main/java/homework_2/traffic_light/)
[Tests](./src/test/java/homework_2/traffic_light/) | The app that switching colors on different number value (input from keyboard) | -HW2.2 | [Pyramid Printer](./src/main/java/homework_2/pyramid_printer/)
[Tests](./src/test/java/homework_2/pyramid_printer/) | Printing 'x' Pyramid with the input parameter as Pyramid height | -HW2.3 | [Random Chars Table](./src/main/java/homework_2/random_chars_table/)
[Tests](./src/test/java/homework_2/random_chars_table/) | The app that creates 2-dimensional array/matrix made of random Character values (from A=65 to Z=90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | +HW2.1 | [Traffic Light](./src/main/java/homework_2/traffic_light/)
[Tests](./src/test/java/homework_2/traffic_light/TrafficLightTest.java) | The app that switching colors on different number value (input from keyboard) | +HW2.2 | [Pyramid Printer](./src/main/java/homework_2/pyramid_printer/)
[Tests](./src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java) | Printing 'x' Pyramid with the input parameter as Pyramid height | +HW2.3 | [Random Chars Table](./src/main/java/homework_2/random_chars_table/)
[Tests](./src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java) | The app that creates 2-dimensional array/matrix made of random Character values (from A=65 to Z=90), dimensions set by input from keyboard. Then generating resulting string with even/odd parameter depends on input | HW3 | [Immutable Class](./src/main/java/homework_3/ImmutableClass.java) | Create Immutable class: several fields, including reference type; several constructors; method returning a new object. | -HW4.1 | [Custom File Reader](./src/main/java/homework_4/custom_file_reader/)
[Tests](./src/test/java/homework_4/custom_file_reader/) | App reading data from file and prints to console. Text file path: main/resources/custom_file_reader/. Reading file in 4 different ways (one of them using NIO) executable with methods: run1(), run2(), run3(), run4() | -HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/test/java/homework_4/singleton/) | Singleton App: private constructor and public method getInstance() | -HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/) | Custom annotation class. | -HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Tests](./src/test/java/homework_5/power_of_number/) | Power of number recursion using App. Reads 2 non-negative integer numbers from console and prints out the result of exponentiation. Only for positive integer numbers. On any problem output message will be gotten: "Only 2 non-negative integers are allowed" | -HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. | +HW4.1 | [Custom File Reader](./src/main/java/homework_4/custom_file_reader/)
[Tests](./src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java) | App reading data from file and prints to console. Text file path: main/resources/custom_file_reader/. Reading file in 4 different ways (one of them using NIO) executable with methods: run1(), run2(), run3(), run4() | +HW4.2 | [Singleton](./src/main/java/homework_4/singleton/)
[Tests](./src/test/java/homework_4/singleton/SingletonMenuTest.java) | Singleton App: private constructor and public method getInstance() | +HW4.3 | [Custom Annotation](./src/main/java/homework_4/custom_annotation/)
[Tests](./src/test/java/homework_4/custom_annotation/ResourcesPathTest.java) | Custom annotation class. | +HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Tests](./src/test/java/homework_5/power_of_number/PowerOfNumberTest.java) | Power of number recursion using App. Reads 2 non-negative integer numbers from console and prints out the result of exponentiation. Only for positive integer numbers. On any problem output message will be gotten: "Only 2 non-negative integers are allowed" | +HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. | HW6 | [MapProblemsGenerator](./src/main/java/homework_6/map_problems_collision_generator/) | App which has:
1) Class creating 100% HashMap collisions
2) Mutable class with overridden HashCode/Equals. When put MutableClass object into HashMap as key - can't retrieve it (equals works correctly) | -HW7 | [Kitten to Cat](./src/main/java/homework_7/kitten_to_cat/) | App using Functional Interface KittenToCatFunction with abstract method grow(). Realization in Main class through lambda function | +HW7 | [Kitten to Cat](./src/main/java/homework_7/kitten_to_cat/)
[Tests](./src/test/java/homework_7/kitten_to_cat/KittenToCatTest.java) | App using Functional Interface KittenToCatFunction with abstract method grow(). Realization in Main class through lambda function |
diff --git a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java similarity index 93% rename from src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java rename to src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java index 35f7c1f6..6d9fa656 100644 --- a/src/test/java/homework_2/pyramid_printer/sources/PyramidPrintTest.java +++ b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -1,7 +1,6 @@ -package homework_2.pyramid_printer.sources; +package homework_2.pyramid_printer; import base.UnitBase; -import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -11,7 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class PyramidPrintTest extends UnitBase { +class PyramidPrinterTest extends UnitBase { PyramidPrinter pyramidPrinter = new PyramidPrinter(); diff --git a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java similarity index 97% rename from src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java rename to src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index d89d440e..f7e4b2fb 100644 --- a/src/test/java/homework_2/random_chars_table/sources/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,7 +1,6 @@ -package homework_2.random_chars_table.sources; +package homework_2.random_chars_table; import base.UnitBase; -import homework_2.random_chars_table.RandomCharsTable; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/TrafficLightTest.java similarity index 94% rename from src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java rename to src/test/java/homework_2/traffic_light/TrafficLightTest.java index 085bd343..cbae6c2d 100644 --- a/src/test/java/homework_2/traffic_light/sources/TrafficLightTest.java +++ b/src/test/java/homework_2/traffic_light/TrafficLightTest.java @@ -1,7 +1,6 @@ -package homework_2.traffic_light.sources; +package homework_2.traffic_light; import base.UnitBase; -import homework_2.traffic_light.TrafficLight; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java b/src/test/java/homework_7/kitten_to_cat/KittenToCatTest.java similarity index 100% rename from src/test/java/homework_7.kitten_to_cat/KittenToCatTest.java rename to src/test/java/homework_7/kitten_to_cat/KittenToCatTest.java From 7813c80e3a7778b30a73dbba441606213419e503 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 21 Sep 2021 17:33:45 +0300 Subject: [PATCH 59/67] little fix --- src/main/java/homework_2/Colors.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/homework_2/Colors.java b/src/main/java/homework_2/Colors.java index 9edd640d..78fecda2 100644 --- a/src/main/java/homework_2/Colors.java +++ b/src/main/java/homework_2/Colors.java @@ -2,6 +2,8 @@ public final class Colors { + private Colors() {} + public static final String ANSI_RESET = "\u001B[0m"; public static final String ANSI_RED = "\033[1;91m"; public static final String ANSI_GREEN = "\033[1;92m"; From 239bd82f398dacd6fd18452fb0e48aaf18056e14 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 21 Sep 2021 17:34:47 +0300 Subject: [PATCH 60/67] course project: SeaBattle add; --- src/main/java/course_project/Main.java | 11 + .../gamestuff/field/Battlefield.java | 114 +++++++++ .../course_project/gamestuff/field/Cell.java | 47 ++++ .../course_project/gamestuff/field/Field.java | 140 +++++++++++ .../gamestuff/player/Player.java | 29 +++ .../gamestuff/ships/ExtraLargeShip.java | 12 + .../gamestuff/ships/LargeShip.java | 12 + .../gamestuff/ships/MiddleShip.java | 12 + .../course_project/gamestuff/ships/Ship.java | 52 ++++ .../gamestuff/ships/SmallShip.java | 12 + .../course_project/services/SeaBattle.java | 26 ++ .../services/conversation/DialogueMenu.java | 238 ++++++++++++++++++ .../services/logic/GameLogic.java | 137 ++++++++++ .../utils/AroundDestroyedShipMarker.java | 120 +++++++++ .../utils/RandomCellPositionGenerator.java | 15 ++ .../utils/RandomShipDirectionGenerator.java | 11 + .../utils/ShipOnBattlefieldPlacer.java | 141 +++++++++++ src/main/resources/sea_battle/rules.txt | 54 ++++ 18 files changed, 1183 insertions(+) create mode 100644 src/main/java/course_project/Main.java create mode 100644 src/main/java/course_project/gamestuff/field/Battlefield.java create mode 100644 src/main/java/course_project/gamestuff/field/Cell.java create mode 100644 src/main/java/course_project/gamestuff/field/Field.java create mode 100644 src/main/java/course_project/gamestuff/player/Player.java create mode 100644 src/main/java/course_project/gamestuff/ships/ExtraLargeShip.java create mode 100644 src/main/java/course_project/gamestuff/ships/LargeShip.java create mode 100644 src/main/java/course_project/gamestuff/ships/MiddleShip.java create mode 100644 src/main/java/course_project/gamestuff/ships/Ship.java create mode 100644 src/main/java/course_project/gamestuff/ships/SmallShip.java create mode 100644 src/main/java/course_project/services/SeaBattle.java create mode 100644 src/main/java/course_project/services/conversation/DialogueMenu.java create mode 100644 src/main/java/course_project/services/logic/GameLogic.java create mode 100644 src/main/java/course_project/utils/AroundDestroyedShipMarker.java create mode 100644 src/main/java/course_project/utils/RandomCellPositionGenerator.java create mode 100644 src/main/java/course_project/utils/RandomShipDirectionGenerator.java create mode 100644 src/main/java/course_project/utils/ShipOnBattlefieldPlacer.java create mode 100644 src/main/resources/sea_battle/rules.txt diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java new file mode 100644 index 00000000..f96f25cb --- /dev/null +++ b/src/main/java/course_project/Main.java @@ -0,0 +1,11 @@ +package course_project; + +import course_project.services.SeaBattle; + +public class Main { + + public static void main(String[] args) { + SeaBattle.getInstance().run(); + } + +} diff --git a/src/main/java/course_project/gamestuff/field/Battlefield.java b/src/main/java/course_project/gamestuff/field/Battlefield.java new file mode 100644 index 00000000..5d253e55 --- /dev/null +++ b/src/main/java/course_project/gamestuff/field/Battlefield.java @@ -0,0 +1,114 @@ +package course_project.gamestuff.field; + +import course_project.gamestuff.player.Player; +import course_project.gamestuff.ships.*; + +import java.util.Collection; +import java.util.LinkedList; + +import static course_project.services.conversation.DialogueMenu.*; +import static course_project.utils.AroundDestroyedShipMarker.*; +import static course_project.utils.RandomCellPositionGenerator.generateRandomForCell; +import static course_project.utils.RandomShipDirectionGenerator.generateRandomDirection; +import static course_project.utils.ShipOnBattlefieldPlacer.*; + +/** + * Battlefield is Field for the Player(owner) of this object. + * It stores all ships available for adding, + * and then for removing on destroy to find out who is winner in the game. + */ +public class Battlefield extends Field { + + private final Collection availableShips; + + public Battlefield() { + super(); + this.availableShips = new LinkedList<>(); + initAvailableShips(); + } + + private void initAvailableShips() { + availableShips.add(new ExtraLargeShip()); + availableShips.add(new LargeShip()); + availableShips.add(new LargeShip()); + availableShips.add(new MiddleShip()); + availableShips.add(new MiddleShip()); + availableShips.add(new MiddleShip()); + availableShips.add(new SmallShip()); + availableShips.add(new SmallShip()); + availableShips.add(new SmallShip()); + availableShips.add(new SmallShip()); + } + + public Collection getAvailableShips() { + return this.availableShips; + } + + public boolean addShipOnBattlefield(Ship ship, Cell toCell, boolean isHorizontal) { + if (isEnoughSpaceToPlaceShip(toCell, ship.getSize(), isHorizontal)) { + return isHorizontal ? + addRowOfCells(this, toCell, ship) : + addColumnOfCells(this, toCell, ship); + } + return false; + } + + // onDestroy + public void availableShipsDecrease(Ship ship) { + this.availableShips.remove(ship); + } + + public boolean hasAvailableShips() { + return countOfAvailableShips() > 0; + } + + public int countOfAvailableShips() { + return this.availableShips.size(); + } + + public static void addShipsManually(Player currentPlayer) { + printPlayerShipPlacingHelp(); + currentPlayer.getField().getAvailableShips().forEach(ship -> { + currentPlayer.getField().printField(); + Cell toPos; + boolean isHorizontal = true; + do { + printSetPositionMessage(ship.getName(), ship.getSize()); + String[] pos = getShipPlacingInput().split(" "); + int x = Integer.parseInt(pos[0].substring(1)) - 1; + int y = Integer.parseInt(String.valueOf(pos[0].charAt(0) - LOWERCASE_A)); + toPos = currentPlayer.getField().getCellByPosition(x, y); + if (pos.length == 2) { + isHorizontal = "h".equals(pos[1]); + } + } while (!currentPlayer.getField().addShipOnBattlefield(ship, toPos, isHorizontal)); + } + ); + } + + public static void addShipsAuto(Player currentPlayer) { + currentPlayer.getField().getAvailableShips().forEach(ship -> { + Cell toPos; + boolean isHorizontal; + do { + toPos = currentPlayer.getField().getCellByPosition(generateRandomForCell(), + generateRandomForCell()); + isHorizontal = generateRandomDirection(); + } while (!currentPlayer.getField().addShipOnBattlefield(ship, toPos, isHorizontal)); + } + ); + } + + public void setAroundShipCellsAsHit(Player currentPlayer, Ship ship) { + if (ship.getSize() == 1) { + fillAroundSmallShip(currentPlayer, ship); + } else { + if (ship.isVertical()) { + fillAroundHorizontalShip(currentPlayer, ship); + } else { + fillAroundVerticalShip(currentPlayer, ship); + } + } + } + +} diff --git a/src/main/java/course_project/gamestuff/field/Cell.java b/src/main/java/course_project/gamestuff/field/Cell.java new file mode 100644 index 00000000..2e97b199 --- /dev/null +++ b/src/main/java/course_project/gamestuff/field/Cell.java @@ -0,0 +1,47 @@ +package course_project.gamestuff.field; + +import course_project.gamestuff.ships.Ship; + +public class Cell { + + private final int x; + private final int y; + private Ship ref; + private boolean hit; + + public Cell(int x, int y) { + this.x = x; + this.y = y; + this.ref = null; + this.hit = false; + } + + public boolean isHit() { + return this.hit; + } + + public void setHit(boolean hit) { + this.hit = hit; + } + + public Ship isShipPlacedAtCell() { + return this.ref == null ? null : ref; + } + + public void placeShipOnCell(Ship ship) { + this.ref = ship; + } + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + public Ship getRef() { + return this.ref; + } + +} diff --git a/src/main/java/course_project/gamestuff/field/Field.java b/src/main/java/course_project/gamestuff/field/Field.java new file mode 100644 index 00000000..f54cacee --- /dev/null +++ b/src/main/java/course_project/gamestuff/field/Field.java @@ -0,0 +1,140 @@ +package course_project.gamestuff.field; + +import course_project.gamestuff.player.Player; + +import static homework_2.Colors.*; + +public abstract class Field { + + public static final int FIELD_SIZE = 12; + public static final int LOWERCASE_A = 'a'; + private static final String WATER = BLUE_BG + " " + ANSI_RESET; + private static final String DESTROYED = ANSI_RED + "†" + ANSI_RESET; + private static final String HIT = ANSI_RED + "X" + ANSI_RESET; + private static final String MISS = ANSI_YELLOW + "O" + ANSI_RESET; + private static final String SHIP = ANSI_GREEN + "¤" + ANSI_RESET; + private static final char FIRST_SYMBOL_TOP_LINE = 'A'; + private static final String TOP_LINE; + private static final String CELL_FORMAT = "%s "; + private static final String ROW_NUMBER_FORMAT = "[%-2d]"; + + private final Cell[][] cells; + + protected Field() { + this.cells = new Cell[FIELD_SIZE][FIELD_SIZE]; + fillCellsWithIndexes(); + } + + static { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = FIRST_SYMBOL_TOP_LINE; i < FIRST_SYMBOL_TOP_LINE + FIELD_SIZE; i++) { + stringBuilder + .append((char) i) + .append(" "); + } + TOP_LINE = stringBuilder.toString().trim(); + } + + private void fillCellsWithIndexes() { + for (int i = 0; i < FIELD_SIZE; i++) { + for (int j = 0; j < FIELD_SIZE; j++) { + cells[i][j] = new Cell(i, j); + } + } + } + + public void printField() { + StringBuilder oneField = new StringBuilder(); + oneField + .append("\t") + .append(TOP_LINE) + .append("\n"); + for (int i = 0; i < FIELD_SIZE; i++) { + oneField.append(String.format(ROW_NUMBER_FORMAT, i + 1)); + for (int j = 0; j < FIELD_SIZE; j++) { + Cell currentCell = getCellByPosition(i, j); + String toPrint = WATER; + if (!isCellEmpty(currentCell)) { + toPrint = SHIP; + } + oneField.append(String.format(CELL_FORMAT, toPrint)); + } + oneField.append("\n"); + } + System.out.println(oneField); + } + + public void printBothFields(Player currentPlayer, Player enemy) { + StringBuilder bothFields = new StringBuilder(); + bothFields + .append("\t") + .append(TOP_LINE) + .append("\t\t\t ") + .append(TOP_LINE) + .append("\n"); + for (int i = 0; i < FIELD_SIZE; i++) { + bothFields.append(String.format(ROW_NUMBER_FORMAT, i + 1)); + for (int j = 0; j < FIELD_SIZE; j++) { + Cell currentPlayerCell = currentPlayer.getField().getCellByPosition(i, j); + if (currentPlayerCell.isHit()) { + bothFields + .append(getCellStateAsString(currentPlayer, currentPlayerCell)); + } else { + if (currentPlayer.getField().isCellEmpty(currentPlayerCell)) { + bothFields + .append(String.format(CELL_FORMAT, WATER)); + } else { + bothFields + .append(String.format(CELL_FORMAT, SHIP)); + } + } + } + bothFields + .append("\t\t") + .append(String.format(ROW_NUMBER_FORMAT, i + 1)); + for (int j = 0; j < FIELD_SIZE; j++) { + Cell currentEnemyCell = enemy.getField().getCellByPosition(i, j); + if (currentEnemyCell.isHit()) { + bothFields + .append(getCellStateAsString(enemy, currentEnemyCell)); + } else { + bothFields + .append(String.format(CELL_FORMAT, WATER)); + } + } + bothFields.append("\n"); + } + System.out.println(bothFields); + } + + private String getCellStateAsString(Player currentPlayer, Cell playersCell) { + if (currentPlayer.getField().getHit(playersCell)) { + if (playersCell.getRef().isShipDestroyed()) { + return String.format(CELL_FORMAT, DESTROYED); + } else { + return String.format(CELL_FORMAT, HIT); + } + } + return String.format(CELL_FORMAT, MISS); + } + + public Cell getCellByPosition(int x, int y) { + for (Cell[] cellRow : this.cells) { + for (Cell cellCol : cellRow) { + if (cellCol.getX() == x && cellCol.getY() == y) { + return cellCol; + } + } + } + return null; + } + + public boolean isCellEmpty(Cell currentCell) { + return currentCell.isShipPlacedAtCell() == null; + } + + public boolean getHit(Cell toCell) { + return !isCellEmpty(cells[toCell.getX()][toCell.getY()]); + } + +} diff --git a/src/main/java/course_project/gamestuff/player/Player.java b/src/main/java/course_project/gamestuff/player/Player.java new file mode 100644 index 00000000..476bc089 --- /dev/null +++ b/src/main/java/course_project/gamestuff/player/Player.java @@ -0,0 +1,29 @@ +package course_project.gamestuff.player; + +import course_project.gamestuff.field.Battlefield; + +public class Player { + + private final boolean computer; + private final String name; + private final Battlefield battlefield; + + public Player(String name, boolean isComputer) { + this.computer = isComputer; + this.name = name; + this.battlefield = new Battlefield(); + } + + public boolean isComputer() { + return this.computer; + } + + public String getName() { + return this.name; + } + + public Battlefield getField() { + return this.battlefield; + } + +} diff --git a/src/main/java/course_project/gamestuff/ships/ExtraLargeShip.java b/src/main/java/course_project/gamestuff/ships/ExtraLargeShip.java new file mode 100644 index 00000000..84899159 --- /dev/null +++ b/src/main/java/course_project/gamestuff/ships/ExtraLargeShip.java @@ -0,0 +1,12 @@ +package course_project.gamestuff.ships; + +public final class ExtraLargeShip extends Ship { + + private static final int SIZE = 4; + private static final String SHIP_NAME = "Battleship"; + + public ExtraLargeShip() { + super(SIZE, SHIP_NAME); + } + +} diff --git a/src/main/java/course_project/gamestuff/ships/LargeShip.java b/src/main/java/course_project/gamestuff/ships/LargeShip.java new file mode 100644 index 00000000..9e7fe62f --- /dev/null +++ b/src/main/java/course_project/gamestuff/ships/LargeShip.java @@ -0,0 +1,12 @@ +package course_project.gamestuff.ships; + +public final class LargeShip extends Ship { + + private static final int SIZE = 3; + private static final String SHIP_NAME = "Destroyer"; + + public LargeShip() { + super(SIZE, SHIP_NAME); + } + +} \ No newline at end of file diff --git a/src/main/java/course_project/gamestuff/ships/MiddleShip.java b/src/main/java/course_project/gamestuff/ships/MiddleShip.java new file mode 100644 index 00000000..f6494ccb --- /dev/null +++ b/src/main/java/course_project/gamestuff/ships/MiddleShip.java @@ -0,0 +1,12 @@ +package course_project.gamestuff.ships; + +public final class MiddleShip extends Ship { + + private static final int SIZE = 2; + private static final String SHIP_NAME = "Submarine"; + + public MiddleShip() { + super(SIZE, SHIP_NAME); + } + +} diff --git a/src/main/java/course_project/gamestuff/ships/Ship.java b/src/main/java/course_project/gamestuff/ships/Ship.java new file mode 100644 index 00000000..cafd7fc0 --- /dev/null +++ b/src/main/java/course_project/gamestuff/ships/Ship.java @@ -0,0 +1,52 @@ +package course_project.gamestuff.ships; + +import course_project.gamestuff.field.Cell; + +public abstract class Ship { + + private final int size; + private final String name; + private int hitCount; + private Cell startCell; + private boolean direction = true; // true - vertical, false - horizontal + + protected Ship(int size, String shipName) { + this.size = size; + this.name = shipName; + this.hitCount = 0; + this.startCell = null; + } + + public boolean isVertical() { + return this.direction; + } + + public void setVertical() { + this.direction = false; + } + + public Cell getStartCell() { + return this.startCell; + } + + public void setStartCell(Cell cell) { + this.startCell = cell; + } + + public int getSize() { + return this.size; + } + + public String getName() { + return this.name; + } + + public boolean isShipDestroyed() { + return this.hitCount == this.size; + } + + public void hitCountIncrease() { + this.hitCount++; + } + +} diff --git a/src/main/java/course_project/gamestuff/ships/SmallShip.java b/src/main/java/course_project/gamestuff/ships/SmallShip.java new file mode 100644 index 00000000..8d34bd1c --- /dev/null +++ b/src/main/java/course_project/gamestuff/ships/SmallShip.java @@ -0,0 +1,12 @@ +package course_project.gamestuff.ships; + +public final class SmallShip extends Ship { + + private static final int SIZE = 1; + private static final String SHIP_NAME = "Patrol Boat"; + + public SmallShip() { + super(SIZE, SHIP_NAME); + } + +} diff --git a/src/main/java/course_project/services/SeaBattle.java b/src/main/java/course_project/services/SeaBattle.java new file mode 100644 index 00000000..3718b98d --- /dev/null +++ b/src/main/java/course_project/services/SeaBattle.java @@ -0,0 +1,26 @@ +package course_project.services; + +import course_project.services.conversation.DialogueMenu; + +/** + * Start of SeaBattle game; + */ +public final class SeaBattle { + + private SeaBattle() { + } + + private static class SeaBattleHelper { + private static final SeaBattle INSTANCE = new SeaBattle(); + } + + public static SeaBattle getInstance() { + return SeaBattleHelper.INSTANCE; + } + + public void run() { + DialogueMenu.printGreetings(); + DialogueMenu.printMainMenu(); + } + +} diff --git a/src/main/java/course_project/services/conversation/DialogueMenu.java b/src/main/java/course_project/services/conversation/DialogueMenu.java new file mode 100644 index 00000000..dda92cf4 --- /dev/null +++ b/src/main/java/course_project/services/conversation/DialogueMenu.java @@ -0,0 +1,238 @@ +package course_project.services.conversation; + +import course_project.gamestuff.field.Field; +import course_project.gamestuff.player.Player; +import course_project.gamestuff.ships.Ship; +import course_project.services.logic.GameLogic; +import homework_4.custom_file_reader.CustomFileReader; + +import java.util.Scanner; + +import static course_project.gamestuff.field.Battlefield.addShipsAuto; +import static course_project.gamestuff.field.Battlefield.addShipsManually; +import static course_project.gamestuff.field.Field.FIELD_SIZE; +import static course_project.gamestuff.field.Field.LOWERCASE_A; + +/** + * Ultimate class for communication over the app; + * it's using functional style, just because it's no reason to use extra memory for storing object, + * and no even reason to create object of such type except it'd implement command pattern - + * but it's completely different way to communicate over app. + */ +public class DialogueMenu { + + private static final String INCORRECT_INPUT_MESSAGE = "Please, input correct variant"; + private static final String FILLED_FIELD_MESSAGE = "Done! Battlefield is filled ;)"; + private static final String WELCOME_MESSAGE = "Welcome to Sea Battle Console v0.1!"; + private static final String QUIT = "quit"; + private static final String FIRST_SYMBOL_POSITION_REGEX; + private static final String DIRECTION_REGEX = "^[v|h]$"; + private static final String NAME_REGEX = "^[a-zA-Z]{2,}$"; + private static final Scanner scanner = new Scanner(System.in); + + static { + FIRST_SYMBOL_POSITION_REGEX = "^[" + Field.LOWERCASE_A + "-" + (char) (LOWERCASE_A + FIELD_SIZE) + "]$"; + } + + private static Player player; + private static Player enemy; + + private DialogueMenu() { + } + + public static void printGreetings() { + System.out.println(WELCOME_MESSAGE); + } + + public static void printMainMenu() { + System.out.print( + "[1] Start game Human vs Computer\n" + + "[2] Start game Human vs Human\n" + + "[3] Start game Computer vs Computer\n" + + "[4] Print rules\n" + + "[5] Quit the game\n" + ); + String input = getInput(); + switch (input) { + case "1": + startHumanVSComputer(); + break; + case "2": + startHumanVSHuman(); + break; + case "3": + startComputerVSComputer(); + break; + case "4": + printRules(); + printMainMenu(); + break; + case "5": + terminate(); + break; + default: + System.out.println(INCORRECT_INPUT_MESSAGE); + printMainMenu(); // recursion, wow! + } + } + + private static void printRules() { + new CustomFileReader("./src/main/resources/sea_battle/", "rules.txt") + .run2(); + } + + private static void startComputerVSComputer() { + player = new Player("CPU0", true); + enemy = new Player("CPU1", true); + addShipsAuto(player); + addShipsAuto(enemy); + new GameLogic(player, enemy).run(); + } + + @SuppressWarnings("java:S2142") // like senior developer! yah? + private static void startHumanVSHuman() { + player = new Player(getInputName(), false); + enemy = new Player(getInputName(), false); + printPlayerMenu(player); + try { + printInviteOpponentMessage(enemy); + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + printPlayerMenu(enemy); + new GameLogic(player, enemy).run(); + } + + private static void startHumanVSComputer() { + player = new Player(getInputName(), false); + enemy = new Player("Mozilla", true); + printPlayerMenu(player); + addShipsAuto(enemy); + new GameLogic(player, enemy).run(); + } + + private static String getInputName() { + System.out.println("My name is SeaBattle, and yours?"); + while (true) { + String name = scanner.nextLine().trim(); + if (name.matches(NAME_REGEX)) { + return name; + } else { + System.out.println("Ha-ha, it's impossible to have such name!\n" + + "It should consists of at least 2 latin symbols and no numbers and spaces, ok?"); + } + } + } + + public static void printInviteOpponentMessage(Player opponent) { + System.out.println(opponent.getName() + "'s turn!"); + } + + private static void printPlayerMenu(Player currentPlayer) { + System.out.print("Menu for " + currentPlayer.getName() + ":" + "\n" + + "[1] Add ships on the field manually\n" + + "[2] Auto adding ships\n"); + String input = getInput(); + switch (input) { + case "1": + addShipsManually(currentPlayer); + currentPlayer.getField().printField(); + System.out.println(FILLED_FIELD_MESSAGE + "\n"); + break; + case "2": + addShipsAuto(currentPlayer); + currentPlayer.getField().printField(); + System.out.println(FILLED_FIELD_MESSAGE + "\n"); + break; + default: + System.out.println(INCORRECT_INPUT_MESSAGE); + printPlayerMenu(currentPlayer); // recursion again, ok!? + } + } + + public static String getPlayerMotionInput() { + while (true) { + String input = getInput(); + if (QUIT.equals(input)) { + terminate(); + } else if (isPositionValid(input)) { + return input; + } else { + System.out.println(INCORRECT_INPUT_MESSAGE); + } + } + } + + public static void printPlayerShipPlacingHelp() { + System.out.println("To place ship just input position from" + "'a1' to " + + ((char) (LOWERCASE_A + FIELD_SIZE - 1)) + FIELD_SIZE + + "(horizontal direction is default)" + + "\nIf you want to set ship vertically type e.g. 'a1 v' or horizontal 'b2 h'" + + "\nInput 'quit' to exit the game."); + } + + public static String getShipPlacingInput() { + while (true) { + String input = getInput(); + if (QUIT.equals(input)) { + terminate(); + } else { + String[] strings = input.split(" "); + if ((strings.length == 1 && isPositionValid(input)) || + (strings.length == 2 && isPositionValid(strings[0]) && strings[1].matches(DIRECTION_REGEX))) { + return input; + } else { + System.out.println(INCORRECT_INPUT_MESSAGE); + } + } + } + } + + private static boolean isPositionValid(String str) { + return String.valueOf(str.charAt(0)).matches(FIRST_SYMBOL_POSITION_REGEX) && + str.substring(1).matches("\\d+") && + Integer.parseInt(str.substring(1)) >= 1 && + Integer.parseInt(str.substring(1)) <= FIELD_SIZE; + } + + public static void printSetPositionMessage(String name, int size) { + System.out.print("Set position for " + name + " size of " + size + ": "); + } + + private static String getInput() { + return scanner.nextLine().trim().toLowerCase(); + } + + public static void printShipDestroyedMessage(String opponentsName, Ship ship) { + System.out.println("Nice! " + opponentsName + "'s " + ship.getName() + " is destroyed!"); + } + + public static void printShipHitMessage(String currentPlayerName, String opponentsName) { + System.out.println(currentPlayerName + " hit " + opponentsName + "'s ship!"); + } + + public static void printMiss() { + System.out.println("MISS!"); + } + + public static void printShipsLeftMessage(int countOfShipsLeft) { + System.out.println(countOfShipsLeft + " ships left"); + } + + public static void printSamePositionMessage() { + System.out.println("You've already hit at this position! Try another one: "); + } + + public static void printCongratulationsAndQuit(Player currentPlayer, Player opponent) { + System.out.println(currentPlayer.getName() + " WON THE GAME !!!" + + "\n" + opponent.getName() + " lose."); + terminate(); + } + + private static void terminate() { + scanner.close(); + Runtime.getRuntime().exit(0); // James Gosling approved! + } + +} diff --git a/src/main/java/course_project/services/logic/GameLogic.java b/src/main/java/course_project/services/logic/GameLogic.java new file mode 100644 index 00000000..b622b615 --- /dev/null +++ b/src/main/java/course_project/services/logic/GameLogic.java @@ -0,0 +1,137 @@ +package course_project.services.logic; + +import course_project.gamestuff.field.Battlefield; +import course_project.gamestuff.field.Cell; +import course_project.gamestuff.player.Player; +import course_project.gamestuff.ships.Ship; + +import static course_project.services.conversation.DialogueMenu.*; +import static course_project.utils.RandomCellPositionGenerator.generateRandomForCell; + +/** + * Game logic provides control through the game process; + */ +public class GameLogic { + + private final Player player1; + private final Player player2; + private Player currentPlayer; + + public GameLogic(Player firstPlayer, Player secondPlayer) { + this.player1 = firstPlayer; + this.player2 = secondPlayer; + currentPlayer = getRandomPlayer(); + } + + private Player getRandomPlayer() { + return Math.random() <= 0.5 ? this.player1 : this.player2; + } + + // switch to opponents turn + private void swapPlayers() { + if (currentPlayer == player1) { + this.currentPlayer = this.player2; + } else { + this.currentPlayer = this.player1; + } + } + + private Player getEnemy() { + return currentPlayer == player1 ? player2 : player1; + } + + public void run() { + while (currentPlayer.getField().hasAvailableShips() && getEnemy().getField().hasAvailableShips()) { + if (currentPlayer.isComputer() && getEnemy().isComputer()) { + computerMotion(currentPlayer); + } else if (!currentPlayer.isComputer() && getEnemy().isComputer()) { + humanMotion(currentPlayer); + } else if (currentPlayer.isComputer() && !getEnemy().isComputer()) { + computerMotion(currentPlayer); + } else { + try { + printInviteOpponentMessage(currentPlayer); + Thread.sleep(5000); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + humanMotion(currentPlayer); + } + } + } + + private void finishGame() { + if (currentPlayer.getField().hasAvailableShips()) { + printCongratulationsAndQuit(currentPlayer, getEnemy()); + } else { + printCongratulationsAndQuit(getEnemy(), currentPlayer); + } + } + + private void computerMotion(Player currentPlayer) { + int x = generateRandomForCell(); + int y = generateRandomForCell(); + if (!getEnemy().getField().getCellByPosition(x, y).isHit()) { + getEnemy().getField().getCellByPosition(x, y).setHit(true); + if (!getEnemy().getField().isCellEmpty(getEnemy().getField().getCellByPosition(x, y))) { + Ship enemyShip = getEnemy().getField().getCellByPosition(x, y).getRef(); + enemyShip.hitCountIncrease(); + if (enemyShip.isShipDestroyed()) { + getEnemy().getField().setAroundShipCellsAsHit(getEnemy(), enemyShip); + printShipDestroyedMessage(getEnemy().getName(), enemyShip); + getEnemy().getField().availableShipsDecrease(enemyShip); + if (!getEnemy().getField().hasAvailableShips()) { + finishGame(); + } + } else { + printShipHitMessage(currentPlayer.getName(), getEnemy().getName()); + } + computerMotion(currentPlayer); + } else { + swapPlayers(); + } + } else { + computerMotion(currentPlayer); + } + } + + private void humanMotion(Player currentPlayer) { + currentPlayer.getField().printBothFields(currentPlayer, getEnemy()); + try { + String pos = getPlayerMotionInput(); + int x = Integer.parseInt(pos.substring(1)) - 1; + int y = Integer.parseInt(String.valueOf(pos.charAt(0) - 97)); + if (getEnemy().getField().getCellByPosition(x, y).isHit()) { + printSamePositionMessage(); + humanMotion(currentPlayer); + } else { + Cell enemyCell = getEnemy().getField().getCellByPosition(x, y); + enemyCell.setHit(true); + if (!getEnemy().getField().isCellEmpty(enemyCell)) { + Ship enemyShip = enemyCell.getRef(); + enemyShip.hitCountIncrease(); + if (enemyShip.isShipDestroyed()) { + Battlefield enemiesField = getEnemy().getField(); + enemiesField.setAroundShipCellsAsHit(getEnemy(), enemyShip); + enemiesField.availableShipsDecrease(enemyShip); + if (!enemiesField.hasAvailableShips()) { + currentPlayer.getField().printBothFields(currentPlayer, getEnemy()); + finishGame(); + } + printShipsLeftMessage(enemiesField.countOfAvailableShips()); + printShipDestroyedMessage(getEnemy().getName(), enemyShip); + } else { + printShipHitMessage(currentPlayer.getName(), getEnemy().getName()); + } + humanMotion(currentPlayer); + } else { + printMiss(); + swapPlayers(); + } + } + } catch (NumberFormatException exception) { + humanMotion(currentPlayer); + } + } + +} diff --git a/src/main/java/course_project/utils/AroundDestroyedShipMarker.java b/src/main/java/course_project/utils/AroundDestroyedShipMarker.java new file mode 100644 index 00000000..ce7bf59a --- /dev/null +++ b/src/main/java/course_project/utils/AroundDestroyedShipMarker.java @@ -0,0 +1,120 @@ +package course_project.utils; + +import course_project.gamestuff.field.Battlefield; +import course_project.gamestuff.field.Cell; +import course_project.gamestuff.field.Field; +import course_project.gamestuff.player.Player; +import course_project.gamestuff.ships.Ship; + +/** + * Functions to fill cells around the destroyed ship. + */ +public final class AroundDestroyedShipMarker { + + private AroundDestroyedShipMarker() {} + + public static void fillAroundSmallShip(Player currentPlayer, Ship ship) { + Cell shipCell = currentPlayer.getField().getCellByPosition( + ship.getStartCell().getX(), + ship.getStartCell().getY() + ); + Battlefield battlefield = currentPlayer.getField(); + markAboveAsHitCell(battlefield, shipCell); + markBelowAsHitCell(battlefield, shipCell); + markRightAsHitCell(battlefield, shipCell); + markLeftAsHitCell(battlefield, shipCell); + markDiagonalRightBelowAsHitCell(battlefield, shipCell); + markDiagonalLeftBelowAsHitCell(battlefield, shipCell); + markDiagonalRightAboveAsHitCell(battlefield, shipCell); + markDiagonalLeftAboveAsHitCell(battlefield, shipCell); + } + + public static void fillAroundVerticalShip(Player currentPlayer, Ship ship) { + int x = ship.getStartCell().getX(); + int y = ship.getStartCell().getY(); + Battlefield battlefield = currentPlayer.getField(); + for (int i = 0; i < ship.getSize(); i++) { + Cell currentCell = battlefield.getCellByPosition(x + i, y); + if (i == 0) { + markAboveAsHitCell(battlefield, currentCell); + markDiagonalLeftAboveAsHitCell(battlefield, currentCell); + markDiagonalRightAboveAsHitCell(battlefield, currentCell); + } else if (i == ship.getSize() - 1) { + markDiagonalLeftBelowAsHitCell(battlefield, currentCell); + markDiagonalRightBelowAsHitCell(battlefield, currentCell); + markBelowAsHitCell(battlefield, currentCell); + } + markLeftAsHitCell(battlefield, currentCell); + markRightAsHitCell(battlefield, currentCell); + } + } + + public static void fillAroundHorizontalShip(Player currentPlayer, Ship ship) { + int x = ship.getStartCell().getX(); + int y = ship.getStartCell().getY(); + Battlefield battlefield = currentPlayer.getField(); + for (int i = 0; i < ship.getSize(); i++) { + Cell currentCell = currentPlayer.getField().getCellByPosition(x, y + i); + if (i == 0) { + markDiagonalLeftAboveAsHitCell(battlefield, currentCell); + markLeftAsHitCell(battlefield, currentCell); + markDiagonalLeftBelowAsHitCell(battlefield, currentCell); + } else if (i == ship.getSize() - 1) { + markDiagonalRightAboveAsHitCell(battlefield, currentCell); + markRightAsHitCell(battlefield, currentCell); + markDiagonalRightBelowAsHitCell(battlefield, currentCell); + } + markAboveAsHitCell(battlefield, currentCell); + markBelowAsHitCell(battlefield, currentCell); + } + } + + private static void markRightAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getY() != Field.FIELD_SIZE - 1) { + battlefield.getCellByPosition(currentCell.getX(), currentCell.getY() + 1).setHit(true); + } + } + + private static void markLeftAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getY() != 0) { + battlefield.getCellByPosition(currentCell.getX(), currentCell.getY() - 1).setHit(true); + } + } + + private static void markDiagonalRightBelowAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != Field.FIELD_SIZE - 1 && currentCell.getY() != Field.FIELD_SIZE - 1) { + battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY() + 1).setHit(true); + } + } + + private static void markDiagonalRightAboveAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != 0 && currentCell.getY() != Field.FIELD_SIZE - 1) { + battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY() + 1).setHit(true); + } + } + + private static void markDiagonalLeftAboveAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != 0 && currentCell.getY() != 0) { + battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY() - 1).setHit(true); + } + } + + private static void markDiagonalLeftBelowAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != Field.FIELD_SIZE - 1 && currentCell.getY() != 0) { + battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY() - 1).setHit(true); + } + } + + private static void markAboveAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != 0) { + battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY()).setHit(true); + } + } + + private static void markBelowAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != Field.FIELD_SIZE - 1) { + battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY()).setHit(true); + } + } + +} diff --git a/src/main/java/course_project/utils/RandomCellPositionGenerator.java b/src/main/java/course_project/utils/RandomCellPositionGenerator.java new file mode 100644 index 00000000..0a44065d --- /dev/null +++ b/src/main/java/course_project/utils/RandomCellPositionGenerator.java @@ -0,0 +1,15 @@ +package course_project.utils; + +import java.security.SecureRandom; + +import static course_project.gamestuff.field.Field.FIELD_SIZE; + +public class RandomCellPositionGenerator { + + private RandomCellPositionGenerator() {} + + public static int generateRandomForCell() { + return new SecureRandom().nextInt(FIELD_SIZE); + } + +} diff --git a/src/main/java/course_project/utils/RandomShipDirectionGenerator.java b/src/main/java/course_project/utils/RandomShipDirectionGenerator.java new file mode 100644 index 00000000..bf03c2ff --- /dev/null +++ b/src/main/java/course_project/utils/RandomShipDirectionGenerator.java @@ -0,0 +1,11 @@ +package course_project.utils; + +public class RandomShipDirectionGenerator { + + private RandomShipDirectionGenerator() {} + + public static boolean generateRandomDirection() { + return Math.random() <= 0.5; + } + +} diff --git a/src/main/java/course_project/utils/ShipOnBattlefieldPlacer.java b/src/main/java/course_project/utils/ShipOnBattlefieldPlacer.java new file mode 100644 index 00000000..dd23070d --- /dev/null +++ b/src/main/java/course_project/utils/ShipOnBattlefieldPlacer.java @@ -0,0 +1,141 @@ +package course_project.utils; + +import course_project.gamestuff.field.Battlefield; +import course_project.gamestuff.field.Cell; +import course_project.gamestuff.ships.Ship; + +import static course_project.gamestuff.field.Field.FIELD_SIZE; + +/** + * Ship placing on owner battlefield + * checkers for availability of addition ship. + */ +public final class ShipOnBattlefieldPlacer { + + private ShipOnBattlefieldPlacer() {} + + public static boolean isEnoughSpaceToPlaceShip(Cell fromCell, int shipSize, boolean isHorizontal) { + return isHorizontal ? + fromCell.getY() >= 0 && fromCell.getY() + shipSize <= FIELD_SIZE : + fromCell.getX() >= 0 && fromCell.getX() + shipSize <= FIELD_SIZE; + } + + public static boolean addColumnOfCells(Battlefield battlefield, Cell firstCell, Ship ship) { + if (isAbleToAddColumnOfCells(battlefield, firstCell, ship.getSize())) { + int y = firstCell.getY(); + ship.setStartCell(firstCell); + ship.setVertical(); + for (int i = firstCell.getX(); i < firstCell.getX() + ship.getSize(); i++) { + battlefield.getCellByPosition(i, y).placeShipOnCell(ship); + } + return true; + } + return false; + } + + public static boolean addRowOfCells(Battlefield battlefield, Cell firstCell, Ship ship) { + if (isAbleToAddRowOfCells(battlefield, firstCell, ship.getSize())) { + int x = firstCell.getX(); + ship.setStartCell(firstCell); + for (int j = firstCell.getY(); j < firstCell.getY() + ship.getSize(); j++) { + battlefield.getCellByPosition(x, j).placeShipOnCell(ship); + } + return true; + } + return false; + } + + private static boolean isAbleToAddColumnOfCells(Battlefield battlefield, Cell firstCell, int shipSize) { + if (!(isCellAboveFromCurrentIsEmpty(battlefield, firstCell) && + isCellDiagonalLeftAboveFromCurrentIsEmpty(battlefield, firstCell) && + isCellDiagonalRightAboveFromCurrentIsEmpty(battlefield, firstCell))) { + return false; + } + int y = firstCell.getY(); + for (int i = firstCell.getX(); i < firstCell.getX() + shipSize; i++) { + Cell currentCell = battlefield.getCellByPosition(i, y); + if (!(battlefield.isCellEmpty(currentCell) && + isCellBelowFromCurrentIsEmpty(battlefield, currentCell) && + isCellLeftFromCurrentIsEmpty(battlefield, currentCell) && + isCellRightFromCurrentIsEmpty(battlefield, currentCell))) { + return false; + } + if (i == firstCell.getX() + shipSize - 1 && + !(isCellDiagonalLeftBelowFromCurrentIsEmpty(battlefield, currentCell) && + isCellDiagonalRightBelowFromCurrentIsEmpty(battlefield, currentCell)) + ) { + return false; + } + } + return true; + } + + private static boolean isAbleToAddRowOfCells(Battlefield battlefield, Cell firstCell, int shipSize) { + if (!(isCellLeftFromCurrentIsEmpty(battlefield, firstCell) && + isCellDiagonalLeftAboveFromCurrentIsEmpty(battlefield, firstCell) && + isCellDiagonalLeftBelowFromCurrentIsEmpty(battlefield, firstCell) && + isCellDiagonalRightAboveFromCurrentIsEmpty(battlefield, firstCell)) + ) { + return false; + } + int x = firstCell.getX(); + for (int j = firstCell.getY(); j < firstCell.getY() + shipSize; j++) { + Cell currentCell = battlefield.getCellByPosition(x, j); + if (!(battlefield.isCellEmpty(currentCell) && + isCellRightFromCurrentIsEmpty(battlefield, currentCell) && + isCellAboveFromCurrentIsEmpty(battlefield, currentCell) && + isCellBelowFromCurrentIsEmpty(battlefield, currentCell)) + ) { + return false; + } + if (j == firstCell.getY() + shipSize - 1 && + !(isCellDiagonalRightAboveFromCurrentIsEmpty(battlefield, currentCell) && + isCellDiagonalRightBelowFromCurrentIsEmpty(battlefield, currentCell)) + ) { + return false; + } + } + return true; + } + + private static boolean isCellRightFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getY() == FIELD_SIZE - 1 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX(), currentCell.getY() + 1)); + } + + private static boolean isCellLeftFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getY() == 0 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX(), currentCell.getY() - 1)); + } + + private static boolean isCellAboveFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getX() == 0 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY())); + } + + private static boolean isCellBelowFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getX() == FIELD_SIZE - 1 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY())); + } + + private static boolean isCellDiagonalLeftAboveFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getX() == 0 || currentCell.getY() == 0 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY() - 1)); + } + + private static boolean isCellDiagonalRightAboveFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getX() == 0 || currentCell.getY() == FIELD_SIZE - 1 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY() + 1)); + } + + private static boolean isCellDiagonalLeftBelowFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getX() == FIELD_SIZE - 1 || currentCell.getY() == 0 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY() - 1)); + } + + private static boolean isCellDiagonalRightBelowFromCurrentIsEmpty(Battlefield battlefield, Cell currentCell) { + return currentCell.getX() == FIELD_SIZE - 1 || currentCell.getY() == FIELD_SIZE - 1 || + battlefield.isCellEmpty(battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY() + 1)); + } + +} diff --git a/src/main/resources/sea_battle/rules.txt b/src/main/resources/sea_battle/rules.txt new file mode 100644 index 00000000..d87a56b4 --- /dev/null +++ b/src/main/resources/sea_battle/rules.txt @@ -0,0 +1,54 @@ +-Правила размещения кораблей (флота) + +Игровое поле — обычно квадрат 10×10 у каждого игрока, на котором размещается флот кораблей. +Вертикали обычно нумеруются сверху вниз, а горизонтали помечаются буквами слева направо. +При этом используются буквы русского алфавита от «а» до «к» (буквы «ё» и «й» обычно пропускаются) +либо от «а» до «и» (с использованием буквы «ё»), либо буквы латинского алфавита от «a» до «j». + +Размещаются: + 1 корабль — ряд из 4 клеток («четырёхпалубный»; линкор) + 2 корабля — ряд из 3 клеток («трёхпалубные»; крейсера) + 3 корабля — ряд из 2 клеток («двухпалубные»; эсминцы) + 4 корабля — 1 клетка («однопалубные»; торпедные катера) + +При размещении корабли не могут касаться друг друга сторонами и углами. +Встречаются, однако, варианты, когда касание углами не запрещается. +Встречаются также варианты игры, когда корабли могут размещаться буквой «Г» («трех-» и «четырехпалубные»), +квадратом или зигзагом («четырехпалубные»). +Кроме того, есть варианты с другим набором кораблей (напр., один пятипалубный, два четырёхпалубных и т. д.) +и/или другой формой поля (15×15 для пятипалубных (авианосец)). + +Рядом со «своим» полем чертится «чужое» такого же размера, только пустое. +Это участок моря, где плавают корабли противника. + +При попадании в корабль противника — на чужом поле ставится крестик, при холостом выстреле — точка. +Попавший стреляет ещё раз. + +Самыми уязвимыми являются линкор и торпедный катер: первый из-за крупных размеров, +в связи с чем его сравнительно легко найти, а второй из-за того, что топится с одного удара, +хотя его найти достаточно сложно. + +-Потопление кораблей противника + +Перед началом боевых действий игроки бросают жребий или договариваются, кто будет ходить первым. + +Игрок, выполняющий ход, совершает выстрел — называет вслух координаты клетки, в которой, по его мнению, +находится корабль противника, например, «В1». + + Если выстрел пришёлся в клетку, не занятую ни одним кораблём противника, + то следует ответ «Мимо!» и стрелявший игрок ставит на чужом квадрате в этом месте точку. + Право хода переходит к сопернику. + + Если выстрел пришёлся в клетку, где находится многопалубный корабль (размером больше чем 1 клетка), + то следует ответ «Ранил(а)!» или «Попал(а)!», кроме одного случая. + Стрелявший игрок ставит на чужом поле в эту клетку крестик, + а его противник ставит крестик на своём поле также в эту клетку. + Стрелявший игрок получает право на ещё один выстрел. + + Если выстрел пришёлся в клетку, где находится однотрубный корабль, + или последнюю непоражённую клетку многопалубного корабля, + то следует ответ «Убил(а)!» или «Потопил(а)!». + Оба игрока отмечают потопленный корабль на листе. Стрелявший игрок получает право на ещё один выстрел. + + +Победителем считается тот, кто первым потопит все 10 кораблей противника. From 0fdfad3a004537f989b26ed33e9060ce511add57 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 21 Sep 2021 17:54:50 +0300 Subject: [PATCH 61/67] changed field size to 10 ;) changed ship naming functions; README upd; --- README.md | 1 + src/main/java/course_project/gamestuff/field/Battlefield.java | 2 +- src/main/java/course_project/gamestuff/field/Field.java | 2 +- src/main/java/course_project/gamestuff/ships/Ship.java | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2d569290..6b62de1b 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ HW5.1 | [Power Of Number](./src/main/java/homework_5/power_of_number/)
[Te HW5.2 | [Custom Regex Matcher](./src/main/java/homework_5/custom_regex_matcher/)
[Tests](./src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java) | App reads input from keyboard and print true or false for the input matching to the hardcoded regex format. | HW6 | [MapProblemsGenerator](./src/main/java/homework_6/map_problems_collision_generator/) | App which has:
1) Class creating 100% HashMap collisions
2) Mutable class with overridden HashCode/Equals. When put MutableClass object into HashMap as key - can't retrieve it (equals works correctly) | HW7 | [Kitten to Cat](./src/main/java/homework_7/kitten_to_cat/)
[Tests](./src/test/java/homework_7/kitten_to_cat/KittenToCatTest.java) | App using Functional Interface KittenToCatFunction with abstract method grow(). Realization in Main class through lambda function | +Course project | [Sea Battle](./src/main/java/course_project/) | Sea Battle console game |
diff --git a/src/main/java/course_project/gamestuff/field/Battlefield.java b/src/main/java/course_project/gamestuff/field/Battlefield.java index 5d253e55..a25b0386 100644 --- a/src/main/java/course_project/gamestuff/field/Battlefield.java +++ b/src/main/java/course_project/gamestuff/field/Battlefield.java @@ -103,7 +103,7 @@ public void setAroundShipCellsAsHit(Player currentPlayer, Ship ship) { if (ship.getSize() == 1) { fillAroundSmallShip(currentPlayer, ship); } else { - if (ship.isVertical()) { + if (ship.isHorizontal()) { fillAroundHorizontalShip(currentPlayer, ship); } else { fillAroundVerticalShip(currentPlayer, ship); diff --git a/src/main/java/course_project/gamestuff/field/Field.java b/src/main/java/course_project/gamestuff/field/Field.java index f54cacee..c3f05933 100644 --- a/src/main/java/course_project/gamestuff/field/Field.java +++ b/src/main/java/course_project/gamestuff/field/Field.java @@ -6,7 +6,7 @@ public abstract class Field { - public static final int FIELD_SIZE = 12; + public static final int FIELD_SIZE = 10; public static final int LOWERCASE_A = 'a'; private static final String WATER = BLUE_BG + " " + ANSI_RESET; private static final String DESTROYED = ANSI_RED + "†" + ANSI_RESET; diff --git a/src/main/java/course_project/gamestuff/ships/Ship.java b/src/main/java/course_project/gamestuff/ships/Ship.java index cafd7fc0..89ab0948 100644 --- a/src/main/java/course_project/gamestuff/ships/Ship.java +++ b/src/main/java/course_project/gamestuff/ships/Ship.java @@ -8,7 +8,7 @@ public abstract class Ship { private final String name; private int hitCount; private Cell startCell; - private boolean direction = true; // true - vertical, false - horizontal + private boolean direction = true; // true - horizontal, false - vertical protected Ship(int size, String shipName) { this.size = size; @@ -17,7 +17,7 @@ protected Ship(int size, String shipName) { this.startCell = null; } - public boolean isVertical() { + public boolean isHorizontal() { return this.direction; } From f1dfc08306767d8067e1b0fc9655ce9d6d76b69d Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 21 Sep 2021 21:08:40 +0300 Subject: [PATCH 62/67] upd for more comfortable PVP game --- .../gamestuff/field/Battlefield.java | 2 - .../course_project/gamestuff/field/Cell.java | 2 +- .../services/conversation/DialogueMenu.java | 60 +++++--- .../course_project/services/logic/Game.java | 126 ++++++++++++++++ .../services/logic/GameLogic.java | 137 ------------------ .../utils/AroundDestroyedShipMarker.java | 30 ++-- 6 files changed, 180 insertions(+), 177 deletions(-) create mode 100644 src/main/java/course_project/services/logic/Game.java delete mode 100644 src/main/java/course_project/services/logic/GameLogic.java diff --git a/src/main/java/course_project/gamestuff/field/Battlefield.java b/src/main/java/course_project/gamestuff/field/Battlefield.java index a25b0386..58e73316 100644 --- a/src/main/java/course_project/gamestuff/field/Battlefield.java +++ b/src/main/java/course_project/gamestuff/field/Battlefield.java @@ -14,8 +14,6 @@ /** * Battlefield is Field for the Player(owner) of this object. - * It stores all ships available for adding, - * and then for removing on destroy to find out who is winner in the game. */ public class Battlefield extends Field { diff --git a/src/main/java/course_project/gamestuff/field/Cell.java b/src/main/java/course_project/gamestuff/field/Cell.java index 2e97b199..31012973 100644 --- a/src/main/java/course_project/gamestuff/field/Cell.java +++ b/src/main/java/course_project/gamestuff/field/Cell.java @@ -7,7 +7,7 @@ public class Cell { private final int x; private final int y; private Ship ref; - private boolean hit; + private boolean hit; // stores state of cell: if motion to this cell was made public Cell(int x, int y) { this.x = x; diff --git a/src/main/java/course_project/services/conversation/DialogueMenu.java b/src/main/java/course_project/services/conversation/DialogueMenu.java index dda92cf4..5eb3c0c7 100644 --- a/src/main/java/course_project/services/conversation/DialogueMenu.java +++ b/src/main/java/course_project/services/conversation/DialogueMenu.java @@ -3,7 +3,7 @@ import course_project.gamestuff.field.Field; import course_project.gamestuff.player.Player; import course_project.gamestuff.ships.Ship; -import course_project.services.logic.GameLogic; +import course_project.services.logic.Game; import homework_4.custom_file_reader.CustomFileReader; import java.util.Scanner; @@ -14,10 +14,7 @@ import static course_project.gamestuff.field.Field.LOWERCASE_A; /** - * Ultimate class for communication over the app; - * it's using functional style, just because it's no reason to use extra memory for storing object, - * and no even reason to create object of such type except it'd implement command pattern - - * but it's completely different way to communicate over app. + * Ultimate class for communication with user over the app; */ public class DialogueMenu { @@ -46,7 +43,7 @@ public static void printGreetings() { public static void printMainMenu() { System.out.print( - "[1] Start game Human vs Computer\n" + + "[1] Start game Human vs Computer\n" + "[2] Start game Human vs Human\n" + "[3] Start game Computer vs Computer\n" + "[4] Print rules\n" + @@ -72,13 +69,12 @@ public static void printMainMenu() { break; default: System.out.println(INCORRECT_INPUT_MESSAGE); - printMainMenu(); // recursion, wow! + printMainMenu(); } } private static void printRules() { - new CustomFileReader("./src/main/resources/sea_battle/", "rules.txt") - .run2(); + new CustomFileReader("./src/main/resources/sea_battle/", "rules.txt").run2(); } private static void startComputerVSComputer() { @@ -86,22 +82,30 @@ private static void startComputerVSComputer() { enemy = new Player("CPU1", true); addShipsAuto(player); addShipsAuto(enemy); - new GameLogic(player, enemy).run(); + new Game(player, enemy).start(); } - @SuppressWarnings("java:S2142") // like senior developer! yah? + private static void startHumanVSHuman() { player = new Player(getInputName(), false); enemy = new Player(getInputName(), false); printPlayerMenu(player); + waitForSeconds(2); + printEmptyLines(); + printInvitePlayerMessage(enemy); + waitForSeconds(1); + printPlayerMenu(enemy); + waitForSeconds(1); + new Game(player, enemy).start(); + } + + @SuppressWarnings("java:S2142") + public static void waitForSeconds(int seconds) { try { - printInviteOpponentMessage(enemy); - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); + Thread.sleep(seconds * 1000L); + } catch (InterruptedException ex) { + ex.printStackTrace(); } - printPlayerMenu(enemy); - new GameLogic(player, enemy).run(); } private static void startHumanVSComputer() { @@ -109,7 +113,7 @@ private static void startHumanVSComputer() { enemy = new Player("Mozilla", true); printPlayerMenu(player); addShipsAuto(enemy); - new GameLogic(player, enemy).run(); + new Game(player, enemy).start(); } private static String getInputName() { @@ -120,13 +124,13 @@ private static String getInputName() { return name; } else { System.out.println("Ha-ha, it's impossible to have such name!\n" + - "It should consists of at least 2 latin symbols and no numbers and spaces, ok?"); + "It should consists of at least 2 latin symbols(only), ok?"); } } } - public static void printInviteOpponentMessage(Player opponent) { - System.out.println(opponent.getName() + "'s turn!"); + public static void printInvitePlayerMessage(Player player) { + System.out.println(player.getName() + "'s turn!"); } private static void printPlayerMenu(Player currentPlayer) { @@ -147,7 +151,7 @@ private static void printPlayerMenu(Player currentPlayer) { break; default: System.out.println(INCORRECT_INPUT_MESSAGE); - printPlayerMenu(currentPlayer); // recursion again, ok!? + printPlayerMenu(currentPlayer); } } @@ -164,6 +168,10 @@ public static String getPlayerMotionInput() { } } + public static void printPlayerMotionHelp() { + System.out.println("Input position you want to attack in format: 'a1' or 'b9'"); + } + public static void printPlayerShipPlacingHelp() { System.out.println("To place ship just input position from" + "'a1' to " + ((char) (LOWERCASE_A + FIELD_SIZE - 1)) + FIELD_SIZE + @@ -230,6 +238,14 @@ public static void printCongratulationsAndQuit(Player currentPlayer, Player oppo terminate(); } + public static void printEmptyLines() { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < FIELD_SIZE * 2; i++) { + stringBuilder.append("\n"); + } + System.out.println(stringBuilder); + } + private static void terminate() { scanner.close(); Runtime.getRuntime().exit(0); // James Gosling approved! diff --git a/src/main/java/course_project/services/logic/Game.java b/src/main/java/course_project/services/logic/Game.java new file mode 100644 index 00000000..550afb03 --- /dev/null +++ b/src/main/java/course_project/services/logic/Game.java @@ -0,0 +1,126 @@ +package course_project.services.logic; + +import course_project.gamestuff.field.Battlefield; +import course_project.gamestuff.field.Cell; +import course_project.gamestuff.player.Player; +import course_project.gamestuff.ships.Ship; + +import static course_project.services.conversation.DialogueMenu.*; +import static course_project.utils.RandomCellPositionGenerator.generateRandomForCell; + +/** + * Game logic provides control through the game process; + */ +public class Game { + + private final Player player1; + private final Player player2; + private Player currentPlayer; + + public Game(Player firstPlayer, Player secondPlayer) { + this.player1 = firstPlayer; + this.player2 = secondPlayer; + currentPlayer = getRandomPlayer(); + } + + private Player getRandomPlayer() { + return Math.random() <= 0.5 ? this.player1 : this.player2; + } + + // switch to opponents turn + private void swapPlayers() { + if (currentPlayer == player1) { + this.currentPlayer = this.player2; + } else { + this.currentPlayer = this.player1; + } + } + + private Player getEnemy() { + return currentPlayer == player1 ? player2 : player1; + } + + + public void start() { + while (currentPlayer.getField().hasAvailableShips() && getEnemy().getField().hasAvailableShips()) { + if (currentPlayer.isComputer() && getEnemy().isComputer()) { + computerMotion(currentPlayer); + } else if (!currentPlayer.isComputer() && getEnemy().isComputer()) { + humanMotion(currentPlayer); + } else if (currentPlayer.isComputer() && !getEnemy().isComputer()) { + computerMotion(currentPlayer); + } else { + waitForSeconds(2); + printEmptyLines(); + printInvitePlayerMessage(currentPlayer); + waitForSeconds(3); + printPlayerMotionHelp(); + humanMotion(currentPlayer); + } + } + } + + private void computerMotion(Player currentPlayer) { + Cell enemyCell = getEnemy().getField().getCellByPosition(generateRandomForCell(), generateRandomForCell()); + if (!enemyCell.isHit()) { + enemyCell.setHit(true); + Battlefield enemyBattlefield = getEnemy().getField(); + if (!enemyBattlefield.isCellEmpty(enemyCell)) { + Ship enemyShip = enemyCell.getRef(); + enemyShip.hitCountIncrease(); + if (enemyShip.isShipDestroyed()) { + enemyBattlefield.availableShipsDecrease(enemyShip); + enemyBattlefield.setAroundShipCellsAsHit(getEnemy(), enemyShip); + printShipDestroyedMessage(getEnemy().getName(), enemyShip); + if (!enemyBattlefield.hasAvailableShips()) { + printCongratulationsAndQuit(currentPlayer, getEnemy()); + } + } else { + printShipHitMessage(currentPlayer.getName(), getEnemy().getName()); + } + computerMotion(currentPlayer); + } else { + swapPlayers(); + } + } else { + computerMotion(currentPlayer); + } + } + + private void humanMotion(Player currentPlayer) { + currentPlayer.getField().printBothFields(currentPlayer, getEnemy()); + String pos = getPlayerMotionInput(); + Cell enemyCell = getEnemy().getField().getCellByPosition( + Integer.parseInt(pos.substring(1)) - 1, + Integer.parseInt(String.valueOf(pos.charAt(0) - 97)) + ); + if (enemyCell.isHit()) { + printSamePositionMessage(); + humanMotion(currentPlayer); + } else { + enemyCell.setHit(true); + Battlefield enemiesField = getEnemy().getField(); + if (!enemiesField.isCellEmpty(enemyCell)) { + Ship enemyShip = enemyCell.getRef(); + enemyShip.hitCountIncrease(); + if (enemyShip.isShipDestroyed()) { + enemiesField.setAroundShipCellsAsHit(getEnemy(), enemyShip); + enemiesField.availableShipsDecrease(enemyShip); + printShipDestroyedMessage(getEnemy().getName(), enemyShip); + if (!enemiesField.hasAvailableShips()) { + currentPlayer.getField().printBothFields(currentPlayer, getEnemy()); + printCongratulationsAndQuit(currentPlayer, getEnemy()); + } + printShipsLeftMessage(enemiesField.countOfAvailableShips()); + } else { + printShipHitMessage(currentPlayer.getName(), getEnemy().getName()); + } + humanMotion(currentPlayer); + } else { + printMiss(); + swapPlayers(); + } + } + } + +} diff --git a/src/main/java/course_project/services/logic/GameLogic.java b/src/main/java/course_project/services/logic/GameLogic.java deleted file mode 100644 index b622b615..00000000 --- a/src/main/java/course_project/services/logic/GameLogic.java +++ /dev/null @@ -1,137 +0,0 @@ -package course_project.services.logic; - -import course_project.gamestuff.field.Battlefield; -import course_project.gamestuff.field.Cell; -import course_project.gamestuff.player.Player; -import course_project.gamestuff.ships.Ship; - -import static course_project.services.conversation.DialogueMenu.*; -import static course_project.utils.RandomCellPositionGenerator.generateRandomForCell; - -/** - * Game logic provides control through the game process; - */ -public class GameLogic { - - private final Player player1; - private final Player player2; - private Player currentPlayer; - - public GameLogic(Player firstPlayer, Player secondPlayer) { - this.player1 = firstPlayer; - this.player2 = secondPlayer; - currentPlayer = getRandomPlayer(); - } - - private Player getRandomPlayer() { - return Math.random() <= 0.5 ? this.player1 : this.player2; - } - - // switch to opponents turn - private void swapPlayers() { - if (currentPlayer == player1) { - this.currentPlayer = this.player2; - } else { - this.currentPlayer = this.player1; - } - } - - private Player getEnemy() { - return currentPlayer == player1 ? player2 : player1; - } - - public void run() { - while (currentPlayer.getField().hasAvailableShips() && getEnemy().getField().hasAvailableShips()) { - if (currentPlayer.isComputer() && getEnemy().isComputer()) { - computerMotion(currentPlayer); - } else if (!currentPlayer.isComputer() && getEnemy().isComputer()) { - humanMotion(currentPlayer); - } else if (currentPlayer.isComputer() && !getEnemy().isComputer()) { - computerMotion(currentPlayer); - } else { - try { - printInviteOpponentMessage(currentPlayer); - Thread.sleep(5000); - } catch (InterruptedException ex) { - ex.printStackTrace(); - } - humanMotion(currentPlayer); - } - } - } - - private void finishGame() { - if (currentPlayer.getField().hasAvailableShips()) { - printCongratulationsAndQuit(currentPlayer, getEnemy()); - } else { - printCongratulationsAndQuit(getEnemy(), currentPlayer); - } - } - - private void computerMotion(Player currentPlayer) { - int x = generateRandomForCell(); - int y = generateRandomForCell(); - if (!getEnemy().getField().getCellByPosition(x, y).isHit()) { - getEnemy().getField().getCellByPosition(x, y).setHit(true); - if (!getEnemy().getField().isCellEmpty(getEnemy().getField().getCellByPosition(x, y))) { - Ship enemyShip = getEnemy().getField().getCellByPosition(x, y).getRef(); - enemyShip.hitCountIncrease(); - if (enemyShip.isShipDestroyed()) { - getEnemy().getField().setAroundShipCellsAsHit(getEnemy(), enemyShip); - printShipDestroyedMessage(getEnemy().getName(), enemyShip); - getEnemy().getField().availableShipsDecrease(enemyShip); - if (!getEnemy().getField().hasAvailableShips()) { - finishGame(); - } - } else { - printShipHitMessage(currentPlayer.getName(), getEnemy().getName()); - } - computerMotion(currentPlayer); - } else { - swapPlayers(); - } - } else { - computerMotion(currentPlayer); - } - } - - private void humanMotion(Player currentPlayer) { - currentPlayer.getField().printBothFields(currentPlayer, getEnemy()); - try { - String pos = getPlayerMotionInput(); - int x = Integer.parseInt(pos.substring(1)) - 1; - int y = Integer.parseInt(String.valueOf(pos.charAt(0) - 97)); - if (getEnemy().getField().getCellByPosition(x, y).isHit()) { - printSamePositionMessage(); - humanMotion(currentPlayer); - } else { - Cell enemyCell = getEnemy().getField().getCellByPosition(x, y); - enemyCell.setHit(true); - if (!getEnemy().getField().isCellEmpty(enemyCell)) { - Ship enemyShip = enemyCell.getRef(); - enemyShip.hitCountIncrease(); - if (enemyShip.isShipDestroyed()) { - Battlefield enemiesField = getEnemy().getField(); - enemiesField.setAroundShipCellsAsHit(getEnemy(), enemyShip); - enemiesField.availableShipsDecrease(enemyShip); - if (!enemiesField.hasAvailableShips()) { - currentPlayer.getField().printBothFields(currentPlayer, getEnemy()); - finishGame(); - } - printShipsLeftMessage(enemiesField.countOfAvailableShips()); - printShipDestroyedMessage(getEnemy().getName(), enemyShip); - } else { - printShipHitMessage(currentPlayer.getName(), getEnemy().getName()); - } - humanMotion(currentPlayer); - } else { - printMiss(); - swapPlayers(); - } - } - } catch (NumberFormatException exception) { - humanMotion(currentPlayer); - } - } - -} diff --git a/src/main/java/course_project/utils/AroundDestroyedShipMarker.java b/src/main/java/course_project/utils/AroundDestroyedShipMarker.java index ce7bf59a..14d36f65 100644 --- a/src/main/java/course_project/utils/AroundDestroyedShipMarker.java +++ b/src/main/java/course_project/utils/AroundDestroyedShipMarker.java @@ -69,6 +69,18 @@ public static void fillAroundHorizontalShip(Player currentPlayer, Ship ship) { } } + private static void markAboveAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != 0) { + battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY()).setHit(true); + } + } + + private static void markBelowAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != Field.FIELD_SIZE - 1) { + battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY()).setHit(true); + } + } + private static void markRightAsHitCell(Battlefield battlefield, Cell currentCell) { if (currentCell.getY() != Field.FIELD_SIZE - 1) { battlefield.getCellByPosition(currentCell.getX(), currentCell.getY() + 1).setHit(true); @@ -93,27 +105,15 @@ private static void markDiagonalRightAboveAsHitCell(Battlefield battlefield, Cel } } - private static void markDiagonalLeftAboveAsHitCell(Battlefield battlefield, Cell currentCell) { - if (currentCell.getX() != 0 && currentCell.getY() != 0) { - battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY() - 1).setHit(true); - } - } - private static void markDiagonalLeftBelowAsHitCell(Battlefield battlefield, Cell currentCell) { if (currentCell.getX() != Field.FIELD_SIZE - 1 && currentCell.getY() != 0) { battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY() - 1).setHit(true); } } - private static void markAboveAsHitCell(Battlefield battlefield, Cell currentCell) { - if (currentCell.getX() != 0) { - battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY()).setHit(true); - } - } - - private static void markBelowAsHitCell(Battlefield battlefield, Cell currentCell) { - if (currentCell.getX() != Field.FIELD_SIZE - 1) { - battlefield.getCellByPosition(currentCell.getX() + 1, currentCell.getY()).setHit(true); + private static void markDiagonalLeftAboveAsHitCell(Battlefield battlefield, Cell currentCell) { + if (currentCell.getX() != 0 && currentCell.getY() != 0) { + battlefield.getCellByPosition(currentCell.getX() - 1, currentCell.getY() - 1).setHit(true); } } From d0e0a9f6c2ec49b63dc4cd890ff6b6f2de986db5 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Tue, 21 Sep 2021 21:32:28 +0300 Subject: [PATCH 63/67] bug fixed :) --- .../java/course_project/services/conversation/DialogueMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/course_project/services/conversation/DialogueMenu.java b/src/main/java/course_project/services/conversation/DialogueMenu.java index 5eb3c0c7..b50ab0c6 100644 --- a/src/main/java/course_project/services/conversation/DialogueMenu.java +++ b/src/main/java/course_project/services/conversation/DialogueMenu.java @@ -28,7 +28,7 @@ public class DialogueMenu { private static final Scanner scanner = new Scanner(System.in); static { - FIRST_SYMBOL_POSITION_REGEX = "^[" + Field.LOWERCASE_A + "-" + (char) (LOWERCASE_A + FIELD_SIZE) + "]$"; + FIRST_SYMBOL_POSITION_REGEX = "^[" + Field.LOWERCASE_A + "-" + (char) (LOWERCASE_A + FIELD_SIZE - 1) + "]$"; } private static Player player; From 207e3e56a81ae6cf0b0404d76742c7df8b01c517 Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 22 Sep 2021 14:25:56 +0300 Subject: [PATCH 64/67] homeworks fixes --- src/main/java/homework_3/ImmutableClass.java | 36 ++++++++++++++----- .../Main.java | 3 +- .../MapProblemsMutableGenerator.java | 3 +- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index a7cbf867..cbe5d766 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -10,30 +10,48 @@ Deep Copy of objects should be performed in the getter methods (To return a copy No setters (To not have the option to change the value of the instance variable) */ +import java.util.LinkedList; +import java.util.List; + public final class ImmutableClass { - private final String name; // reference type + private final List allDataList; // mutable type private final int age; // primitive type private final double weight; // primitive type public ImmutableClass() { - this.name = "Unknown"; this.age = 0; this.weight = 0.0; + this.allDataList = new LinkedList<>(); + initAllDataList(); } - public ImmutableClass(String str, int age, double weight) { - this.name = str; + public ImmutableClass(int age, double weight) { this.age = age; this.weight = weight; + this.allDataList = new LinkedList<>(); + initAllDataList(); + } + + public ImmutableClass(List allData, int age, double weight) { + this.allDataList = new LinkedList<>(allData); + this.age = age; + this.weight = weight; + } + + private void initAllDataList() { + this.allDataList.add(age); + this.allDataList.add(weight); } - public ImmutableClass(String str) { - this(str, 1, 1.0); + public List getAllDataList() { + return new LinkedList<>(this.allDataList); } - public String getName() { - return name; + public ImmutableClass getAllDataListChangeable(List changes) { + List list = getAllDataList(); + list.addAll(changes); + return new ImmutableClass(list, this.age, this.weight); } public int getAge() { @@ -45,7 +63,7 @@ public double getWeight() { } public final Object newObjectMethod() { - return new ImmutableClass(name, age, weight); + return new ImmutableClass(); } } diff --git a/src/main/java/homework_6/map_problems_collision_generator/Main.java b/src/main/java/homework_6/map_problems_collision_generator/Main.java index d0de1d27..18a51a37 100644 --- a/src/main/java/homework_6/map_problems_collision_generator/Main.java +++ b/src/main/java/homework_6/map_problems_collision_generator/Main.java @@ -11,8 +11,9 @@ public static void main(String[] args) { MapProblemsMutableGenerator mapProblemsMutableGenerator = new MapProblemsMutableGenerator(); mapProblemsMutableGenerator.setVal("ложим!"); - unluckyMap.put(mapProblemsMutableGenerator, mapProblemsMutableGenerator.getVal()); + mapProblemsMutableGenerator.setVal("кладем!"); + System.out.println("не можИм! " + unluckyMap.get(mapProblemsMutableGenerator)); } diff --git a/src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java index 9fb506e8..43486379 100644 --- a/src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java +++ b/src/main/java/homework_6/map_problems_collision_generator/MapProblemsMutableGenerator.java @@ -1,7 +1,6 @@ package homework_6.map_problems_collision_generator; import java.util.Objects; -import java.util.Random; public class MapProblemsMutableGenerator { @@ -21,7 +20,7 @@ public void setVal(String val) { @Override public int hashCode() { - return new Random().nextInt(Integer.MAX_VALUE - 1); + return Objects.hashCode(val); } @Override From 8470929227a97a7d9952e813689760aa8bdd7a6b Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 22 Sep 2021 14:26:18 +0300 Subject: [PATCH 65/67] course project optimizations --- .../course_project/gamestuff/field/Field.java | 2 +- .../services/conversation/DialogueMenu.java | 48 ++++++++++--------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/course_project/gamestuff/field/Field.java b/src/main/java/course_project/gamestuff/field/Field.java index c3f05933..4b5384a5 100644 --- a/src/main/java/course_project/gamestuff/field/Field.java +++ b/src/main/java/course_project/gamestuff/field/Field.java @@ -69,7 +69,7 @@ public void printBothFields(Player currentPlayer, Player enemy) { bothFields .append("\t") .append(TOP_LINE) - .append("\t\t\t ") + .append("\t\t\t\t") .append(TOP_LINE) .append("\n"); for (int i = 0; i < FIELD_SIZE; i++) { diff --git a/src/main/java/course_project/services/conversation/DialogueMenu.java b/src/main/java/course_project/services/conversation/DialogueMenu.java index b50ab0c6..c37cdae2 100644 --- a/src/main/java/course_project/services/conversation/DialogueMenu.java +++ b/src/main/java/course_project/services/conversation/DialogueMenu.java @@ -6,6 +6,7 @@ import course_project.services.logic.Game; import homework_4.custom_file_reader.CustomFileReader; +import java.io.PrintStream; import java.util.Scanner; import static course_project.gamestuff.field.Battlefield.addShipsAuto; @@ -16,6 +17,7 @@ /** * Ultimate class for communication with user over the app; */ +@SuppressWarnings("java:S106") // remove showing System.out warning public class DialogueMenu { private static final String INCORRECT_INPUT_MESSAGE = "Please, input correct variant"; @@ -26,6 +28,7 @@ public class DialogueMenu { private static final String DIRECTION_REGEX = "^[v|h]$"; private static final String NAME_REGEX = "^[a-zA-Z]{2,}$"; private static final Scanner scanner = new Scanner(System.in); + private static final PrintStream out = System.out; static { FIRST_SYMBOL_POSITION_REGEX = "^[" + Field.LOWERCASE_A + "-" + (char) (LOWERCASE_A + FIELD_SIZE - 1) + "]$"; @@ -38,11 +41,11 @@ private DialogueMenu() { } public static void printGreetings() { - System.out.println(WELCOME_MESSAGE); + out.println(WELCOME_MESSAGE); } public static void printMainMenu() { - System.out.print( + out.print( "[1] Start game Human vs Computer\n" + "[2] Start game Human vs Human\n" + "[3] Start game Computer vs Computer\n" + @@ -68,7 +71,7 @@ public static void printMainMenu() { terminate(); break; default: - System.out.println(INCORRECT_INPUT_MESSAGE); + out.println(INCORRECT_INPUT_MESSAGE); printMainMenu(); } } @@ -117,24 +120,24 @@ private static void startHumanVSComputer() { } private static String getInputName() { - System.out.println("My name is SeaBattle, and yours?"); + out.println("My name is SeaBattle, and yours?"); while (true) { String name = scanner.nextLine().trim(); if (name.matches(NAME_REGEX)) { return name; } else { - System.out.println("Ha-ha, it's impossible to have such name!\n" + + out.println("Ha-ha, it's impossible to have such name!\n" + "It should consists of at least 2 latin symbols(only), ok?"); } } } public static void printInvitePlayerMessage(Player player) { - System.out.println(player.getName() + "'s turn!"); + out.println(player.getName() + "'s turn!"); } private static void printPlayerMenu(Player currentPlayer) { - System.out.print("Menu for " + currentPlayer.getName() + ":" + "\n" + + out.print("Menu for " + currentPlayer.getName() + ":" + "\n" + "[1] Add ships on the field manually\n" + "[2] Auto adding ships\n"); String input = getInput(); @@ -142,15 +145,15 @@ private static void printPlayerMenu(Player currentPlayer) { case "1": addShipsManually(currentPlayer); currentPlayer.getField().printField(); - System.out.println(FILLED_FIELD_MESSAGE + "\n"); + out.println(FILLED_FIELD_MESSAGE + "\n"); break; case "2": addShipsAuto(currentPlayer); currentPlayer.getField().printField(); - System.out.println(FILLED_FIELD_MESSAGE + "\n"); + out.println(FILLED_FIELD_MESSAGE + "\n"); break; default: - System.out.println(INCORRECT_INPUT_MESSAGE); + out.println(INCORRECT_INPUT_MESSAGE); printPlayerMenu(currentPlayer); } } @@ -163,17 +166,18 @@ public static String getPlayerMotionInput() { } else if (isPositionValid(input)) { return input; } else { - System.out.println(INCORRECT_INPUT_MESSAGE); + out.println(INCORRECT_INPUT_MESSAGE); } } } public static void printPlayerMotionHelp() { - System.out.println("Input position you want to attack in format: 'a1' or 'b9'"); + out.println("Input position you want to attack in format: 'a1' or 'b9'\n" + + "you can input 'quit' to exit the app anytime you want"); } public static void printPlayerShipPlacingHelp() { - System.out.println("To place ship just input position from" + "'a1' to " + + out.println("To place ship just input position from" + "'a1' to " + ((char) (LOWERCASE_A + FIELD_SIZE - 1)) + FIELD_SIZE + "(horizontal direction is default)" + "\nIf you want to set ship vertically type e.g. 'a1 v' or horizontal 'b2 h'" + @@ -191,7 +195,7 @@ public static String getShipPlacingInput() { (strings.length == 2 && isPositionValid(strings[0]) && strings[1].matches(DIRECTION_REGEX))) { return input; } else { - System.out.println(INCORRECT_INPUT_MESSAGE); + out.println(INCORRECT_INPUT_MESSAGE); } } } @@ -205,7 +209,7 @@ private static boolean isPositionValid(String str) { } public static void printSetPositionMessage(String name, int size) { - System.out.print("Set position for " + name + " size of " + size + ": "); + out.print("Set position for " + name + " size of " + size + ": "); } private static String getInput() { @@ -213,27 +217,27 @@ private static String getInput() { } public static void printShipDestroyedMessage(String opponentsName, Ship ship) { - System.out.println("Nice! " + opponentsName + "'s " + ship.getName() + " is destroyed!"); + out.println("Nice! " + opponentsName + "'s " + ship.getName() + " is destroyed!"); } public static void printShipHitMessage(String currentPlayerName, String opponentsName) { - System.out.println(currentPlayerName + " hit " + opponentsName + "'s ship!"); + out.println(currentPlayerName + " hit " + opponentsName + "'s ship!"); } public static void printMiss() { - System.out.println("MISS!"); + out.println("MISS!"); } public static void printShipsLeftMessage(int countOfShipsLeft) { - System.out.println(countOfShipsLeft + " ships left"); + out.println(countOfShipsLeft + " ships left"); } public static void printSamePositionMessage() { - System.out.println("You've already hit at this position! Try another one: "); + out.println("You've already hit at this position! Try another one: "); } public static void printCongratulationsAndQuit(Player currentPlayer, Player opponent) { - System.out.println(currentPlayer.getName() + " WON THE GAME !!!" + + out.println(currentPlayer.getName() + " WON THE GAME !!!" + "\n" + opponent.getName() + " lose."); terminate(); } @@ -243,7 +247,7 @@ public static void printEmptyLines() { for (int i = 0; i < FIELD_SIZE * 2; i++) { stringBuilder.append("\n"); } - System.out.println(stringBuilder); + out.println(stringBuilder); } private static void terminate() { From 127a57fa7032a53debc34791585393320cc161ec Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 22 Sep 2021 14:54:44 +0300 Subject: [PATCH 66/67] hw3 upd --- src/main/java/homework_3/Main.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/homework_3/Main.java diff --git a/src/main/java/homework_3/Main.java b/src/main/java/homework_3/Main.java new file mode 100644 index 00000000..f7214323 --- /dev/null +++ b/src/main/java/homework_3/Main.java @@ -0,0 +1,19 @@ +package homework_3; + +import java.util.LinkedList; +import java.util.List; + +public class Main { + + public static void main(String[] args) { + ImmutableClass obj = new ImmutableClass(2, 3.0); + obj.getAllDataList().forEach(System.out::println); + List changes = new LinkedList<>(); + changes.add(1); + changes.add(12.); + changes.add(13); + ImmutableClass obj2 = obj.getAllDataListChangeable(changes); + obj2.getAllDataList().forEach(System.out::println); + } + +} From 4f262da232c4b308682d7cc4cf001407260f9e7c Mon Sep 17 00:00:00 2001 From: Frank Fibonacci Date: Wed, 22 Sep 2021 19:38:47 +0300 Subject: [PATCH 67/67] hw3 upd --- src/main/java/homework_3/ImmutableClass.java | 9 +++------ src/main/java/homework_3/Main.java | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index cbe5d766..59cd2e2a 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -34,9 +34,10 @@ public ImmutableClass(int age, double weight) { } public ImmutableClass(List allData, int age, double weight) { - this.allDataList = new LinkedList<>(allData); this.age = age; this.weight = weight; + this.allDataList = new LinkedList<>(allData); + initAllDataList(); } private void initAllDataList() { @@ -48,7 +49,7 @@ public List getAllDataList() { return new LinkedList<>(this.allDataList); } - public ImmutableClass getAllDataListChangeable(List changes) { + public ImmutableClass getNewObjectWithChanges(List changes) { List list = getAllDataList(); list.addAll(changes); return new ImmutableClass(list, this.age, this.weight); @@ -62,8 +63,4 @@ public double getWeight() { return weight; } - public final Object newObjectMethod() { - return new ImmutableClass(); - } - } diff --git a/src/main/java/homework_3/Main.java b/src/main/java/homework_3/Main.java index f7214323..9884add3 100644 --- a/src/main/java/homework_3/Main.java +++ b/src/main/java/homework_3/Main.java @@ -12,7 +12,7 @@ public static void main(String[] args) { changes.add(1); changes.add(12.); changes.add(13); - ImmutableClass obj2 = obj.getAllDataListChangeable(changes); + ImmutableClass obj2 = obj.getNewObjectWithChanges(changes); obj2.getAllDataList().forEach(System.out::println); }