From 5d3db82086aa21136fbdd0b1dfbe610195f88f0e Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 5 Jul 2021 19:50:11 +0300 Subject: [PATCH 01/82] test from kirill --- src/main/java/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 9f28e436..f8ea4ecd 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -3,5 +3,5 @@ public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } - + // test Kirill } From cda776598f4844ae5e5efbce51665d0c50b3d2c7 Mon Sep 17 00:00:00 2001 From: Artem Nikolaev Date: Mon, 5 Jul 2021 21:59:44 +0500 Subject: [PATCH 02/82] Gitignore update --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8a0a60d2..2b1fb1b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ # Project exclude paths /.gradle/ /build/ -/build/classes/java/main/ \ No newline at end of file +/build/classes/java/main/ +/.idea/ +/gradle/ +/.DS_Store/ \ No newline at end of file From 986bf6e80103fe6515732d7366a527db20bd3a47 Mon Sep 17 00:00:00 2001 From: Artem Nikolaev Date: Mon, 5 Jul 2021 21:50:56 +0500 Subject: [PATCH 03/82] Initial commit v5 --- src/main/java/Main.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index f8ea4ecd..7ee8196f 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -2,6 +2,8 @@ public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); + + System.out.println("Hello World2!"); } // test Kirill } From 1d0a10b1e3844f2464a8799b012cdd291918564c Mon Sep 17 00:00:00 2001 From: Artem Nikolaev Date: Mon, 5 Jul 2021 22:14:13 +0500 Subject: [PATCH 04/82] Moving and gitignore update --- .gitignore | 32 +++++++++++++++++++++++++- src/main/java/{ => lesson_2}/Main.java | 2 ++ 2 files changed, 33 insertions(+), 1 deletion(-) rename src/main/java/{ => lesson_2}/Main.java (90%) diff --git a/.gitignore b/.gitignore index 2b1fb1b8..14f3f265 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,34 @@ /build/classes/java/main/ /.idea/ /gradle/ -/.DS_Store/ \ No newline at end of file +/.DS_Store/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#Ignore files +out +target +*.iml +.idea \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/lesson_2/Main.java similarity index 90% rename from src/main/java/Main.java rename to src/main/java/lesson_2/Main.java index 7ee8196f..f0fcdc18 100644 --- a/src/main/java/Main.java +++ b/src/main/java/lesson_2/Main.java @@ -1,3 +1,5 @@ +package lesson_2; + public class Main { public static void main(String[] args) { From a4c3c7b70a51cb32d8c0cc842eabc7fb462bc071 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 6 Jul 2021 00:22:44 +0300 Subject: [PATCH 05/82] add homework_lesson_2 --- src/main/java/Homework_lesson_2/MyApp.java | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/Homework_lesson_2/MyApp.java diff --git a/src/main/java/Homework_lesson_2/MyApp.java b/src/main/java/Homework_lesson_2/MyApp.java new file mode 100644 index 00000000..caacf3bc --- /dev/null +++ b/src/main/java/Homework_lesson_2/MyApp.java @@ -0,0 +1,35 @@ +package Homework_lesson_2; + +public class MyApp { + public static void main(String... args) { + if (args.length == 0) return; + for (String arg : + args) { + if (arg.equalsIgnoreCase("ошибка")) { + System.err.println("Тревога!"); + return; + } else { + switch (arg.length()%10) { + case 1: + System.out.println(arg + ": " + arg.length() + " буква"); + break; + case 2: + case 3: + case 4: + System.out.println(arg + ": " + arg.length() + " буквы"); + break; + case 5: + case 6: + case 7: + case 8: + case 9: + case 0: + System.out.println(arg + ": " + arg.length() + " букв"); + break; + default: + System.out.println("Тут должна быть ошибка, но обойдемся этим сообщением"); + } + } + } + } +} From b7db6c6f836d8cedce67e74f853f2b543bed1ff2 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 6 Jul 2021 00:22:44 +0300 Subject: [PATCH 06/82] add homework_lesson_2 --- src/main/java/Homework_lesson_2/MyApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Homework_lesson_2/MyApp.java b/src/main/java/Homework_lesson_2/MyApp.java index caacf3bc..e3c1b1be 100644 --- a/src/main/java/Homework_lesson_2/MyApp.java +++ b/src/main/java/Homework_lesson_2/MyApp.java @@ -27,7 +27,7 @@ public static void main(String... args) { System.out.println(arg + ": " + arg.length() + " букв"); break; default: - System.out.println("Тут должна быть ошибка, но обойдемся этим сообщением"); + System.err.println("Тут должна быть ошибка, но обойдемся этим сообщением"); } } } From dbfe254b639b253ff2ec3f42cb45298425cb57ca Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 6 Jul 2021 00:57:14 +0300 Subject: [PATCH 07/82] homework_lesson_2 add StringBuilder remove case 5-9,0 --- src/main/java/Homework_lesson_2/MyApp.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/Homework_lesson_2/MyApp.java b/src/main/java/Homework_lesson_2/MyApp.java index e3c1b1be..ca870733 100644 --- a/src/main/java/Homework_lesson_2/MyApp.java +++ b/src/main/java/Homework_lesson_2/MyApp.java @@ -3,32 +3,32 @@ public class MyApp { public static void main(String... args) { if (args.length == 0) return; + StringBuilder strBuilder = new StringBuilder(); for (String arg : args) { if (arg.equalsIgnoreCase("ошибка")) { System.err.println("Тревога!"); return; } else { + strBuilder + .append(arg) + .append(": ") + .append(arg.length()) + .append(" букв"); switch (arg.length()%10) { case 1: - System.out.println(arg + ": " + arg.length() + " буква"); + strBuilder.append("а"); break; case 2: case 3: case 4: - System.out.println(arg + ": " + arg.length() + " буквы"); - break; - case 5: - case 6: - case 7: - case 8: - case 9: - case 0: - System.out.println(arg + ": " + arg.length() + " букв"); + strBuilder.append("ы"); break; default: - System.err.println("Тут должна быть ошибка, но обойдемся этим сообщением"); + break; } + System.out.println(strBuilder); + strBuilder.setLength(0); } } } From 52ae014f6cd5dd67c6ad384986ee17a3785ffcc7 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Fri, 9 Jul 2021 16:11:20 +0300 Subject: [PATCH 08/82] rename Homework_lesson_2 -> homework rename MyApp.java -> Main.java --- .../{Homework_lesson_2/MyApp.java => homework_1/Main.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/main/java/{Homework_lesson_2/MyApp.java => homework_1/Main.java} (95%) diff --git a/src/main/java/Homework_lesson_2/MyApp.java b/src/main/java/homework_1/Main.java similarity index 95% rename from src/main/java/Homework_lesson_2/MyApp.java rename to src/main/java/homework_1/Main.java index ca870733..705bf7b6 100644 --- a/src/main/java/Homework_lesson_2/MyApp.java +++ b/src/main/java/homework_1/Main.java @@ -1,6 +1,6 @@ -package Homework_lesson_2; +package homework_1; -public class MyApp { +public class Main { public static void main(String... args) { if (args.length == 0) return; StringBuilder strBuilder = new StringBuilder(); From 59d2dd8d2f53d7d1360122d66589242513da73e8 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Fri, 9 Jul 2021 16:19:47 +0300 Subject: [PATCH 09/82] refactor README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..4af2d478 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Java Core June 2021 + +## *Filipchik Kirill* + +| Number | Solution | Short description +| --- | --- | --- | +| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument(ignore case) | + +[Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 42cd0730e293600bcb00d22c19aaf10b956181b2 Mon Sep 17 00:00:00 2001 From: filipchikkirill <76182443+filipchikkirill@users.noreply.github.com> Date: Fri, 9 Jul 2021 18:09:07 +0300 Subject: [PATCH 10/82] Delete src/main/java/lesson_2 directory --- src/main/java/lesson_2/Main.java | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 src/main/java/lesson_2/Main.java diff --git a/src/main/java/lesson_2/Main.java b/src/main/java/lesson_2/Main.java deleted file mode 100644 index f0fcdc18..00000000 --- a/src/main/java/lesson_2/Main.java +++ /dev/null @@ -1,11 +0,0 @@ -package lesson_2; - -public class Main { - - public static void main(String[] args) { - System.out.println("Hello, World!"); - - System.out.println("Hello World2!"); - } - // test Kirill -} From aed8cb270b55707b888b9fbdd3b3c7f5170790d7 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 12 Jul 2021 08:41:56 +0300 Subject: [PATCH 11/82] fix bugs moved the creation of result String -> new method createStringResult removed check for missing args --- src/main/java/homework_1/Main.java | 46 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index 705bf7b6..dfa8260f 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -2,34 +2,36 @@ public class Main { public static void main(String... args) { - if (args.length == 0) return; - StringBuilder strBuilder = new StringBuilder(); for (String arg : args) { - if (arg.equalsIgnoreCase("ошибка")) { + if (arg. equals("ошибка")) { System.err.println("Тревога!"); return; } else { - strBuilder - .append(arg) - .append(": ") - .append(arg.length()) - .append(" букв"); - switch (arg.length()%10) { - case 1: - strBuilder.append("а"); - break; - case 2: - case 3: - case 4: - strBuilder.append("ы"); - break; - default: - break; - } - System.out.println(strBuilder); - strBuilder.setLength(0); + System.out.println(createStringResult(arg)); } } } + + private static String createStringResult(String str) { + StringBuilder strBuilder = new StringBuilder(); + strBuilder + .append(str) + .append(": ") + .append(str.length()) + .append(" букв"); + switch (str.length()%10) { + case 1: + strBuilder.append("а"); + break; + case 2: + case 3: + case 4: + strBuilder.append("ы"); + break; + default: + break; + } + return strBuilder.toString(); + } } From ce8002fb34582607e879b58944b9286fa553a622 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 12 Jul 2021 08:41:56 +0300 Subject: [PATCH 12/82] fix bugs add color -> instead -> System.err the last commit deleted the main, returned it. --- src/main/java/homework_1/Main.java | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create 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 new file mode 100644 index 00000000..c12fc7c0 --- /dev/null +++ b/src/main/java/homework_1/Main.java @@ -0,0 +1,39 @@ +package homework_1; + +public class Main { + public static final String redColorOutString = "\u001B[31m"; + public static final String closeColorOutString = "\u001B[0m"; + public static void main(String... args) { + for (String arg : + args) { + if (arg. equals("ошибка")) { + System.out.println(redColorOutString + "Тревога!" + redColorOutString); + return; + } else { + System.out.println(createStringResult(arg)); + } + } + } + + private static String createStringResult(String str) { + StringBuilder strBuilder = new StringBuilder(); + strBuilder + .append(str) + .append(": ") + .append(str.length()) + .append(" букв"); + switch (str.length()%10) { + case 1: + strBuilder.append("а"); + break; + case 2: + case 3: + case 4: + strBuilder.append("ы"); + break; + default: + break; + } + return strBuilder.toString(); + } +} From 077525824d4c8b3caf93461d4b98ad4c711011f4 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 12 Jul 2021 22:57:21 +0300 Subject: [PATCH 13/82] fix bugs --- src/main/java/homework_1/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index c12fc7c0..53a2d361 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -7,7 +7,7 @@ public static void main(String... args) { for (String arg : args) { if (arg. equals("ошибка")) { - System.out.println(redColorOutString + "Тревога!" + redColorOutString); + System.out.println(redColorOutString + "Тревога!" + closeColorOutString); return; } else { System.out.println(createStringResult(arg)); From c0cc2918e6c216405c24adf0ff928d17b23688e5 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 13 Jul 2021 21:58:16 +0300 Subject: [PATCH 14/82] fix style conditions in one line --- src/main/java/homework_1/Main.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index 53a2d361..7dc814ff 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -1,12 +1,12 @@ package homework_1; public class Main { - public static final String redColorOutString = "\u001B[31m"; - public static final String closeColorOutString = "\u001B[0m"; + public static final String redColorOutString = "\u001B[31m"; + public static final String closeColorOutString = "\u001B[0m"; + public static void main(String... args) { - for (String arg : - args) { - if (arg. equals("ошибка")) { + for (String arg : args) { + if (arg.equals("ошибка")) { System.out.println(redColorOutString + "Тревога!" + closeColorOutString); return; } else { @@ -22,7 +22,7 @@ private static String createStringResult(String str) { .append(": ") .append(str.length()) .append(" букв"); - switch (str.length()%10) { + switch (str.length() % 10) { case 1: strBuilder.append("а"); break; From a57fb6d52e22ab8ee1f958d7cb5a8c7c98038d74 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 15 Jul 2021 09:05:48 +0300 Subject: [PATCH 15/82] homework 2 start add ResultPrinter.java --- src/main/java/homework_2/ResultPrinter.java | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/homework_2/ResultPrinter.java diff --git a/src/main/java/homework_2/ResultPrinter.java b/src/main/java/homework_2/ResultPrinter.java new file mode 100644 index 00000000..9d9c558f --- /dev/null +++ b/src/main/java/homework_2/ResultPrinter.java @@ -0,0 +1,31 @@ +package homework_2; + +import java.io.PrintStream; + +public class ResultPrinter { + /** + * + * @param result Result. + * @param inputValue The value entered by the user. + * @param outputStream Where to print the result. + * @param isNewLine A flag indicating that a newline is required after the word 'output'. + */ + public static void printResult( + String result, + String inputValue, + PrintStream outputStream, + boolean isNewLine + ) { + StringBuilder sb = new StringBuilder(); + sb + .append("input - ") + .append(inputValue) + .append(", ") + .append("output - "); + if (isNewLine) { + sb.append('\n'); + } + sb.append(result); + outputStream.println(sb); + } +} From a7344a0283e18a366cba4268f4f7f05f9120c793 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 15 Jul 2021 09:06:19 +0300 Subject: [PATCH 16/82] homework 2 PyramidPrinter add PyramidPrinter.java --- .../homework_2/pyramid/PyramidPrinter.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/java/homework_2/pyramid/PyramidPrinter.java diff --git a/src/main/java/homework_2/pyramid/PyramidPrinter.java b/src/main/java/homework_2/pyramid/PyramidPrinter.java new file mode 100644 index 00000000..97973fe1 --- /dev/null +++ b/src/main/java/homework_2/pyramid/PyramidPrinter.java @@ -0,0 +1,59 @@ +package homework_2.pyramid; + +import homework_2.ResultPrinter; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public class PyramidPrinter { + private final static InputStream INPUT_STREAM = System.in; + private final static PrintStream OUTPUT_STREAM = System.out; + private final static PrintStream ERR_STREAM = System.err; + + public static void main(String[] args) { + int base = getBase(); + String result = buildResult(base); + + ResultPrinter.printResult(result, Integer.toString(base), OUTPUT_STREAM, true); + } + + private static String buildResult(int baseOfPyramid) { + StringBuilder strBuilder = new StringBuilder(); + StringBuilder result = new StringBuilder(); + for (int i = 0; i < baseOfPyramid; i++) { + strBuilder.append('x'); + result + .append(strBuilder) + .append('\n'); + } + return result.toString(); + } + + private static int getBase() { + int base = 0; + + try(Scanner sc = new Scanner(INPUT_STREAM).useDelimiter("\n")) { + OUTPUT_STREAM.println("Введите основание:"); + while (sc.hasNext()) { + if (sc.hasNextInt()) { + base = sc.nextInt(); + if (base > 0) { + break; + } else { + OUTPUT_STREAM.printf("'%d' целое, но не натуральное число\n", base); + } + } else if (sc.hasNextDouble()) { + OUTPUT_STREAM.printf("'%.2f...' не целое число\n", sc.nextDouble()); + } else { + OUTPUT_STREAM.printf("'%s' не число\n", sc.next()); + } + OUTPUT_STREAM.println("Введите натуральное число:"); + } + } catch (Exception ex) { + // ошибок не должно быть, но мало ли что то упустил + ex.printStackTrace(ERR_STREAM); + } + return base; + } +} From 3dff0e87f8b19cfcc7697ad32c08072cc762f2b1 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 15 Jul 2021 09:13:10 +0300 Subject: [PATCH 17/82] homework 2 change README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4af2d478..9365b461 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ | Number | Solution | Short description | --- | --- | --- | -| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument(ignore case) | +| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument | +| HW2 | [PyramidPrinter](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/pyramid) | The app that reads input argument and builds pyramid base on input value | [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From c1b79336997c123eb25fe32692fe870e64e6ed18 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Fri, 16 Jul 2021 00:24:40 +0300 Subject: [PATCH 18/82] homework 2 add TrafficLight. rework PyramidPrinter -> OldPyramidPrinter all launch in Main.java --- README.md | 2 + src/main/java/homework_2/Main.java | 10 +++ src/main/java/homework_2/ResultPrinter.java | 31 -------- .../homework_2/pyramid/OldPyramidPrinter.java | 60 +++++++++++++++ .../homework_2/pyramid/PyramidPrinter.java | 72 ++++++----------- src/main/java/homework_2/traffic/Color.java | 7 ++ .../java/homework_2/traffic/TrafficLight.java | 54 +++++++++++++ .../java/homework_2/utils/Applications.java | 18 +++++ src/main/java/homework_2/utils/Data.java | 49 ++++++++++++ .../java/homework_2/utils/Executable.java | 5 ++ src/main/java/homework_2/utils/Menu.java | 77 +++++++++++++++++++ src/main/java/homework_2/utils/MyReader.java | 34 ++++++++ src/main/java/homework_2/utils/Parsable.java | 5 ++ src/main/java/homework_2/utils/Parser.java | 20 +++++ .../java/homework_2/utils/ResultPrinter.java | 40 ++++++++++ src/main/java/homework_2/utils/Status.java | 10 +++ src/main/java/homework_2/utils/Type.java | 7 ++ 17 files changed, 423 insertions(+), 78 deletions(-) create mode 100644 src/main/java/homework_2/Main.java delete mode 100644 src/main/java/homework_2/ResultPrinter.java create mode 100644 src/main/java/homework_2/pyramid/OldPyramidPrinter.java create mode 100644 src/main/java/homework_2/traffic/Color.java create mode 100644 src/main/java/homework_2/traffic/TrafficLight.java create mode 100644 src/main/java/homework_2/utils/Applications.java create mode 100644 src/main/java/homework_2/utils/Data.java create mode 100644 src/main/java/homework_2/utils/Executable.java create mode 100644 src/main/java/homework_2/utils/Menu.java create mode 100644 src/main/java/homework_2/utils/MyReader.java create mode 100644 src/main/java/homework_2/utils/Parsable.java create mode 100644 src/main/java/homework_2/utils/Parser.java create mode 100644 src/main/java/homework_2/utils/ResultPrinter.java create mode 100644 src/main/java/homework_2/utils/Status.java create mode 100644 src/main/java/homework_2/utils/Type.java diff --git a/README.md b/README.md index 9365b461..1239602c 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,7 @@ | --- | --- | --- | | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument | | HW2 | [PyramidPrinter](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/pyramid) | The app that reads input argument and builds pyramid base on input value | +| HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic) | The application is not ready| +| HW2 | [AllInOne](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/) | The application is not ready(2 of 3)| [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework_2/Main.java b/src/main/java/homework_2/Main.java new file mode 100644 index 00000000..294573c8 --- /dev/null +++ b/src/main/java/homework_2/Main.java @@ -0,0 +1,10 @@ +package homework_2; + +import homework_2.utils.Menu; + +public class Main { + public static void main(String[] args) { + Menu menu = new Menu(); + menu.start(); + } +} diff --git a/src/main/java/homework_2/ResultPrinter.java b/src/main/java/homework_2/ResultPrinter.java deleted file mode 100644 index 9d9c558f..00000000 --- a/src/main/java/homework_2/ResultPrinter.java +++ /dev/null @@ -1,31 +0,0 @@ -package homework_2; - -import java.io.PrintStream; - -public class ResultPrinter { - /** - * - * @param result Result. - * @param inputValue The value entered by the user. - * @param outputStream Where to print the result. - * @param isNewLine A flag indicating that a newline is required after the word 'output'. - */ - public static void printResult( - String result, - String inputValue, - PrintStream outputStream, - boolean isNewLine - ) { - StringBuilder sb = new StringBuilder(); - sb - .append("input - ") - .append(inputValue) - .append(", ") - .append("output - "); - if (isNewLine) { - sb.append('\n'); - } - sb.append(result); - outputStream.println(sb); - } -} diff --git a/src/main/java/homework_2/pyramid/OldPyramidPrinter.java b/src/main/java/homework_2/pyramid/OldPyramidPrinter.java new file mode 100644 index 00000000..8dcec167 --- /dev/null +++ b/src/main/java/homework_2/pyramid/OldPyramidPrinter.java @@ -0,0 +1,60 @@ +package homework_2.pyramid; + +import homework_2.utils.ResultPrinter; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public class OldPyramidPrinter { + private final static InputStream INPUT_STREAM = System.in; + private final static PrintStream OUTPUT_STREAM = System.out; + private final static PrintStream ERR_STREAM = System.err; + + public static void main(String[] args) { + int base = getBase(); + String result = calculate(base); + ResultPrinter rp = new ResultPrinter(); + + rp.printResult(result, Integer.toString(base), OUTPUT_STREAM); + } + + private static String calculate(int baseOfPyramid) { + StringBuilder strBuilder = new StringBuilder(); + StringBuilder result = new StringBuilder("\n"); + for (int i = 0; i < baseOfPyramid; i++) { + strBuilder.append('x'); + result + .append(strBuilder) + .append('\n'); + } + return result.toString(); + } + + private static int getBase() { + int base = 0; + + try(Scanner sc = new Scanner(INPUT_STREAM).useDelimiter("\n")) { + OUTPUT_STREAM.println("Введите основание:"); + while (sc.hasNext()) { + if (sc.hasNextInt()) { + base = sc.nextInt(); + if (base > 0) { + break; + } else { + OUTPUT_STREAM.printf("'%d' целое, но не натуральное число\n", base); + } + } else if (sc.hasNextDouble()) { + OUTPUT_STREAM.printf("'%.2f...' не целое число\n", sc.nextDouble()); + } else { + OUTPUT_STREAM.printf("'%s' не число\n", sc.next()); + } + OUTPUT_STREAM.println("Введите натуральное число:"); + } + } catch (Exception ex) { + // ошибок не должно быть, но мало ли что то упустил + ex.printStackTrace(ERR_STREAM); + } + return base; + } +} diff --git a/src/main/java/homework_2/pyramid/PyramidPrinter.java b/src/main/java/homework_2/pyramid/PyramidPrinter.java index 97973fe1..38338297 100644 --- a/src/main/java/homework_2/pyramid/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid/PyramidPrinter.java @@ -1,59 +1,37 @@ package homework_2.pyramid; -import homework_2.ResultPrinter; - -import java.io.InputStream; -import java.io.PrintStream; -import java.util.Scanner; - -public class PyramidPrinter { - private final static InputStream INPUT_STREAM = System.in; - private final static PrintStream OUTPUT_STREAM = System.out; - private final static PrintStream ERR_STREAM = System.err; - - public static void main(String[] args) { - int base = getBase(); - String result = buildResult(base); - - ResultPrinter.printResult(result, Integer.toString(base), OUTPUT_STREAM, true); - } +import homework_2.utils.Data; +import homework_2.utils.Executable; + +public class PyramidPrinter implements Executable { + + private final static String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; + private final static String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; + + @Override + public void execute(Data data) { + //повторяется думаю как убрать + switch (data.getType()) { + case STRING: + data.setError(ERR_STRING_MSG); + return; + case NEGATIVE_INTEGER: + data.setError(ERR_NEGATIVE_MSG); + return; + case INTEGER: + default: + break; + } - private static String buildResult(int baseOfPyramid) { + int baseOfPyramid = Integer.parseInt(data.getInValue()); StringBuilder strBuilder = new StringBuilder(); - StringBuilder result = new StringBuilder(); + StringBuilder result = new StringBuilder("\n"); for (int i = 0; i < baseOfPyramid; i++) { strBuilder.append('x'); result .append(strBuilder) .append('\n'); } - return result.toString(); - } - - private static int getBase() { - int base = 0; - - try(Scanner sc = new Scanner(INPUT_STREAM).useDelimiter("\n")) { - OUTPUT_STREAM.println("Введите основание:"); - while (sc.hasNext()) { - if (sc.hasNextInt()) { - base = sc.nextInt(); - if (base > 0) { - break; - } else { - OUTPUT_STREAM.printf("'%d' целое, но не натуральное число\n", base); - } - } else if (sc.hasNextDouble()) { - OUTPUT_STREAM.printf("'%.2f...' не целое число\n", sc.nextDouble()); - } else { - OUTPUT_STREAM.printf("'%s' не число\n", sc.next()); - } - OUTPUT_STREAM.println("Введите натуральное число:"); - } - } catch (Exception ex) { - // ошибок не должно быть, но мало ли что то упустил - ex.printStackTrace(ERR_STREAM); - } - return base; + data.setResult(result.toString()); } } diff --git a/src/main/java/homework_2/traffic/Color.java b/src/main/java/homework_2/traffic/Color.java new file mode 100644 index 00000000..3c0e9d02 --- /dev/null +++ b/src/main/java/homework_2/traffic/Color.java @@ -0,0 +1,7 @@ +package homework_2.traffic; + +public enum Color { + GREEN, + YELLOW, + RED +} diff --git a/src/main/java/homework_2/traffic/TrafficLight.java b/src/main/java/homework_2/traffic/TrafficLight.java new file mode 100644 index 00000000..829a8bb1 --- /dev/null +++ b/src/main/java/homework_2/traffic/TrafficLight.java @@ -0,0 +1,54 @@ +package homework_2.traffic; + +import homework_2.utils.Data; +import homework_2.utils.Executable; + +public class TrafficLight implements Executable { + private final static int MAX_VALUE = 86399; + private final static int MIN_VALUE = 0; + + private final static int GREEN_START = 0; + private final static int GREEN_END = 35; + private final static int RED_START = 40; + private final static int RED_END = 55; + + private final static String ERR_MAX_MSG = "Error: день закончен)"; + private final static String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; + private final static String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; + + @Override + public void execute(Data data) { + //повторяется думаю как убрать + switch (data.getType()) { + case STRING: + data.setError(ERR_STRING_MSG); + return; + case NEGATIVE_INTEGER: + data.setError(ERR_NEGATIVE_MSG); + return; + case INTEGER: + default: + break; + } + + int value = Integer.parseInt(data.getInValue()); + Color color; + if (!checkIntValue(value)) { + data.setError(ERR_MAX_MSG); + } else { + int sec = value % 60; + if (sec >= GREEN_START && sec < GREEN_END) { + color = Color.GREEN; + } else if (sec >= RED_START && sec < RED_END) { + color = Color.RED; + } else { + color = Color.YELLOW; + } + data.setResult(color.name()); + } + } + + private boolean checkIntValue(int value) { + return value <= MAX_VALUE; + } +} diff --git a/src/main/java/homework_2/utils/Applications.java b/src/main/java/homework_2/utils/Applications.java new file mode 100644 index 00000000..b683ad51 --- /dev/null +++ b/src/main/java/homework_2/utils/Applications.java @@ -0,0 +1,18 @@ +package homework_2.utils; + +public enum Applications { + PYRAMID_PRINTER(1), + TRAFFIC_LIGHT(2); + + private int num; + + Applications(int num) { + this.num = num; + } + + @Override + public String toString() { + return this.name() + + " № \t" + num; + } +} diff --git a/src/main/java/homework_2/utils/Data.java b/src/main/java/homework_2/utils/Data.java new file mode 100644 index 00000000..08514b4a --- /dev/null +++ b/src/main/java/homework_2/utils/Data.java @@ -0,0 +1,49 @@ +package homework_2.utils; + +public class Data { + private Status status; + private Type type; + private String inValue; + private String result; + + public Data() { + this.status = Status.START; + } + + public void setError(String msg) { + setResult(msg); + setStatus(Status.ERROR); + } + + public String getInValue() { + return inValue; + } + + public void setInValue(String inValue) { + this.inValue = inValue; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } +} diff --git a/src/main/java/homework_2/utils/Executable.java b/src/main/java/homework_2/utils/Executable.java new file mode 100644 index 00000000..f1fd495b --- /dev/null +++ b/src/main/java/homework_2/utils/Executable.java @@ -0,0 +1,5 @@ +package homework_2.utils; + +public interface Executable { + void execute(Data data); +} diff --git a/src/main/java/homework_2/utils/Menu.java b/src/main/java/homework_2/utils/Menu.java new file mode 100644 index 00000000..07860b33 --- /dev/null +++ b/src/main/java/homework_2/utils/Menu.java @@ -0,0 +1,77 @@ +package homework_2.utils; + +import homework_2.pyramid.PyramidPrinter; +import homework_2.traffic.TrafficLight; + +import java.util.Arrays; + +public class Menu { + private boolean isWork = true; + private final Data data = new Data(); + private final MyReader reader = new MyReader(); + private final ResultPrinter rp = new ResultPrinter(); + private Parsable parser = new Parser(); + private Executable application; + + public void start() { + + while (isWork) { + switch (data.getStatus()) { + case START: + data.setStatus(Status.READ); + selectApp(); + break; + case READ: + System.out.println("Введите число:"); + data.setStatus(Status.PARSE); + reader.read(data); + reader.close(); + break; + case PARSE: + data.setStatus(Status.EXECUTE); + parser.parse(data); + break; + case EXECUTE: + data.setStatus(Status.PRINT); + application.execute(data); + break; + case PRINT: + case ERROR: + rp.printResult(data); + isWork = false; + break; + default: + break; + } + } + } + + private void selectApp() { + System.out.println("Выбирите приложение(цифрой):"); + Arrays.stream(Applications.values()) + .forEach(System.out::println); + + reader.read(data); + parser.parse(data); + if (data.getType() != Type.INTEGER) { + data.setStatus(Status.START); + System.out.println("Введите положительное число!"); + } + + int numApp = Integer.parseInt(data.getInValue()); + switch (numApp) { + case 1 : + System.out.println(Applications.PYRAMID_PRINTER); + application = new PyramidPrinter(); + break; + case 2 : + System.out.println(Applications.TRAFFIC_LIGHT); + application = new TrafficLight(); + break; + default: + data.setStatus(Status.START); + System.out.println("Приложения с таким номером еще нет"); + break; + } + } +} diff --git a/src/main/java/homework_2/utils/MyReader.java b/src/main/java/homework_2/utils/MyReader.java new file mode 100644 index 00000000..8af65890 --- /dev/null +++ b/src/main/java/homework_2/utils/MyReader.java @@ -0,0 +1,34 @@ +package homework_2.utils; + +import java.io.*; +import java.util.NoSuchElementException; +import java.util.Scanner; + +public class MyReader { + + private final InputStream inputStream = System.in; + private final PrintStream errStream = System.err; + Scanner sc; + + { + sc = new Scanner(inputStream); + } + + /** + * + * @param data Where to store the input data. + */ + public void read(Data data) { + try { + data.setInValue(sc.next()); + } catch (NoSuchElementException e) { + e.printStackTrace(); + data.setInValue("NoSuchElementException"); + data.setError("Error: NoSuchElementException"); + } + } + + public void close() { + sc.close(); + } +} diff --git a/src/main/java/homework_2/utils/Parsable.java b/src/main/java/homework_2/utils/Parsable.java new file mode 100644 index 00000000..88b93da1 --- /dev/null +++ b/src/main/java/homework_2/utils/Parsable.java @@ -0,0 +1,5 @@ +package homework_2.utils; + +public interface Parsable { + void parse(Data data); +} diff --git a/src/main/java/homework_2/utils/Parser.java b/src/main/java/homework_2/utils/Parser.java new file mode 100644 index 00000000..1d8aa79c --- /dev/null +++ b/src/main/java/homework_2/utils/Parser.java @@ -0,0 +1,20 @@ +package homework_2.utils; + +import java.util.Scanner; + +public class Parser implements Parsable { + + @Override + public void parse(Data data) { + Scanner sc = new Scanner(data.getInValue()).useDelimiter("\n"); + + if (sc.hasNextInt()) { + data.setType(Type.INTEGER); + if (sc.nextInt() < 0) { + data.setType(Type.NEGATIVE_INTEGER); + } + } else { + data.setType(Type.STRING); + } + } +} diff --git a/src/main/java/homework_2/utils/ResultPrinter.java b/src/main/java/homework_2/utils/ResultPrinter.java new file mode 100644 index 00000000..bb51cad7 --- /dev/null +++ b/src/main/java/homework_2/utils/ResultPrinter.java @@ -0,0 +1,40 @@ +package homework_2.utils; + +import java.io.PrintStream; + +public class ResultPrinter { + private final PrintStream printStream = System.out; + + public void printResult( + Data data + ) { + printResult(data.getResult(), data.getInValue()); + } + + public void printResult( + String result, + String inputValue + ) { + printResult(result, + inputValue, + printStream); + } + /** + * + * @param result Result. + * @param inputValue The value entered by the user. + * @param outputStream Where to print the result. + */ + public void printResult( + String result, + String inputValue, + PrintStream outputStream + ) { + String str = "input - " + + inputValue + + ", " + + "output - " + + result; + outputStream.println(str); + } +} diff --git a/src/main/java/homework_2/utils/Status.java b/src/main/java/homework_2/utils/Status.java new file mode 100644 index 00000000..aae2e09a --- /dev/null +++ b/src/main/java/homework_2/utils/Status.java @@ -0,0 +1,10 @@ +package homework_2.utils; + +public enum Status { + ERROR, + PARSE, + READ, + EXECUTE, + PRINT, + START +} diff --git a/src/main/java/homework_2/utils/Type.java b/src/main/java/homework_2/utils/Type.java new file mode 100644 index 00000000..89a6a686 --- /dev/null +++ b/src/main/java/homework_2/utils/Type.java @@ -0,0 +1,7 @@ +package homework_2.utils; + +public enum Type { + NEGATIVE_INTEGER, + INTEGER, + STRING +} From 4947867e67a3028302410504bc0859b6936ee32d Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Fri, 16 Jul 2021 21:40:06 +0300 Subject: [PATCH 19/82] homework 2 add RandomCharsTable. change README.md --- README.md | 1 + .../charsTable/RandomCharsTable.java | 74 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/homework_2/charsTable/RandomCharsTable.java diff --git a/README.md b/README.md index 1239602c..a060df63 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ | --- | --- | --- | | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument | | HW2 | [PyramidPrinter](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/pyramid) | The app that reads input argument and builds pyramid base on input value | +| HW2 | [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/charsTable) | App reads from the console width and length of the chart, strategy keyword (even or odd). Prints to the console the chart of random chars from A to Z | | HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic) | The application is not ready| | HW2 | [AllInOne](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/) | The application is not ready(2 of 3)| diff --git a/src/main/java/homework_2/charsTable/RandomCharsTable.java b/src/main/java/homework_2/charsTable/RandomCharsTable.java new file mode 100644 index 00000000..ac854df3 --- /dev/null +++ b/src/main/java/homework_2/charsTable/RandomCharsTable.java @@ -0,0 +1,74 @@ +package homework_2.charsTable; + +import homework_2.utils.ResultPrinter; + +import java.util.Random; +import java.util.Scanner; + +public class RandomCharsTable { + String inputStr; + int length; + int width; + boolean isOdd; + char[][] tableChars; + + public static void main(String[] args) { + RandomCharsTable rct = new RandomCharsTable(); + rct.execute(); + } + + public void execute() { + ResultPrinter rp = new ResultPrinter(); + readData(); + parseData(); + rp.printResult(generateResult(), inputStr); + } + + private void readData() { + try(Scanner sc = new Scanner(System.in)) { + System.out.println("Введите данные"); + inputStr = sc.nextLine(); + } + } + + private void parseData() { + try(Scanner sc = new Scanner(inputStr)) { + length = sc.nextInt(); + width = sc.nextInt(); + isOdd = sc.next().equalsIgnoreCase("odd"); + } + } + + private String generateResult() { + int check; + Random random = new Random(); + StringBuilder charTable = new StringBuilder("\n"); + StringBuilder answerBuilder = new StringBuilder(); + + if(isOdd) { + check = 1; + answerBuilder.append("Odd letters - "); + } else { + check = 0; + answerBuilder.append("Even letters - "); + } + + for (int y = 0; y < length; y++) { + for (int x = 0; x < width; x++) { + char letter = (char)(65 + random.nextInt(25)); + charTable + .append("| ") + .append(letter) + .append(" "); + if( (letter & check) == check) { + answerBuilder + .append(letter) + .append(", "); + } + } + charTable.append("|\n"); + } + answerBuilder.setLength(answerBuilder.length() - 2); + return charTable.append(answerBuilder).toString(); + } +} From 7c4b7a750edb0402335a848a6d7d6346434d6eee Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 19 Jul 2021 06:26:58 +0300 Subject: [PATCH 20/82] homework 2 ready for check. add abstract classes App and AppWithIntInput add interface Executable removed duplicate code I cant start new branch, so del all old. --- README.md | 3 +- src/main/java/homework_2/Main.java | 10 --- .../charsTable/RandomCharsTable.java | 31 ++------ .../homework_2/pyramid/OldPyramidPrinter.java | 60 --------------- .../homework_2/pyramid/PyramidPrinter.java | 32 +++----- .../java/homework_2/traffic/TrafficLight.java | 48 +++++------- src/main/java/homework_2/utils/App.java | 60 +++++++++++++++ .../homework_2/utils/AppWithIntInput.java | 21 +++++ .../java/homework_2/utils/Applications.java | 18 ----- src/main/java/homework_2/utils/Data.java | 49 ------------ .../java/homework_2/utils/Executable.java | 2 +- src/main/java/homework_2/utils/Menu.java | 77 ------------------- src/main/java/homework_2/utils/MyReader.java | 34 -------- src/main/java/homework_2/utils/Parsable.java | 5 -- src/main/java/homework_2/utils/Parser.java | 20 ----- .../java/homework_2/utils/ResultPrinter.java | 40 ---------- src/main/java/homework_2/utils/Status.java | 10 --- src/main/java/homework_2/utils/Type.java | 7 -- 18 files changed, 120 insertions(+), 407 deletions(-) delete mode 100644 src/main/java/homework_2/Main.java delete mode 100644 src/main/java/homework_2/pyramid/OldPyramidPrinter.java create mode 100644 src/main/java/homework_2/utils/App.java create mode 100644 src/main/java/homework_2/utils/AppWithIntInput.java delete mode 100644 src/main/java/homework_2/utils/Applications.java delete mode 100644 src/main/java/homework_2/utils/Data.java delete mode 100644 src/main/java/homework_2/utils/Menu.java delete mode 100644 src/main/java/homework_2/utils/MyReader.java delete mode 100644 src/main/java/homework_2/utils/Parsable.java delete mode 100644 src/main/java/homework_2/utils/Parser.java delete mode 100644 src/main/java/homework_2/utils/ResultPrinter.java delete mode 100644 src/main/java/homework_2/utils/Status.java delete mode 100644 src/main/java/homework_2/utils/Type.java diff --git a/README.md b/README.md index a060df63..6493499b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument | | HW2 | [PyramidPrinter](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/pyramid) | The app that reads input argument and builds pyramid base on input value | | HW2 | [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/charsTable) | App reads from the console width and length of the chart, strategy keyword (even or odd). Prints to the console the chart of random chars from A to Z | -| HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic) | The application is not ready| -| HW2 | [AllInOne](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/) | The application is not ready(2 of 3)| +| HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic) | App reads current time in seconds from the console and prints the traffic light| [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework_2/Main.java b/src/main/java/homework_2/Main.java deleted file mode 100644 index 294573c8..00000000 --- a/src/main/java/homework_2/Main.java +++ /dev/null @@ -1,10 +0,0 @@ -package homework_2; - -import homework_2.utils.Menu; - -public class Main { - public static void main(String[] args) { - Menu menu = new Menu(); - menu.start(); - } -} diff --git a/src/main/java/homework_2/charsTable/RandomCharsTable.java b/src/main/java/homework_2/charsTable/RandomCharsTable.java index ac854df3..ec8d823a 100644 --- a/src/main/java/homework_2/charsTable/RandomCharsTable.java +++ b/src/main/java/homework_2/charsTable/RandomCharsTable.java @@ -1,45 +1,30 @@ package homework_2.charsTable; -import homework_2.utils.ResultPrinter; +import homework_2.utils.App; +import homework_2.utils.Executable; import java.util.Random; import java.util.Scanner; -public class RandomCharsTable { - String inputStr; +public class RandomCharsTable extends App { int length; int width; boolean isOdd; - char[][] tableChars; public static void main(String[] args) { - RandomCharsTable rct = new RandomCharsTable(); + Executable rct = new RandomCharsTable(); rct.execute(); } - - public void execute() { - ResultPrinter rp = new ResultPrinter(); - readData(); - parseData(); - rp.printResult(generateResult(), inputStr); - } - - private void readData() { - try(Scanner sc = new Scanner(System.in)) { - System.out.println("Введите данные"); - inputStr = sc.nextLine(); - } - } - - private void parseData() { + @Override + protected void parseData() { try(Scanner sc = new Scanner(inputStr)) { length = sc.nextInt(); width = sc.nextInt(); isOdd = sc.next().equalsIgnoreCase("odd"); } } - - private String generateResult() { + @Override + protected String calculate() { int check; Random random = new Random(); StringBuilder charTable = new StringBuilder("\n"); diff --git a/src/main/java/homework_2/pyramid/OldPyramidPrinter.java b/src/main/java/homework_2/pyramid/OldPyramidPrinter.java deleted file mode 100644 index 8dcec167..00000000 --- a/src/main/java/homework_2/pyramid/OldPyramidPrinter.java +++ /dev/null @@ -1,60 +0,0 @@ -package homework_2.pyramid; - -import homework_2.utils.ResultPrinter; - -import java.io.InputStream; -import java.io.PrintStream; -import java.util.Scanner; - -public class OldPyramidPrinter { - private final static InputStream INPUT_STREAM = System.in; - private final static PrintStream OUTPUT_STREAM = System.out; - private final static PrintStream ERR_STREAM = System.err; - - public static void main(String[] args) { - int base = getBase(); - String result = calculate(base); - ResultPrinter rp = new ResultPrinter(); - - rp.printResult(result, Integer.toString(base), OUTPUT_STREAM); - } - - private static String calculate(int baseOfPyramid) { - StringBuilder strBuilder = new StringBuilder(); - StringBuilder result = new StringBuilder("\n"); - for (int i = 0; i < baseOfPyramid; i++) { - strBuilder.append('x'); - result - .append(strBuilder) - .append('\n'); - } - return result.toString(); - } - - private static int getBase() { - int base = 0; - - try(Scanner sc = new Scanner(INPUT_STREAM).useDelimiter("\n")) { - OUTPUT_STREAM.println("Введите основание:"); - while (sc.hasNext()) { - if (sc.hasNextInt()) { - base = sc.nextInt(); - if (base > 0) { - break; - } else { - OUTPUT_STREAM.printf("'%d' целое, но не натуральное число\n", base); - } - } else if (sc.hasNextDouble()) { - OUTPUT_STREAM.printf("'%.2f...' не целое число\n", sc.nextDouble()); - } else { - OUTPUT_STREAM.printf("'%s' не число\n", sc.next()); - } - OUTPUT_STREAM.println("Введите натуральное число:"); - } - } catch (Exception ex) { - // ошибок не должно быть, но мало ли что то упустил - ex.printStackTrace(ERR_STREAM); - } - return base; - } -} diff --git a/src/main/java/homework_2/pyramid/PyramidPrinter.java b/src/main/java/homework_2/pyramid/PyramidPrinter.java index 38338297..ca4cddcb 100644 --- a/src/main/java/homework_2/pyramid/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid/PyramidPrinter.java @@ -1,37 +1,25 @@ package homework_2.pyramid; -import homework_2.utils.Data; +import homework_2.utils.AppWithIntInput; import homework_2.utils.Executable; -public class PyramidPrinter implements Executable { - - private final static String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; - private final static String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; +public class PyramidPrinter extends AppWithIntInput { + public static void main(String[] args) { + Executable pyramidPrinter = new PyramidPrinter(); + pyramidPrinter.execute(); + } @Override - public void execute(Data data) { - //повторяется думаю как убрать - switch (data.getType()) { - case STRING: - data.setError(ERR_STRING_MSG); - return; - case NEGATIVE_INTEGER: - data.setError(ERR_NEGATIVE_MSG); - return; - case INTEGER: - default: - break; - } - - int baseOfPyramid = Integer.parseInt(data.getInValue()); + protected String calculate() { + if (error != null) return error; StringBuilder strBuilder = new StringBuilder(); StringBuilder result = new StringBuilder("\n"); - for (int i = 0; i < baseOfPyramid; i++) { + for (int i = 0; i < data; i++) { strBuilder.append('x'); result .append(strBuilder) .append('\n'); } - data.setResult(result.toString()); + return result.toString(); } } diff --git a/src/main/java/homework_2/traffic/TrafficLight.java b/src/main/java/homework_2/traffic/TrafficLight.java index 829a8bb1..8efeabd8 100644 --- a/src/main/java/homework_2/traffic/TrafficLight.java +++ b/src/main/java/homework_2/traffic/TrafficLight.java @@ -1,42 +1,36 @@ package homework_2.traffic; -import homework_2.utils.Data; +import homework_2.utils.AppWithIntInput; import homework_2.utils.Executable; -public class TrafficLight implements Executable { - private final static int MAX_VALUE = 86399; - private final static int MIN_VALUE = 0; +import java.util.Scanner; + +public class TrafficLight extends AppWithIntInput { + + protected final static String ERR_MAX_MSG = "Error: день закончен)"; + private final static int MAX_VALUE = 86399; private final static int GREEN_START = 0; private final static int GREEN_END = 35; private final static int RED_START = 40; private final static int RED_END = 55; - private final static String ERR_MAX_MSG = "Error: день закончен)"; - private final static String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; - private final static String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; + public static void main(String[] args) { + Executable trafficLight = new TrafficLight(); + trafficLight.execute(); + } @Override - public void execute(Data data) { - //повторяется думаю как убрать - switch (data.getType()) { - case STRING: - data.setError(ERR_STRING_MSG); - return; - case NEGATIVE_INTEGER: - data.setError(ERR_NEGATIVE_MSG); - return; - case INTEGER: - default: - break; - } + protected String calculate() { - int value = Integer.parseInt(data.getInValue()); + if(error != null) { + return error; + } Color color; - if (!checkIntValue(value)) { - data.setError(ERR_MAX_MSG); + if (data > MAX_VALUE) { + return (ERR_MAX_MSG); } else { - int sec = value % 60; + int sec = data % 60; if (sec >= GREEN_START && sec < GREEN_END) { color = Color.GREEN; } else if (sec >= RED_START && sec < RED_END) { @@ -44,11 +38,7 @@ public void execute(Data data) { } else { color = Color.YELLOW; } - data.setResult(color.name()); + return color.name(); } } - - private boolean checkIntValue(int value) { - return value <= MAX_VALUE; - } } diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java new file mode 100644 index 00000000..f6aa4529 --- /dev/null +++ b/src/main/java/homework_2/utils/App.java @@ -0,0 +1,60 @@ +package homework_2.utils; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public abstract class App implements Executable{ + + protected final static String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; + protected final static String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; + protected final static String STRING_MSG = "Введите данные:"; + + protected final InputStream INPUT_STREAM = System.in; + protected final PrintStream PRINT_STREAM = System.out; + + protected String error; + protected String inputStr; + + + public void execute() { + + readData(); + parseData(); + + printResult(calculate(), inputStr); + } + + protected abstract void parseData(); + protected abstract String calculate(); + + /** + * + * @param result Result. + * @param inputValue The value entered by the user. + */ + protected void printResult(String result, String inputValue) { + printResult(result, inputValue, PRINT_STREAM); + } + /** + * + * @param result Result. + * @param inputValue The value entered by the user. + * @param outputStream Where to print the result. + */ + protected void printResult(String result, String inputValue, PrintStream outputStream) { + String str = "input - " + + inputValue + + ", " + + "output - " + + result; + outputStream.println(str); + } + + protected void readData() { + try(Scanner sc = new Scanner(INPUT_STREAM)) { + PRINT_STREAM.println(STRING_MSG); + inputStr = sc.nextLine(); + } + } +} diff --git a/src/main/java/homework_2/utils/AppWithIntInput.java b/src/main/java/homework_2/utils/AppWithIntInput.java new file mode 100644 index 00000000..a1bf82f8 --- /dev/null +++ b/src/main/java/homework_2/utils/AppWithIntInput.java @@ -0,0 +1,21 @@ +package homework_2.utils; + +import java.util.Scanner; + +public abstract class AppWithIntInput extends App{ + protected int data; + @Override + protected void parseData() { + Scanner sc = new Scanner(inputStr).useDelimiter("\n"); + if (sc.hasNextInt()) { + data = sc.nextInt(); + if (data < 0) { + error = ERR_NEGATIVE_MSG; + } + } else if (sc.hasNextDouble()) { + error = (sc.nextDouble() + " не целое число"); + } else { + error = (ERR_STRING_MSG); + } + } +} diff --git a/src/main/java/homework_2/utils/Applications.java b/src/main/java/homework_2/utils/Applications.java deleted file mode 100644 index b683ad51..00000000 --- a/src/main/java/homework_2/utils/Applications.java +++ /dev/null @@ -1,18 +0,0 @@ -package homework_2.utils; - -public enum Applications { - PYRAMID_PRINTER(1), - TRAFFIC_LIGHT(2); - - private int num; - - Applications(int num) { - this.num = num; - } - - @Override - public String toString() { - return this.name() + - " № \t" + num; - } -} diff --git a/src/main/java/homework_2/utils/Data.java b/src/main/java/homework_2/utils/Data.java deleted file mode 100644 index 08514b4a..00000000 --- a/src/main/java/homework_2/utils/Data.java +++ /dev/null @@ -1,49 +0,0 @@ -package homework_2.utils; - -public class Data { - private Status status; - private Type type; - private String inValue; - private String result; - - public Data() { - this.status = Status.START; - } - - public void setError(String msg) { - setResult(msg); - setStatus(Status.ERROR); - } - - public String getInValue() { - return inValue; - } - - public void setInValue(String inValue) { - this.inValue = inValue; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - public String getResult() { - return result; - } - - public void setResult(String result) { - this.result = result; - } -} diff --git a/src/main/java/homework_2/utils/Executable.java b/src/main/java/homework_2/utils/Executable.java index f1fd495b..ba5c004a 100644 --- a/src/main/java/homework_2/utils/Executable.java +++ b/src/main/java/homework_2/utils/Executable.java @@ -1,5 +1,5 @@ package homework_2.utils; public interface Executable { - void execute(Data data); + void execute(); } diff --git a/src/main/java/homework_2/utils/Menu.java b/src/main/java/homework_2/utils/Menu.java deleted file mode 100644 index 07860b33..00000000 --- a/src/main/java/homework_2/utils/Menu.java +++ /dev/null @@ -1,77 +0,0 @@ -package homework_2.utils; - -import homework_2.pyramid.PyramidPrinter; -import homework_2.traffic.TrafficLight; - -import java.util.Arrays; - -public class Menu { - private boolean isWork = true; - private final Data data = new Data(); - private final MyReader reader = new MyReader(); - private final ResultPrinter rp = new ResultPrinter(); - private Parsable parser = new Parser(); - private Executable application; - - public void start() { - - while (isWork) { - switch (data.getStatus()) { - case START: - data.setStatus(Status.READ); - selectApp(); - break; - case READ: - System.out.println("Введите число:"); - data.setStatus(Status.PARSE); - reader.read(data); - reader.close(); - break; - case PARSE: - data.setStatus(Status.EXECUTE); - parser.parse(data); - break; - case EXECUTE: - data.setStatus(Status.PRINT); - application.execute(data); - break; - case PRINT: - case ERROR: - rp.printResult(data); - isWork = false; - break; - default: - break; - } - } - } - - private void selectApp() { - System.out.println("Выбирите приложение(цифрой):"); - Arrays.stream(Applications.values()) - .forEach(System.out::println); - - reader.read(data); - parser.parse(data); - if (data.getType() != Type.INTEGER) { - data.setStatus(Status.START); - System.out.println("Введите положительное число!"); - } - - int numApp = Integer.parseInt(data.getInValue()); - switch (numApp) { - case 1 : - System.out.println(Applications.PYRAMID_PRINTER); - application = new PyramidPrinter(); - break; - case 2 : - System.out.println(Applications.TRAFFIC_LIGHT); - application = new TrafficLight(); - break; - default: - data.setStatus(Status.START); - System.out.println("Приложения с таким номером еще нет"); - break; - } - } -} diff --git a/src/main/java/homework_2/utils/MyReader.java b/src/main/java/homework_2/utils/MyReader.java deleted file mode 100644 index 8af65890..00000000 --- a/src/main/java/homework_2/utils/MyReader.java +++ /dev/null @@ -1,34 +0,0 @@ -package homework_2.utils; - -import java.io.*; -import java.util.NoSuchElementException; -import java.util.Scanner; - -public class MyReader { - - private final InputStream inputStream = System.in; - private final PrintStream errStream = System.err; - Scanner sc; - - { - sc = new Scanner(inputStream); - } - - /** - * - * @param data Where to store the input data. - */ - public void read(Data data) { - try { - data.setInValue(sc.next()); - } catch (NoSuchElementException e) { - e.printStackTrace(); - data.setInValue("NoSuchElementException"); - data.setError("Error: NoSuchElementException"); - } - } - - public void close() { - sc.close(); - } -} diff --git a/src/main/java/homework_2/utils/Parsable.java b/src/main/java/homework_2/utils/Parsable.java deleted file mode 100644 index 88b93da1..00000000 --- a/src/main/java/homework_2/utils/Parsable.java +++ /dev/null @@ -1,5 +0,0 @@ -package homework_2.utils; - -public interface Parsable { - void parse(Data data); -} diff --git a/src/main/java/homework_2/utils/Parser.java b/src/main/java/homework_2/utils/Parser.java deleted file mode 100644 index 1d8aa79c..00000000 --- a/src/main/java/homework_2/utils/Parser.java +++ /dev/null @@ -1,20 +0,0 @@ -package homework_2.utils; - -import java.util.Scanner; - -public class Parser implements Parsable { - - @Override - public void parse(Data data) { - Scanner sc = new Scanner(data.getInValue()).useDelimiter("\n"); - - if (sc.hasNextInt()) { - data.setType(Type.INTEGER); - if (sc.nextInt() < 0) { - data.setType(Type.NEGATIVE_INTEGER); - } - } else { - data.setType(Type.STRING); - } - } -} diff --git a/src/main/java/homework_2/utils/ResultPrinter.java b/src/main/java/homework_2/utils/ResultPrinter.java deleted file mode 100644 index bb51cad7..00000000 --- a/src/main/java/homework_2/utils/ResultPrinter.java +++ /dev/null @@ -1,40 +0,0 @@ -package homework_2.utils; - -import java.io.PrintStream; - -public class ResultPrinter { - private final PrintStream printStream = System.out; - - public void printResult( - Data data - ) { - printResult(data.getResult(), data.getInValue()); - } - - public void printResult( - String result, - String inputValue - ) { - printResult(result, - inputValue, - printStream); - } - /** - * - * @param result Result. - * @param inputValue The value entered by the user. - * @param outputStream Where to print the result. - */ - public void printResult( - String result, - String inputValue, - PrintStream outputStream - ) { - String str = "input - " + - inputValue + - ", " + - "output - " + - result; - outputStream.println(str); - } -} diff --git a/src/main/java/homework_2/utils/Status.java b/src/main/java/homework_2/utils/Status.java deleted file mode 100644 index aae2e09a..00000000 --- a/src/main/java/homework_2/utils/Status.java +++ /dev/null @@ -1,10 +0,0 @@ -package homework_2.utils; - -public enum Status { - ERROR, - PARSE, - READ, - EXECUTE, - PRINT, - START -} diff --git a/src/main/java/homework_2/utils/Type.java b/src/main/java/homework_2/utils/Type.java deleted file mode 100644 index 89a6a686..00000000 --- a/src/main/java/homework_2/utils/Type.java +++ /dev/null @@ -1,7 +0,0 @@ -package homework_2.utils; - -public enum Type { - NEGATIVE_INTEGER, - INTEGER, - STRING -} From b21edbb8ad0f4911b848fe5a6ea398b44dd34ba7 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 19 Jul 2021 06:40:54 +0300 Subject: [PATCH 21/82] homework 2 ready for check. remade enum Color and as a consequence class TrafficLight --- src/main/java/homework_2/traffic/Color.java | 25 +++++++++++++++++-- .../java/homework_2/traffic/TrafficLight.java | 14 +---------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/homework_2/traffic/Color.java b/src/main/java/homework_2/traffic/Color.java index 3c0e9d02..5e7b76fd 100644 --- a/src/main/java/homework_2/traffic/Color.java +++ b/src/main/java/homework_2/traffic/Color.java @@ -1,7 +1,28 @@ package homework_2.traffic; public enum Color { - GREEN, + GREEN(0, 35), YELLOW, - RED + RED(40, 55); + + private int start; + private int end; + + Color() { + } + + Color(int start, int end) { + this.start = start; + this.end = end; + } + + public static Color check(int sec) { + if (sec >= GREEN.start && sec < GREEN.end) { + return GREEN; + } else if (sec >= RED.start && sec < RED.end) { + return RED; + } else { + return YELLOW; + } + } } diff --git a/src/main/java/homework_2/traffic/TrafficLight.java b/src/main/java/homework_2/traffic/TrafficLight.java index 8efeabd8..67d42c62 100644 --- a/src/main/java/homework_2/traffic/TrafficLight.java +++ b/src/main/java/homework_2/traffic/TrafficLight.java @@ -10,10 +10,6 @@ public class TrafficLight extends AppWithIntInput { protected final static String ERR_MAX_MSG = "Error: день закончен)"; private final static int MAX_VALUE = 86399; - private final static int GREEN_START = 0; - private final static int GREEN_END = 35; - private final static int RED_START = 40; - private final static int RED_END = 55; public static void main(String[] args) { Executable trafficLight = new TrafficLight(); @@ -26,19 +22,11 @@ protected String calculate() { if(error != null) { return error; } - Color color; if (data > MAX_VALUE) { return (ERR_MAX_MSG); } else { int sec = data % 60; - if (sec >= GREEN_START && sec < GREEN_END) { - color = Color.GREEN; - } else if (sec >= RED_START && sec < RED_END) { - color = Color.RED; - } else { - color = Color.YELLOW; - } - return color.name(); + return Color.check(sec).name(); } } } From accdbb28de71ca7884169e2346e5bd098b760ca7 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 19 Jul 2021 07:30:30 +0300 Subject: [PATCH 22/82] homework 2 ready for check. fixes. add check value in RandomCharsTable(incomplete as correct behavior is not specified) --- src/main/java/homework_2/charsTable/RandomCharsTable.java | 4 ++++ src/main/java/homework_2/traffic/TrafficLight.java | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/homework_2/charsTable/RandomCharsTable.java b/src/main/java/homework_2/charsTable/RandomCharsTable.java index ec8d823a..ffb3d771 100644 --- a/src/main/java/homework_2/charsTable/RandomCharsTable.java +++ b/src/main/java/homework_2/charsTable/RandomCharsTable.java @@ -20,11 +20,15 @@ protected void parseData() { try(Scanner sc = new Scanner(inputStr)) { length = sc.nextInt(); width = sc.nextInt(); + // if you enter not "odd" or "even", it will be "even" isOdd = sc.next().equalsIgnoreCase("odd"); + } catch (RuntimeException ex) { + error = ex.getClass().getSimpleName(); } } @Override protected String calculate() { + if (error != null) return error; int check; Random random = new Random(); StringBuilder charTable = new StringBuilder("\n"); diff --git a/src/main/java/homework_2/traffic/TrafficLight.java b/src/main/java/homework_2/traffic/TrafficLight.java index 67d42c62..a45a9a27 100644 --- a/src/main/java/homework_2/traffic/TrafficLight.java +++ b/src/main/java/homework_2/traffic/TrafficLight.java @@ -18,10 +18,8 @@ public static void main(String[] args) { @Override protected String calculate() { + if (error != null) return error; - if(error != null) { - return error; - } if (data > MAX_VALUE) { return (ERR_MAX_MSG); } else { From 5fa1a3b9a5f4249bd9241a355c1615ba66c10710 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 20 Jul 2021 11:50:54 +0300 Subject: [PATCH 23/82] homework 2 refactoring the project structure --- .../java/homework_2/pyramid_printer/Main.java | 11 +++++++ .../PyramidPrinter.java | 7 +---- .../homework_2/random_chars_table/Main.java | 11 +++++++ .../RandomCharsTable.java | 7 +---- .../java/homework_2/traffic/TrafficLight.java | 30 ------------------- .../{traffic => traffic_light}/Color.java | 3 +- .../java/homework_2/traffic_light/Main.java | 11 +++++++ .../traffic_light/TrafficLight.java | 18 +++++++++++ src/main/java/homework_2/utils/App.java | 9 +++--- .../java/homework_2/utils/Executable.java | 2 +- 10 files changed, 60 insertions(+), 49 deletions(-) create mode 100644 src/main/java/homework_2/pyramid_printer/Main.java rename src/main/java/homework_2/{pyramid => pyramid_printer}/PyramidPrinter.java (71%) create mode 100644 src/main/java/homework_2/random_chars_table/Main.java rename src/main/java/homework_2/{charsTable => random_chars_table}/RandomCharsTable.java (90%) delete mode 100644 src/main/java/homework_2/traffic/TrafficLight.java rename src/main/java/homework_2/{traffic => traffic_light}/Color.java (93%) create mode 100644 src/main/java/homework_2/traffic_light/Main.java create mode 100644 src/main/java/homework_2/traffic_light/TrafficLight.java 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..a30e5454 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -0,0 +1,11 @@ +package homework_2.pyramid_printer; + +import homework_2.utils.Executable; + +public class Main { + + public static void main(String[] args) { + Executable pyramidPrinter = new PyramidPrinter(); + pyramidPrinter.start(); + } +} diff --git a/src/main/java/homework_2/pyramid/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java similarity index 71% rename from src/main/java/homework_2/pyramid/PyramidPrinter.java rename to src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index ca4cddcb..f2ae2e05 100644 --- a/src/main/java/homework_2/pyramid/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -1,14 +1,9 @@ -package homework_2.pyramid; +package homework_2.pyramid_printer; import homework_2.utils.AppWithIntInput; -import homework_2.utils.Executable; public class PyramidPrinter extends AppWithIntInput { - public static void main(String[] args) { - Executable pyramidPrinter = new PyramidPrinter(); - pyramidPrinter.execute(); - } @Override protected String calculate() { if (error != null) return error; 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..b99df200 --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -0,0 +1,11 @@ +package homework_2.random_chars_table; + +import homework_2.utils.Executable; + +public class Main { + + public static void main(String[] args) { + Executable rct = new RandomCharsTable(); + rct.start(); + } +} diff --git a/src/main/java/homework_2/charsTable/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java similarity index 90% rename from src/main/java/homework_2/charsTable/RandomCharsTable.java rename to src/main/java/homework_2/random_chars_table/RandomCharsTable.java index ffb3d771..50cfc0fa 100644 --- a/src/main/java/homework_2/charsTable/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,7 +1,6 @@ -package homework_2.charsTable; +package homework_2.random_chars_table; import homework_2.utils.App; -import homework_2.utils.Executable; import java.util.Random; import java.util.Scanner; @@ -11,10 +10,6 @@ public class RandomCharsTable extends App { int width; boolean isOdd; - public static void main(String[] args) { - Executable rct = new RandomCharsTable(); - rct.execute(); - } @Override protected void parseData() { try(Scanner sc = new Scanner(inputStr)) { diff --git a/src/main/java/homework_2/traffic/TrafficLight.java b/src/main/java/homework_2/traffic/TrafficLight.java deleted file mode 100644 index a45a9a27..00000000 --- a/src/main/java/homework_2/traffic/TrafficLight.java +++ /dev/null @@ -1,30 +0,0 @@ -package homework_2.traffic; - -import homework_2.utils.AppWithIntInput; -import homework_2.utils.Executable; - -import java.util.Scanner; - -public class TrafficLight extends AppWithIntInput { - - protected final static String ERR_MAX_MSG = "Error: день закончен)"; - - private final static int MAX_VALUE = 86399; - - public static void main(String[] args) { - Executable trafficLight = new TrafficLight(); - trafficLight.execute(); - } - - @Override - protected String calculate() { - if (error != null) return error; - - if (data > MAX_VALUE) { - return (ERR_MAX_MSG); - } else { - int sec = data % 60; - return Color.check(sec).name(); - } - } -} diff --git a/src/main/java/homework_2/traffic/Color.java b/src/main/java/homework_2/traffic_light/Color.java similarity index 93% rename from src/main/java/homework_2/traffic/Color.java rename to src/main/java/homework_2/traffic_light/Color.java index 5e7b76fd..595c8d91 100644 --- a/src/main/java/homework_2/traffic/Color.java +++ b/src/main/java/homework_2/traffic_light/Color.java @@ -1,6 +1,7 @@ -package homework_2.traffic; +package homework_2.traffic_light; public enum Color { + GREEN(0, 35), YELLOW, RED(40, 55); 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..7e6f6163 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -0,0 +1,11 @@ +package homework_2.traffic_light; + +import homework_2.utils.Executable; + +public class Main { + + public static void main(String[] args) { + Executable trafficLight = new TrafficLight(); + trafficLight.start(); + } +} 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..786dd006 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -0,0 +1,18 @@ +package homework_2.traffic_light; + +import homework_2.utils.AppWithIntInput; + +public class TrafficLight extends AppWithIntInput { + + protected final static String ERR_MAX_MSG = "Error: день закончен)"; + private final static int MAX_VALUE = 86399; + + @Override + protected String calculate() { + if (error != null) return error; + if (data > MAX_VALUE) return (ERR_MAX_MSG); + + int sec = data % 60; + return Color.check(sec).name(); + } +} diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java index f6aa4529..360f5a6e 100644 --- a/src/main/java/homework_2/utils/App.java +++ b/src/main/java/homework_2/utils/App.java @@ -6,9 +6,9 @@ public abstract class App implements Executable{ - protected final static String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; - protected final static String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; - protected final static String STRING_MSG = "Введите данные:"; + protected final String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; + protected final String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; + protected final String STRING_MSG = "Введите данные:"; protected final InputStream INPUT_STREAM = System.in; protected final PrintStream PRINT_STREAM = System.out; @@ -17,8 +17,7 @@ public abstract class App implements Executable{ protected String inputStr; - public void execute() { - + public void start() { readData(); parseData(); diff --git a/src/main/java/homework_2/utils/Executable.java b/src/main/java/homework_2/utils/Executable.java index ba5c004a..7abb150a 100644 --- a/src/main/java/homework_2/utils/Executable.java +++ b/src/main/java/homework_2/utils/Executable.java @@ -1,5 +1,5 @@ package homework_2.utils; public interface Executable { - void execute(); + void start(); } From 0db5d6d95b331cebf27bad1b708351402cee3161 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 20 Jul 2021 13:46:30 +0300 Subject: [PATCH 24/82] homework 2 RandomCharsTable refactor --- .../homework_2/random_chars_table/Main.java | 4 ++-- .../random_chars_table/RandomCharsTable.java | 23 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java index b99df200..8a080043 100644 --- a/src/main/java/homework_2/random_chars_table/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -5,7 +5,7 @@ public class Main { public static void main(String[] args) { - Executable rct = new RandomCharsTable(); - rct.start(); + Executable randomCharsTable = new RandomCharsTable(); + randomCharsTable.start(); } } 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 50cfc0fa..048eba73 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -3,22 +3,29 @@ import homework_2.utils.App; import java.util.Random; -import java.util.Scanner; public class RandomCharsTable extends App { + + protected final String ERR_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; + int length; int width; boolean isOdd; @Override protected void parseData() { - try(Scanner sc = new Scanner(inputStr)) { - length = sc.nextInt(); - width = sc.nextInt(); - // if you enter not "odd" or "even", it will be "even" - isOdd = sc.next().equalsIgnoreCase("odd"); - } catch (RuntimeException ex) { - error = ex.getClass().getSimpleName(); + + if (!inputStr.matches("[1-9][0-9]*\\s+[1-9][0-9]*\\s+(even|odd)")) { + error = ERR_MSG; + return; + } + String[] arguments = inputStr.split("\\s"); + isOdd = arguments[2].equalsIgnoreCase("odd"); + try { + length = Integer.parseInt(arguments[0]); + width = Integer.parseInt(arguments[1]); + } catch (NumberFormatException ex) { + error = ERR_MSG; } } @Override From 4ad9d12042fae47035d55dfaba1da33fc87ca072 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 20 Jul 2021 13:49:03 +0300 Subject: [PATCH 25/82] homework 2 refactor TrafficLight --- src/main/java/homework_2/traffic_light/TrafficLight.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 786dd006..667851e2 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -4,13 +4,13 @@ public class TrafficLight extends AppWithIntInput { - protected final static String ERR_MAX_MSG = "Error: день закончен)"; + protected final static String MAX_MSG = "The day is over"; private final static int MAX_VALUE = 86399; @Override protected String calculate() { if (error != null) return error; - if (data > MAX_VALUE) return (ERR_MAX_MSG); + if (data > MAX_VALUE) return (MAX_MSG); int sec = data % 60; return Color.check(sec).name(); From eb09bf6e2fd2b34df4aa021c565f878642bffcd0 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 20 Jul 2021 13:57:08 +0300 Subject: [PATCH 26/82] homework 2 refactor utils App.java - change err msg AppWithIntInput.java -> AppWithOneIntInput.java --- .../java/homework_2/pyramid_printer/PyramidPrinter.java | 4 ++-- src/main/java/homework_2/traffic_light/TrafficLight.java | 4 ++-- src/main/java/homework_2/utils/App.java | 4 ++-- .../utils/{AppWithIntInput.java => AppWithOneIntInput.java} | 6 ++---- 4 files changed, 8 insertions(+), 10 deletions(-) rename src/main/java/homework_2/utils/{AppWithIntInput.java => AppWithOneIntInput.java} (64%) diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index f2ae2e05..bbfd1d4d 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -1,8 +1,8 @@ package homework_2.pyramid_printer; -import homework_2.utils.AppWithIntInput; +import homework_2.utils.AppWithOneIntInput; -public class PyramidPrinter extends AppWithIntInput { +public class PyramidPrinter extends AppWithOneIntInput { @Override protected String calculate() { diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 667851e2..425613e2 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -1,8 +1,8 @@ package homework_2.traffic_light; -import homework_2.utils.AppWithIntInput; +import homework_2.utils.AppWithOneIntInput; -public class TrafficLight extends AppWithIntInput { +public class TrafficLight extends AppWithOneIntInput { protected final static String MAX_MSG = "The day is over"; private final static int MAX_VALUE = 86399; diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java index 360f5a6e..0d27afba 100644 --- a/src/main/java/homework_2/utils/App.java +++ b/src/main/java/homework_2/utils/App.java @@ -6,8 +6,8 @@ public abstract class App implements Executable{ - protected final String ERR_NEGATIVE_MSG = "Error: Отрицательное число недопустимо"; - protected final String ERR_STRING_MSG = "Error: Допустимо только число(max 2^31)"; + protected final String ERR_NEGATIVE_MSG = "Only 1 non-negative integer is allowed as passed parameter"; + protected final String ERR_STRING_MSG = "Only 1 non-negative integer is allowed as passed parameter"; protected final String STRING_MSG = "Введите данные:"; protected final InputStream INPUT_STREAM = System.in; diff --git a/src/main/java/homework_2/utils/AppWithIntInput.java b/src/main/java/homework_2/utils/AppWithOneIntInput.java similarity index 64% rename from src/main/java/homework_2/utils/AppWithIntInput.java rename to src/main/java/homework_2/utils/AppWithOneIntInput.java index a1bf82f8..df8ec6b2 100644 --- a/src/main/java/homework_2/utils/AppWithIntInput.java +++ b/src/main/java/homework_2/utils/AppWithOneIntInput.java @@ -2,7 +2,7 @@ import java.util.Scanner; -public abstract class AppWithIntInput extends App{ +public abstract class AppWithOneIntInput extends App{ protected int data; @Override protected void parseData() { @@ -12,10 +12,8 @@ protected void parseData() { if (data < 0) { error = ERR_NEGATIVE_MSG; } - } else if (sc.hasNextDouble()) { - error = (sc.nextDouble() + " не целое число"); } else { - error = (ERR_STRING_MSG); + error = ERR_STRING_MSG; } } } From 781e1e56a521bebabb538ba0c7a2acc828d0936f Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 20 Jul 2021 16:01:57 +0300 Subject: [PATCH 27/82] modify README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6493499b..378aa1ab 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,12 @@ | Number | Solution | Short description | --- | --- | --- | | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_1) | The app that reads input arguments and prints them, until "ошибка" argument | -| HW2 | [PyramidPrinter](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/pyramid) | The app that reads input argument and builds pyramid base on input value | -| HW2 | [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/charsTable) | App reads from the console width and length of the chart, strategy keyword (even or odd). Prints to the console the chart of random chars from A to Z | -| HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic) | App reads current time in seconds from the console and prints the traffic light| +| HW2 | [PyramidPrinter](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/pyramid_printer) | The app that reads input argument and builds pyramid base on input value | +| HW2 | [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/random_chars_table) | App reads from the console width and length of the chart, strategy keyword (even or odd). Prints to the console the chart of random chars from A to Z | +| HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic_light) | App reads current time in seconds from the console and prints the traffic light| +| HW3 | [ImmutableClass](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_3) | ImmutableClass | + + +[Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 76fa0ec444cd3918b8dde396ac27453cbf52bafe Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 20 Jul 2021 16:02:14 +0300 Subject: [PATCH 28/82] homework_3 --- src/main/java/homework_3/ImmutableClass.java | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/homework_3/ImmutableClass.java diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java new file mode 100644 index 00000000..ac804817 --- /dev/null +++ b/src/main/java/homework_3/ImmutableClass.java @@ -0,0 +1,46 @@ +package homework_3; + +import java.util.ArrayList; +import java.util.List; +/* +The class must be declared as final +Data members in the class must be declared as private +Data members in the class must be declared as final +A parameterized constructor should initialize all the fields performing a deep copy +Deep Copy of objects should be performed in the getter methods +No setters + */ +public final class ImmutableClass { + private final String aString; + private final int anInt; + private final List aList; + + public ImmutableClass(List aList) { + this.aString = "default"; + this.anInt = 0; + this.aList = aList; + } + + public ImmutableClass(String aString, int anInt, List aList) { + List tempList = new ArrayList<>(aList); + this.aString = aString; + this.anInt = anInt; + this.aList = tempList; + } + + public String getaString() { + return aString; + } + + public int getAnInt() { + return anInt; + } + + public List getaList() { + return new ArrayList<>(aList); + } + + public ImmutableClass getNew(List aList) { + return new ImmutableClass(aString, anInt, aList); + } +} From ce3ca967948767ce6382389ba6ded2422ef05384 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 21 Jul 2021 03:55:38 +0300 Subject: [PATCH 29/82] homework_2 small refactor --- .../random_chars_table/RandomCharsTable.java | 16 ++++----- src/main/java/homework_2/utils/App.java | 34 ++++++++++++------- .../homework_2/utils/AppWithOneIntInput.java | 7 ++-- 3 files changed, 33 insertions(+), 24 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 048eba73..be655eb7 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -5,18 +5,16 @@ import java.util.Random; public class RandomCharsTable extends App { - - protected final String ERR_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; - - int length; - int width; - boolean isOdd; + private int length; + private int width; + private boolean isOdd; @Override protected void parseData() { + final String ERR_NON_VALID_DATA_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; - if (!inputStr.matches("[1-9][0-9]*\\s+[1-9][0-9]*\\s+(even|odd)")) { - error = ERR_MSG; + if (!inputStr.matches("[1-9][0-9]*\\s[1-9][0-9]*\\s(even|odd)")) { + error = ERR_NON_VALID_DATA_MSG; return; } String[] arguments = inputStr.split("\\s"); @@ -25,7 +23,7 @@ protected void parseData() { length = Integer.parseInt(arguments[0]); width = Integer.parseInt(arguments[1]); } catch (NumberFormatException ex) { - error = ERR_MSG; + error = ERR_NON_VALID_DATA_MSG; } } @Override diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java index 0d27afba..89c3685d 100644 --- a/src/main/java/homework_2/utils/App.java +++ b/src/main/java/homework_2/utils/App.java @@ -6,16 +6,18 @@ public abstract class App implements Executable{ - protected final String ERR_NEGATIVE_MSG = "Only 1 non-negative integer is allowed as passed parameter"; - protected final String ERR_STRING_MSG = "Only 1 non-negative integer is allowed as passed parameter"; - protected final String STRING_MSG = "Введите данные:"; - - protected final InputStream INPUT_STREAM = System.in; - protected final PrintStream PRINT_STREAM = System.out; - + protected InputStream inputStream; + protected PrintStream printStream; protected String error; protected String inputStr; + { + inputStream = System.in; + printStream = System.out; + } + + protected abstract void parseData(); + protected abstract String calculate(); public void start() { readData(); @@ -24,16 +26,13 @@ public void start() { printResult(calculate(), inputStr); } - protected abstract void parseData(); - protected abstract String calculate(); - /** * * @param result Result. * @param inputValue The value entered by the user. */ protected void printResult(String result, String inputValue) { - printResult(result, inputValue, PRINT_STREAM); + printResult(result, inputValue, printStream); } /** * @@ -51,9 +50,18 @@ protected void printResult(String result, String inputValue, PrintStream outputS } protected void readData() { - try(Scanner sc = new Scanner(INPUT_STREAM)) { - PRINT_STREAM.println(STRING_MSG); + final String STRING_MSG = "Введите данные:"; + try(Scanner sc = new Scanner(inputStream)) { + printStream.println(STRING_MSG); inputStr = sc.nextLine(); } } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + public void setPrintStream(PrintStream printStream) { + this.printStream = printStream; + } } diff --git a/src/main/java/homework_2/utils/AppWithOneIntInput.java b/src/main/java/homework_2/utils/AppWithOneIntInput.java index df8ec6b2..27d4c261 100644 --- a/src/main/java/homework_2/utils/AppWithOneIntInput.java +++ b/src/main/java/homework_2/utils/AppWithOneIntInput.java @@ -3,17 +3,20 @@ import java.util.Scanner; public abstract class AppWithOneIntInput extends App{ + protected int data; + @Override protected void parseData() { + final String ERR_NON_VALID_DATA_MSG = "Only 1 non-negative integer is allowed as passed parameter"; Scanner sc = new Scanner(inputStr).useDelimiter("\n"); if (sc.hasNextInt()) { data = sc.nextInt(); if (data < 0) { - error = ERR_NEGATIVE_MSG; + error = ERR_NON_VALID_DATA_MSG; } } else { - error = ERR_STRING_MSG; + error = ERR_NON_VALID_DATA_MSG; } } } From f3339908cc398d537921de32bfb62f6f2df819c6 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 21 Jul 2021 04:21:03 +0300 Subject: [PATCH 30/82] homework_2 small refactor --- src/main/java/homework_2/utils/App.java | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java index 89c3685d..271cbaf7 100644 --- a/src/main/java/homework_2/utils/App.java +++ b/src/main/java/homework_2/utils/App.java @@ -26,26 +26,13 @@ public void start() { printResult(calculate(), inputStr); } - /** - * - * @param result Result. - * @param inputValue The value entered by the user. - */ protected void printResult(String result, String inputValue) { printResult(result, inputValue, printStream); } - /** - * - * @param result Result. - * @param inputValue The value entered by the user. - * @param outputStream Where to print the result. - */ + protected void printResult(String result, String inputValue, PrintStream outputStream) { - String str = "input - " + - inputValue + - ", " + - "output - " + - result; + String str = "input - " + inputValue + + ", output - " + result; outputStream.println(str); } From 97ee39cd16aad21df9e808dd51adf9a2690f8347 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 21 Jul 2021 14:43:06 +0300 Subject: [PATCH 31/82] homework_2 I don't know what result is needed, so now output the raw result --- src/main/java/homework_2/utils/App.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java index 271cbaf7..5e256c62 100644 --- a/src/main/java/homework_2/utils/App.java +++ b/src/main/java/homework_2/utils/App.java @@ -22,8 +22,8 @@ public abstract class App implements Executable{ public void start() { readData(); parseData(); - - printResult(calculate(), inputStr); + printStream.print(calculate().trim()); +// printResult(calculate(), inputStr); // custom output } protected void printResult(String result, String inputValue) { From bc6a30fe5dce15d2631a9f63c836d0e4abe61107 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 21 Jul 2021 16:45:04 +0300 Subject: [PATCH 32/82] homework_2 method start() -> run() --- src/main/java/homework_2/pyramid_printer/Main.java | 2 +- src/main/java/homework_2/random_chars_table/Main.java | 2 +- src/main/java/homework_2/traffic_light/Main.java | 2 +- src/main/java/homework_2/utils/App.java | 3 ++- src/main/java/homework_2/utils/Executable.java | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java index a30e5454..db0c5365 100644 --- a/src/main/java/homework_2/pyramid_printer/Main.java +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -6,6 +6,6 @@ public class Main { public static void main(String[] args) { Executable pyramidPrinter = new PyramidPrinter(); - pyramidPrinter.start(); + pyramidPrinter.run(); } } diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java index 8a080043..a2387808 100644 --- a/src/main/java/homework_2/random_chars_table/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -6,6 +6,6 @@ public class Main { public static void main(String[] args) { Executable randomCharsTable = new RandomCharsTable(); - randomCharsTable.start(); + randomCharsTable.run(); } } diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java index 7e6f6163..e67feaf3 100644 --- a/src/main/java/homework_2/traffic_light/Main.java +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -6,6 +6,6 @@ public class Main { public static void main(String[] args) { Executable trafficLight = new TrafficLight(); - trafficLight.start(); + trafficLight.run(); } } diff --git a/src/main/java/homework_2/utils/App.java b/src/main/java/homework_2/utils/App.java index 5e256c62..02efca63 100644 --- a/src/main/java/homework_2/utils/App.java +++ b/src/main/java/homework_2/utils/App.java @@ -19,7 +19,8 @@ public abstract class App implements Executable{ protected abstract void parseData(); protected abstract String calculate(); - public void start() { + @Override + public void run() { readData(); parseData(); printStream.print(calculate().trim()); diff --git a/src/main/java/homework_2/utils/Executable.java b/src/main/java/homework_2/utils/Executable.java index 7abb150a..6619a2d9 100644 --- a/src/main/java/homework_2/utils/Executable.java +++ b/src/main/java/homework_2/utils/Executable.java @@ -1,5 +1,5 @@ package homework_2.utils; public interface Executable { - void start(); + void run(); } From 6a9110a39a495c1ef9fa9366d4f914730f2168e9 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 21 Jul 2021 23:38:27 +0300 Subject: [PATCH 33/82] homework_3 add PyramidPrinterTest --- .../pyramid_printer/PyramidPrinterTest.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java diff --git a/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java new file mode 100644 index 00000000..e12d75ec --- /dev/null +++ b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -0,0 +1,90 @@ +package homework_2.pyramid_printer; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.*; + +class PyramidPrinterTest extends UnitBase { + @Test + void InputZeroAsArgument() { + setInput("0"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("", getOutputLines()[0]); + } + + @Test + void InputFiveAsArgument() { + setInput("5"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("x", getOutputLines()[0]); + assertEquals("xx", getOutputLines()[1]); + assertEquals("xxx", getOutputLines()[2]); + assertEquals("xxxx", getOutputLines()[3]); + assertEquals("xxxxx", getOutputLines()[4]); + } + + @Test + void InputMinusOneAsArgument() { + setInput("-1"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputStringValueAsArgument() { + setInput("String"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputTwoArguments() { + setInput("2 2"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputDoubleAsArgument() { + setInput("0.1"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputDigitalValueBiggerThenIntegerAsArgument() { + setInput("9999999999"); + + new PyramidPrinter().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputEmptyArgument() { + setInput(""); + assertThrows(NoSuchElementException.class, () -> new PyramidPrinter().run()); + } +} \ No newline at end of file From 2355efd99ff36fe0f1aa689dc37b9b84f13b990b Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 21 Jul 2021 23:59:45 +0300 Subject: [PATCH 34/82] homework_3 add TrafficLightTest --- .../traffic_light/TrafficLightTest.java | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/test/java/homework_2/traffic_light/TrafficLightTest.java diff --git a/src/test/java/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/TrafficLightTest.java new file mode 100644 index 00000000..5014e1b1 --- /dev/null +++ b/src/test/java/homework_2/traffic_light/TrafficLightTest.java @@ -0,0 +1,117 @@ +package homework_2.traffic_light; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.*; + +class TrafficLightTest extends UnitBase { + @Test + void InputZeroAsArgument() { + setInput("0"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("GREEN", getOutputLines()[0]); + } + + @Test + void InputFiftyFiveAsArgument() { + setInput("55"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("YELLOW", getOutputLines()[0]); + } + + @Test + void InputThirtyFiveAsArgument() { + setInput("35"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("YELLOW", getOutputLines()[0]); + } + + @Test + void InputFiftyAsArgument() { + setInput("50"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("RED", getOutputLines()[0]); + } + + @Test + void InputMinusOneAsArgument() { + setInput("-1"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputStringValueAsArgument() { + setInput("String"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputTwoArguments() { + setInput("2 2"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputDoubleAsArgument() { + setInput("0.1"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputDigitalValueBiggerThenIntegerAsArgument() { + setInput("9999999999"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); + } + + @Test + void InputValueBiggerThenSecInOneDayAsArgument() { + setInput("86401"); + + new TrafficLight().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("The day is over", getOutputLines()[0]); + } + + @Test + void InputEmptyArgument() { + setInput(""); + assertThrows(NoSuchElementException.class, () -> new TrafficLight().run()); + } + +} \ No newline at end of file From 92d54919e383bfe18775daef7e73927b539bed1c Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 00:00:15 +0300 Subject: [PATCH 35/82] homework_3 add RandomCharsTableTest not full --- .../RandomCharsTableTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java new file mode 100644 index 00000000..6f490912 --- /dev/null +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -0,0 +1,27 @@ +package homework_2.random_chars_table; + +import base.UnitBase; +import homework_2.pyramid_printer.PyramidPrinter; +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomCharsTableTest extends UnitBase { + @Test + void InputZeroAsArgument() { + setInput("0"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", getOutputLines()[0]); + } + + @Test + void InputEmptyArgument() { + setInput(""); + assertThrows(NoSuchElementException.class, () -> new RandomCharsTable().run()); + } +} \ No newline at end of file From e44be4221f5741aa5117176911377720203b3fc8 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 00:39:05 +0300 Subject: [PATCH 36/82] homework_2 fix RandomCharsTable fix check strategy add method setDebug which sets the seed(1L) for the randomizer --- .../random_chars_table/RandomCharsTable.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 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 be655eb7..3da26a5b 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -9,6 +9,8 @@ public class RandomCharsTable extends App { private int width; private boolean isOdd; + private boolean isDebug; + @Override protected void parseData() { final String ERR_NON_VALID_DATA_MSG = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; @@ -29,8 +31,13 @@ protected void parseData() { @Override protected String calculate() { if (error != null) return error; + int check; - Random random = new Random(); + Random random; + + if (isDebug) random = new Random(1L); + else random = new Random(); + StringBuilder charTable = new StringBuilder("\n"); StringBuilder answerBuilder = new StringBuilder(); @@ -49,7 +56,7 @@ protected String calculate() { .append("| ") .append(letter) .append(" "); - if( (letter & check) == check) { + if (letter % 2 == check) { answerBuilder .append(letter) .append(", "); @@ -60,4 +67,9 @@ protected String calculate() { answerBuilder.setLength(answerBuilder.length() - 2); return charTable.append(answerBuilder).toString(); } + + public RandomCharsTable setDebug(boolean debug) { + isDebug = debug; + return this; + } } From f9af1a8443c7a73370f6eb2869318c96bf916f80 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 00:40:19 +0300 Subject: [PATCH 37/82] homework_3 ready for check --- .../RandomCharsTableTest.java | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index 6f490912..51a68383 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,12 +1,12 @@ package homework_2.random_chars_table; import base.UnitBase; -import homework_2.pyramid_printer.PyramidPrinter; import org.junit.jupiter.api.Test; import java.util.NoSuchElementException; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class RandomCharsTableTest extends UnitBase { @Test @@ -24,4 +24,48 @@ void InputEmptyArgument() { setInput(""); assertThrows(NoSuchElementException.class, () -> new RandomCharsTable().run()); } + + @Test + void InputValidArgumentsNotSameResults() { + setInput("3 3 even"); + + new RandomCharsTable().run(); + printOut(); + new RandomCharsTable().run(); + printOut(); + } + + @Test + void InputValidEvenArguments() { + setInput("3 3 even"); + + new RandomCharsTable().setDebug(true).run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("| K | N | W |", getOutputLines()[0]); + assertEquals("| N | E | E |", getOutputLines()[1]); + assertEquals("| J | G | D |", getOutputLines()[2]); + assertEquals("Even letters - N, N, J, D", getOutputLines()[3]); + } + + /* + for this test use new RandomCharsTable().setDebug(true).run(); + 3 3 odd + | K | N | W | + | N | E | E | + | J | G | D | + odd letters - K, W, E, E, G + */ + @Test + void InputValidOddArguments() { + setInput("3 3 odd"); + + new RandomCharsTable().setDebug(true).run(); + printOut(); + removeFromOutput("Введите данные:"); + assertEquals("| K | N | W |", getOutputLines()[0]); + assertEquals("| N | E | E |", getOutputLines()[1]); + assertEquals("| J | G | D |", getOutputLines()[2]); + assertEquals("Odd letters - K, W, E, E, G", getOutputLines()[3]); + } } \ No newline at end of file From 18b9a0e694b803bbfff165756f5d913b8066c866 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 00:45:34 +0300 Subject: [PATCH 38/82] homework_3 ready for check remove test RandomCharsTableTest.InputValidArgumentsNotSameResults() (can't to do it) --- .../random_chars_table/RandomCharsTableTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index 51a68383..b5594757 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -25,16 +25,6 @@ void InputEmptyArgument() { assertThrows(NoSuchElementException.class, () -> new RandomCharsTable().run()); } - @Test - void InputValidArgumentsNotSameResults() { - setInput("3 3 even"); - - new RandomCharsTable().run(); - printOut(); - new RandomCharsTable().run(); - printOut(); - } - @Test void InputValidEvenArguments() { setInput("3 3 even"); From b003a8cfb26dec07b17887a7dddd6e3420c6844a Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 00:57:28 +0300 Subject: [PATCH 39/82] homework_3 ready for check README.md update --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 378aa1ab..4acdd83a 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ | HW2 | [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/random_chars_table) | App reads from the console width and length of the chart, strategy keyword (even or odd). Prints to the console the chart of random chars from A to Z | | HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic_light) | App reads current time in seconds from the console and prints the traffic light| | HW3 | [ImmutableClass](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_3) | ImmutableClass | +| HW3 | [PyramidPrinterTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/pyramid_printer) | Pyramid printer tests | +| HW3 | [RandomCharsTableTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/random_chars_table) | Random chars table tests | +| HW3 | [TrafficLightTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/traffic_light) | Traffic light tests| + [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) From ba88fc3dc677310148a78e6fb24c38d97bb87a04 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 02:22:07 +0300 Subject: [PATCH 40/82] homework_3 ready for check add some tests. --- .../RandomCharsTableTest.java | 97 +++++++++++++++++-- 1 file changed, 88 insertions(+), 9 deletions(-) diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index b5594757..7a290031 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -5,8 +5,7 @@ import java.util.NoSuchElementException; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; class RandomCharsTableTest extends UnitBase { @Test @@ -25,6 +24,14 @@ void InputEmptyArgument() { assertThrows(NoSuchElementException.class, () -> new RandomCharsTable().run()); } + /* + for this test use new RandomCharsTable().setDebug(true).run(); + 3 3 odd + | K | N | W | + | N | E | E | + | J | G | D | + Even letters - N, N, J, D + */ @Test void InputValidEvenArguments() { setInput("3 3 even"); @@ -39,13 +46,13 @@ void InputValidEvenArguments() { } /* - for this test use new RandomCharsTable().setDebug(true).run(); - 3 3 odd - | K | N | W | - | N | E | E | - | J | G | D | - odd letters - K, W, E, E, G - */ + for this test use new RandomCharsTable().setDebug(true).run(); + 3 3 odd + | K | N | W | + | N | E | E | + | J | G | D | + odd letters - K, W, E, E, G + */ @Test void InputValidOddArguments() { setInput("3 3 odd"); @@ -58,4 +65,76 @@ void InputValidOddArguments() { assertEquals("| J | G | D |", getOutputLines()[2]); assertEquals("Odd letters - K, W, E, E, G", getOutputLines()[3]); } + + @Test + void InputFourRowsThreeColumnsAsArgument() { + setInput("4 3 odd"); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Введите данные:"); + assertTrue(getOutputLines()[0].matches("(\\|\\s[A-Z]\\s){3}\\|")); + assertTrue(getOutputLines()[1].matches("(\\|\\s[A-Z]\\s){3}\\|")); + assertTrue(getOutputLines()[2].matches("(\\|\\s[A-Z]\\s){3}\\|")); + assertTrue(getOutputLines()[3].matches("(\\|\\s[A-Z]\\s){3}\\|")); + } + + + // дальше тесты уродливы, но как иначе распарсить эти строки и сравнить все я не знаю + @Test + void InputCheckStrategyEven() { + final int ROWS = 3; + final int COLUMNS = 4; + final String STRATEGY = "even"; + final String input = "" + ROWS + " " + COLUMNS + " " + STRATEGY; + + setInput(input); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Введите данные:"); + + final String[] strategyRow = getOutputLines()[ROWS].trim().split(" - "); + final char[] evenCharsInAnswerRow = strategyRow[1].trim().replaceAll(", ","").toCharArray(); + StringBuffer charsInTable = new StringBuffer(); + for (int i = 0; i < ROWS; i++){ + charsInTable.append(getOutputLines()[i].trim().replaceAll("\\|", "").replace(" ", "")); + } + + for (char c : evenCharsInAnswerRow) { + assertEquals(0, c % 2); + assertNotEquals(-1, charsInTable.indexOf("" + c)); + } + assertEquals("Even letters", strategyRow[0]); + } + + + // дальше тесты уродливы, но как иначе распарсить эти строки и сравнить все я не знаю + @Test + void InputCheckStrategyOdd() { + final int ROWS = 5; + final int COLUMNS = 4; + final String STRATEGY = "odd"; + final String input = "" + ROWS + " " + COLUMNS + " " + STRATEGY; + + setInput(input); + + new RandomCharsTable().run(); + printOut(); + removeFromOutput("Введите данные:"); + + final String[] strategyRow = getOutputLines()[ROWS].trim().split(" - "); + final char[] oddCharsInAnswerRow = strategyRow[1].trim().replaceAll(", ","").toCharArray(); + + StringBuffer charsInTable = new StringBuffer(); + for (int i = 0; i < ROWS; i++){ + charsInTable.append(getOutputLines()[i].trim().replaceAll("\\|", "").replace(" ", "")); + } + + for (char c : oddCharsInAnswerRow) { + assertEquals(1, c % 2); + assertNotEquals(-1, charsInTable.indexOf("" + c)); + } + assertEquals("Odd letters", strategyRow[0]); + } } \ No newline at end of file From 1ce9200b5d725d048972c011882a983410d8cd9c Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 03:18:11 +0300 Subject: [PATCH 41/82] homework_3 ready for check fix tests in RandomCharsTableTest InputCheckStrategyOdd and InputCheckStrategyEven -> InputRandomCheckStrategy --- .../RandomCharsTableTest.java | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index 7a290031..dc9a9d59 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import java.util.NoSuchElementException; +import java.util.Random; import static org.junit.jupiter.api.Assertions.*; @@ -67,55 +68,43 @@ void InputValidOddArguments() { } @Test - void InputFourRowsThreeColumnsAsArgument() { - setInput("4 3 odd"); + void InputRandomRowsAndColumnsAsArgument() { + final String STRATEGY = "even"; + final int ROWS = 1 + new Random().nextInt(20); + final int COLUMNS = 1 + new Random().nextInt(20); + final String input = "" + ROWS + " " + COLUMNS + " " + STRATEGY; + + setInput(input); new RandomCharsTable().run(); printOut(); removeFromOutput("Введите данные:"); - assertTrue(getOutputLines()[0].matches("(\\|\\s[A-Z]\\s){3}\\|")); - assertTrue(getOutputLines()[1].matches("(\\|\\s[A-Z]\\s){3}\\|")); - assertTrue(getOutputLines()[2].matches("(\\|\\s[A-Z]\\s){3}\\|")); - assertTrue(getOutputLines()[3].matches("(\\|\\s[A-Z]\\s){3}\\|")); + for (int i = 0; i < ROWS; i++) + assertTrue(getOutputLines()[i].matches("(\\|\\s[A-Z]\\s){" + COLUMNS + "}\\|")); } - - // дальше тесты уродливы, но как иначе распарсить эти строки и сравнить все я не знаю + // дальше тест уродлив, но как иначе распарсить эти строки и сравнить все я не знаю + // за то покрывает все варианты. @Test - void InputCheckStrategyEven() { - final int ROWS = 3; - final int COLUMNS = 4; - final String STRATEGY = "even"; - final String input = "" + ROWS + " " + COLUMNS + " " + STRATEGY; + void InputRandomCheckStrategy() { + final boolean isOdd = new Random().nextBoolean(); - setInput(input); + final int ROWS = 1 + new Random().nextInt(20); + final int COLUMNS = 1 + new Random().nextInt(20); - new RandomCharsTable().run(); - printOut(); - removeFromOutput("Введите данные:"); + final String STRATEGY; + final char testChar; // добавим точно валидное значение, что бы быть уверенным в тесте - final String[] strategyRow = getOutputLines()[ROWS].trim().split(" - "); - final char[] evenCharsInAnswerRow = strategyRow[1].trim().replaceAll(", ","").toCharArray(); - StringBuffer charsInTable = new StringBuffer(); - for (int i = 0; i < ROWS; i++){ - charsInTable.append(getOutputLines()[i].trim().replaceAll("\\|", "").replace(" ", "")); - } + if (isOdd) { + STRATEGY = "Odd"; + testChar = 91; - for (char c : evenCharsInAnswerRow) { - assertEquals(0, c % 2); - assertNotEquals(-1, charsInTable.indexOf("" + c)); + } else { + STRATEGY = "Even"; + testChar = 92; } - assertEquals("Even letters", strategyRow[0]); - } - - // дальше тесты уродливы, но как иначе распарсить эти строки и сравнить все я не знаю - @Test - void InputCheckStrategyOdd() { - final int ROWS = 5; - final int COLUMNS = 4; - final String STRATEGY = "odd"; - final String input = "" + ROWS + " " + COLUMNS + " " + STRATEGY; + final String input = "" + ROWS + " " + COLUMNS + " " + STRATEGY.toLowerCase(); setInput(input); @@ -124,17 +113,20 @@ void InputCheckStrategyOdd() { removeFromOutput("Введите данные:"); final String[] strategyRow = getOutputLines()[ROWS].trim().split(" - "); - final char[] oddCharsInAnswerRow = strategyRow[1].trim().replaceAll(", ","").toCharArray(); + final char[] charsInAnswerRow = + (strategyRow[1].replaceAll(",|\\s","") + testChar).toCharArray(); - StringBuffer charsInTable = new StringBuffer(); + StringBuilder charsInTable = new StringBuilder(); for (int i = 0; i < ROWS; i++){ - charsInTable.append(getOutputLines()[i].trim().replaceAll("\\|", "").replace(" ", "")); + charsInTable.append(getOutputLines()[i].replaceAll("\\||\\s" , "")); } - for (char c : oddCharsInAnswerRow) { - assertEquals(1, c % 2); - assertNotEquals(-1, charsInTable.indexOf("" + c)); + charsInTable.append(testChar); + + for (char aChar : charsInAnswerRow) { + assertEquals(testChar % 2, aChar % 2); + assertNotEquals(-1, charsInTable.indexOf("" + aChar)); } - assertEquals("Odd letters", strategyRow[0]); + assertEquals(STRATEGY + " letters", strategyRow[0]); } } \ No newline at end of file From d210ecee7515d945486a441c30298b5866e82852 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 03:34:30 +0300 Subject: [PATCH 42/82] homework_3 ready for check add @RepeatedTest(10) --- .../homework_2/random_chars_table/RandomCharsTableTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index dc9a9d59..a9dfcd3c 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,6 +1,7 @@ package homework_2.random_chars_table; import base.UnitBase; +import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; import java.util.NoSuchElementException; @@ -11,7 +12,7 @@ class RandomCharsTableTest extends UnitBase { @Test void InputZeroAsArgument() { - setInput("0"); + setInput("0 0 odd"); new RandomCharsTable().run(); printOut(); @@ -85,7 +86,7 @@ void InputRandomRowsAndColumnsAsArgument() { // дальше тест уродлив, но как иначе распарсить эти строки и сравнить все я не знаю // за то покрывает все варианты. - @Test + @RepeatedTest(10) void InputRandomCheckStrategy() { final boolean isOdd = new Random().nextBoolean(); From 6478f77e498825b77ed4a5d9f3a356fc58775900 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 22 Jul 2021 10:30:40 +0300 Subject: [PATCH 43/82] homework_3 ready for check add Tests for HW_1 --- src/test/java/homework_1/MainTest.java | 64 ++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/test/java/homework_1/MainTest.java diff --git a/src/test/java/homework_1/MainTest.java b/src/test/java/homework_1/MainTest.java new file mode 100644 index 00000000..c5d3075e --- /dev/null +++ b/src/test/java/homework_1/MainTest.java @@ -0,0 +1,64 @@ +package homework_1; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MainTest extends UnitBase { + + @Test + void ValidInputArgsMain() { + + String[] input = { + "тест", + "не тест", + "много букв", + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday"}; + Main.main(input); + printOut(); + assertEquals("тест: 4 буквы", getOutputLines()[0]); + assertEquals("не тест: 7 букв", getOutputLines()[1]); + assertEquals("много букв: 10 букв", getOutputLines()[2]); + assertEquals("Sunday: 6 букв", getOutputLines()[3]); + assertEquals("Monday: 6 букв", getOutputLines()[4]); + assertEquals("Tuesday: 7 букв", getOutputLines()[5]); + assertEquals("Wednesday: 9 букв", getOutputLines()[6]); + assertEquals("Thursday: 8 букв", getOutputLines()[7]); + assertEquals("Friday: 6 букв", getOutputLines()[8]); + assertEquals("Saturday: 8 букв", getOutputLines()[9]); + } + + @Test + void ErrorInputArgsMain() { + + String[] input = { + "ошибка" + }; + Main.main(input); + printOut(); + + assertTrue(getOutputLines()[0].contains("Тревога!")); + } + + @Test + void MixInputArgsMain() { + + String[] input = { + "тест", + "не тест", + "ошибка" + }; + Main.main(input); + printOut(); + assertEquals("тест: 4 буквы", getOutputLines()[0]); + assertEquals("не тест: 7 букв", getOutputLines()[1]); + assertTrue(getOutputLines()[2].contains("Тревога")); + } +} \ No newline at end of file From 838ce8d1d557668a6b1655215594ca0faccd039d Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sat, 24 Jul 2021 21:07:16 +0300 Subject: [PATCH 44/82] homework_2 fix Main.java --- src/main/java/homework_2/pyramid_printer/Main.java | 3 +-- src/main/java/homework_2/random_chars_table/Main.java | 3 +-- src/main/java/homework_2/traffic_light/Main.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java index db0c5365..b72cc0ca 100644 --- a/src/main/java/homework_2/pyramid_printer/Main.java +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -5,7 +5,6 @@ public class Main { public static void main(String[] args) { - Executable pyramidPrinter = new PyramidPrinter(); - pyramidPrinter.run(); + new PyramidPrinter().run(); } } diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java index a2387808..113ac38d 100644 --- a/src/main/java/homework_2/random_chars_table/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -5,7 +5,6 @@ public class Main { public static void main(String[] args) { - Executable randomCharsTable = new RandomCharsTable(); - randomCharsTable.run(); + new RandomCharsTable().run(); } } diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java index e67feaf3..3d3f202c 100644 --- a/src/main/java/homework_2/traffic_light/Main.java +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -5,7 +5,6 @@ public class Main { public static void main(String[] args) { - Executable trafficLight = new TrafficLight(); - trafficLight.run(); + new TrafficLight().run(); } } From 95c50dc91dca9ddbbdd45db4fd9cd71e3fdceb77 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sat, 24 Jul 2021 21:07:52 +0300 Subject: [PATCH 45/82] homework_2 fix Main.java --- src/main/java/homework_2/pyramid_printer/Main.java | 2 -- src/main/java/homework_2/random_chars_table/Main.java | 2 -- src/main/java/homework_2/traffic_light/Main.java | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/main/java/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java index b72cc0ca..71e33035 100644 --- a/src/main/java/homework_2/pyramid_printer/Main.java +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -1,7 +1,5 @@ package homework_2.pyramid_printer; -import homework_2.utils.Executable; - public class Main { public static void main(String[] args) { diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java index 113ac38d..be586c4b 100644 --- a/src/main/java/homework_2/random_chars_table/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -1,7 +1,5 @@ package homework_2.random_chars_table; -import homework_2.utils.Executable; - public class Main { public static void main(String[] args) { diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java index 3d3f202c..3ff7f428 100644 --- a/src/main/java/homework_2/traffic_light/Main.java +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -1,7 +1,5 @@ package homework_2.traffic_light; -import homework_2.utils.Executable; - public class Main { public static void main(String[] args) { From 514a8c163de488ce23a75000c9b26535fea29733 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Thu, 29 Jul 2021 23:44:26 +0300 Subject: [PATCH 46/82] homework_4 start add Singleton and SingletonTest --- README.md | 5 +++-- .../java/homework_4/singleton/Singleton.java | 13 +++++++++++++ .../java/homework_4/singleton/SingletonTest.java | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/main/java/homework_4/singleton/Singleton.java create mode 100644 src/test/java/homework_4/singleton/SingletonTest.java diff --git a/README.md b/README.md index 4acdd83a..294c5100 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,10 @@ | HW3 | [PyramidPrinterTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/pyramid_printer) | Pyramid printer tests | | HW3 | [RandomCharsTableTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/random_chars_table) | Random chars table tests | | HW3 | [TrafficLightTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/traffic_light) | Traffic light tests| - +| HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4/singleton) | Singleton| +| HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 tests| [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) -[Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) +[Link to markdown guide](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework_4/singleton/Singleton.java b/src/main/java/homework_4/singleton/Singleton.java new file mode 100644 index 00000000..080c9c5b --- /dev/null +++ b/src/main/java/homework_4/singleton/Singleton.java @@ -0,0 +1,13 @@ +package homework_4.singleton; + +public final class Singleton { + private Singleton() {} + + private static class Holder { + static final Singleton INSTANCE = new Singleton(); + } + + public static Singleton getInstance() { + return Holder.INSTANCE; + } +} diff --git a/src/test/java/homework_4/singleton/SingletonTest.java b/src/test/java/homework_4/singleton/SingletonTest.java new file mode 100644 index 00000000..4880fa4c --- /dev/null +++ b/src/test/java/homework_4/singleton/SingletonTest.java @@ -0,0 +1,16 @@ +package homework_4.singleton; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SingletonTest { + + @Test + void getInstance() { + Singleton singleton1 = Singleton.getInstance(); + Singleton singleton2 = Singleton.getInstance(); + + assertEquals(singleton1, singleton2); + } +} \ No newline at end of file From 0cb7be3705565b77c12d6a366d172096fcece2f5 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sun, 15 Aug 2021 20:40:19 +0300 Subject: [PATCH 47/82] homework_4 change README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 294c5100..d08d3074 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ | HW3 | [PyramidPrinterTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/pyramid_printer) | Pyramid printer tests | | HW3 | [RandomCharsTableTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/random_chars_table) | Random chars table tests | | HW3 | [TrafficLightTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/traffic_light) | Traffic light tests| -| HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4/singleton) | Singleton| +| HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/singleton) | Singleton| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 tests| From f0c4bda74b33ebb82c0e73d66469cb9a08443c5e Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sun, 15 Aug 2021 21:56:26 +0300 Subject: [PATCH 48/82] homework_4 add annotation --- README.md | 7 ++--- .../CustomAnnotation.java" | 13 +++++++++ .../SimpleClassWithNameField.java" | 28 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 "src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" create mode 100644 "src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" diff --git a/README.md b/README.md index d08d3074..1039be37 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,10 @@ | HW2 | [RandomCharsTable](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/random_chars_table) | App reads from the console width and length of the chart, strategy keyword (even or odd). Prints to the console the chart of random chars from A to Z | | HW2 | [TrafficLight](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_2/traffic_light) | App reads current time in seconds from the console and prints the traffic light| | HW3 | [ImmutableClass](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_3) | ImmutableClass | -| HW3 | [PyramidPrinterTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/pyramid_printer) | Pyramid printer tests | -| HW3 | [RandomCharsTableTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/random_chars_table) | Random chars table tests | -| HW3 | [TrafficLightTest](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/traffic_light) | Traffic light tests| +| HW3 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/) | HW_2 Tests | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/singleton) | Singleton| -| HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 tests| +| HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/сustomAnnotation) | CustomAnnotation| +| HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) diff --git "a/src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" "b/src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" new file mode 100644 index 00000000..b0ef59da --- /dev/null +++ "b/src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" @@ -0,0 +1,13 @@ +package сustomAnnotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Retention(RUNTIME) +@Target(CONSTRUCTOR) +public @interface CustomAnnotation { + String value() default "CustomAnnotation"; +} diff --git "a/src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" "b/src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" new file mode 100644 index 00000000..b64ccac9 --- /dev/null +++ "b/src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" @@ -0,0 +1,28 @@ +package сustomAnnotation; + +import java.lang.reflect.Constructor; + +public class SimpleClassWithNameField { + private String name; + + @CustomAnnotation("test name string") + public SimpleClassWithNameField() { + try { + Constructor constructor = this.getClass ().getConstructor (); + CustomAnnotation annotation = constructor.getAnnotation(CustomAnnotation.class); + this.name = annotation.value(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public String getName() { + return name; + } + + public static void main(String[] args) { + SimpleClassWithNameField obj = new SimpleClassWithNameField(); + System.out.println(obj.getName()); + } + +} From 0a1c1b6b4f6887951409b5603bd2641302b199ad Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sun, 15 Aug 2021 21:58:41 +0300 Subject: [PATCH 49/82] homework_4 add annotation --- README.md | 2 +- .../homework_4/\321\201ustom_annotation/CustomAnnotation.java" | 2 +- .../\321\201ustom_annotation/SimpleClassWithNameField.java" | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename "src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" => "src/main/java/homework_4/\321\201ustom_annotation/CustomAnnotation.java" (89%) rename "src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" => "src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" (95%) diff --git a/README.md b/README.md index 1039be37..b93040db 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ | HW3 | [ImmutableClass](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_3) | ImmutableClass | | HW3 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/) | HW_2 Tests | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/singleton) | Singleton| -| HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/сustomAnnotation) | CustomAnnotation| +| HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/homework_4/сustom_annotation) | CustomAnnotation| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| diff --git "a/src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" "b/src/main/java/homework_4/\321\201ustom_annotation/CustomAnnotation.java" similarity index 89% rename from "src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" rename to "src/main/java/homework_4/\321\201ustom_annotation/CustomAnnotation.java" index b0ef59da..6a6c929d 100644 --- "a/src/main/java/\321\201ustomAnnotation/CustomAnnotation.java" +++ "b/src/main/java/homework_4/\321\201ustom_annotation/CustomAnnotation.java" @@ -1,4 +1,4 @@ -package сustomAnnotation; +package homework_4.сustom_annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git "a/src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" "b/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" similarity index 95% rename from "src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" rename to "src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" index b64ccac9..9e1dc4d2 100644 --- "a/src/main/java/\321\201ustomAnnotation/SimpleClassWithNameField.java" +++ "b/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" @@ -1,4 +1,4 @@ -package сustomAnnotation; +package homework_4.сustom_annotation; import java.lang.reflect.Constructor; From 5870a57437199bd510ef7cf50d5ce8033ab44aa2 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 16 Aug 2021 02:36:31 +0300 Subject: [PATCH 50/82] homework_4 add CustomFileReader add resource/custom_file_reader/file --- README.md | 1 + .../custom_file_reader/CustomFileReader.java | 44 +++++++ .../homework_4/custom_file_reader/Main.java | 13 ++ src/main/resources/custom_file_reader/file | 119 ++++++++++++++++++ .../CustomFileReaderTest.java | 41 ++++++ 5 files changed, 218 insertions(+) create mode 100644 src/main/java/homework_4/custom_file_reader/CustomFileReader.java create mode 100644 src/main/java/homework_4/custom_file_reader/Main.java create mode 100644 src/main/resources/custom_file_reader/file create mode 100644 src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java diff --git a/README.md b/README.md index b93040db..5554c906 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ | HW3 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/) | HW_2 Tests | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/singleton) | Singleton| | HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/homework_4/сustom_annotation) | CustomAnnotation| +| HW4 | [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/homework_4/custom_file_reader) | CustomFileReader| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| 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..6db6797f --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -0,0 +1,44 @@ +package homework_4.custom_file_reader; + +import java.io.*; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Scanner; +import java.util.function.Consumer; + +public class CustomFileReader { + private static String FILE_PATH = "custom_file_reader/file"; + private static final Consumer FUNCTION = x -> System.out.println(x.replaceAll("[,.]", "")); + + public static void run1() throws IOException { + new Scanner(getFileURL().openStream()).useDelimiter("\n").forEachRemaining(FUNCTION); + } + + public static void run2() throws FileNotFoundException { + new BufferedReader(new FileReader(getFileURL().getFile())).lines().forEach(FUNCTION); + } + + public static void run3() throws IOException { + Files.lines(Paths.get(getFileURL().getPath())).forEach(FUNCTION); + } + + public static void run4() throws IOException { + Files.readAllLines(Paths.get(getFileURL().getPath())).forEach(FUNCTION); + } + + private static URL getFileURL() { + ClassLoader classLoader = CustomFileReader.class.getClassLoader(); + return classLoader.getResource(FILE_PATH); + } + + public static String getFilePath() { + return FILE_PATH; + } + + public static void setFilePath(String filePath) { + FILE_PATH = filePath; + } + +} diff --git a/src/main/java/homework_4/custom_file_reader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java new file mode 100644 index 00000000..21a348ca --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -0,0 +1,13 @@ +package homework_4.custom_file_reader; + +import java.io.IOException; +import java.net.URISyntaxException; + +public class Main { + public static void main(String[] args) throws IOException { + CustomFileReader.run1(); + CustomFileReader.run2(); + CustomFileReader.run3(); + CustomFileReader.run4(); + } +} diff --git a/src/main/resources/custom_file_reader/file b/src/main/resources/custom_file_reader/file new file mode 100644 index 00000000..4036f3ab --- /dev/null +++ b/src/main/resources/custom_file_reader/file @@ -0,0 +1,119 @@ +Сергей Есенин + +Письмо к женщине + +Вы помните, +Вы всё, конечно, помните, +Как я стоял, +Приблизившись к стене, +Взволнованно ходили вы по комнате +И что-то резкое +В лицо бросали мне. + +Вы говорили: +Нам пора расстаться, +Что вас измучила +Моя шальная жизнь, +Что вам пора за дело приниматься, +А мой удел — +Катиться дальше, вниз. + +Любимая! +Меня вы не любили. +Не знали вы, что в сонмище людском +Я был как лошадь, загнанная в мыле, +Пришпоренная смелым ездоком. + +Не знали вы, +Что я в сплошном дыму, +В развороченном бурей быте +С того и мучаюсь, что не пойму — +Куда несет нас рок событий. + +Лицом к лицу +Лица не увидать. +Большое видится на расстоянье. +Когда кипит морская гладь — +Корабль в плачевном состоянье. + +Земля — корабль! +Но кто-то вдруг +За новой жизнью, новой славой +В прямую гущу бурь и вьюг +Ее направил величаво. + +Ну кто ж из нас на палубе большой +Не падал, не блевал и не ругался? +Их мало, с опытной душой, +Кто крепким в качке оставался. + +Тогда и я, +Под дикий шум, +Но зрело знающий работу, +Спустился в корабельный трюм, +Чтоб не смотреть людскую рвоту. + +Тот трюм был — +Русским кабаком. +И я склонился над стаканом, +Чтоб, не страдая ни о ком, +Себя сгубить +В угаре пьяном. + +Любимая! +Я мучил вас, +У вас была тоска +В глазах усталых: +Что я пред вами напоказ +Себя растрачивал в скандалах. + +Но вы не знали, +Что в сплошном дыму, +В развороченном бурей быте +С того и мучаюсь, +Что не пойму, +Куда несет нас рок событий… + +Теперь года прошли. +Я в возрасте ином. +И чувствую и мыслю по-иному. +И говорю за праздничным вином: +Хвала и слава рулевому! + +Сегодня я +В ударе нежных чувств. +Я вспомнил вашу грустную усталость. +И вот теперь +Я сообщить вам мчусь, +Каков я был, +И что со мною сталось! + +Любимая! +Сказать приятно мне: +Я избежал паденья с кручи. +Теперь в Советской стороне +Я самый яростный попутчик. + +Я стал не тем, +Кем был тогда. +Не мучил бы я вас, +Как это было раньше. +За знамя вольности +И светлого труда +Готов идти хоть до Ла-Манша. + +Простите мне… +Я знаю: вы не та — +Живете вы +С серьезным, умным мужем; +Что не нужна вам наша маета, +И сам я вам +Ни капельки не нужен. + +Живите так, +Как вас ведет звезда, +Под кущей обновленной сени. +С приветствием, +Вас помнящий всегда +Знакомый ваш +Сергей Есенин. 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..fd8d0149 --- /dev/null +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -0,0 +1,41 @@ +package homework_4.custom_file_reader; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import static homework_4.custom_file_reader.CustomFileReader.*; +import static org.junit.jupiter.api.Assertions.assertFalse; + +class CustomFileReaderTest extends UnitBase { + + @Test + void TestRun1() throws IOException { + run1(); + assertFalse(getOutput().contains(".")); + assertFalse(getOutput().contains(",")); + } + + @Test + void TestRun2() throws FileNotFoundException { + run2(); + assertFalse(getOutput().contains(".")); + assertFalse(getOutput().contains(",")); + } + + @Test + void TestRun3() throws IOException { + run3(); + assertFalse(getOutput().contains(".")); + assertFalse(getOutput().contains(",")); + } + + @Test + void TestRun4() throws IOException { + run4(); + assertFalse(getOutput().contains(".")); + assertFalse(getOutput().contains(",")); + } +} \ No newline at end of file From f1cded3cb92b6cf686b24a1b17561b60b40c5dc0 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 16 Aug 2021 02:39:10 +0300 Subject: [PATCH 51/82] homework_4 add fix README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5554c906..7f8840bf 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ | HW3 | [ImmutableClass](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_3) | ImmutableClass | | HW3 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_2/) | HW_2 Tests | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/singleton) | Singleton| -| HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/homework_4/сustom_annotation) | CustomAnnotation| -| HW4 | [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/homework_4/custom_file_reader) | CustomFileReader| +| HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/сustom_annotation) | CustomAnnotation| +| HW4 | [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/custom_file_reader) | CustomFileReader| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| From c603925d0e9f462e6a204e6771bc080d1fd4c8f7 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 16 Aug 2021 07:45:24 +0300 Subject: [PATCH 52/82] homework_4 add fix --- build.gradle | 6 ++++++ .../custom_file_reader/CustomFileReader.java | 19 ++++++++++--------- .../homework_4/custom_file_reader/Main.java | 16 +++++++++++----- .../CustomFileReaderTest.java | 2 +- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index b91dc843..ae57fa50 100644 --- a/build.gradle +++ b/build.gradle @@ -16,4 +16,10 @@ dependencies { test { useJUnitPlatform() +} + +jar { + manifest { + attributes 'Main-Class': 'homework_4.custom_file_reader.Main' + } } \ No newline at end of file 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 6db6797f..49bc58d4 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -1,7 +1,9 @@ package homework_4.custom_file_reader; -import java.io.*; -import java.net.URISyntaxException; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; @@ -9,28 +11,27 @@ import java.util.function.Consumer; public class CustomFileReader { - private static String FILE_PATH = "custom_file_reader/file"; + private static String FILE_PATH = "custom_file_reader" + File.separator + "file"; private static final Consumer FUNCTION = x -> System.out.println(x.replaceAll("[,.]", "")); public static void run1() throws IOException { new Scanner(getFileURL().openStream()).useDelimiter("\n").forEachRemaining(FUNCTION); } - public static void run2() throws FileNotFoundException { - new BufferedReader(new FileReader(getFileURL().getFile())).lines().forEach(FUNCTION); + public static void run2() throws IOException { + new BufferedReader(new InputStreamReader(getFileURL().openStream())).lines().forEach(FUNCTION); } - + //The resource URL is not working in the JAR public static void run3() throws IOException { Files.lines(Paths.get(getFileURL().getPath())).forEach(FUNCTION); } - + //The resource URL is not working in the JAR public static void run4() throws IOException { Files.readAllLines(Paths.get(getFileURL().getPath())).forEach(FUNCTION); } private static URL getFileURL() { - ClassLoader classLoader = CustomFileReader.class.getClassLoader(); - return classLoader.getResource(FILE_PATH); + return ClassLoader.getSystemResource(FILE_PATH); } public static String getFilePath() { diff --git a/src/main/java/homework_4/custom_file_reader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java index 21a348ca..48b883ba 100644 --- a/src/main/java/homework_4/custom_file_reader/Main.java +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -4,10 +4,16 @@ import java.net.URISyntaxException; public class Main { - public static void main(String[] args) throws IOException { - CustomFileReader.run1(); - CustomFileReader.run2(); - CustomFileReader.run3(); - CustomFileReader.run4(); + public static void main(String[] args) { + try { + CustomFileReader.run1(); + CustomFileReader.run2(); + //The resource URL is not working in the JAR + CustomFileReader.run3(); + //The resource URL is not working in the JAR + CustomFileReader.run4(); + } catch (IOException e) { + e.printStackTrace(); + } } } 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 fd8d0149..df5cca8d 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -19,7 +19,7 @@ void TestRun1() throws IOException { } @Test - void TestRun2() throws FileNotFoundException { + void TestRun2() throws IOException { run2(); assertFalse(getOutput().contains(".")); assertFalse(getOutput().contains(",")); From 311e3592546581b19ed8496130c2d939a7c89723 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 18 Aug 2021 00:11:51 +0300 Subject: [PATCH 53/82] homework_5 add --- README.md | 2 ++ src/main/java/homework_5/digit/Digit.java | 8 +++++ .../java/homework_5/exponent/Exponent.java | 8 +++++ .../InputNegativeBaseArgumentException.java | 4 +++ src/test/java/homework_5/digit/DigitTest.java | 25 +++++++++++++++ .../homework_5/exponent/ExponentTest.java | 32 +++++++++++++++++++ 6 files changed, 79 insertions(+) create mode 100644 src/main/java/homework_5/digit/Digit.java create mode 100644 src/main/java/homework_5/exponent/Exponent.java create mode 100644 src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java create mode 100644 src/test/java/homework_5/digit/DigitTest.java create mode 100644 src/test/java/homework_5/exponent/ExponentTest.java diff --git a/README.md b/README.md index 7f8840bf..6c072aec 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ | HW4 | [CustomAnnotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/сustom_annotation) | CustomAnnotation| | HW4 | [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/custom_file_reader) | CustomFileReader| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| +| HW5 | [HW_5](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5) | HW_5| +| HW5 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_5) | HW_5 Tests| [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) diff --git a/src/main/java/homework_5/digit/Digit.java b/src/main/java/homework_5/digit/Digit.java new file mode 100644 index 00000000..bb0a2b03 --- /dev/null +++ b/src/main/java/homework_5/digit/Digit.java @@ -0,0 +1,8 @@ +package homework_5.digit; + +public class Digit { + + public static int getCountOfDigit(long number) { + return 1 + (number / 10 == 0 ? 0 : getCountOfDigit(number / 10)); + } +} diff --git a/src/main/java/homework_5/exponent/Exponent.java b/src/main/java/homework_5/exponent/Exponent.java new file mode 100644 index 00000000..b7cae593 --- /dev/null +++ b/src/main/java/homework_5/exponent/Exponent.java @@ -0,0 +1,8 @@ +package homework_5.exponent; + +public class Exponent { + public static long calculate(int base, int pow) throws InputNegativeBaseArgumentException { + if (pow < 0) throw new InputNegativeBaseArgumentException(); + return pow == 0 ? 1 : (base*calculate(base, pow-1)); + } +} diff --git a/src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java b/src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java new file mode 100644 index 00000000..e5cc97c5 --- /dev/null +++ b/src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java @@ -0,0 +1,4 @@ +package homework_5.exponent; + +public class InputNegativeBaseArgumentException extends RuntimeException { +} \ No newline at end of file diff --git a/src/test/java/homework_5/digit/DigitTest.java b/src/test/java/homework_5/digit/DigitTest.java new file mode 100644 index 00000000..36f82767 --- /dev/null +++ b/src/test/java/homework_5/digit/DigitTest.java @@ -0,0 +1,25 @@ +package homework_5.digit; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class DigitTest { + @Test + void positiveNumberTest() { + final long num1 = 15_005_532L; + final long num2 = 12L; + + assertEquals(8, Digit.getCountOfDigit(num1)); + assertEquals(2, Digit.getCountOfDigit(num2)); + } + + @Test + void negativeNumberTest() { + final long num1 = -15_005_532L; + final long num2 = -12L; + + assertEquals(8, Digit.getCountOfDigit(num1)); + assertEquals(2, Digit.getCountOfDigit(num2)); + } +} \ No newline at end of file diff --git a/src/test/java/homework_5/exponent/ExponentTest.java b/src/test/java/homework_5/exponent/ExponentTest.java new file mode 100644 index 00000000..71749b2b --- /dev/null +++ b/src/test/java/homework_5/exponent/ExponentTest.java @@ -0,0 +1,32 @@ +package homework_5.exponent; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ExponentTest { + + @Test + void positiveNumberTest() { + final int base1 = 2; + final int base2 = 9; + + final int num1 = 10_000; + final int num2 = 2; + + assertEquals(100_000_000, Exponent.calculate(num1,base1)); + assertEquals(512, Exponent.calculate(num2, base2)); + } + + @Test + void negativeNumberTest() { + final int base1 = 2; + final int base2 = 9; + + final int num1 = -10_000; + final int num2 = -2; + + assertEquals(100_000_000, Exponent.calculate(num1,base1)); + assertEquals(-512, Exponent.calculate(num2, base2)); + } +} \ No newline at end of file From 13b2021126aa0f69e6a50c1d488d2035e246fe26 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 18 Aug 2021 18:41:47 +0300 Subject: [PATCH 54/82] homework_4 fix removed setter and getter for file_path --- .../custom_file_reader/CustomFileReader.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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 49bc58d4..16eb0288 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -11,7 +11,7 @@ import java.util.function.Consumer; public class CustomFileReader { - private static String FILE_PATH = "custom_file_reader" + File.separator + "file"; + private static final String FILE_PATH = "custom_file_reader" + File.separator + "file"; private static final Consumer FUNCTION = x -> System.out.println(x.replaceAll("[,.]", "")); public static void run1() throws IOException { @@ -34,12 +34,4 @@ private static URL getFileURL() { return ClassLoader.getSystemResource(FILE_PATH); } - public static String getFilePath() { - return FILE_PATH; - } - - public static void setFilePath(String filePath) { - FILE_PATH = filePath; - } - } From 6117c71bf9cc64f66bb6e5d2f706f5060993bc70 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 18 Aug 2021 20:16:05 +0300 Subject: [PATCH 55/82] homework_4 add test for CustomAnnotation --- .../SimpleClassWithNameField.java" | 13 +++++-------- .../SimpleClassWithNameFieldTest.java" | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 "src/test/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameFieldTest.java" diff --git "a/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" "b/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" index 9e1dc4d2..8e8959c0 100644 --- "a/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" +++ "b/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" @@ -6,11 +6,13 @@ public class SimpleClassWithNameField { private String name; @CustomAnnotation("test name string") - public SimpleClassWithNameField() { + public SimpleClassWithNameField(String name) { + Constructor constructor; try { - Constructor constructor = this.getClass ().getConstructor (); + constructor = this.getClass().getConstructor(String.class); CustomAnnotation annotation = constructor.getAnnotation(CustomAnnotation.class); - this.name = annotation.value(); + if (annotation != null) this.name = annotation.value(); + if (!name.isEmpty()) this.name = name; } catch (NoSuchMethodException e) { e.printStackTrace(); } @@ -20,9 +22,4 @@ public String getName() { return name; } - public static void main(String[] args) { - SimpleClassWithNameField obj = new SimpleClassWithNameField(); - System.out.println(obj.getName()); - } - } diff --git "a/src/test/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameFieldTest.java" "b/src/test/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameFieldTest.java" new file mode 100644 index 00000000..582b2c3f --- /dev/null +++ "b/src/test/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameFieldTest.java" @@ -0,0 +1,19 @@ +package homework_4.сustom_annotation; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SimpleClassWithNameFieldTest { + @Test + void testEmptyNameString() { + SimpleClassWithNameField obj = new SimpleClassWithNameField(""); + assertEquals("test name string", obj.getName()); + } + + @Test + void testNotEmptyNameString() { + SimpleClassWithNameField obj = new SimpleClassWithNameField("test"); + assertEquals("test", obj.getName()); + } +} \ No newline at end of file From 4d24b63d8c9c26d6a701ea74472f966ff24071e4 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sun, 22 Aug 2021 13:02:16 +0300 Subject: [PATCH 56/82] homework_5 add --- src/main/java/homework_5/AppHW_5.java | 54 +++++++++++++ .../CustomRegexMatcher.java | 23 ++++++ src/main/java/homework_5/digit/Digit.java | 4 +- .../{exponent => powerOfNumber}/Exponent.java | 2 +- .../InputNegativeBaseArgumentException.java | 2 +- .../powerOfNumber/PowerOfNumber.java | 41 ++++++++++ src/main/java/homework_5/utils/MyReader.java | 6 ++ .../java/homework_5/utils/StringChecker.java | 6 ++ .../homework_5/utils/impl/MyReaderImpl.java | 37 +++++++++ .../utils/impl/StringCheckerImpl.java | 20 +++++ src/test/java/homework_5/AppHW_5Test.java | 80 +++++++++++++++++++ .../CustomRegexMatcherTest.java | 44 ++++++++++ src/test/java/homework_5/digit/DigitTest.java | 8 +- .../homework_5/exponent/ExponentTest.java | 17 ++++ .../powerOfNumber/PowerOfNumberTest.java | 72 +++++++++++++++++ .../utils/impl/MyReaderImplTest.java | 45 +++++++++++ .../utils/impl/StringCheckerImplTest.java | 41 ++++++++++ 17 files changed, 494 insertions(+), 8 deletions(-) create mode 100644 src/main/java/homework_5/AppHW_5.java create mode 100644 src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java rename src/main/java/homework_5/{exponent => powerOfNumber}/Exponent.java (88%) rename src/main/java/homework_5/{exponent => powerOfNumber}/InputNegativeBaseArgumentException.java (69%) create mode 100644 src/main/java/homework_5/powerOfNumber/PowerOfNumber.java create mode 100644 src/main/java/homework_5/utils/MyReader.java create mode 100644 src/main/java/homework_5/utils/StringChecker.java create mode 100644 src/main/java/homework_5/utils/impl/MyReaderImpl.java create mode 100644 src/main/java/homework_5/utils/impl/StringCheckerImpl.java create mode 100644 src/test/java/homework_5/AppHW_5Test.java create mode 100644 src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java create mode 100644 src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java create mode 100644 src/test/java/homework_5/utils/impl/MyReaderImplTest.java create mode 100644 src/test/java/homework_5/utils/impl/StringCheckerImplTest.java diff --git a/src/main/java/homework_5/AppHW_5.java b/src/main/java/homework_5/AppHW_5.java new file mode 100644 index 00000000..65aaf41e --- /dev/null +++ b/src/main/java/homework_5/AppHW_5.java @@ -0,0 +1,54 @@ +package homework_5; + +import homework_5.utils.MyReader; +import homework_5.utils.StringChecker; +import homework_5.utils.impl.MyReaderImpl; +import homework_5.utils.impl.StringCheckerImpl; + +import java.util.NoSuchElementException; + +public class AppHW_5 { + private static final String PATTERN = "default"; + + private final MyReader reader; + private final StringChecker matcher; + private final StringBuilder dataSB = new StringBuilder(); + private boolean isReaderClose = false; + + protected AppHW_5() { + this(PATTERN); + } + + public AppHW_5(String patternString) { + reader = new MyReaderImpl(); + matcher = new StringCheckerImpl().setPattern(patternString); + } + + public void clearData() { + dataSB.setLength(0); + } + + public boolean readData() throws NoSuchElementException { + boolean result = true; + if (isReaderClose) { + result = false; + } else { + dataSB.append(reader.readData()); + } + return result; + } + + protected boolean check() { + return matcher.checkData(dataSB.toString()); + } + + protected void closeReader() { + isReaderClose = true; + reader.close(); + } + + protected String getData() { + return this.dataSB.toString(); + } + +} diff --git a/src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java b/src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java new file mode 100644 index 00000000..b9a32207 --- /dev/null +++ b/src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java @@ -0,0 +1,23 @@ +package homework_5.customRegexMatcher; + +import homework_5.AppHW_5; + +public class CustomRegexMatcher extends AppHW_5 { + private final static String PATTERN_STRING = "[0-9a-zA-Z_]+@[0-9a-zA-Z_]+\\.[a-zA-Z]{2,3}"; + + public CustomRegexMatcher() { + super(PATTERN_STRING); + } + + public String run() { + readData(); + String result = String.valueOf(check()); + System.out.println(result); + closeReader(); + return result; + } + + public static void main(String[] args) { + new CustomRegexMatcher().run(); + } +} diff --git a/src/main/java/homework_5/digit/Digit.java b/src/main/java/homework_5/digit/Digit.java index bb0a2b03..261c8376 100644 --- a/src/main/java/homework_5/digit/Digit.java +++ b/src/main/java/homework_5/digit/Digit.java @@ -2,7 +2,7 @@ public class Digit { - public static int getCountOfDigit(long number) { - return 1 + (number / 10 == 0 ? 0 : getCountOfDigit(number / 10)); + public static int calculate(long number) { + return 1 + (number / 10 == 0 ? 0 : calculate(number / 10)); } } diff --git a/src/main/java/homework_5/exponent/Exponent.java b/src/main/java/homework_5/powerOfNumber/Exponent.java similarity index 88% rename from src/main/java/homework_5/exponent/Exponent.java rename to src/main/java/homework_5/powerOfNumber/Exponent.java index b7cae593..51898375 100644 --- a/src/main/java/homework_5/exponent/Exponent.java +++ b/src/main/java/homework_5/powerOfNumber/Exponent.java @@ -1,4 +1,4 @@ -package homework_5.exponent; +package homework_5.powerOfNumber; public class Exponent { public static long calculate(int base, int pow) throws InputNegativeBaseArgumentException { diff --git a/src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java b/src/main/java/homework_5/powerOfNumber/InputNegativeBaseArgumentException.java similarity index 69% rename from src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java rename to src/main/java/homework_5/powerOfNumber/InputNegativeBaseArgumentException.java index e5cc97c5..636b7bfa 100644 --- a/src/main/java/homework_5/exponent/InputNegativeBaseArgumentException.java +++ b/src/main/java/homework_5/powerOfNumber/InputNegativeBaseArgumentException.java @@ -1,4 +1,4 @@ -package homework_5.exponent; +package homework_5.powerOfNumber; public class InputNegativeBaseArgumentException extends RuntimeException { } \ No newline at end of file diff --git a/src/main/java/homework_5/powerOfNumber/PowerOfNumber.java b/src/main/java/homework_5/powerOfNumber/PowerOfNumber.java new file mode 100644 index 00000000..bd10a885 --- /dev/null +++ b/src/main/java/homework_5/powerOfNumber/PowerOfNumber.java @@ -0,0 +1,41 @@ +package homework_5.powerOfNumber; + +import homework_5.AppHW_5; + +import java.util.Scanner; + +public class PowerOfNumber extends AppHW_5 { + private final static String PATTERN_STRING = "[0-9]* [0-9]*"; + private final static String ERROR = "Only 2 non-negative integers are allowed"; + + public PowerOfNumber() { + super(PATTERN_STRING); + } + + public String run() { + String result; + try { + readData(); + if (!check()) result = ERROR; + else result = calculate(); + } catch (Exception ex) { + return ERROR; + } + finally { + closeReader(); + } + + System.out.println(result); + return result; + } + + private String calculate() { + Scanner sc = new Scanner(getData()); + return String.valueOf(Exponent.calculate(sc.nextInt(), sc.nextInt())); + } + + public static void main(String[] args) { + new PowerOfNumber().run(); + } + +} diff --git a/src/main/java/homework_5/utils/MyReader.java b/src/main/java/homework_5/utils/MyReader.java new file mode 100644 index 00000000..5e51b8a0 --- /dev/null +++ b/src/main/java/homework_5/utils/MyReader.java @@ -0,0 +1,6 @@ +package homework_5.utils; + +public interface MyReader { + String readData(); + void close(); +} diff --git a/src/main/java/homework_5/utils/StringChecker.java b/src/main/java/homework_5/utils/StringChecker.java new file mode 100644 index 00000000..14453946 --- /dev/null +++ b/src/main/java/homework_5/utils/StringChecker.java @@ -0,0 +1,6 @@ +package homework_5.utils; + +public interface StringChecker { + + boolean checkData(String data); +} diff --git a/src/main/java/homework_5/utils/impl/MyReaderImpl.java b/src/main/java/homework_5/utils/impl/MyReaderImpl.java new file mode 100644 index 00000000..c8ab5ce3 --- /dev/null +++ b/src/main/java/homework_5/utils/impl/MyReaderImpl.java @@ -0,0 +1,37 @@ +package homework_5.utils.impl; + +import homework_5.utils.MyReader; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.NoSuchElementException; +import java.util.Scanner; + +public class MyReaderImpl implements MyReader { + private final InputStream inputStream; + private final PrintStream printStream; + private Scanner sc; + + public MyReaderImpl() { + inputStream = System.in; + printStream = System.out; + } + + public MyReaderImpl(InputStream inputStream, PrintStream printStream) { + this.inputStream = inputStream; + this.printStream = printStream; + } + + public String readData() throws NoSuchElementException, IllegalStateException { + final String STRING_MSG = "Введите данные:"; + if (sc == null) sc = new Scanner(inputStream); + printStream.println(STRING_MSG); + + return sc.nextLine(); + } + + public void close() { + if (sc != null) sc.close(); + } + +} diff --git a/src/main/java/homework_5/utils/impl/StringCheckerImpl.java b/src/main/java/homework_5/utils/impl/StringCheckerImpl.java new file mode 100644 index 00000000..63d33e1f --- /dev/null +++ b/src/main/java/homework_5/utils/impl/StringCheckerImpl.java @@ -0,0 +1,20 @@ +package homework_5.utils.impl; + +import homework_5.utils.StringChecker; + +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +public class StringCheckerImpl implements StringChecker { + private Pattern pattern; + + public boolean checkData(String data) { + if (pattern == null) pattern = Pattern.compile("default"); + return pattern.matcher(data).matches(); + } + + public StringCheckerImpl setPattern(String patternLiteral) throws PatternSyntaxException{ + this.pattern = Pattern.compile(patternLiteral); + return this; + } +} diff --git a/src/test/java/homework_5/AppHW_5Test.java b/src/test/java/homework_5/AppHW_5Test.java new file mode 100644 index 00000000..f240e3a0 --- /dev/null +++ b/src/test/java/homework_5/AppHW_5Test.java @@ -0,0 +1,80 @@ +package homework_5; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class AppHW_5Test extends UnitBase { + + @Test + void clearDataTest() { + String input_data = "default"; + setInput(input_data); + + AppHW_5 appHW_5 = new AppHW_5(); + appHW_5.readData(); + appHW_5.clearData(); + assertEquals("", appHW_5.getData()); + } + + @Test + void readDataTest() { + String input_data = "default"; + setInput(input_data); + + AppHW_5 appHW_5 = new AppHW_5(); + appHW_5.readData(); + + assertEquals(input_data, appHW_5.getData()); + } + + @Test + void checkTest() { + String input_data = "default"; + setInput(input_data); + + AppHW_5 appHW_5 = new AppHW_5(); + appHW_5.readData(); + + assertTrue(appHW_5.check()); + } + + @Test + void closeReaderTest() { + String input_data = "default"; + setInput(input_data); + + AppHW_5 appHW_5 = new AppHW_5(); + appHW_5.closeReader(); + + assertFalse(appHW_5.readData()); + } + + @Test + void getDataTest() { + assertEquals("", new AppHW_5().getData()); + } + + @Test + void getDataTest2() { + String input_data = "default"; + setInput(input_data); + + AppHW_5 appHW_5 = new AppHW_5(); + appHW_5.readData(); + + assertEquals("default", appHW_5.getData()); + } + + @Test + void getDataInvalidTest() { + String input_data = "default"; + setInput(input_data); + + AppHW_5 appHW_5 = new AppHW_5(); + appHW_5.readData(); + + assertNotEquals("def", appHW_5.getData()); + } +} \ No newline at end of file diff --git a/src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java b/src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java new file mode 100644 index 00000000..cf4d0574 --- /dev/null +++ b/src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java @@ -0,0 +1,44 @@ +package homework_5.customRegexMatcher; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class CustomRegexMatcherTest extends UnitBase { + + @Test + void validInputTest() { + final String input_value = "test_email@test_host.com"; + setInput(input_value); + + String result = new CustomRegexMatcher().run(); + + removeFromOutput("Введите данные:"); + assertEquals("true", result); + assertEquals("true", getOutputLines()[0]); + } + + @Test + void EmptyInputTest() { + final String input_value = ""; + setInput(input_value); + + assertThrows(NoSuchElementException.class, () -> new CustomRegexMatcher().run()); + } + + @Test + void notValidInputTest() { + final String input_value = "@test_host.com"; + setInput(input_value); + + String result = new CustomRegexMatcher().run(); + + removeFromOutput("Введите данные:"); + assertEquals("false", result); + assertEquals("false", getOutputLines()[0]); + } +} \ No newline at end of file diff --git a/src/test/java/homework_5/digit/DigitTest.java b/src/test/java/homework_5/digit/DigitTest.java index 36f82767..e37e52cc 100644 --- a/src/test/java/homework_5/digit/DigitTest.java +++ b/src/test/java/homework_5/digit/DigitTest.java @@ -10,8 +10,8 @@ void positiveNumberTest() { final long num1 = 15_005_532L; final long num2 = 12L; - assertEquals(8, Digit.getCountOfDigit(num1)); - assertEquals(2, Digit.getCountOfDigit(num2)); + assertEquals(8, Digit.calculate(num1)); + assertEquals(2, Digit.calculate(num2)); } @Test @@ -19,7 +19,7 @@ void negativeNumberTest() { final long num1 = -15_005_532L; final long num2 = -12L; - assertEquals(8, Digit.getCountOfDigit(num1)); - assertEquals(2, Digit.getCountOfDigit(num2)); + assertEquals(8, Digit.calculate(num1)); + assertEquals(2, Digit.calculate(num2)); } } \ No newline at end of file diff --git a/src/test/java/homework_5/exponent/ExponentTest.java b/src/test/java/homework_5/exponent/ExponentTest.java index 71749b2b..e0e57314 100644 --- a/src/test/java/homework_5/exponent/ExponentTest.java +++ b/src/test/java/homework_5/exponent/ExponentTest.java @@ -1,8 +1,11 @@ package homework_5.exponent; +import homework_5.powerOfNumber.Exponent; +import homework_5.powerOfNumber.InputNegativeBaseArgumentException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class ExponentTest { @@ -29,4 +32,18 @@ void negativeNumberTest() { assertEquals(100_000_000, Exponent.calculate(num1,base1)); assertEquals(-512, Exponent.calculate(num2, base2)); } + + @Test + void negativeBaseTest() { + final int base1 = -2; + final int base2 = -9; + + final int num1 = -10_000; + final int num2 = -2; + + assertThrows(InputNegativeBaseArgumentException.class, () -> Exponent.calculate(num1,base1)); + assertThrows(InputNegativeBaseArgumentException.class, () -> Exponent.calculate(num2, base2)); + + } + } \ No newline at end of file diff --git a/src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java b/src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java new file mode 100644 index 00000000..c8eaf28e --- /dev/null +++ b/src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java @@ -0,0 +1,72 @@ +package homework_5.powerOfNumber; + +import base.UnitBase; +import homework_5.customRegexMatcher.CustomRegexMatcher; +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PowerOfNumberTest extends UnitBase { + + @Test + void validInputTest() { + final String input_value = "2 2"; + setInput(input_value); + + String result = new PowerOfNumber().run(); + + removeFromOutput("Введите данные:"); + assertEquals("4", result); + assertEquals("4", getOutputLines()[0]); + } + + @Test + void validInputTest2() { + final String input_value = "0 0"; + setInput(input_value); + + String result = new PowerOfNumber().run(); + + removeFromOutput("Введите данные:"); + assertEquals("1", result); + assertEquals("1", getOutputLines()[0]); + } + + @Test + void EmptyInputTest() { + final String input_value = ""; + setInput(input_value); + + String result = new PowerOfNumber().run(); + + removeFromOutput("Введите данные:"); + assertEquals("Only 2 non-negative integers are allowed", result); + } + + @Test + void notValidInputTest() { + final String input_value = "@test_host.com"; + setInput(input_value); + + String result = new PowerOfNumber().run(); + + removeFromOutput("Введите данные:"); + assertEquals("Only 2 non-negative integers are allowed", result); + assertEquals("Only 2 non-negative integers are allowed", getOutputLines()[0]); + } + + @Test + void notValidInputTest2() { + final String input_value = "-2 0"; + setInput(input_value); + + String result = new PowerOfNumber().run(); + + removeFromOutput("Введите данные:"); + assertEquals("Only 2 non-negative integers are allowed", result); + assertEquals("Only 2 non-negative integers are allowed", getOutputLines()[0]); + } +} \ No newline at end of file diff --git a/src/test/java/homework_5/utils/impl/MyReaderImplTest.java b/src/test/java/homework_5/utils/impl/MyReaderImplTest.java new file mode 100644 index 00000000..a8d47432 --- /dev/null +++ b/src/test/java/homework_5/utils/impl/MyReaderImplTest.java @@ -0,0 +1,45 @@ +package homework_5.utils.impl; + +import base.UnitBase; +import homework_5.customRegexMatcher.CustomRegexMatcher; +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class MyReaderImplTest extends UnitBase { + + + @Test + void readValidTest() { + String input_value = "text"; + setInput(input_value); + + MyReaderImpl reader = new MyReaderImpl(); + + assertEquals(input_value, reader.readData()); + assertEquals("Введите данные:", getOutput()); + } + + @Test + void EmptyInputTest() { + final String input_value = ""; + setInput(input_value); + + assertThrows(NoSuchElementException.class, () -> new MyReaderImpl().readData()); + } + + @Test + void closeAndReadTest() { + final String input_value = "test"; + setInput(input_value); + + MyReaderImpl reader = new MyReaderImpl(); + reader.readData(); + reader.close(); + + assertThrows(IllegalStateException.class, reader::readData); + } +} \ No newline at end of file diff --git a/src/test/java/homework_5/utils/impl/StringCheckerImplTest.java b/src/test/java/homework_5/utils/impl/StringCheckerImplTest.java new file mode 100644 index 00000000..95a09f91 --- /dev/null +++ b/src/test/java/homework_5/utils/impl/StringCheckerImplTest.java @@ -0,0 +1,41 @@ +package homework_5.utils.impl; + +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import java.util.regex.PatternSyntaxException; + +import static org.junit.jupiter.api.Assertions.*; + +class StringCheckerImplTest extends UnitBase { + + @Test + void setPatternValidTest() { + String pattern = "\\s+.*[\\w]?"; + + new StringCheckerImpl().setPattern(pattern); + } + + @Test + void setPatternInvalidTest() { + String pattern = "\\"; + + assertThrows(PatternSyntaxException.class, () -> new StringCheckerImpl().setPattern(pattern)); + } + + @Test + void checkValidDataTest() { + String pattern = "[abc]{0,3}"; + String input = "abc"; + + assertTrue(new StringCheckerImpl().setPattern(pattern).checkData(input)); + } + + @Test + void checkInvalidDataTest() { + String pattern = "[abc]{0,3}"; + String input = "abd"; + + assertFalse(new StringCheckerImpl().setPattern(pattern).checkData(input)); + } +} \ No newline at end of file From c940b668f843fb789747a7a3c6a64834e2053e28 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Sun, 22 Aug 2021 13:05:32 +0300 Subject: [PATCH 57/82] homework_5 README.md change --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6c072aec..3e7dab8a 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ | HW4 | [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/custom_file_reader) | CustomFileReader| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| | HW5 | [HW_5](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5) | HW_5| +| HW5 | [PowerOfNumber](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/powerOfNumber) | PowerOfNumber| +| HW5 | [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/customRegexMatcher) | CustomRegexMatcher| | HW5 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_5) | HW_5 Tests| From 3049b134de341f368f9f178db382beae56a258c3 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 30 Aug 2021 17:01:41 +0300 Subject: [PATCH 58/82] homework_6 add map_problems_generator README.md change fix hw5 package --- README.md | 5 +- .../CustomRegexMatcher.java | 2 +- .../Exponent.java | 2 +- .../InputNegativeBaseArgumentException.java | 2 +- .../PowerOfNumber.java | 2 +- .../map_problems_generator/Main.java | 29 ++++++++++++ .../MapProblemsGenerator.java | 20 ++++++++ .../map_problems_generator/Problem.java | 5 ++ .../problem_impl/CollisionProblem.java | 13 ++++++ .../problem_impl/GettingProblem.java | 15 ++++++ .../problem_impl/NoProblem.java | 33 +++++++++++++ .../problem_impl/Wrapper.java | 46 +++++++++++++++++++ .../CustomRegexMatcherTest.java | 2 +- .../homework_5/exponent/ExponentTest.java | 4 +- .../PowerOfNumberTest.java | 5 +- .../utils/impl/MyReaderImplTest.java | 1 - 16 files changed, 172 insertions(+), 14 deletions(-) rename src/main/java/homework_5/{customRegexMatcher => custom_regex_matcher}/CustomRegexMatcher.java (92%) rename src/main/java/homework_5/{powerOfNumber => power_of_number}/Exponent.java (87%) rename src/main/java/homework_5/{powerOfNumber => power_of_number}/InputNegativeBaseArgumentException.java (68%) rename src/main/java/homework_5/{powerOfNumber => power_of_number}/PowerOfNumber.java (96%) create mode 100644 src/main/java/homework_6/map_problems_generator/Main.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/Problem.java create mode 100644 src/main/java/homework_6/map_problems_generator/problem_impl/CollisionProblem.java create mode 100644 src/main/java/homework_6/map_problems_generator/problem_impl/GettingProblem.java create mode 100644 src/main/java/homework_6/map_problems_generator/problem_impl/NoProblem.java create mode 100644 src/main/java/homework_6/map_problems_generator/problem_impl/Wrapper.java rename src/test/java/homework_5/{customRegexMatcher => custom_regex_matcher}/CustomRegexMatcherTest.java (96%) rename src/test/java/homework_5/{powerOfNumber => power_of_number}/PowerOfNumberTest.java (93%) diff --git a/README.md b/README.md index 3e7dab8a..6610b074 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,10 @@ | HW4 | [CustomFileReader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_4/custom_file_reader) | CustomFileReader| | HW4 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_4) | HW_4 Tests| | HW5 | [HW_5](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5) | HW_5| -| HW5 | [PowerOfNumber](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/powerOfNumber) | PowerOfNumber| -| HW5 | [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/customRegexMatcher) | CustomRegexMatcher| +| HW5 | [PowerOfNumber](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/power_of_number) | PowerOfNumber| +| HW5 | [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/custom_regex_matcher) | CustomRegexMatcher| | HW5 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_5) | HW_5 Tests| +| HW6 | [MapProblemsGenerator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_6/homework_6.map_problems_generator) | MapProblemsGenerator| [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) diff --git a/src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java similarity index 92% rename from src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java rename to src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java index b9a32207..211350a2 100644 --- a/src/main/java/homework_5/customRegexMatcher/CustomRegexMatcher.java +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -1,4 +1,4 @@ -package homework_5.customRegexMatcher; +package homework_5.custom_regex_matcher; import homework_5.AppHW_5; diff --git a/src/main/java/homework_5/powerOfNumber/Exponent.java b/src/main/java/homework_5/power_of_number/Exponent.java similarity index 87% rename from src/main/java/homework_5/powerOfNumber/Exponent.java rename to src/main/java/homework_5/power_of_number/Exponent.java index 51898375..b32fb1e4 100644 --- a/src/main/java/homework_5/powerOfNumber/Exponent.java +++ b/src/main/java/homework_5/power_of_number/Exponent.java @@ -1,4 +1,4 @@ -package homework_5.powerOfNumber; +package homework_5.power_of_number; public class Exponent { public static long calculate(int base, int pow) throws InputNegativeBaseArgumentException { diff --git a/src/main/java/homework_5/powerOfNumber/InputNegativeBaseArgumentException.java b/src/main/java/homework_5/power_of_number/InputNegativeBaseArgumentException.java similarity index 68% rename from src/main/java/homework_5/powerOfNumber/InputNegativeBaseArgumentException.java rename to src/main/java/homework_5/power_of_number/InputNegativeBaseArgumentException.java index 636b7bfa..67638278 100644 --- a/src/main/java/homework_5/powerOfNumber/InputNegativeBaseArgumentException.java +++ b/src/main/java/homework_5/power_of_number/InputNegativeBaseArgumentException.java @@ -1,4 +1,4 @@ -package homework_5.powerOfNumber; +package homework_5.power_of_number; public class InputNegativeBaseArgumentException extends RuntimeException { } \ No newline at end of file diff --git a/src/main/java/homework_5/powerOfNumber/PowerOfNumber.java b/src/main/java/homework_5/power_of_number/PowerOfNumber.java similarity index 96% rename from src/main/java/homework_5/powerOfNumber/PowerOfNumber.java rename to src/main/java/homework_5/power_of_number/PowerOfNumber.java index bd10a885..9a7c7c36 100644 --- a/src/main/java/homework_5/powerOfNumber/PowerOfNumber.java +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -1,4 +1,4 @@ -package homework_5.powerOfNumber; +package homework_5.power_of_number; import homework_5.AppHW_5; diff --git a/src/main/java/homework_6/map_problems_generator/Main.java b/src/main/java/homework_6/map_problems_generator/Main.java new file mode 100644 index 00000000..748dd535 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/Main.java @@ -0,0 +1,29 @@ +package homework_6.map_problems_generator; + +import homework_6.map_problems_generator.problem_impl.Wrapper; + +import java.util.HashMap; +import java.util.Map; + +public class Main { + public static void main(String[] args) { + MapProblemsGenerator generator = new MapProblemsGenerator<>(); + Map, Integer> problemIntegerHashMap = new HashMap<>(); + + Wrapper noProblem = new Wrapper(generator.generateNoProblemClass("first")); + Wrapper collisionProblem = new Wrapper(generator.generateCollisionProblemClass("second")); + Wrapper collisionProblem2 = new Wrapper(generator.generateCollisionProblemClass("third")); + Wrapper gettingProblem = new Wrapper(generator.generateGettingProblemClass("fourth")); + + problemIntegerHashMap.put(noProblem, 1); + + problemIntegerHashMap.put(collisionProblem, 1); + problemIntegerHashMap.put(collisionProblem2, 1); + + problemIntegerHashMap.put(gettingProblem, 1); + problemIntegerHashMap.get(gettingProblem); + + + problemIntegerHashMap.keySet().forEach(o -> ((Wrapper)o).getEvent().forEach(System.out::println)); + } +} 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..de690490 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java @@ -0,0 +1,20 @@ +package homework_6.map_problems_generator; + +import homework_6.map_problems_generator.problem_impl.CollisionProblem; +import homework_6.map_problems_generator.problem_impl.GettingProblem; +import homework_6.map_problems_generator.problem_impl.NoProblem; + +public class MapProblemsGenerator { + + public NoProblem generateNoProblemClass(T value) { + return new NoProblem<>(value); + } + + public CollisionProblem generateCollisionProblemClass(T value) { + return new CollisionProblem<>(value); + } + + public GettingProblem generateGettingProblemClass(T value) { + return new GettingProblem<>(value); + } +} diff --git a/src/main/java/homework_6/map_problems_generator/Problem.java b/src/main/java/homework_6/map_problems_generator/Problem.java new file mode 100644 index 00000000..9ee548ee --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/Problem.java @@ -0,0 +1,5 @@ +package homework_6.map_problems_generator; + +public interface Problem { + T getValue(); +} diff --git a/src/main/java/homework_6/map_problems_generator/problem_impl/CollisionProblem.java b/src/main/java/homework_6/map_problems_generator/problem_impl/CollisionProblem.java new file mode 100644 index 00000000..87140973 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/problem_impl/CollisionProblem.java @@ -0,0 +1,13 @@ +package homework_6.map_problems_generator.problem_impl; + +public class CollisionProblem extends NoProblem { + + public CollisionProblem(T value) { + super(value); + } + + @Override + public int hashCode() { + return 0; + } +} diff --git a/src/main/java/homework_6/map_problems_generator/problem_impl/GettingProblem.java b/src/main/java/homework_6/map_problems_generator/problem_impl/GettingProblem.java new file mode 100644 index 00000000..537de9c1 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/problem_impl/GettingProblem.java @@ -0,0 +1,15 @@ +package homework_6.map_problems_generator.problem_impl; + +import java.util.Random; + +public class GettingProblem extends NoProblem { + + public GettingProblem(T value) { + super(value); + } + + @Override + public int hashCode() { + return new Random().nextInt(); + } +} diff --git a/src/main/java/homework_6/map_problems_generator/problem_impl/NoProblem.java b/src/main/java/homework_6/map_problems_generator/problem_impl/NoProblem.java new file mode 100644 index 00000000..3aaffd65 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/problem_impl/NoProblem.java @@ -0,0 +1,33 @@ +package homework_6.map_problems_generator.problem_impl; + +import homework_6.map_problems_generator.Problem; + +import java.util.Objects; + +public class NoProblem implements Problem { + protected T value; + + public NoProblem(T value) { + this.value = value; + } + + @Override + public T getValue() { + return this.value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + NoProblem noProblem = (NoProblem) o; + + return Objects.equals(value, noProblem.value); + } + + @Override + public int hashCode() { + return value != null ? value.hashCode() : 0; + } +} diff --git a/src/main/java/homework_6/map_problems_generator/problem_impl/Wrapper.java b/src/main/java/homework_6/map_problems_generator/problem_impl/Wrapper.java new file mode 100644 index 00000000..d86b896a --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/problem_impl/Wrapper.java @@ -0,0 +1,46 @@ +package homework_6.map_problems_generator.problem_impl; + +import homework_6.map_problems_generator.Problem; + +import java.util.ArrayList; +import java.util.List; + +public class Wrapper implements Problem { + private final Problem innerProblem; + private final List event = new ArrayList<>(); + + public Wrapper(Problem innerProblem) { + this.innerProblem = innerProblem; + } + + public List getEvent() { + return event; + } + + private void update(String str, String result) { + String res = "At the object class(" + innerProblem.getClass().getSimpleName() + + ") with value = " + innerProblem.getValue() + + ", was called method " + str + + ". Result = " + result; + event.add(res); + } + + @Override + public T getValue() { + return innerProblem.getValue(); + } + + @Override + public boolean equals(Object o) { + boolean equals = innerProblem.equals(o); + update("equals".toUpperCase() ,String.valueOf(equals)); + return equals; + } + + @Override + public int hashCode() { + int hashCode = innerProblem.hashCode(); + update("hashCode".toUpperCase() ,String.valueOf(hashCode)); + return hashCode; + } +} diff --git a/src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java similarity index 96% rename from src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java rename to src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java index cf4d0574..6a8a1224 100644 --- a/src/test/java/homework_5/customRegexMatcher/CustomRegexMatcherTest.java +++ b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -1,4 +1,4 @@ -package homework_5.customRegexMatcher; +package homework_5.custom_regex_matcher; import base.UnitBase; import org.junit.jupiter.api.Test; diff --git a/src/test/java/homework_5/exponent/ExponentTest.java b/src/test/java/homework_5/exponent/ExponentTest.java index e0e57314..68fb8dfb 100644 --- a/src/test/java/homework_5/exponent/ExponentTest.java +++ b/src/test/java/homework_5/exponent/ExponentTest.java @@ -1,7 +1,7 @@ package homework_5.exponent; -import homework_5.powerOfNumber.Exponent; -import homework_5.powerOfNumber.InputNegativeBaseArgumentException; +import homework_5.power_of_number.Exponent; +import homework_5.power_of_number.InputNegativeBaseArgumentException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java similarity index 93% rename from src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java rename to src/test/java/homework_5/power_of_number/PowerOfNumberTest.java index c8eaf28e..08b35f40 100644 --- a/src/test/java/homework_5/powerOfNumber/PowerOfNumberTest.java +++ b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java @@ -1,11 +1,8 @@ -package homework_5.powerOfNumber; +package homework_5.power_of_number; import base.UnitBase; -import homework_5.customRegexMatcher.CustomRegexMatcher; import org.junit.jupiter.api.Test; -import java.util.NoSuchElementException; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/src/test/java/homework_5/utils/impl/MyReaderImplTest.java b/src/test/java/homework_5/utils/impl/MyReaderImplTest.java index a8d47432..d4dcfcbe 100644 --- a/src/test/java/homework_5/utils/impl/MyReaderImplTest.java +++ b/src/test/java/homework_5/utils/impl/MyReaderImplTest.java @@ -1,7 +1,6 @@ package homework_5.utils.impl; import base.UnitBase; -import homework_5.customRegexMatcher.CustomRegexMatcher; import org.junit.jupiter.api.Test; import java.util.NoSuchElementException; From 4ce308e11211536563ed83de1e42c7ef60c1a647 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 1 Sep 2021 15:28:09 +0300 Subject: [PATCH 59/82] homework_6 README.md fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6610b074..d5163458 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ | HW5 | [PowerOfNumber](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/power_of_number) | PowerOfNumber| | HW5 | [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/custom_regex_matcher) | CustomRegexMatcher| | HW5 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_5) | HW_5 Tests| -| HW6 | [MapProblemsGenerator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_6/homework_6.map_problems_generator) | MapProblemsGenerator| +| HW6 | [MapProblemsGenerator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_6/map_problems_generator) | MapProblemsGenerator| [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) From 663d28adc5ab8fea622fde8c2754cef43db7f9a6 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 14 Sep 2021 08:28:56 +0300 Subject: [PATCH 60/82] homework_7 add README.md fix add SuppressWarnings in Main hw_6 --- README.md | 1 + .../map_problems_generator/Main.java | 2 ++ src/main/java/homework_7/Main.java | 16 +++++++++ .../kitten_to_cat_function/Cat.java | 34 +++++++++++++++++++ .../kitten_to_cat_function/Kitten.java | 34 +++++++++++++++++++ .../KittenToCatFunction.java | 6 ++++ 6 files changed, 93 insertions(+) create mode 100644 src/main/java/homework_7/Main.java create mode 100644 src/main/java/homework_7/kitten_to_cat_function/Cat.java create mode 100644 src/main/java/homework_7/kitten_to_cat_function/Kitten.java create mode 100644 src/main/java/homework_7/kitten_to_cat_function/KittenToCatFunction.java diff --git a/README.md b/README.md index d5163458..8c678f9c 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ | HW5 | [CustomRegexMatcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_5/custom_regex_matcher) | CustomRegexMatcher| | HW5 | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/test/java/homework_5) | HW_5 Tests| | HW6 | [MapProblemsGenerator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_6/map_problems_generator) | MapProblemsGenerator| +| HW7 | [KittenToCatFunction](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/KirillFilipchik/src/main/java/homework_7/kitten_to_cat_function) | KittenToCatFunction| [Link to CodingBat](https://codingbat.com/done?user=parallaksik@gmail.com&tag=9517187513) diff --git a/src/main/java/homework_6/map_problems_generator/Main.java b/src/main/java/homework_6/map_problems_generator/Main.java index 748dd535..fa08e011 100644 --- a/src/main/java/homework_6/map_problems_generator/Main.java +++ b/src/main/java/homework_6/map_problems_generator/Main.java @@ -2,10 +2,12 @@ import homework_6.map_problems_generator.problem_impl.Wrapper; +import java.io.UncheckedIOException; import java.util.HashMap; import java.util.Map; public class Main { + @SuppressWarnings("unchecked") public static void main(String[] args) { MapProblemsGenerator generator = new MapProblemsGenerator<>(); Map, Integer> problemIntegerHashMap = new HashMap<>(); diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java new file mode 100644 index 00000000..bfdc8c6a --- /dev/null +++ b/src/main/java/homework_7/Main.java @@ -0,0 +1,16 @@ +package homework_7; + +import homework_7.kitten_to_cat_function.Cat; +import homework_7.kitten_to_cat_function.Kitten; +import homework_7.kitten_to_cat_function.KittenToCatFunction; + +public class Main { + + public static void main(String[] args) { + Kitten kitten = new Kitten("Murzik", 1); + KittenToCatFunction function = (k) -> new Cat(k.getName(), k.getAge() + 4); + Cat cat = function.grow(kitten); + System.out.println(kitten); + System.out.println(cat); + } +} diff --git a/src/main/java/homework_7/kitten_to_cat_function/Cat.java b/src/main/java/homework_7/kitten_to_cat_function/Cat.java new file mode 100644 index 00000000..72df1a3c --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat_function/Cat.java @@ -0,0 +1,34 @@ +package homework_7.kitten_to_cat_function; + +public class Cat { + private String name; + private Integer age; + private String favoriteMeal; + + public Cat(String name, Integer age) { + this.name = name; + this.age = age; + this.favoriteMeal = "Fish"; + } + + public String getName() { + return name; + } + + public Integer getAge() { + return age; + } + + public String getFavoriteMeal() { + return favoriteMeal; + } + + @Override + public String toString() { + return "Cat{" + + "name='" + name + '\'' + + ", age=" + age + + ", favoriteMeal='" + favoriteMeal + '\'' + + '}'; + } +} diff --git a/src/main/java/homework_7/kitten_to_cat_function/Kitten.java b/src/main/java/homework_7/kitten_to_cat_function/Kitten.java new file mode 100644 index 00000000..ef316437 --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat_function/Kitten.java @@ -0,0 +1,34 @@ +package homework_7.kitten_to_cat_function; + +public class Kitten { + private String name; + private Integer age; + private String favoriteMeal; + + public Kitten(String name, Integer age) { + this.name = name; + this.age = age; + this.favoriteMeal = "Milk"; + } + + public String getName() { + return name; + } + + public Integer getAge() { + return age; + } + + public String getFavoriteMeal() { + return favoriteMeal; + } + + @Override + public String toString() { + return "Kitten{" + + "name='" + name + '\'' + + ", age=" + age + + ", favoriteMeal='" + favoriteMeal + '\'' + + '}'; + } +} diff --git a/src/main/java/homework_7/kitten_to_cat_function/KittenToCatFunction.java b/src/main/java/homework_7/kitten_to_cat_function/KittenToCatFunction.java new file mode 100644 index 00000000..5c7b09d5 --- /dev/null +++ b/src/main/java/homework_7/kitten_to_cat_function/KittenToCatFunction.java @@ -0,0 +1,6 @@ +package homework_7.kitten_to_cat_function; + +@FunctionalInterface +public interface KittenToCatFunction { + Cat grow(Kitten kitten); +} From 9dcbbe45ae36f621de7476aa25229fee87b2b13a Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 14 Sep 2021 08:51:59 +0300 Subject: [PATCH 61/82] homework_4 fix --- .../custom_file_reader/CustomFileReader.java | 35 +++++++++++++++++-- .../homework_4/custom_file_reader/Main.java | 11 +----- 2 files changed, 33 insertions(+), 13 deletions(-) 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 16eb0288..996909a6 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -14,19 +14,48 @@ public class CustomFileReader { private static final String FILE_PATH = "custom_file_reader" + File.separator + "file"; private static final Consumer FUNCTION = x -> System.out.println(x.replaceAll("[,.]", "")); + public static void run() { + try { + run1(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + run2(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + run3(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + run4(); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static void run1() throws IOException { - new Scanner(getFileURL().openStream()).useDelimiter("\n").forEachRemaining(FUNCTION); + Scanner scanner = new Scanner(getFileURL().openStream()).useDelimiter("\n");; + scanner.forEachRemaining(FUNCTION); + scanner.close(); } public static void run2() throws IOException { - new BufferedReader(new InputStreamReader(getFileURL().openStream())).lines().forEach(FUNCTION); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getFileURL().openStream())); + bufferedReader.lines().forEach(FUNCTION); + bufferedReader.close(); } //The resource URL is not working in the JAR public static void run3() throws IOException { - Files.lines(Paths.get(getFileURL().getPath())).forEach(FUNCTION); + //lines - close stream + Files.lines(Paths.get(getFileURL().getPath())); } //The resource URL is not working in the JAR public static void run4() throws IOException { + //readAllLines - close stream Files.readAllLines(Paths.get(getFileURL().getPath())).forEach(FUNCTION); } diff --git a/src/main/java/homework_4/custom_file_reader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java index 48b883ba..16214a05 100644 --- a/src/main/java/homework_4/custom_file_reader/Main.java +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -5,15 +5,6 @@ public class Main { public static void main(String[] args) { - try { - CustomFileReader.run1(); - CustomFileReader.run2(); - //The resource URL is not working in the JAR - CustomFileReader.run3(); - //The resource URL is not working in the JAR - CustomFileReader.run4(); - } catch (IOException e) { - e.printStackTrace(); - } + CustomFileReader.run(); } } From 35fb91b790653a9c1e003ed26b38fe0176e8398c Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 04:37:53 +0300 Subject: [PATCH 62/82] course_project first iteration --- .../sea_battle/SeaBattleApp.java | 9 ++ .../controller/FieldController.java | 8 ++ .../sea_battle/controller/FireController.java | 7 + .../sea_battle/controller/GameController.java | 5 + .../sea_battle/controller/IOController.java | 7 + .../controller/PlayerController.java | 7 + .../sea_battle/controller/ShipController.java | 8 ++ .../controller/impl/FieldControllerImpl.java | 70 ++++++++++ .../controller/impl/FireControllerImpl.java | 40 ++++++ .../controller/impl/GameControllerImpl.java | 88 ++++++++++++ .../controller/impl/GameSetupsController.java | 46 +++++++ .../controller/impl/IOControllerImpl.java | 56 ++++++++ .../controller/impl/PlayerControllerImpl.java | 26 ++++ .../controller/impl/ShipControllerImpl.java | 129 ++++++++++++++++++ .../impl/ValidateControllerImpl.java | 21 +++ .../sea_battle/model/BasePlayer.java | 14 ++ .../sea_battle/model/CellStatus.java | 19 +++ .../sea_battle/model/Field.java | 18 +++ .../course_project/sea_battle/model/Game.java | 24 ++++ .../sea_battle/model/GamePlayer.java | 26 ++++ 20 files changed, 628 insertions(+) create mode 100644 src/main/java/course_project/sea_battle/SeaBattleApp.java create mode 100644 src/main/java/course_project/sea_battle/controller/FieldController.java create mode 100644 src/main/java/course_project/sea_battle/controller/FireController.java create mode 100644 src/main/java/course_project/sea_battle/controller/GameController.java create mode 100644 src/main/java/course_project/sea_battle/controller/IOController.java create mode 100644 src/main/java/course_project/sea_battle/controller/PlayerController.java create mode 100644 src/main/java/course_project/sea_battle/controller/ShipController.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/PlayerControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java create mode 100644 src/main/java/course_project/sea_battle/model/BasePlayer.java create mode 100644 src/main/java/course_project/sea_battle/model/CellStatus.java create mode 100644 src/main/java/course_project/sea_battle/model/Field.java create mode 100644 src/main/java/course_project/sea_battle/model/Game.java create mode 100644 src/main/java/course_project/sea_battle/model/GamePlayer.java diff --git a/src/main/java/course_project/sea_battle/SeaBattleApp.java b/src/main/java/course_project/sea_battle/SeaBattleApp.java new file mode 100644 index 00000000..2331e287 --- /dev/null +++ b/src/main/java/course_project/sea_battle/SeaBattleApp.java @@ -0,0 +1,9 @@ +package course_project.sea_battle; + +import course_project.sea_battle.controller.impl.GameControllerImpl; + +public class SeaBattleApp { + public static void main(String[] args) { + GameControllerImpl.getInstance().start(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/FieldController.java b/src/main/java/course_project/sea_battle/controller/FieldController.java new file mode 100644 index 00000000..69ff5317 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/FieldController.java @@ -0,0 +1,8 @@ +package course_project.sea_battle.controller; + +import course_project.sea_battle.model.Field; + +public interface FieldController { + Field instance(); + void drawFields(Field... fields); +} diff --git a/src/main/java/course_project/sea_battle/controller/FireController.java b/src/main/java/course_project/sea_battle/controller/FireController.java new file mode 100644 index 00000000..88dd8e01 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/FireController.java @@ -0,0 +1,7 @@ +package course_project.sea_battle.controller; + +import course_project.sea_battle.model.Field; + +public interface FireController { + boolean fire(Field targetField, Field enemyField, String coordinate); +} diff --git a/src/main/java/course_project/sea_battle/controller/GameController.java b/src/main/java/course_project/sea_battle/controller/GameController.java new file mode 100644 index 00000000..6539a567 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/GameController.java @@ -0,0 +1,5 @@ +package course_project.sea_battle.controller; + +public interface GameController { + void start(); +} diff --git a/src/main/java/course_project/sea_battle/controller/IOController.java b/src/main/java/course_project/sea_battle/controller/IOController.java new file mode 100644 index 00000000..4df815be --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/IOController.java @@ -0,0 +1,7 @@ +package course_project.sea_battle.controller; + +public interface IOController { + void close(); + String dialog(String msg); + void print(String msg); +} diff --git a/src/main/java/course_project/sea_battle/controller/PlayerController.java b/src/main/java/course_project/sea_battle/controller/PlayerController.java new file mode 100644 index 00000000..97f45cc7 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/PlayerController.java @@ -0,0 +1,7 @@ +package course_project.sea_battle.controller; + +import course_project.sea_battle.model.GamePlayer; + +public interface PlayerController { + GamePlayer instance(String name); +} diff --git a/src/main/java/course_project/sea_battle/controller/ShipController.java b/src/main/java/course_project/sea_battle/controller/ShipController.java new file mode 100644 index 00000000..d971fab6 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/ShipController.java @@ -0,0 +1,8 @@ +package course_project.sea_battle.controller; + +import course_project.sea_battle.model.Field; + +public interface ShipController { + boolean placeShip(Field field, String coordinate, String vector, int size); + boolean isAnyShipAlive(Field field); +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java new file mode 100644 index 00000000..04febab3 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java @@ -0,0 +1,70 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; + +import java.util.Arrays; +import java.util.stream.IntStream; + +public final class FieldControllerImpl implements FieldController { + private static final String TOP = " ╔══════════╗"; + private static final String HUD = " ║ABCDEFGHIG║"; + private static final String SPLIT_TOP_LINE = "╔══╬══════════╣"; + private static final String SPLIT_BOT_LINE = "╚══╩══════════╝"; + private static final String SPLIT_COL_LINE = "║"; + + private FieldControllerImpl() {} + + @Override + public Field instance() { + Field field = new Field(); + this.fillWater(field); + return field; + } + + private void fillWater(Field field) { + if (field == null) return; + CellStatus[][] cells = field.getCells(); + for (CellStatus[] row : + cells) { + Arrays.fill(row, CellStatus.WATER); + } + } + + @Override + public void drawFields(Field... fields) { + Arrays.stream(fields) + .map(this::prepareForPrint) + .reduce((arr1, arr2) -> { + Arrays.setAll(arr1, i -> arr1[i] + "\t" + arr2[i]); + return arr1; + }).ifPresent(x -> Arrays.stream(x).forEach(System.out::println)); + } + + private String[] prepareForPrint(Field field) { + String[] arr = new String[field.getCells().length + 4]; + arr[0] = TOP; + arr[1] = HUD; + arr[2] = SPLIT_TOP_LINE; + arr[arr.length - 1] = SPLIT_BOT_LINE; + StringBuilder sb = new StringBuilder(); + int bound = Field.FIELD_SIZE; + IntStream.range(0, bound).forEachOrdered(i -> { + sb.append(String.format(SPLIT_COL_LINE + "%2s" + SPLIT_COL_LINE, i + 1)); + Arrays.stream(field.getCells()[i]).forEachOrdered(sb::append); + sb.append(SPLIT_COL_LINE); + arr[i + 3] = sb.toString(); + sb.setLength(0); + }); + return arr; + } + + public static FieldControllerImpl getInstance() { + return FieldControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final FieldControllerImpl INSTANCE = new FieldControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java new file mode 100644 index 00000000..ae3750e9 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java @@ -0,0 +1,40 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FireController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; + +public final class FireControllerImpl implements FireController { + private final ValidateControllerImpl validateController = ValidateControllerImpl.getInstance(); + private FireControllerImpl() {} + + @Override + public boolean fire(Field targetField, Field enemyField, String coordinate) { + if (targetField == null || enemyField == null) throw new RuntimeException("в атаке что то не так"); + if (validateController.coordinate(coordinate)) return false; + int x = coordinate.toLowerCase().charAt(0) - 'a'; + int y = Integer.parseInt(coordinate.toLowerCase().substring(1)) - 1; + CellStatus cellBefore = targetField.getCell(x, y); + CellStatus cellAfter; + if (cellBefore == CellStatus.SHOT + || cellBefore == CellStatus.HIT) { + return false; + }else if (cellBefore == CellStatus.SHIP) { + cellAfter = CellStatus.HIT; + } + else { + cellAfter = CellStatus.SHOT; + } + targetField.setCell(x, y, cellAfter); + enemyField.setCell(x, y, cellAfter); + return true; + } + + public static FireControllerImpl getInstance() { + return FireControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final FireControllerImpl INSTANCE = new FireControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java new file mode 100644 index 00000000..18f4d701 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -0,0 +1,88 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.*; +import course_project.sea_battle.model.Game; +import course_project.sea_battle.model.GamePlayer; + +public final class GameControllerImpl implements GameController{ + private final PlayerController playerController = PlayerControllerImpl.getInstance(); + private final IOController ioController = IOControllerImpl.getInstance(); + private final GameSetupsController gameSetupsController = GameSetupsController.getInstance(); + private final FieldController fieldController = FieldControllerImpl.getInstance(); + private final FireController fireController = FireControllerImpl.getInstance(); + private final ShipController shipController = ShipControllerImpl.getInstance(); + + private GameControllerImpl() {} + + public void start() { + Game game = new Game(); + addPlayers(game); + ioController.print(game.getPlayer1().getName() + ", установите корабли!"); + gameSetupsController.setShips(game.getPlayer1().getFieldPlayer()); + ioController.print(game.getPlayer2().getName() + ", ваша очередь установить корабли!"); + gameSetupsController.setShips(game.getPlayer2().getFieldPlayer()); + ioController.print("Да начнется битва"); + + doGame(game, 2000); + } + + private void addPlayers(Game game) { + String name1; + String name2; + do { + name1 = ioController.dialog("Введите имя первого игрока:"); + } while (name1.isEmpty()); + game.setPlayer1(playerController.instance(name1)); + do { + name2 = ioController.dialog("Введите имя второго игрока:"); + } while (name2.isEmpty()); + game.setPlayer2(playerController.instance(name2)); + } + + private void doGame(Game game, long nanoSec){ + boolean isPlayer1Move = true; + boolean isGameOver = false; + + GamePlayer playerAtk = game.getPlayer1(); + GamePlayer playerDef = game.getPlayer2(); + + while (!isGameOver) { + + if (isPlayer1Move) { + playerAtk = game.getPlayer1(); + playerDef = game.getPlayer2(); + } else { + playerAtk = game.getPlayer2(); + playerDef = game.getPlayer1(); + } + + ioController.print(playerAtk.getName() + ", Ваш ход!"); + fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); + String coordinate; + do coordinate = ioController.dialog("Координаты:"); + while (!fireController.fire(playerDef.getFieldPlayer(), + playerAtk.getRadarPlayer(), + coordinate)); + fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); + isPlayer1Move = !isPlayer1Move; + isGameOver = !shipController.isAnyShipAlive(playerDef.getFieldPlayer()); + try { + Thread.sleep(nanoSec); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + ioController.print(playerAtk.getName() + " Выйграл!"); + ioController.print(playerDef.getName() + " Проиграл!"); + fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer(), + playerDef.getFieldPlayer(), playerDef.getRadarPlayer()); + } + + public static GameControllerImpl getInstance() { + return GameControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final GameControllerImpl INSTANCE = new GameControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java b/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java new file mode 100644 index 00000000..a72ddbd8 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java @@ -0,0 +1,46 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.controller.ShipController; +import course_project.sea_battle.model.Field; + +public final class GameSetupsController { + private final int[] DECK_4 = {4, 0}; + private final int[] DECK_3 = {3, 0}; + private final int[] DECK_2 = {2, 0}; + private final int[] DECK_1 = {1, 2}; + + private final ShipController shipController = ShipControllerImpl.getInstance(); + private final IOControllerImpl ioController = IOControllerImpl.getInstance(); + private final FieldController fieldController = FieldControllerImpl.getInstance(); + + private GameSetupsController() {} + + public void setShips(Field field) { + setShipsByType(field, DECK_4); + setShipsByType(field, DECK_3); + setShipsByType(field, DECK_2); + setShipsByType(field, DECK_1); + } + + private void setShipsByType(Field field, int[] deck) { + String coordinate; + String vector; + ioController.print("Введите " + deck[0] + " палубных коробля. Количество: " + deck[1]); + for (int i = 0; i < deck[1]; i++) { + do { + coordinate = ioController.dialog("Введите координаты\n(Exemple: a1):"); + vector = ioController.dialog("Введите направление(v/g):"); + } while (!shipController.placeShip(field, coordinate, vector, deck[0])); + fieldController.drawFields(field); + } + } + + public static GameSetupsController getInstance() { + return GameSetupsController.Holder.INSTANCE; + } + + private static class Holder { + static final GameSetupsController INSTANCE = new GameSetupsController(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java new file mode 100644 index 00000000..64e20769 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java @@ -0,0 +1,56 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.IOController; + +import java.util.Scanner; + +public final class IOControllerImpl implements IOController { + private final Scanner scanner = new Scanner(System.in); + + @Override + public String dialog(String msg) { + System.out.println(msg); + return scanner.nextLine(); + } + + @Override + public void print(String msg) { + System.out.println(msg); + } + + @Override + public void close() { + scanner.close(); + } + + public static void clearConsole() + { + try + { + final String os = System.getProperty("os.name"); + + if (os.contains("Windows")) + { + Runtime.getRuntime().exec("cls"); + } + else + { + Runtime.getRuntime().exec("clear"); + } + } + catch (final Exception e) + { + e.printStackTrace(); + } + } + + private IOControllerImpl() {} + + public static IOControllerImpl getInstance() { + return IOControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final IOControllerImpl INSTANCE = new IOControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/PlayerControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/PlayerControllerImpl.java new file mode 100644 index 00000000..7dcbbcc8 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/PlayerControllerImpl.java @@ -0,0 +1,26 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.controller.PlayerController; +import course_project.sea_battle.model.GamePlayer; + +public final class PlayerControllerImpl implements PlayerController { + private final FieldController fieldController = FieldControllerImpl.getInstance(); + private PlayerControllerImpl() {} + + @Override + public GamePlayer instance(String name) { + GamePlayer player = new GamePlayer(name); + player.setFieldPlayer(fieldController.instance()); + player.setRadarPlayer(fieldController.instance()); + return player; + } + + public static PlayerControllerImpl getInstance() { + return PlayerControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final PlayerControllerImpl INSTANCE = new PlayerControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java new file mode 100644 index 00000000..cb81bb9c --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java @@ -0,0 +1,129 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.ShipController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; + +import java.util.Arrays; + +public final class ShipControllerImpl implements ShipController { + private final ValidateControllerImpl validateController = ValidateControllerImpl.getInstance(); + private ShipControllerImpl() {} + + @Override + public boolean placeShip(Field field, String coordinate, String vector, int size) { + if (field == null) return false; + if (validateController.coordinate(coordinate)) return false; + if (!validateController.vector(vector)) return false; + + Ship ship = new Ship(size, coordinate, vector); + + if (!isAvailable(field, ship)) return false; + for (int i = 0; i < ship.getSize(); i++) { + if (ship.isVertical()) { + field.setCell(ship.starX, ship.startY + i, CellStatus.SHIP); + } else { + field.setCell(ship.starX + i, ship.startY, CellStatus.SHIP); + } + } + return true; + } + + @Override + public boolean isAnyShipAlive(Field field) { + if (field == null) return false; + return Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .anyMatch(x -> x == CellStatus.SHIP); + } + + private boolean isAvailable(Field field, Ship ship) { + if (field.getCell(ship.starX, ship.startY) == CellStatus.SHIP) return false; + if(cellCheckCross(field, ship.starX, ship.startY)) return false; + + if (ship.isVertical()){ + if (ship.startY + ship.getSize() > Field.FIELD_SIZE) return false; + if (cellCheckCross(field, ship.starX, ship.startY + ship.getSize() - 1)) return false; + } else { + if (ship.starX + ship.getSize() > Field.FIELD_SIZE) return false; + if (cellCheckCross(field, ship.starX + ship.getSize() - 1, ship.startY)) return false; + } + for (int i = 0; i < ship.getSize(); i++) { + int dx = 0; + int dy = 0; + + if (ship.isVertical()) dy = i; + else dx = i; + + if (cellCheckPlus(field, ship.starX + dx, ship.startY + dy)) return false; + } + + return true; + } + + private boolean cellCheckCross(Field field, int x, int y) { + if (y - 1 >= 0 && x - 1 >= 0) { + if (field.getCell(x - 1, y - 1) == CellStatus.SHIP) return true; + } + if (y - 1 >= 0 && x + 1 < Field.FIELD_SIZE){ + if (field.getCell(x + 1, y - 1) == CellStatus.SHIP) return true; + } + if (y + 1 < Field.FIELD_SIZE && x - 1 >= 0) { + if (field.getCell(x - 1, y + 1) == CellStatus.SHIP) return true; + } + if (y + 1 < Field.FIELD_SIZE && x + 1 < Field.FIELD_SIZE) { + if (field.getCell(x + 1, y + 1) == CellStatus.SHIP) return true; + } + + return false; + } + + private boolean cellCheckPlus(Field field, int x, int y) { + if (x + 1 < Field.FIELD_SIZE) { + if (field.getCell(x + 1, y) == CellStatus.SHIP) return true; + } + + if (x - 1 >= 0) { + if (field.getCell(x - 1, y) == CellStatus.SHIP) return true; + } + + if (y + 1 < Field.FIELD_SIZE) { + if (field.getCell(x, y + 1) == CellStatus.SHIP) return true; + } + if (y - 1 >= 0) { + if (field.getCell(x, y - 1) == CellStatus.SHIP) return true; + } + return false; + } + + public static ShipControllerImpl getInstance() { + return ShipControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final ShipControllerImpl INSTANCE = new ShipControllerImpl(); + } + + private static class Ship { + private final int size; + private final boolean isVertical; + private final int starX; + private final int startY; + + public Ship(int size, String coordinate, String vector) { + this.size = size; + + this.starX = coordinate.toLowerCase().charAt(0) - 'a'; + this.startY = Integer.parseInt(coordinate.toLowerCase().substring(1)) - 1; + this.isVertical = vector.equals("v"); + } + + public int getSize() { + return size; + } + + public boolean isVertical() { + return isVertical; + } + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java new file mode 100644 index 00000000..46ba53b5 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java @@ -0,0 +1,21 @@ +package course_project.sea_battle.controller.impl; + +public final class ValidateControllerImpl { + private ValidateControllerImpl() {} + + public boolean coordinate(String str) { + return !str.toLowerCase().matches("[a-i]([1-9]|10)"); + } + + public boolean vector(String str) { + return str.toLowerCase().matches("[vg]"); + } + + public static ValidateControllerImpl getInstance() { + return ValidateControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final ValidateControllerImpl INSTANCE = new ValidateControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/model/BasePlayer.java b/src/main/java/course_project/sea_battle/model/BasePlayer.java new file mode 100644 index 00000000..6cc698ad --- /dev/null +++ b/src/main/java/course_project/sea_battle/model/BasePlayer.java @@ -0,0 +1,14 @@ +package course_project.sea_battle.model; + +public class BasePlayer { + private final String name; + + public BasePlayer(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/course_project/sea_battle/model/CellStatus.java b/src/main/java/course_project/sea_battle/model/CellStatus.java new file mode 100644 index 00000000..95048f8a --- /dev/null +++ b/src/main/java/course_project/sea_battle/model/CellStatus.java @@ -0,0 +1,19 @@ +package course_project.sea_battle.model; + +public enum CellStatus { + SHIP('█'), + SHOT('⊙'), + WATER('~'), + HIT('X'); + + private final char value; + + CellStatus(char value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} diff --git a/src/main/java/course_project/sea_battle/model/Field.java b/src/main/java/course_project/sea_battle/model/Field.java new file mode 100644 index 00000000..61e7e03a --- /dev/null +++ b/src/main/java/course_project/sea_battle/model/Field.java @@ -0,0 +1,18 @@ +package course_project.sea_battle.model; + +public class Field { + public static final int FIELD_SIZE = 10; + private final CellStatus[][] cells = new CellStatus[FIELD_SIZE][FIELD_SIZE]; + + public CellStatus[][] getCells() { + return cells; + } + + public CellStatus getCell(int x, int y) { + return cells[y][x]; + } + + public void setCell(int x, int y, CellStatus status) { + cells[y][x] = status; + } +} diff --git a/src/main/java/course_project/sea_battle/model/Game.java b/src/main/java/course_project/sea_battle/model/Game.java new file mode 100644 index 00000000..f544aa61 --- /dev/null +++ b/src/main/java/course_project/sea_battle/model/Game.java @@ -0,0 +1,24 @@ +package course_project.sea_battle.model; + + +public class Game { + private GamePlayer player1; + private GamePlayer player2; + + public GamePlayer getPlayer1() { + return player1; + } + + public void setPlayer1(GamePlayer player1) { + this.player1 = player1; + } + + public GamePlayer getPlayer2() { + return player2; + } + + public void setPlayer2(GamePlayer player2) { + this.player2 = player2; + } + +} diff --git a/src/main/java/course_project/sea_battle/model/GamePlayer.java b/src/main/java/course_project/sea_battle/model/GamePlayer.java new file mode 100644 index 00000000..f72d0175 --- /dev/null +++ b/src/main/java/course_project/sea_battle/model/GamePlayer.java @@ -0,0 +1,26 @@ +package course_project.sea_battle.model; + +public class GamePlayer extends BasePlayer{ + private Field fieldPlayer; + private Field radarPlayer; + + public GamePlayer(String name) { + super(name); + } + + public Field getFieldPlayer() { + return fieldPlayer; + } + + public void setFieldPlayer(Field fieldPlayer) { + this.fieldPlayer = fieldPlayer; + } + + public Field getRadarPlayer() { + return radarPlayer; + } + + public void setRadarPlayer(Field radarPlayer) { + this.radarPlayer = radarPlayer; + } +} From 0b28c700d1cc8aa3a121738ddbc7e79571e3cfd6 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 12:09:32 +0300 Subject: [PATCH 63/82] course_project fix 1 --- .../sea_battle/controller/impl/FieldControllerImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java index 04febab3..8fcf4fce 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java @@ -1,10 +1,12 @@ package course_project.sea_battle.controller.impl; import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.controller.IOController; import course_project.sea_battle.model.CellStatus; import course_project.sea_battle.model.Field; import java.util.Arrays; +import java.util.Optional; import java.util.stream.IntStream; public final class FieldControllerImpl implements FieldController { @@ -14,6 +16,8 @@ public final class FieldControllerImpl implements FieldController { private static final String SPLIT_BOT_LINE = "╚══╩══════════╝"; private static final String SPLIT_COL_LINE = "║"; + private final IOController ioController = IOControllerImpl.getInstance(); + private FieldControllerImpl() {} @Override @@ -34,12 +38,13 @@ private void fillWater(Field field) { @Override public void drawFields(Field... fields) { - Arrays.stream(fields) + Optional reduce = Arrays.stream(fields) .map(this::prepareForPrint) .reduce((arr1, arr2) -> { Arrays.setAll(arr1, i -> arr1[i] + "\t" + arr2[i]); return arr1; - }).ifPresent(x -> Arrays.stream(x).forEach(System.out::println)); + }); + reduce.ifPresent(x -> Arrays.stream(x).forEach(ioController::print)); } private String[] prepareForPrint(Field field) { From 9e2d0b26ef10e718367bd6558ba0feee918ff8d2 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 12:11:58 +0300 Subject: [PATCH 64/82] course_project fix 2 --- .../controller/impl/GameControllerImpl.java | 1 + .../controller/impl/GameSetupsController.java | 8 +++---- .../controller/impl/IOControllerImpl.java | 21 ------------------- 3 files changed, 5 insertions(+), 25 deletions(-) diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index 18f4d701..6b8084b3 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -24,6 +24,7 @@ public void start() { ioController.print("Да начнется битва"); doGame(game, 2000); + ioController.close(); } private void addPlayers(Game game) { diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java b/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java index a72ddbd8..b039462e 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java @@ -5,10 +5,10 @@ import course_project.sea_battle.model.Field; public final class GameSetupsController { - private final int[] DECK_4 = {4, 0}; - private final int[] DECK_3 = {3, 0}; - private final int[] DECK_2 = {2, 0}; - private final int[] DECK_1 = {1, 2}; + private final int[] DECK_4 = {4, 1}; + private final int[] DECK_3 = {3, 2}; + private final int[] DECK_2 = {2, 3}; + private final int[] DECK_1 = {1, 4}; private final ShipController shipController = ShipControllerImpl.getInstance(); private final IOControllerImpl ioController = IOControllerImpl.getInstance(); diff --git a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java index 64e20769..3480ab53 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java @@ -23,27 +23,6 @@ public void close() { scanner.close(); } - public static void clearConsole() - { - try - { - final String os = System.getProperty("os.name"); - - if (os.contains("Windows")) - { - Runtime.getRuntime().exec("cls"); - } - else - { - Runtime.getRuntime().exec("clear"); - } - } - catch (final Exception e) - { - e.printStackTrace(); - } - } - private IOControllerImpl() {} public static IOControllerImpl getInstance() { From e71d04aff6964339c74485251babd53eb794057c Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 20:07:41 +0300 Subject: [PATCH 65/82] course_project fix 3 --- .../sea_battle/controller/FireController.java | 4 ++- .../controller/impl/FireControllerImpl.java | 30 ++++++++++++------- .../controller/impl/GameControllerImpl.java | 21 +++++++------ .../controller/impl/ParserControllerImpl.java | 23 ++++++++++++++ .../controller/impl/ShipControllerImpl.java | 16 ++++++---- 5 files changed, 67 insertions(+), 27 deletions(-) create mode 100644 src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java diff --git a/src/main/java/course_project/sea_battle/controller/FireController.java b/src/main/java/course_project/sea_battle/controller/FireController.java index 88dd8e01..04e5e0bf 100644 --- a/src/main/java/course_project/sea_battle/controller/FireController.java +++ b/src/main/java/course_project/sea_battle/controller/FireController.java @@ -1,7 +1,9 @@ package course_project.sea_battle.controller; +import course_project.sea_battle.model.CellStatus; import course_project.sea_battle.model.Field; public interface FireController { - boolean fire(Field targetField, Field enemyField, String coordinate); + CellStatus fire(Field targetField, Field enemyField, String coordinate); + boolean checkFire(Field field, String coordinate); } diff --git a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java index ae3750e9..0d57ef64 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java @@ -6,20 +6,20 @@ public final class FireControllerImpl implements FireController { private final ValidateControllerImpl validateController = ValidateControllerImpl.getInstance(); + private final ParserControllerImpl parserController = ParserControllerImpl.getInstance(); + private FireControllerImpl() {} @Override - public boolean fire(Field targetField, Field enemyField, String coordinate) { - if (targetField == null || enemyField == null) throw new RuntimeException("в атаке что то не так"); - if (validateController.coordinate(coordinate)) return false; - int x = coordinate.toLowerCase().charAt(0) - 'a'; - int y = Integer.parseInt(coordinate.toLowerCase().substring(1)) - 1; + public CellStatus fire(Field targetField, Field enemyField, String coordinate) { + if (enemyField == null) throw new RuntimeException("Поле не может быть null"); + + int[] cordXY = parserController.parseCoordinate(coordinate); + int x = cordXY[0], y = cordXY[1]; + CellStatus cellBefore = targetField.getCell(x, y); CellStatus cellAfter; - if (cellBefore == CellStatus.SHOT - || cellBefore == CellStatus.HIT) { - return false; - }else if (cellBefore == CellStatus.SHIP) { + if (cellBefore == CellStatus.SHIP) { cellAfter = CellStatus.HIT; } else { @@ -27,7 +27,17 @@ public boolean fire(Field targetField, Field enemyField, String coordinate) { } targetField.setCell(x, y, cellAfter); enemyField.setCell(x, y, cellAfter); - return true; + return cellAfter; + } + + @Override + public boolean checkFire(Field field, String coordinate) { + if (field == null) return false; + if (validateController.coordinate(coordinate)) return false; + int[] cordXY = parserController.parseCoordinate(coordinate); + + return field.getCell(cordXY[0], cordXY[1]) != CellStatus.HIT + && field.getCell(cordXY[0], cordXY[1]) != CellStatus.SHOT; } public static FireControllerImpl getInstance() { diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index 6b8084b3..b906c87d 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -1,6 +1,7 @@ package course_project.sea_battle.controller.impl; import course_project.sea_battle.controller.*; +import course_project.sea_battle.model.CellStatus; import course_project.sea_battle.model.Game; import course_project.sea_battle.model.GamePlayer; @@ -23,7 +24,7 @@ public void start() { gameSetupsController.setShips(game.getPlayer2().getFieldPlayer()); ioController.print("Да начнется битва"); - doGame(game, 2000); + doGame(game); ioController.close(); } @@ -40,7 +41,7 @@ private void addPlayers(Game game) { game.setPlayer2(playerController.instance(name2)); } - private void doGame(Game game, long nanoSec){ + private void doGame(Game game){ boolean isPlayer1Move = true; boolean isGameOver = false; @@ -57,21 +58,19 @@ private void doGame(Game game, long nanoSec){ playerDef = game.getPlayer1(); } - ioController.print(playerAtk.getName() + ", Ваш ход!"); + ioController.dialog(playerAtk.getName() + ", Ваш ход!"); fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); String coordinate; do coordinate = ioController.dialog("Координаты:"); - while (!fireController.fire(playerDef.getFieldPlayer(), + while (fireController.checkFire(playerAtk.getRadarPlayer(), coordinate)); + CellStatus cellStatus = fireController.fire(playerDef.getFieldPlayer(), playerAtk.getRadarPlayer(), - coordinate)); + coordinate); fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); - isPlayer1Move = !isPlayer1Move; - isGameOver = !shipController.isAnyShipAlive(playerDef.getFieldPlayer()); - try { - Thread.sleep(nanoSec); - } catch (InterruptedException e) { - e.printStackTrace(); + if (cellStatus != CellStatus.HIT) { + isPlayer1Move = !isPlayer1Move; } + isGameOver = !shipController.isAnyShipAlive(playerDef.getFieldPlayer()); } ioController.print(playerAtk.getName() + " Выйграл!"); ioController.print(playerDef.getName() + " Проиграл!"); diff --git a/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java new file mode 100644 index 00000000..b24efcbe --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java @@ -0,0 +1,23 @@ +package course_project.sea_battle.controller.impl; + +public final class ParserControllerImpl { + private ParserControllerImpl() {} + + public int[] parseCoordinate(String coordinate) { + int x = coordinate.toLowerCase().charAt(0) - 'a'; + int y = Integer.parseInt(coordinate.toLowerCase().substring(1)) - 1; + return new int[]{x, y}; + } + + public boolean isVerticalVector(String vector) { + return vector.equalsIgnoreCase("v"); + } + + public static ParserControllerImpl getInstance() { + return ParserControllerImpl.Holder.INSTANCE; + } + + private static class Holder { + static final ParserControllerImpl INSTANCE = new ParserControllerImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java index cb81bb9c..29949c2e 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java @@ -8,6 +8,8 @@ public final class ShipControllerImpl implements ShipController { private final ValidateControllerImpl validateController = ValidateControllerImpl.getInstance(); + private final ParserControllerImpl parserController = ParserControllerImpl.getInstance(); + private ShipControllerImpl() {} @Override @@ -16,7 +18,11 @@ public boolean placeShip(Field field, String coordinate, String vector, int size if (validateController.coordinate(coordinate)) return false; if (!validateController.vector(vector)) return false; - Ship ship = new Ship(size, coordinate, vector); + int[] cordXY = parserController.parseCoordinate(coordinate); + int x = cordXY[0], y = cordXY[1]; + boolean isVertical = parserController.isVerticalVector(vector); + + Ship ship = new Ship(size, x, y, isVertical); if (!isAvailable(field, ship)) return false; for (int i = 0; i < ship.getSize(); i++) { @@ -110,12 +116,12 @@ private static class Ship { private final int starX; private final int startY; - public Ship(int size, String coordinate, String vector) { + public Ship(int size, int x, int y, boolean isVertical) { this.size = size; - this.starX = coordinate.toLowerCase().charAt(0) - 'a'; - this.startY = Integer.parseInt(coordinate.toLowerCase().substring(1)) - 1; - this.isVertical = vector.equals("v"); + this.starX = x; + this.startY = y; + this.isVertical = isVertical; } public int getSize() { From 628b0c3e1f23bc655537f144326cdb4e1fdd5594 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 20:31:07 +0300 Subject: [PATCH 66/82] course_project fix 4 --- .../sea_battle/controller/impl/FieldControllerImpl.java | 5 ++--- .../sea_battle/controller/impl/GameControllerImpl.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java index 8fcf4fce..8ec9bd43 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/FieldControllerImpl.java @@ -38,13 +38,12 @@ private void fillWater(Field field) { @Override public void drawFields(Field... fields) { - Optional reduce = Arrays.stream(fields) + Arrays.stream(fields) .map(this::prepareForPrint) .reduce((arr1, arr2) -> { Arrays.setAll(arr1, i -> arr1[i] + "\t" + arr2[i]); return arr1; - }); - reduce.ifPresent(x -> Arrays.stream(x).forEach(ioController::print)); + }).ifPresent(x -> Arrays.stream(x).forEach(ioController::print)); } private String[] prepareForPrint(Field field) { diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index b906c87d..52da2933 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -62,7 +62,7 @@ private void doGame(Game game){ fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); String coordinate; do coordinate = ioController.dialog("Координаты:"); - while (fireController.checkFire(playerAtk.getRadarPlayer(), coordinate)); + while (!fireController.checkFire(playerAtk.getRadarPlayer(), coordinate)); CellStatus cellStatus = fireController.fire(playerDef.getFieldPlayer(), playerAtk.getRadarPlayer(), coordinate); From 1c931ddf18c0bca95bc2536325ec03c758697c6b Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 21:02:28 +0300 Subject: [PATCH 67/82] course_project fix 5 --- .../sea_battle/controller/impl/FireControllerImpl.java | 2 +- .../sea_battle/controller/impl/ShipControllerImpl.java | 2 +- .../sea_battle/controller/impl/ValidateControllerImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java index 0d57ef64..749a090d 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java @@ -33,7 +33,7 @@ public CellStatus fire(Field targetField, Field enemyField, String coordinate) { @Override public boolean checkFire(Field field, String coordinate) { if (field == null) return false; - if (validateController.coordinate(coordinate)) return false; + if (!validateController.coordinate(coordinate)) return false; int[] cordXY = parserController.parseCoordinate(coordinate); return field.getCell(cordXY[0], cordXY[1]) != CellStatus.HIT diff --git a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java index 29949c2e..f3a59758 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java @@ -15,7 +15,7 @@ private ShipControllerImpl() {} @Override public boolean placeShip(Field field, String coordinate, String vector, int size) { if (field == null) return false; - if (validateController.coordinate(coordinate)) return false; + if (!validateController.coordinate(coordinate)) return false; if (!validateController.vector(vector)) return false; int[] cordXY = parserController.parseCoordinate(coordinate); diff --git a/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java index 46ba53b5..aa022f3f 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java @@ -4,7 +4,7 @@ public final class ValidateControllerImpl { private ValidateControllerImpl() {} public boolean coordinate(String str) { - return !str.toLowerCase().matches("[a-i]([1-9]|10)"); + return str.toLowerCase().matches("[a-i]([1-9]|10)"); } public boolean vector(String str) { From 72b5a3b94183801a7840b5c082d8af0a659f8a99 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 22:53:43 +0300 Subject: [PATCH 68/82] course_project fix 6 --- .../sea_battle/controller/ParseController.java | 7 +++++++ .../controller/impl/FireControllerImpl.java | 12 ++++++------ .../controller/impl/ParserControllerImpl.java | 6 +++++- .../controller/impl/ValidateControllerImpl.java | 2 ++ 4 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 src/main/java/course_project/sea_battle/controller/ParseController.java diff --git a/src/main/java/course_project/sea_battle/controller/ParseController.java b/src/main/java/course_project/sea_battle/controller/ParseController.java new file mode 100644 index 00000000..e4769b48 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/ParseController.java @@ -0,0 +1,7 @@ +package course_project.sea_battle.controller; + +public interface ParseController { + + int[] parseCoordinate(String coordinate); + boolean isVerticalVector(String vector); +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java index 749a090d..7efb8ab4 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/FireControllerImpl.java @@ -11,22 +11,22 @@ public final class FireControllerImpl implements FireController { private FireControllerImpl() {} @Override - public CellStatus fire(Field targetField, Field enemyField, String coordinate) { - if (enemyField == null) throw new RuntimeException("Поле не может быть null"); + public CellStatus fire(Field opponentField, Field radar, String coordinate) { + if (radar == null || opponentField == null) throw new RuntimeException("Поле не может быть null"); int[] cordXY = parserController.parseCoordinate(coordinate); int x = cordXY[0], y = cordXY[1]; - CellStatus cellBefore = targetField.getCell(x, y); + CellStatus cellBefore = opponentField.getCell(x, y); CellStatus cellAfter; - if (cellBefore == CellStatus.SHIP) { + if (cellBefore == CellStatus.SHIP || cellBefore == CellStatus.HIT) { cellAfter = CellStatus.HIT; } else { cellAfter = CellStatus.SHOT; } - targetField.setCell(x, y, cellAfter); - enemyField.setCell(x, y, cellAfter); + opponentField.setCell(x, y, cellAfter); + radar.setCell(x, y, cellAfter); return cellAfter; } diff --git a/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java index b24efcbe..ce641372 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ParserControllerImpl.java @@ -1,14 +1,18 @@ package course_project.sea_battle.controller.impl; -public final class ParserControllerImpl { +import course_project.sea_battle.controller.ParseController; + +public final class ParserControllerImpl implements ParseController { private ParserControllerImpl() {} + @Override public int[] parseCoordinate(String coordinate) { int x = coordinate.toLowerCase().charAt(0) - 'a'; int y = Integer.parseInt(coordinate.toLowerCase().substring(1)) - 1; return new int[]{x, y}; } + @Override public boolean isVerticalVector(String vector) { return vector.equalsIgnoreCase("v"); } diff --git a/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java index aa022f3f..215ce52b 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ValidateControllerImpl.java @@ -4,10 +4,12 @@ public final class ValidateControllerImpl { private ValidateControllerImpl() {} public boolean coordinate(String str) { + if (str == null) return false; return str.toLowerCase().matches("[a-i]([1-9]|10)"); } public boolean vector(String str) { + if (str == null) return false; return str.toLowerCase().matches("[vg]"); } From 8a66fec52a2646476fffd9a53afe7551681331f0 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Mon, 20 Sep 2021 22:54:11 +0300 Subject: [PATCH 69/82] course_project add Tests (not all) --- .../impl/FieldControllerImplTest.java | 113 ++++++++++++++++++ .../impl/FireControllerImplTest.java | 107 +++++++++++++++++ .../impl/ValidateControllerImplTest.java | 61 ++++++++++ 3 files changed, 281 insertions(+) create mode 100644 src/test/java/course_project/sea_battle/controller/impl/FieldControllerImplTest.java create mode 100644 src/test/java/course_project/sea_battle/controller/impl/FireControllerImplTest.java create mode 100644 src/test/java/course_project/sea_battle/controller/impl/ValidateControllerImplTest.java diff --git a/src/test/java/course_project/sea_battle/controller/impl/FieldControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/FieldControllerImplTest.java new file mode 100644 index 00000000..0b91a674 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/FieldControllerImplTest.java @@ -0,0 +1,113 @@ +package course_project.sea_battle.controller.impl; + +import base.UnitBase; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class FieldControllerImplTest extends UnitBase { + + @Test + void InstanceMethodReturnFieldFillsWaterTest() { + assertTrue(Arrays.stream(FieldControllerImpl.getInstance().instance().getCells()) + .flatMap(Arrays::stream) + .allMatch(x -> x.equals(CellStatus.WATER))); + } + + @Test + void DrawFieldsWith1FieldTest() { + Field waterField1 = FieldControllerImpl.getInstance().instance(); + FieldControllerImpl.getInstance().drawFields(waterField1); + + String raw1 = " ╔══════════╗"; + String raw2 = " ║ABCDEFGHIG║"; + String raw3 = "╔══╬══════════╣"; + String raw4 = "║ 1║~~~~~~~~~~║"; + String raw5 = "║ 2║~~~~~~~~~~║"; + String raw6 = "║ 3║~~~~~~~~~~║"; + String raw7 = "║ 4║~~~~~~~~~~║"; + String raw8 = "║ 5║~~~~~~~~~~║"; + String raw9 = "║ 6║~~~~~~~~~~║"; + String raw10 = "║ 7║~~~~~~~~~~║"; + String raw11 = "║ 8║~~~~~~~~~~║"; + String raw12 = "║ 9║~~~~~~~~~~║"; + String raw13 = "║10║~~~~~~~~~~║"; + String raw14 = "╚══╩══════════╝"; + + assertEquals(14, getOutputLines().length); + assertEquals(raw1.trim(), getOutputLines()[0]); + assertEquals(raw2, getOutputLines()[1]); + assertEquals(raw3, getOutputLines()[2]); + assertEquals(raw4, getOutputLines()[3]); + assertEquals(raw5, getOutputLines()[4]); + assertEquals(raw6, getOutputLines()[5]); + assertEquals(raw7, getOutputLines()[6]); + assertEquals(raw8, getOutputLines()[7]); + assertEquals(raw9, getOutputLines()[8]); + assertEquals(raw10, getOutputLines()[9]); + assertEquals(raw11, getOutputLines()[10]); + assertEquals(raw12, getOutputLines()[11]); + assertEquals(raw13, getOutputLines()[12]); + assertEquals(raw14.trim(), getOutputLines()[13]); + } + + + @Test + void DrawFieldsWith2FieldsTest() { + + final String raw2 = " ║ABCDEFGHIG║" + "\t" + " ║ABCDEFGHIG║"; + final String raw3 = "╔══╬══════════╣" + "\t" + "╔══╬══════════╣"; + final String raw4 = "║ 1║~~~~~~~~~~║" + "\t" + "║ 1║X~~~~~~~~~║"; + final String raw5 = "║ 2║~~~~~~~~~~║" + "\t" + "║ 2║~~~~~~~~~~║"; + + + final Field waterField1 = FieldControllerImpl.getInstance().instance(); + final Field waterField2 = FieldControllerImpl.getInstance().instance(); + + waterField2.setCell(0,0, CellStatus.HIT); + + FieldControllerImpl.getInstance().drawFields(waterField1, waterField2); + + assertEquals(14, getOutputLines().length); + assertEquals(raw2, getOutputLines()[1]); + assertEquals(raw3, getOutputLines()[2]); + assertEquals(raw4, getOutputLines()[3]); + assertEquals(raw5, getOutputLines()[4]); + } + + @Test + void DrawFieldsWith3FieldsTest() { + + final String expected = + "╔══════════╗\t ╔══════════╗\t ╔══════════╗\n" + + " ║ABCDEFGHIG║\t ║ABCDEFGHIG║\t ║ABCDEFGHIG║\n" + + "╔══╬══════════╣\t╔══╬══════════╣\t╔══╬══════════╣\n" + + "║ 1║~~~~~~~~~~║\t║ 1║~~█~~~~~~~║\t║ 1║~~⊙~~~~~~~║\n" + + "║ 2║~~~~~~~~~~║\t║ 2║~~~~~~~~~~║\t║ 2║~~~~~~~~~~║\n" + + "║ 3║~~~~~~~~~~║\t║ 3║~~~~~~~~~~║\t║ 3║~~~~~~~~~~║\n" + + "║ 4║~~~~~~~~~~║\t║ 4║~~~~~~~~~~║\t║ 4║~~~~~~~~~~║\n" + + "║ 5║~~~~~~~~~~║\t║ 5║~~~~~~~~~~║\t║ 5║~~~~~~~~~~║\n" + + "║ 6║~~~~~~~~~~║\t║ 6║~~~~~~~~~~║\t║ 6║~~~~~~~~~~║\n" + + "║ 7║~~~~~~~~~~║\t║ 7║~~~~~~~~~~║\t║ 7║~~~~~~~~~~║\n" + + "║ 8║~~~~~~~~~~║\t║ 8║~~~~~~~~~~║\t║ 8║~~~~~~~~~~║\n" + + "║ 9║~~~~~~~~~~║\t║ 9║~~~~~~~~~~║\t║ 9║~~~~~~~~~~║\n" + + "║10║~~~~~~~~~~║\t║10║~~~~~~~~~~║\t║10║~~~~~~~~~~║\n" + + "╚══╩══════════╝\t╚══╩══════════╝\t╚══╩══════════╝"; + + + final Field waterField = FieldControllerImpl.getInstance().instance(); + final Field waterField2 = FieldControllerImpl.getInstance().instance(); + waterField2.setCell(2,0, CellStatus.SHIP); + final Field waterField3 = FieldControllerImpl.getInstance().instance(); + waterField3.setCell(2,0, CellStatus.SHOT); + + FieldControllerImpl.getInstance().drawFields(waterField, waterField2, waterField3); + + assertEquals(expected, getOutput()); + } +} \ No newline at end of file diff --git a/src/test/java/course_project/sea_battle/controller/impl/FireControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/FireControllerImplTest.java new file mode 100644 index 00000000..d71bc534 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/FireControllerImplTest.java @@ -0,0 +1,107 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FireController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class FireControllerImplTest { + Field radar; + Field def; + FireController fireController = FireControllerImpl.getInstance(); + + @BeforeEach + void setField() { + radar = FieldControllerImpl.getInstance().instance(); + def = FieldControllerImpl.getInstance().instance(); + def.setCell(0, 0, CellStatus.SHIP); + def.setCell(1, 0, CellStatus.HIT); + def.setCell(2, 0, CellStatus.SHOT); + def.setCell(3, 0, CellStatus.WATER); + } + + @Test + void fireShipTest() { + assertEquals(CellStatus.WATER, radar.getCell(0,0)); + assertEquals(CellStatus.SHIP, def.getCell(0,0)); + CellStatus cell1 = fireController.fire(def, radar, "a1"); + assertEquals(CellStatus.HIT, radar.getCell(0,0)); + assertEquals(CellStatus.HIT, def.getCell(0,0)); + } + + @Test + void fireHitTest() { + assertEquals(CellStatus.WATER, radar.getCell(1,0)); + assertEquals(CellStatus.HIT, def.getCell(1,0)); + CellStatus cell1 = fireController.fire(def, radar, "b1"); + assertEquals(CellStatus.HIT, radar.getCell(1,0)); + assertEquals(CellStatus.HIT, def.getCell(1,0)); + } + + @Test + void fireShotTest() { + assertEquals(CellStatus.WATER, radar.getCell(2,0)); + assertEquals(CellStatus.SHOT, def.getCell(2,0)); + CellStatus cell1 = fireController.fire(def, radar, "c1"); + assertEquals(CellStatus.SHOT, radar.getCell(2,0)); + assertEquals(CellStatus.SHOT, def.getCell(2,0)); + } + + @Test + void fireWaterTest() { + assertEquals(CellStatus.WATER, radar.getCell(3,0)); + assertEquals(CellStatus.WATER, def.getCell(3,0)); + CellStatus cell1 = fireController.fire(def, radar, "d1"); + assertEquals(CellStatus.SHOT, radar.getCell(3,0)); + assertEquals(CellStatus.SHOT, def.getCell(3,0)); + } + + @Test + void checkFireValidDataTest() { + //проверет на корректные данные координат + boolean res = fireController.checkFire(def, "a2"); + boolean res2 = fireController.checkFire(def, "a3"); + boolean res3 = fireController.checkFire(def, "a4"); + + boolean res4 = fireController.checkFire(def, "a1"); + boolean res5 = fireController.checkFire(def, "b1"); + boolean res6 = fireController.checkFire(def, "c1"); + boolean res7 = fireController.checkFire(def, "d1"); + + assertTrue(res); + assertTrue(res2); + assertTrue(res3); + + assertTrue(res4); + assertTrue(res7); + + // стрелять 2 раза в 1 место нельзя, по этому тут ожидаем обратного + assertFalse(res5); + assertFalse(res6); + } + + @Test + void checkFireInValidDataTest() { + //проверет на корректные данные координат + boolean res = fireController.checkFire(def, "adsf"); + boolean res2 = fireController.checkFire(def, "adsf"); + boolean res3 = fireController.checkFire(def, "asdf"); + + boolean res4 = fireController.checkFire(def, "adf"); + boolean res5 = fireController.checkFire(def, "zcv"); + boolean res6 = fireController.checkFire(def, "asfd"); + boolean res7 = fireController.checkFire(null, "fgj"); + + assertFalse(res); + assertFalse(res2); + assertFalse(res3); + assertFalse(res4); + assertFalse(res5); + assertFalse(res6); + assertFalse(res7); + + } +} \ No newline at end of file diff --git a/src/test/java/course_project/sea_battle/controller/impl/ValidateControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/ValidateControllerImplTest.java new file mode 100644 index 00000000..ae8af477 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/ValidateControllerImplTest.java @@ -0,0 +1,61 @@ +package course_project.sea_battle.controller.impl; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ValidateControllerImplTest { + + @Test + void ValidCoordinateTest() { + final String val1 = "a1"; + final String val2 = "b9"; + final String val3 = "a3"; + final String val4 = "A1"; + + assertTrue(ValidateControllerImpl.getInstance().coordinate(val1)); + assertTrue(ValidateControllerImpl.getInstance().coordinate(val2)); + assertTrue(ValidateControllerImpl.getInstance().coordinate(val3)); + assertTrue(ValidateControllerImpl.getInstance().coordinate(val4)); + } + + @Test + void NotValidCoordinateTest() { + final String val1 = "sdfa"; + final String val2 = "asdkgn."; + final String val3 = "kap 'sf'aojezvczv"; + final String val4 = ""; + final String val5 = null; + + assertFalse(ValidateControllerImpl.getInstance().coordinate(val1)); + assertFalse(ValidateControllerImpl.getInstance().coordinate(val2)); + assertFalse(ValidateControllerImpl.getInstance().coordinate(val3)); + assertFalse(ValidateControllerImpl.getInstance().coordinate(val4)); + assertFalse(ValidateControllerImpl.getInstance().coordinate(val5)); + } + + @Test + void ValidVectorTest() { + final String val1 = "g"; + final String val2 = "v"; + final String val3 = "V"; + + assertTrue(ValidateControllerImpl.getInstance().vector(val1)); + assertTrue(ValidateControllerImpl.getInstance().vector(val2)); + assertTrue(ValidateControllerImpl.getInstance().vector(val3)); + } + + @Test + void NotValidVectorTest() { + final String val1 = "d"; + final String val2 = "z"; + final String val3 = "zfsdfs"; + + final String val4 = null; + + assertFalse(ValidateControllerImpl.getInstance().vector(val1)); + assertFalse(ValidateControllerImpl.getInstance().vector(val2)); + assertFalse(ValidateControllerImpl.getInstance().vector(val3)); + assertFalse(ValidateControllerImpl.getInstance().vector(val4)); + } +} \ No newline at end of file From 24408c33d3b99512483bf480027b6629f959371b Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 11:33:48 +0300 Subject: [PATCH 70/82] Homework3 fix immutableclass --- src/main/java/homework_3/ImmutableClass.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index ac804817..95ee9b54 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,6 +1,7 @@ package homework_3; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /* The class must be declared as final @@ -16,9 +17,7 @@ public final class ImmutableClass { private final List aList; public ImmutableClass(List aList) { - this.aString = "default"; - this.anInt = 0; - this.aList = aList; + this("default", 0, new ArrayList<>(aList)); } public ImmutableClass(String aString, int anInt, List aList) { @@ -28,7 +27,7 @@ public ImmutableClass(String aString, int anInt, List aList) { this.aList = tempList; } - public String getaString() { + public String getString() { return aString; } @@ -37,10 +36,10 @@ public int getAnInt() { } public List getaList() { - return new ArrayList<>(aList); + return Collections.unmodifiableList(aList); } public ImmutableClass getNew(List aList) { - return new ImmutableClass(aString, anInt, aList); + return new ImmutableClass(aList); } } From d579c63cd593d2dae884a9fcd87e0826498540a5 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 11:57:38 +0300 Subject: [PATCH 71/82] Homework3 fix immutableclass --- .../custom_file_reader/CustomFileReader.java | 12 ++++++------ .../SimpleClassWithNameField.java" | 8 ++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) 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 996909a6..79ef7658 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -38,15 +38,15 @@ public static void run() { } public static void run1() throws IOException { - Scanner scanner = new Scanner(getFileURL().openStream()).useDelimiter("\n");; - scanner.forEachRemaining(FUNCTION); - scanner.close(); + try(Scanner scanner = new Scanner(getFileURL().openStream()).useDelimiter("\n")) { + scanner.forEachRemaining(FUNCTION); + } } public static void run2() throws IOException { - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getFileURL().openStream())); - bufferedReader.lines().forEach(FUNCTION); - bufferedReader.close(); + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getFileURL().openStream()))) { + bufferedReader.lines().forEach(FUNCTION); + } } //The resource URL is not working in the JAR public static void run3() throws IOException { diff --git "a/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" "b/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" index 8e8959c0..5f614af3 100644 --- "a/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" +++ "b/src/main/java/homework_4/\321\201ustom_annotation/SimpleClassWithNameField.java" @@ -11,8 +11,12 @@ public SimpleClassWithNameField(String name) { try { constructor = this.getClass().getConstructor(String.class); CustomAnnotation annotation = constructor.getAnnotation(CustomAnnotation.class); - if (annotation != null) this.name = annotation.value(); - if (!name.isEmpty()) this.name = name; + if (annotation != null) { + this.name = annotation.value(); + } + if (!name.isEmpty()) { + this.name = name; + } } catch (NoSuchMethodException e) { e.printStackTrace(); } From acb9a4951b66d23332ea946b7f6a0913a79702b0 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 12:55:53 +0300 Subject: [PATCH 72/82] Homework 6 add mutable --- .../map_problems_generator/Main.java | 19 ++++++++++++++----- .../MapProblemsGenerator.java | 11 ++++++++--- .../problem_impl/MutableProblem.java | 13 +++++++++++++ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 src/main/java/homework_6/map_problems_generator/problem_impl/MutableProblem.java diff --git a/src/main/java/homework_6/map_problems_generator/Main.java b/src/main/java/homework_6/map_problems_generator/Main.java index fa08e011..421ecc80 100644 --- a/src/main/java/homework_6/map_problems_generator/Main.java +++ b/src/main/java/homework_6/map_problems_generator/Main.java @@ -1,5 +1,6 @@ package homework_6.map_problems_generator; +import homework_6.map_problems_generator.problem_impl.MutableProblem; import homework_6.map_problems_generator.problem_impl.Wrapper; import java.io.UncheckedIOException; @@ -7,15 +8,17 @@ import java.util.Map; public class Main { - @SuppressWarnings("unchecked") public static void main(String[] args) { MapProblemsGenerator generator = new MapProblemsGenerator<>(); Map, Integer> problemIntegerHashMap = new HashMap<>(); - Wrapper noProblem = new Wrapper(generator.generateNoProblemClass("first")); - Wrapper collisionProblem = new Wrapper(generator.generateCollisionProblemClass("second")); - Wrapper collisionProblem2 = new Wrapper(generator.generateCollisionProblemClass("third")); - Wrapper gettingProblem = new Wrapper(generator.generateGettingProblemClass("fourth")); + Wrapper noProblem = new Wrapper<>(generator.generateNoProblemClass("first")); + Wrapper collisionProblem = new Wrapper<>(generator.generateCollisionProblemClass("second")); + Wrapper collisionProblem2 = new Wrapper<>(generator.generateCollisionProblemClass("third")); + Wrapper gettingProblem = new Wrapper<>(generator.generateGettingProblemClass("fourth")); + + MutableProblem muttable = generator.generateMutableProblemClass("Muttable"); + Wrapper mutableProblem = new Wrapper<>(muttable); problemIntegerHashMap.put(noProblem, 1); @@ -25,7 +28,13 @@ public static void main(String[] args) { problemIntegerHashMap.put(gettingProblem, 1); problemIntegerHashMap.get(gettingProblem); + problemIntegerHashMap.put(mutableProblem, 1); + System.out.println(problemIntegerHashMap.get(mutableProblem)); + muttable.setValue("Mod " + muttable.getValue()); + System.out.println(problemIntegerHashMap.get(mutableProblem)); problemIntegerHashMap.keySet().forEach(o -> ((Wrapper)o).getEvent().forEach(System.out::println)); + + } } 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 de690490..1e884c10 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java @@ -2,19 +2,24 @@ import homework_6.map_problems_generator.problem_impl.CollisionProblem; import homework_6.map_problems_generator.problem_impl.GettingProblem; +import homework_6.map_problems_generator.problem_impl.MutableProblem; import homework_6.map_problems_generator.problem_impl.NoProblem; public class MapProblemsGenerator { - public NoProblem generateNoProblemClass(T value) { + public NoProblem generateNoProblemClass(T value) { return new NoProblem<>(value); } - public CollisionProblem generateCollisionProblemClass(T value) { + public CollisionProblem generateCollisionProblemClass(T value) { return new CollisionProblem<>(value); } - public GettingProblem generateGettingProblemClass(T value) { + public GettingProblem generateGettingProblemClass(T value) { return new GettingProblem<>(value); } + + public MutableProblem generateMutableProblemClass(T value) { + return new MutableProblem<>(value); + } } diff --git a/src/main/java/homework_6/map_problems_generator/problem_impl/MutableProblem.java b/src/main/java/homework_6/map_problems_generator/problem_impl/MutableProblem.java new file mode 100644 index 00000000..147b13b6 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/problem_impl/MutableProblem.java @@ -0,0 +1,13 @@ +package homework_6.map_problems_generator.problem_impl; + +import homework_6.map_problems_generator.Problem; + +public class MutableProblem extends NoProblem { + public MutableProblem(T value) { + super(value); + } + + public void setValue(T value) { + this.value = value; + } +} From 7a975989ec6f61305557c28221cc5ab8782a7760 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 13:20:44 +0300 Subject: [PATCH 73/82] Homework 3 add mutable --- src/main/java/homework_3/ImmutableClass.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index 95ee9b54..e2bcbfb9 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -21,6 +21,7 @@ public ImmutableClass(List aList) { } public ImmutableClass(String aString, int anInt, List aList) { + //STRING - неизменяемый класс, глубокая копия не нужна, Так как STRING изменить нельзя. List tempList = new ArrayList<>(aList); this.aString = aString; this.anInt = anInt; @@ -36,6 +37,7 @@ public int getAnInt() { } public List getaList() { + //return new ArrayList(aList) - тоже будет прекрасно работать! return Collections.unmodifiableList(aList); } From 71662a49aac00aedbf91ca1851d2c5cf0c06a82f Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 13:47:16 +0300 Subject: [PATCH 74/82] Homework fix SingletonTest --- src/test/java/homework_4/singleton/SingletonTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/homework_4/singleton/SingletonTest.java b/src/test/java/homework_4/singleton/SingletonTest.java index 4880fa4c..dcda1c2c 100644 --- a/src/test/java/homework_4/singleton/SingletonTest.java +++ b/src/test/java/homework_4/singleton/SingletonTest.java @@ -12,5 +12,6 @@ void getInstance() { Singleton singleton2 = Singleton.getInstance(); assertEquals(singleton1, singleton2); + assertTrue(singleton1 == singleton2); } } \ No newline at end of file From 193cfd90b267e786365e4ffe1ab0dfd3e24ecfa6 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 16:49:49 +0300 Subject: [PATCH 75/82] course_project fix and add random fill field --- .../controller/FieldFillController.java | 7 +++ .../controller/GameSetupHolder.java | 7 +++ .../sea_battle/controller/ShipController.java | 1 + .../controller/impl/GameControllerImpl.java | 13 ++--- .../controller/impl/GameSetupHolderImpl.java | 34 +++++++++++++ .../controller/impl/GameSetupsController.java | 46 ------------------ .../impl/ManualFieldFillController.java | 48 +++++++++++++++++++ .../impl/RandomFieldFillController.java | 43 +++++++++++++++++ .../controller/impl/ShipControllerImpl.java | 9 +++- 9 files changed, 155 insertions(+), 53 deletions(-) create mode 100644 src/main/java/course_project/sea_battle/controller/FieldFillController.java create mode 100644 src/main/java/course_project/sea_battle/controller/GameSetupHolder.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/GameSetupHolderImpl.java delete mode 100644 src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java create mode 100644 src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java diff --git a/src/main/java/course_project/sea_battle/controller/FieldFillController.java b/src/main/java/course_project/sea_battle/controller/FieldFillController.java new file mode 100644 index 00000000..10766484 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/FieldFillController.java @@ -0,0 +1,7 @@ +package course_project.sea_battle.controller; + +import course_project.sea_battle.model.Field; + +public interface FieldFillController { + void setShips(Field field); +} diff --git a/src/main/java/course_project/sea_battle/controller/GameSetupHolder.java b/src/main/java/course_project/sea_battle/controller/GameSetupHolder.java new file mode 100644 index 00000000..f3db2ade --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/GameSetupHolder.java @@ -0,0 +1,7 @@ +package course_project.sea_battle.controller; + +import java.util.Map; + +public interface GameSetupHolder { + Map getMapShips(); +} diff --git a/src/main/java/course_project/sea_battle/controller/ShipController.java b/src/main/java/course_project/sea_battle/controller/ShipController.java index d971fab6..1af4a0de 100644 --- a/src/main/java/course_project/sea_battle/controller/ShipController.java +++ b/src/main/java/course_project/sea_battle/controller/ShipController.java @@ -4,5 +4,6 @@ public interface ShipController { boolean placeShip(Field field, String coordinate, String vector, int size); + boolean placeShipByCoordinate(Field field, int x, int y, boolean isVertical, int size); boolean isAnyShipAlive(Field field); } diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index 52da2933..54c72ec3 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -8,7 +8,8 @@ public final class GameControllerImpl implements GameController{ private final PlayerController playerController = PlayerControllerImpl.getInstance(); private final IOController ioController = IOControllerImpl.getInstance(); - private final GameSetupsController gameSetupsController = GameSetupsController.getInstance(); + private final FieldFillController manualFieldFillService = ManualFieldFillController.getInstance(); + private final FieldFillController randomFieldFillController = RandomFieldFillController.getInstance(); private final FieldController fieldController = FieldControllerImpl.getInstance(); private final FireController fireController = FireControllerImpl.getInstance(); private final ShipController shipController = ShipControllerImpl.getInstance(); @@ -18,11 +19,11 @@ private GameControllerImpl() {} public void start() { Game game = new Game(); addPlayers(game); - ioController.print(game.getPlayer1().getName() + ", установите корабли!"); - gameSetupsController.setShips(game.getPlayer1().getFieldPlayer()); - ioController.print(game.getPlayer2().getName() + ", ваша очередь установить корабли!"); - gameSetupsController.setShips(game.getPlayer2().getFieldPlayer()); - ioController.print("Да начнется битва"); + ioController.dialog(game.getPlayer1().getName() + ", установите корабли!"); + randomFieldFillController.setShips(game.getPlayer1().getFieldPlayer()); + ioController.dialog(game.getPlayer2().getName() + ", ваша очередь установить корабли!"); + randomFieldFillController.setShips(game.getPlayer2().getFieldPlayer()); + ioController.dialog("Да начнется битва"); doGame(game); ioController.close(); diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameSetupHolderImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameSetupHolderImpl.java new file mode 100644 index 00000000..4d56cd04 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/GameSetupHolderImpl.java @@ -0,0 +1,34 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.GameSetupHolder; + +import java.util.Comparator; +import java.util.Map; +import java.util.TreeMap; + +public final class GameSetupHolderImpl implements GameSetupHolder { + private final Map map; + + private GameSetupHolderImpl() { + map = new TreeMap<>(Comparator.reverseOrder()); + map.put(4, 1); + map.put(3, 2); + map.put(2, 3); + map.put(1, 4); + } + + @Override + public Map getMapShips() { + TreeMap copyMap = new TreeMap<>(Comparator.reverseOrder()); + copyMap.putAll(map); + return copyMap; + } + + public static GameSetupHolderImpl getInstance() { + return GameSetupHolderImpl.Holder.INSTANCE; + } + + private static class Holder { + static final GameSetupHolderImpl INSTANCE = new GameSetupHolderImpl(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java b/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java deleted file mode 100644 index b039462e..00000000 --- a/src/main/java/course_project/sea_battle/controller/impl/GameSetupsController.java +++ /dev/null @@ -1,46 +0,0 @@ -package course_project.sea_battle.controller.impl; - -import course_project.sea_battle.controller.FieldController; -import course_project.sea_battle.controller.ShipController; -import course_project.sea_battle.model.Field; - -public final class GameSetupsController { - private final int[] DECK_4 = {4, 1}; - private final int[] DECK_3 = {3, 2}; - private final int[] DECK_2 = {2, 3}; - private final int[] DECK_1 = {1, 4}; - - private final ShipController shipController = ShipControllerImpl.getInstance(); - private final IOControllerImpl ioController = IOControllerImpl.getInstance(); - private final FieldController fieldController = FieldControllerImpl.getInstance(); - - private GameSetupsController() {} - - public void setShips(Field field) { - setShipsByType(field, DECK_4); - setShipsByType(field, DECK_3); - setShipsByType(field, DECK_2); - setShipsByType(field, DECK_1); - } - - private void setShipsByType(Field field, int[] deck) { - String coordinate; - String vector; - ioController.print("Введите " + deck[0] + " палубных коробля. Количество: " + deck[1]); - for (int i = 0; i < deck[1]; i++) { - do { - coordinate = ioController.dialog("Введите координаты\n(Exemple: a1):"); - vector = ioController.dialog("Введите направление(v/g):"); - } while (!shipController.placeShip(field, coordinate, vector, deck[0])); - fieldController.drawFields(field); - } - } - - public static GameSetupsController getInstance() { - return GameSetupsController.Holder.INSTANCE; - } - - private static class Holder { - static final GameSetupsController INSTANCE = new GameSetupsController(); - } -} diff --git a/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java b/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java new file mode 100644 index 00000000..2d09f694 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java @@ -0,0 +1,48 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.controller.FieldFillController; +import course_project.sea_battle.controller.GameSetupHolder; +import course_project.sea_battle.controller.ShipController; +import course_project.sea_battle.model.Field; + +import java.util.*; + +public final class ManualFieldFillController implements FieldFillController { + private final ShipController shipController = ShipControllerImpl.getInstance(); + private final IOControllerImpl ioController = IOControllerImpl.getInstance(); + private final FieldController fieldController = FieldControllerImpl.getInstance(); + private final GameSetupHolder gameSetupHolder = GameSetupHolderImpl.getInstance(); + + private ManualFieldFillController() { + } + + @Override + public void setShips(Field field) { + Map mapShips = gameSetupHolder.getMapShips(); + for (Map.Entry entry : mapShips.entrySet()) { + setShipsByType(field, entry); + } + } + + private void setShipsByType(Field field, Map.Entry entry) { + String coordinate; + String vector; + ioController.print("Введите " + entry.getKey() + " палубных коробля. Количество: " + entry.getValue()); + for (int i = 0; i < entry.getValue(); i++) { + do { + coordinate = ioController.dialog("Введите координаты\n(Exemple: a1):"); + vector = ioController.dialog("Введите направление(v/g):"); + } while (!shipController.placeShip(field, coordinate, vector, entry.getKey())); + fieldController.drawFields(field); + } + } + + public static ManualFieldFillController getInstance() { + return ManualFieldFillController.Holder.INSTANCE; + } + + private static class Holder { + static final ManualFieldFillController INSTANCE = new ManualFieldFillController(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java b/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java new file mode 100644 index 00000000..f998a612 --- /dev/null +++ b/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java @@ -0,0 +1,43 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.controller.GameSetupHolder; +import course_project.sea_battle.controller.FieldFillController; +import course_project.sea_battle.controller.ShipController; +import course_project.sea_battle.model.Field; + +import java.util.Map; +import java.util.Random; + +public final class RandomFieldFillController implements FieldFillController { + private final ShipController shipController = ShipControllerImpl.getInstance(); + private final GameSetupHolder gameSetupHolder = GameSetupHolderImpl.getInstance(); + private final FieldController fieldController = FieldControllerImpl.getInstance(); + + private RandomFieldFillController() {} + + @Override + public void setShips(Field field) { + Random random = new Random(); + for (Map.Entry entry : + gameSetupHolder.getMapShips().entrySet()) { + for (int i = 0; i < entry.getValue(); i++) { + while (!shipController.placeShipByCoordinate( + field, + random.nextInt(9), + random.nextInt(9), + random.nextBoolean(), + entry.getKey())); + } + } + fieldController.drawFields(field); + } + + public static RandomFieldFillController getInstance() { + return RandomFieldFillController.Holder.INSTANCE; + } + + private static class Holder { + static final RandomFieldFillController INSTANCE = new RandomFieldFillController(); + } +} diff --git a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java index f3a59758..5e00a013 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ShipControllerImpl.java @@ -14,7 +14,6 @@ private ShipControllerImpl() {} @Override public boolean placeShip(Field field, String coordinate, String vector, int size) { - if (field == null) return false; if (!validateController.coordinate(coordinate)) return false; if (!validateController.vector(vector)) return false; @@ -22,6 +21,14 @@ public boolean placeShip(Field field, String coordinate, String vector, int size int x = cordXY[0], y = cordXY[1]; boolean isVertical = parserController.isVerticalVector(vector); + return placeShipByCoordinate(field, x, y, isVertical, size); + } + + @Override + public boolean placeShipByCoordinate(Field field, int x, int y, boolean isVertical, int size) { + if (field == null) return false; + if (0 > x || x > 9) return false; + if (0 > y || y > 9) return false; Ship ship = new Ship(size, x, y, isVertical); if (!isAvailable(field, ship)) return false; From 5d672089d3656af21d4dad503a118fccb414ae41 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 17:57:17 +0300 Subject: [PATCH 76/82] course_project fix --- .../sea_battle/controller/IOController.java | 1 + .../controller/impl/GameControllerImpl.java | 56 ++++++++++++++----- .../controller/impl/IOControllerImpl.java | 7 ++- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/main/java/course_project/sea_battle/controller/IOController.java b/src/main/java/course_project/sea_battle/controller/IOController.java index 4df815be..b8a3316d 100644 --- a/src/main/java/course_project/sea_battle/controller/IOController.java +++ b/src/main/java/course_project/sea_battle/controller/IOController.java @@ -1,6 +1,7 @@ package course_project.sea_battle.controller; public interface IOController { + void clr(); void close(); String dialog(String msg); void print(String msg); diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index 54c72ec3..cae5ced1 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -19,11 +19,12 @@ private GameControllerImpl() {} public void start() { Game game = new Game(); addPlayers(game); - ioController.dialog(game.getPlayer1().getName() + ", установите корабли!"); - randomFieldFillController.setShips(game.getPlayer1().getFieldPlayer()); - ioController.dialog(game.getPlayer2().getName() + ", ваша очередь установить корабли!"); - randomFieldFillController.setShips(game.getPlayer2().getFieldPlayer()); + setShips(game.getPlayer1()); + ioController.dialog("Позовите Следующего"); + ioController.clr(); + setShips(game.getPlayer2()); ioController.dialog("Да начнется битва"); + ioController.clr(); doGame(game); ioController.close(); @@ -42,6 +43,21 @@ private void addPlayers(Game game) { game.setPlayer2(playerController.instance(name2)); } + private void setShips(GamePlayer player) { + ioController.print(player.getName() + ", установите корабли!"); + boolean nextStep = false; + while (!nextStep) { + String answerP1 = ioController.dialog("Заполнить рандомно?(y/n):"); + if (answerP1.trim().toLowerCase().matches("y")) { + randomFieldFillController.setShips(player.getFieldPlayer()); + nextStep = true; + } else if (answerP1.trim().toLowerCase().matches("n")) { + manualFieldFillService.setShips(player.getFieldPlayer()); + nextStep = true; + } + } + } + private void doGame(Game game){ boolean isPlayer1Move = true; boolean isGameOver = false; @@ -59,16 +75,8 @@ private void doGame(Game game){ playerDef = game.getPlayer1(); } - ioController.dialog(playerAtk.getName() + ", Ваш ход!"); - fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); - String coordinate; - do coordinate = ioController.dialog("Координаты:"); - while (!fireController.checkFire(playerAtk.getRadarPlayer(), coordinate)); - CellStatus cellStatus = fireController.fire(playerDef.getFieldPlayer(), - playerAtk.getRadarPlayer(), - coordinate); - fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); - if (cellStatus != CellStatus.HIT) { + ioController.clr(); + if (!turnResult(playerAtk, playerDef)) { isPlayer1Move = !isPlayer1Move; } isGameOver = !shipController.isAnyShipAlive(playerDef.getFieldPlayer()); @@ -79,6 +87,26 @@ private void doGame(Game game){ playerDef.getFieldPlayer(), playerDef.getRadarPlayer()); } + private boolean turnResult(GamePlayer playerAtk, GamePlayer playerDef) { + ioController.dialog(playerAtk.getName() + ", Ваш ход!"); + fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); + String coordinate; + do coordinate = ioController.dialog("Координаты:"); + while (!fireController.checkFire(playerAtk.getRadarPlayer(), coordinate)); + CellStatus cellStatus = fireController.fire(playerDef.getFieldPlayer(), + playerAtk.getRadarPlayer(), + coordinate); + fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer()); + if (cellStatus != CellStatus.HIT) { + ioController.dialog("Мимо!"); + ioController.clr(); + return false; + } else { + ioController.dialog("Попали!"); + return true; + } + } + public static GameControllerImpl getInstance() { return GameControllerImpl.Holder.INSTANCE; } diff --git a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java index 3480ab53..bd1ea3b1 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java @@ -5,7 +5,7 @@ import java.util.Scanner; public final class IOControllerImpl implements IOController { - private final Scanner scanner = new Scanner(System.in); + private final Scanner scanner = new Scanner(System.in).useDelimiter("\n"); @Override public String dialog(String msg) { @@ -13,6 +13,11 @@ public String dialog(String msg) { return scanner.nextLine(); } + @Override + public void clr() { + print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + } + @Override public void print(String msg) { System.out.println(msg); From 2be5bc19f54e3265a8022a1ef892ed6178c9933c Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 18:53:34 +0300 Subject: [PATCH 77/82] course_project fix --- .../controller/FieldFillController.java | 1 + .../controller/ParseController.java | 1 - .../controller/impl/GameControllerImpl.java | 2 + .../controller/impl/IOControllerImpl.java | 2 +- .../impl/ManualFieldFillController.java | 8 +++- .../impl/RandomFieldFillController.java | 9 +++- .../impl/RandomFieldFillControllerTest.java | 46 +++++++++++++++++++ 7 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java diff --git a/src/main/java/course_project/sea_battle/controller/FieldFillController.java b/src/main/java/course_project/sea_battle/controller/FieldFillController.java index 10766484..fcf5f9b8 100644 --- a/src/main/java/course_project/sea_battle/controller/FieldFillController.java +++ b/src/main/java/course_project/sea_battle/controller/FieldFillController.java @@ -4,4 +4,5 @@ public interface FieldFillController { void setShips(Field field); + FieldFillController setGameSetupHolder(GameSetupHolder gameSetupHolder); } diff --git a/src/main/java/course_project/sea_battle/controller/ParseController.java b/src/main/java/course_project/sea_battle/controller/ParseController.java index e4769b48..9ce44292 100644 --- a/src/main/java/course_project/sea_battle/controller/ParseController.java +++ b/src/main/java/course_project/sea_battle/controller/ParseController.java @@ -1,7 +1,6 @@ package course_project.sea_battle.controller; public interface ParseController { - int[] parseCoordinate(String coordinate); boolean isVerticalVector(String vector); } diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index cae5ced1..993aa481 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -54,6 +54,8 @@ private void setShips(GamePlayer player) { } else if (answerP1.trim().toLowerCase().matches("n")) { manualFieldFillService.setShips(player.getFieldPlayer()); nextStep = true; + } else { + ioController.print("Попробуйте еще раз"); } } } diff --git a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java index bd1ea3b1..5ef4c6a7 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java @@ -15,7 +15,7 @@ public String dialog(String msg) { @Override public void clr() { - print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); } @Override diff --git a/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java b/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java index 2d09f694..e9223896 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java +++ b/src/main/java/course_project/sea_battle/controller/impl/ManualFieldFillController.java @@ -12,7 +12,8 @@ public final class ManualFieldFillController implements FieldFillController { private final ShipController shipController = ShipControllerImpl.getInstance(); private final IOControllerImpl ioController = IOControllerImpl.getInstance(); private final FieldController fieldController = FieldControllerImpl.getInstance(); - private final GameSetupHolder gameSetupHolder = GameSetupHolderImpl.getInstance(); + // я нарушаю свою идею тут, но так проще тестить + private GameSetupHolder gameSetupHolder = GameSetupHolderImpl.getInstance(); private ManualFieldFillController() { } @@ -38,6 +39,11 @@ private void setShipsByType(Field field, Map.Entry entry) { } } + public FieldFillController setGameSetupHolder(GameSetupHolder gameSetupHolder) { + this.gameSetupHolder = gameSetupHolder; + return this; + } + public static ManualFieldFillController getInstance() { return ManualFieldFillController.Holder.INSTANCE; } diff --git a/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java b/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java index f998a612..061d1cc1 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java +++ b/src/main/java/course_project/sea_battle/controller/impl/RandomFieldFillController.java @@ -11,7 +11,8 @@ public final class RandomFieldFillController implements FieldFillController { private final ShipController shipController = ShipControllerImpl.getInstance(); - private final GameSetupHolder gameSetupHolder = GameSetupHolderImpl.getInstance(); + // я нарушаю свою идею тут, но так проще тестить + private GameSetupHolder gameSetupHolder = GameSetupHolderImpl.getInstance(); private final FieldController fieldController = FieldControllerImpl.getInstance(); private RandomFieldFillController() {} @@ -33,6 +34,12 @@ public void setShips(Field field) { fieldController.drawFields(field); } + @Override + public FieldFillController setGameSetupHolder(GameSetupHolder gameSetupHolder) { + this.gameSetupHolder = gameSetupHolder; + return this; + } + public static RandomFieldFillController getInstance() { return RandomFieldFillController.Holder.INSTANCE; } diff --git a/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java b/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java new file mode 100644 index 00000000..6769ab14 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java @@ -0,0 +1,46 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldFillController; +import course_project.sea_battle.controller.ShipController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.TreeMap; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomFieldFillControllerTest { + + FieldFillController randomFieldFillController; + FieldControllerImpl fieldController = FieldControllerImpl.getInstance(); + ShipController shipController = ShipControllerImpl.getInstance(); + + @AfterEach + void after() { + randomFieldFillController = null; + } + @Test + void setShips() { + randomFieldFillController = RandomFieldFillController.getInstance() + .setGameSetupHolder(()-> { + TreeMap map = new TreeMap<>(Comparator.reverseOrder()); + map.put(5, 1); + return map; + }); + + Field instance = fieldController.instance(); + assertFalse(shipController.isAnyShipAlive(instance)); + randomFieldFillController.setShips(instance); + assertTrue(shipController.isAnyShipAlive(instance)); + long count = Arrays.stream(instance.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count(); + assertEquals(5, count); + } +} \ No newline at end of file From a2464ceb61fac5567219c1ea661a2d7ca9e0bcee Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 19:28:23 +0300 Subject: [PATCH 78/82] course_project test --- .../impl/ShipControllerImplTest.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 src/test/java/course_project/sea_battle/controller/impl/ShipControllerImplTest.java diff --git a/src/test/java/course_project/sea_battle/controller/impl/ShipControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/ShipControllerImplTest.java new file mode 100644 index 00000000..8a4d5485 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/ShipControllerImplTest.java @@ -0,0 +1,118 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldController; +import course_project.sea_battle.controller.ShipController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +class ShipControllerImplTest { + FieldController fieldController = FieldControllerImpl.getInstance(); + ShipController shipController = ShipControllerImpl.getInstance(); + Field field; + + @BeforeEach + void set() { + field = fieldController.instance(); + assertTrue(Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .allMatch(x -> x.equals(CellStatus.WATER))); + } + + @Test + void placeShip4timeTest() { + assertTrue(shipController.placeShip(field, "a1","v", 5)); + assertFalse(shipController.placeShip(field, "a1","v", 5)); + assertFalse(shipController.placeShip(field, "a1","v", 5)); + assertFalse(shipController.placeShip(field, "a1","v", 5)); + assertFalse(shipController.placeShip(field, "a1","v", 5)); + + assertEquals(5, Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count() + ); + } + + @Test + void placeShip1timeTest() { + assertTrue(shipController.placeShip(field, "a1","v", 5)); + assertEquals(5, Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count() + ); + } + + @Test + void placeShipNotValidCoordinateTest() { + assertFalse(shipController.placeShip(field, "z1","v", 5)); + assertFalse(shipController.placeShip(field, "a11","v", 5)); + assertFalse(shipController.placeShip(field, "z11","v", 5)); + assertFalse(shipController.placeShip(field, "a1","q", 5)); + assertFalse(shipController.placeShip(field, "a1","w", 5)); + + assertEquals(0, Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count() + ); + } + + @Test + void placeShipByCoordinate4timeTest() { + assertTrue(shipController.placeShipByCoordinate(field, 0, 0, true, 5)); + assertFalse(shipController.placeShipByCoordinate(field, 0, 0, true, 5)); + assertFalse(shipController.placeShipByCoordinate(field, 0, 1, true, 5)); + assertFalse(shipController.placeShipByCoordinate(field, 0, 4, true, 5)); + + assertEquals(field.getCell(0, 0), CellStatus.SHIP); + assertEquals(field.getCell(0, 1), CellStatus.SHIP); + assertEquals(field.getCell(0, 2), CellStatus.SHIP); + assertEquals(field.getCell(0, 3), CellStatus.SHIP); + assertEquals(field.getCell(0, 4), CellStatus.SHIP); + + assertNotEquals(field.getCell(0, 5), CellStatus.SHIP); + } + + @Test + void placeShipByCoordinate1TimeTest() { + assertTrue(shipController.placeShipByCoordinate(field, 0, 0, true, 3)); + + assertEquals(field.getCell(0, 0), CellStatus.SHIP); + assertEquals(field.getCell(0, 1), CellStatus.SHIP); + assertEquals(field.getCell(0, 2), CellStatus.SHIP); + assertNotEquals(field.getCell(0, 3), CellStatus.SHIP); + assertNotEquals(field.getCell(0, 4), CellStatus.SHIP); + assertNotEquals(field.getCell(0, 5), CellStatus.SHIP); + } + + @Test + void placeShipByNotValidCoordinate() { + assertFalse(shipController.placeShipByCoordinate(field, 10, 0, true, 3)); + + field = fieldController.instance(); + assertTrue(Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .allMatch(x -> x.equals(CellStatus.WATER))); + } + + @Test + void isAnyShipAlive() { + assertFalse(shipController.isAnyShipAlive(field)); + field.setCell(0,0, CellStatus.SHIP); + assertFalse(shipController.isAnyShipAlive(field)); + field.setCell(0,0, CellStatus.WATER); + assertFalse(shipController.isAnyShipAlive(field)); + field.setCell(0,0, CellStatus.SHOT); + assertFalse(shipController.isAnyShipAlive(field)); + + assertTrue(shipController.isAnyShipAlive(field)); + field.setCell(0,0, CellStatus.HIT); + } +} \ No newline at end of file From d56c17e0c1f4263fd1c0666c13cf5dfdf564d20a Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 19:50:32 +0300 Subject: [PATCH 79/82] course_project test --- .../impl/ParserControllerImplTest.java | 33 +++++++++++++++++++ .../impl/RandomFieldFillControllerTest.java | 23 ++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/test/java/course_project/sea_battle/controller/impl/ParserControllerImplTest.java diff --git a/src/test/java/course_project/sea_battle/controller/impl/ParserControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/ParserControllerImplTest.java new file mode 100644 index 00000000..210b5959 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/ParserControllerImplTest.java @@ -0,0 +1,33 @@ +package course_project.sea_battle.controller.impl; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +/* + так как парсер работает только с валидированными данными не валидные значения не имеют значения + */ +class ParserControllerImplTest { + course_project.sea_battle.controller.ParseController instance = ParserControllerImpl.getInstance(); + + @Test + void parseCoordinate() { + final String valid1 = "a1"; + final String valid2 = "b5"; + final String valid3 = "g1"; + final String valid4 = "h10"; + + assertArrayEquals(new int[]{0,0}, instance.parseCoordinate(valid1)); + assertArrayEquals(new int[]{1,4}, instance.parseCoordinate(valid2)); + assertArrayEquals(new int[]{6,0}, instance.parseCoordinate(valid3)); + assertArrayEquals(new int[]{7,9}, instance.parseCoordinate(valid4)); + } + + @Test + void isVerticalVector() { + final String valid1 = "v"; + final String valid2 = "g"; + + assertTrue(instance.isVerticalVector(valid1)); + assertFalse(instance.isVerticalVector(valid2)); + } +} \ No newline at end of file diff --git a/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java b/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java index 6769ab14..cc31d8e9 100644 --- a/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java +++ b/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java @@ -25,7 +25,7 @@ void after() { randomFieldFillController = null; } @Test - void setShips() { + void setShip() { randomFieldFillController = RandomFieldFillController.getInstance() .setGameSetupHolder(()-> { TreeMap map = new TreeMap<>(Comparator.reverseOrder()); @@ -43,4 +43,25 @@ void setShips() { .count(); assertEquals(5, count); } + + @Test + void setShips2() { + randomFieldFillController = RandomFieldFillController.getInstance() + .setGameSetupHolder(()-> { + TreeMap map = new TreeMap<>(Comparator.reverseOrder()); + map.put(5, 2); + return map; + }); + + Field instance = fieldController.instance(); + assertFalse(shipController.isAnyShipAlive(instance)); + randomFieldFillController.setShips(instance); + assertTrue(shipController.isAnyShipAlive(instance)); + + long count = Arrays.stream(instance.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count(); + assertEquals(10, count); + } } \ No newline at end of file From 71f99ca4e419fbbf0bf25711016a00301e5209fd Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 22:00:21 +0300 Subject: [PATCH 80/82] course_project test --- .../sea_battle/SeaBattleApp.java | 9 ++- .../sea_battle/controller/GameController.java | 4 +- .../controller/impl/GameControllerImpl.java | 4 +- .../controller/impl/IOControllerImpl.java | 8 ++- .../course_project/sea_battle/model/Game.java | 9 +++ .../impl/GameControllerImplTest.java | 72 +++++++++++++++++++ .../impl/ManualFieldFillControllerTest.java | 64 +++++++++++++++++ .../impl/PlayerControllerImplTest.java | 37 ++++++++++ .../impl/RandomFieldFillControllerTest.java | 2 +- 9 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java create mode 100644 src/test/java/course_project/sea_battle/controller/impl/ManualFieldFillControllerTest.java create mode 100644 src/test/java/course_project/sea_battle/controller/impl/PlayerControllerImplTest.java diff --git a/src/main/java/course_project/sea_battle/SeaBattleApp.java b/src/main/java/course_project/sea_battle/SeaBattleApp.java index 2331e287..0016f676 100644 --- a/src/main/java/course_project/sea_battle/SeaBattleApp.java +++ b/src/main/java/course_project/sea_battle/SeaBattleApp.java @@ -1,9 +1,16 @@ package course_project.sea_battle; import course_project.sea_battle.controller.impl.GameControllerImpl; +import course_project.sea_battle.controller.impl.IOControllerImpl; public class SeaBattleApp { public static void main(String[] args) { - GameControllerImpl.getInstance().start(); + try { + GameControllerImpl.getInstance().start(); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + IOControllerImpl.getInstance().close(); + } } } diff --git a/src/main/java/course_project/sea_battle/controller/GameController.java b/src/main/java/course_project/sea_battle/controller/GameController.java index 6539a567..85ce7052 100644 --- a/src/main/java/course_project/sea_battle/controller/GameController.java +++ b/src/main/java/course_project/sea_battle/controller/GameController.java @@ -1,5 +1,7 @@ package course_project.sea_battle.controller; +import course_project.sea_battle.model.Game; + public interface GameController { - void start(); + Game start(); } diff --git a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java index 993aa481..77bd43c0 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/GameControllerImpl.java @@ -16,7 +16,7 @@ public final class GameControllerImpl implements GameController{ private GameControllerImpl() {} - public void start() { + public Game start() { Game game = new Game(); addPlayers(game); setShips(game.getPlayer1()); @@ -28,6 +28,7 @@ public void start() { doGame(game); ioController.close(); + return game; } private void addPlayers(Game game) { @@ -87,6 +88,7 @@ private void doGame(Game game){ ioController.print(playerDef.getName() + " Проиграл!"); fieldController.drawFields(playerAtk.getFieldPlayer(), playerAtk.getRadarPlayer(), playerDef.getFieldPlayer(), playerDef.getRadarPlayer()); + game.setPlayerWin(playerAtk); } private boolean turnResult(GamePlayer playerAtk, GamePlayer playerDef) { diff --git a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java index 5ef4c6a7..075e6738 100644 --- a/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java +++ b/src/main/java/course_project/sea_battle/controller/impl/IOControllerImpl.java @@ -5,7 +5,8 @@ import java.util.Scanner; public final class IOControllerImpl implements IOController { - private final Scanner scanner = new Scanner(System.in).useDelimiter("\n"); + //только для тестов. Я не знаю как сделать иначе, теперь сканер не финален и это ужасно. + private Scanner scanner = new Scanner(System.in).useDelimiter("\n"); @Override public String dialog(String msg) { @@ -28,6 +29,11 @@ public void close() { scanner.close(); } + //только для тестов. Я не знаю как сделать иначе + public void setScanner(Scanner scanner) { + this.scanner = scanner; + } + private IOControllerImpl() {} public static IOControllerImpl getInstance() { diff --git a/src/main/java/course_project/sea_battle/model/Game.java b/src/main/java/course_project/sea_battle/model/Game.java index f544aa61..be6b2f0e 100644 --- a/src/main/java/course_project/sea_battle/model/Game.java +++ b/src/main/java/course_project/sea_battle/model/Game.java @@ -5,6 +5,8 @@ public class Game { private GamePlayer player1; private GamePlayer player2; + private GamePlayer playerWin = null; + public GamePlayer getPlayer1() { return player1; } @@ -21,4 +23,11 @@ public void setPlayer2(GamePlayer player2) { this.player2 = player2; } + public GamePlayer getPlayerWin() { + return playerWin; + } + + public void setPlayerWin(GamePlayer playerWin) { + this.playerWin = playerWin; + } } diff --git a/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java new file mode 100644 index 00000000..be03b23e --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java @@ -0,0 +1,72 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.*; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; +import course_project.sea_battle.model.Game; +import course_project.sea_battle.model.GamePlayer; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +class GameControllerImplTest { + GameController gameController = GameControllerImpl.getInstance(); + IOControllerImpl ioController = IOControllerImpl.getInstance(); + FieldFillController randomFieldFillController = ManualFieldFillController.getInstance(); + final String firstPlayerName = "First player"; + final String secondPlayerName = "Second player"; + + @BeforeEach + void set() { + // Это не тест, а скорее игра в игру по сценарию. + // В игре каждый игрок ставит по 2 коробля (1 и 2 клетки) + // сделано от безисходности, так как не знаю как еще написать тут что то. + // но можно проверить + + + final String input = "" + + firstPlayerName + "\n" + //вводится имя 1го + secondPlayerName + "\n" + //вводится имя 2го + "n\n" + "a1\n" + "v\n" + "c1\n" + "v\n" + // говорим что руками поставим корабли и ставим a1 и с1 оба вертикально + "\n" + // передаем ход + "n\n" + "d1\n" + "G\n" + "g1\n" + "G\n" + // выставляем так же корабли + "\n" + // начинаем игру + "\n" + "a1\n" + "\n" + // принимаем ход, делаем выстрел мимо, передаем ход + "\n" + "a1\n" + "\n" + "\n" + "a2\n" + "\n" + "\n" + "c1\n" + "\n"; // делаем 3 выстрела, и выигрываем + + ioController.setScanner(new Scanner(input)); + + randomFieldFillController.setGameSetupHolder(() -> { + Map map = new TreeMap<>(Comparator.reverseOrder()); + map.put(1, 1); + map.put(2, 1); + return map; + }); + } + @Test + void TestWinner() { + Game game = gameController.start(); + assertEquals(firstPlayerName, game.getPlayer1().getName()); + assertEquals(secondPlayerName, game.getPlayer2().getName()); + assertEquals(secondPlayerName, game.getPlayerWin().getName()); + } + @Test + void TestWinnerFieldAndRadar() { + Game game = gameController.start(); + GamePlayer playerWin = game.getPlayerWin(); + + Field fieldPlayer = playerWin.getFieldPlayer(); + Field radarPlayer = playerWin.getRadarPlayer(); + + assertTrue(ShipControllerImpl.getInstance().isAnyShipAlive(fieldPlayer)); + + assertEquals(3, + Arrays.stream(radarPlayer.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.HIT)) + .count()); + } +} \ No newline at end of file diff --git a/src/test/java/course_project/sea_battle/controller/impl/ManualFieldFillControllerTest.java b/src/test/java/course_project/sea_battle/controller/impl/ManualFieldFillControllerTest.java new file mode 100644 index 00000000..4336c536 --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/ManualFieldFillControllerTest.java @@ -0,0 +1,64 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.FieldFillController; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.Field; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +class ManualFieldFillControllerTest { + FieldFillController fieldFillController = ManualFieldFillController.getInstance(); + Field field = FieldControllerImpl.getInstance().instance(); + + @Test + void setShips1Test() { + fieldFillController.setGameSetupHolder(() -> { + Map integerIntegerMap = new TreeMap<>(Comparator.reverseOrder()); + integerIntegerMap.put(6, 1); + return integerIntegerMap; + }); + + IOControllerImpl ioController = IOControllerImpl.getInstance(); + + final String value = "a1\nv"; + ioController.setScanner(new Scanner(value)); + + fieldFillController.setShips(field); + + assertEquals(6, Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count()); + + ioController.close(); + } + + @Test + void setShips2Test() { + fieldFillController.setGameSetupHolder(() -> { + Map integerIntegerMap = new TreeMap<>(Comparator.reverseOrder()); + integerIntegerMap.put(6, 2); + return integerIntegerMap; + }); + + IOControllerImpl ioController = IOControllerImpl.getInstance(); + + final String value = + "a1\nv\n" + + "c1\ng"; + + ioController.setScanner(new Scanner(value)); + + fieldFillController.setShips(field); + + assertEquals(6 * 2, Arrays.stream(field.getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.SHIP)) + .count()); + + ioController.close(); + } +} \ No newline at end of file diff --git a/src/test/java/course_project/sea_battle/controller/impl/PlayerControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/PlayerControllerImplTest.java new file mode 100644 index 00000000..8fc08b8a --- /dev/null +++ b/src/test/java/course_project/sea_battle/controller/impl/PlayerControllerImplTest.java @@ -0,0 +1,37 @@ +package course_project.sea_battle.controller.impl; + +import course_project.sea_battle.controller.PlayerController; +import course_project.sea_battle.model.BasePlayer; +import course_project.sea_battle.model.CellStatus; +import course_project.sea_battle.model.GamePlayer; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class PlayerControllerImplTest { + PlayerController playerController = PlayerControllerImpl.getInstance(); + @Test + void instance() { + final String val1= "Тест 1"; + + BasePlayer player = playerController.instance(val1); + assertEquals(val1, player.getName()); + GamePlayer gamePlayer = null; + if (player.getClass() == GamePlayer.class) gamePlayer = (GamePlayer) player; + assertNotNull(gamePlayer); + assertNotNull(gamePlayer.getFieldPlayer()); + assertNotNull(gamePlayer.getRadarPlayer()); + + assertEquals(100, Arrays.stream(gamePlayer.getFieldPlayer().getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.WATER)) + .count()); + assertEquals(100, Arrays.stream(gamePlayer.getRadarPlayer().getCells()) + .flatMap(Arrays::stream) + .filter(x -> x.equals(CellStatus.WATER)) + .count()); + } +} \ No newline at end of file diff --git a/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java b/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java index cc31d8e9..ea913557 100644 --- a/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java +++ b/src/test/java/course_project/sea_battle/controller/impl/RandomFieldFillControllerTest.java @@ -62,6 +62,6 @@ void setShips2() { .flatMap(Arrays::stream) .filter(x -> x.equals(CellStatus.SHIP)) .count(); - assertEquals(10, count); + assertEquals(5 * 2, count); } } \ No newline at end of file From d6cb9f7bc2a84cef083e9faf9ad3583fea516184 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Tue, 21 Sep 2021 22:09:26 +0300 Subject: [PATCH 81/82] course_project test --- .../controller/impl/GameControllerImplTest.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java b/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java index be03b23e..edd626bd 100644 --- a/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java +++ b/src/test/java/course_project/sea_battle/controller/impl/GameControllerImplTest.java @@ -46,21 +46,20 @@ void set() { return map; }); } + @Test void TestWinner() { Game game = gameController.start(); - assertEquals(firstPlayerName, game.getPlayer1().getName()); - assertEquals(secondPlayerName, game.getPlayer2().getName()); - assertEquals(secondPlayerName, game.getPlayerWin().getName()); - } - @Test - void TestWinnerFieldAndRadar() { - Game game = gameController.start(); + GamePlayer playerWin = game.getPlayerWin(); Field fieldPlayer = playerWin.getFieldPlayer(); Field radarPlayer = playerWin.getRadarPlayer(); + assertEquals(firstPlayerName, game.getPlayer1().getName()); + assertEquals(secondPlayerName, game.getPlayer2().getName()); + assertEquals(secondPlayerName, game.getPlayerWin().getName()); + assertTrue(ShipControllerImpl.getInstance().isAnyShipAlive(fieldPlayer)); assertEquals(3, From a7c52310d3c3b8664f8bd75c7fe3cf78fcbb5e66 Mon Sep 17 00:00:00 2001 From: kirillfilipcik Date: Wed, 22 Sep 2021 18:24:53 +0300 Subject: [PATCH 82/82] hw_3 fix --- src/main/java/homework_3/ImmutableClass.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index e2bcbfb9..90f0e085 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -36,12 +36,12 @@ public int getAnInt() { return anInt; } - public List getaList() { - //return new ArrayList(aList) - тоже будет прекрасно работать! - return Collections.unmodifiableList(aList); + public List getAList() { + //return Collections.unmodifiableList(aList) - тоже будет прекрасно работать! + return new ArrayList<>(aList); } public ImmutableClass getNew(List aList) { - return new ImmutableClass(aList); + return new ImmutableClass(getString(), getAnInt(), aList); } }