From d4cf36e00c6d2f1bf18be819a81299abf60d3d78 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Wed, 7 Jul 2021 15:54:12 +0300 Subject: [PATCH 01/27] 111 --- 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 07c029a2..0a7ab706 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -3,7 +3,7 @@ public class Main { public static void main(String[] args) { - System.out.println("Hello homework!"); + System.out.println("Hello, St. Petersburg!"); } } From 0418c0261440adf871d04e3fc7bf75c419de5129 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Thu, 8 Jul 2021 16:10:22 +0300 Subject: [PATCH 02/27] Completed homework_1 --- src/main/java/homework_1/Main.java | 31 +++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index 0a7ab706..dddc9f22 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -1,9 +1,38 @@ package homework_1; +import java.util.Scanner; public class Main { + static final String RED = "\u001b[31m"; + static final String RESET = "\u001b[0m"; public static void main(String[] args) { - System.out.println("Hello, St. Petersburg!"); + try { + dialog(); + } catch (AlarmException e) { + System.out.println(e.getMessage()); + } + } + + public static void dialog() throws AlarmException { + System.out.println("Enter arguments:"); + Scanner console = new Scanner(System.in); + + while (console.hasNext()) { + String word = console.next(); + + if (!word.equals("error")) { + int n = word.length(); + System.out.println(word + ": " + n + " letters"); + } else { + throw new AlarmException(RED + "Alarm!"+ RESET); + } + } + }; + + public static class AlarmException extends Exception { + public AlarmException(String message) { + super(message); + } } } From a510721f7e12a9b5d4bceb662cfc5e6f37561d16 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR <86971512+GabdrakhimovaRR@users.noreply.github.com> Date: Thu, 8 Jul 2021 17:34:46 +0300 Subject: [PATCH 03/27] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5d686e9f..6236708c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Java Core June 2021 -## *Nikolaev Artem* +## *Gabdrakhimova Regina* | Number | Solution | Short description | --- | --- | --- | -| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/master/src/main/java/homework_1) | The app that reads input arguments and prints them, until "error" argument | +| HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_1) | The app that reads input arguments and prints them, until "error" argument | [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 468f48e06216d77c02d0dd81772d9760e73c4e87 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 10 Jul 2021 01:44:21 +0300 Subject: [PATCH 04/27] homework_1(2) --- src/main/java/homework_1/Main.java | 31 +++++------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index dddc9f22..aa4218de 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -1,38 +1,17 @@ package homework_1; -import java.util.Scanner; public class Main { static final String RED = "\u001b[31m"; static final String RESET = "\u001b[0m"; public static void main(String[] args) { - try { - dialog(); - } catch (AlarmException e) { - System.out.println(e.getMessage()); - } - } - - public static void dialog() throws AlarmException { - System.out.println("Enter arguments:"); - Scanner console = new Scanner(System.in); - - while (console.hasNext()) { - String word = console.next(); - - if (!word.equals("error")) { - int n = word.length(); - System.out.println(word + ": " + n + " letters"); + for (int i = 0; i < args.length; i++) { + if (args[i].equals("error")) { + System.out.println(RED + "Alarm!"+ RESET); + break; } else { - throw new AlarmException(RED + "Alarm!"+ RESET); + System.out.println(args[i] + ": " + args[i].length() + " letters"); } } - }; - - public static class AlarmException extends Exception { - public AlarmException(String message) { - super(message); - } } - } From ca5976baed6bae56663a088ec0d1239bebc2a55b Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Mon, 26 Jul 2021 07:58:56 +0300 Subject: [PATCH 05/27] homework_1(fixed indentation) --- src/main/java/homework_1/Main.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/homework_1/Main.java b/src/main/java/homework_1/Main.java index aa4218de..3875963d 100644 --- a/src/main/java/homework_1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -1,17 +1,17 @@ package homework_1; public class Main { - static final String RED = "\u001b[31m"; - static final String RESET = "\u001b[0m"; + static final String RED = "\u001b[31m"; + static final String RESET = "\u001b[0m"; - public static void main(String[] args) { - for (int i = 0; i < args.length; i++) { - if (args[i].equals("error")) { - System.out.println(RED + "Alarm!"+ RESET); - break; - } else { - System.out.println(args[i] + ": " + args[i].length() + " letters"); - } + public static void main(String[] args) { + for (int i = 0; i < args.length; i++) { + if (args[i].equals("error")) { + System.out.println(RED + "Alarm!"+ RESET); + break; + } else { + System.out.println(args[i] + ": " + args[i].length() + " letters"); + } + } } - } } From 766336afa4b4d8b02bace02899f53f88d397b850 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Mon, 26 Jul 2021 08:00:38 +0300 Subject: [PATCH 06/27] homework_2 --- .../java/homework_2/pyramid_printer/Main.java | 7 ++ .../pyramid_printer/PyramidPrinter.java | 36 +++++++++ .../homework_2/random_chars_table/Main.java | 7 ++ .../random_chars_table/RandomCharsTable.java | 80 +++++++++++++++++++ .../java/homework_2/traffic_light/Main.java | 7 ++ .../traffic_light/TrafficLight.java | 42 ++++++++++ 6 files changed, 179 insertions(+) create mode 100644 src/main/java/homework_2/pyramid_printer/Main.java create mode 100644 src/main/java/homework_2/pyramid_printer/PyramidPrinter.java create mode 100644 src/main/java/homework_2/random_chars_table/Main.java create mode 100644 src/main/java/homework_2/random_chars_table/RandomCharsTable.java 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..e50e37eb --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -0,0 +1,7 @@ +package homework_2.pyramid_printer; + +public class Main { + public static void main(String[] args) { + new PyramidPrinter().run(); + } +} diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java new file mode 100644 index 00000000..a08e06a6 --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -0,0 +1,36 @@ +package homework_2.pyramid_printer; + +import java.util.Scanner; + +public class PyramidPrinter { + public static void run(){ + Scanner sc = new Scanner(System.in); + int numb; + System.out.println("Please enter time in seconds:"); + if (!sc.hasNextInt()) { + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + return; + } else { + numb = sc.nextInt(); + if (numb < 0) { + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + return; + } else { + printPyramid(numb); + } + } + } + + public static void printPyramid(int numb){ + if (numb == 0) { + return; + } + for (int i = 1; i <= numb; i++) { + for (int j = 1; j <= i; j++) { + System.out.print("x"); + } + System.out.print("\n"); + } + } +} + 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..682fe366 --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -0,0 +1,7 @@ +package homework_2.random_chars_table; + +public class Main { + public static void main(String[] args) { + new RandomCharsTable().run(); + } +} diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java new file mode 100644 index 00000000..7131a226 --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -0,0 +1,80 @@ +package homework_2.random_chars_table; + +import java.util.Random; +import java.util.Scanner; + +public class RandomCharsTable { + public static void run(){ + System.out.println("Please enter number of rows, columns and even|odd:"); + Scanner sc = new Scanner(System.in); + String str = sc.nextLine(); + String[] subStr; + String delimiter = " "; + subStr = str.split(delimiter); + + if (subStr.length != 3) { + System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + return; + } + + int rows = 0; + int columns = 0; + + try { + rows = Integer.parseInt(subStr[0]); + columns = Integer.parseInt(subStr[1]); + } catch (NumberFormatException ex) { + System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + return; + } + + if ((!subStr[2].equals("even")) && (!subStr[2].equals("odd"))) { + System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + return; + } + + String evenOrOdd = subStr[2]; + boolean evenCheck = false; + + if (evenOrOdd.equals("even")){ + evenCheck = true; + } + + String ans = printTable(rows, columns, evenCheck); + + if (ans.length() == 0) { + ans = ""; + } else { + ans = ans.substring(0, ans.length() - 1); + } + + if (evenCheck){ + System.out.print("Even letters - " + ans); + } else { + System.out.print("Odd letters - " + ans); + } + } + + private static String printTable(int rows, int columns, boolean evenCheck) { + String ans = ""; + Random random = new Random(); + int [][] arr = new int[rows][columns]; + int a = 65; + int b = 90; + + for (int i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + arr[i][j] = a + (random.nextInt(b - a + 1)); + System.out.print("|"); + System.out.print((char)arr[i][j]); + if (!(arr[i][j] % 2 == 0) ^ (evenCheck)) { + ans = ans.concat(Character.toString((char)arr[i][j])); + ans = ans.concat(","); + } + } + System.out.print("|\n"); + } + + return ans; + } +} 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..2184caef --- /dev/null +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -0,0 +1,7 @@ +package homework_2.traffic_light; + +public class Main { + public static void main(String[] args){ + new TrafficLight().run(); + } +} diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java new file mode 100644 index 00000000..91971bae --- /dev/null +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -0,0 +1,42 @@ +package homework_2.traffic_light; + +import java.util.Scanner; + +public class TrafficLight { + public static final String RED = "\u001b[31m"; + public static final String YELLOW = "\u001B[33m"; + public static final String GREEN = "\u001B[32m"; + public static final String RESET = "\u001b[0m"; + + public static void run(){ + Scanner sc = new Scanner(System.in); + int numb; + System.out.println("Please enter time in seconds:"); + if (!sc.hasNextInt()) { + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + return; + } else { + numb = sc.nextInt(); + if (numb < 0) { + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + return; + } else if (numb > 86399) { + System.out.println("The day is over"); + return; + } else { + color(numb); + } + } + } + + public static void color(int sec){ + int light = sec % 60; + if ((light >=0) && (light < 35)) { + System.out.println(GREEN + "GREEN" + RESET); + } else if (((light >=35) && (light < 40)) || ((light >=55) && (light < 60))) { + System.out.println(YELLOW + "YELLOW" + RESET); + } else { + System.out.println(RED + "RED" + RESET); + } + } +} From 76b4e64beb96e1d143626807a7b5c3faa12da506 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR <86971512+GabdrakhimovaRR@users.noreply.github.com> Date: Mon, 26 Jul 2021 08:18:36 +0300 Subject: [PATCH 07/27] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 6236708c..e16153e8 100644 --- a/README.md +++ b/README.md @@ -5,5 +5,8 @@ | Number | Solution | Short description | --- | --- | --- | | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_1) | The app that reads input arguments and prints them, until "error" argument | +| HW2 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/traffic_light ) | The app reads input argument of seconds from the beginning of the day and shows the traffic light | +| | [Pyramid Printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/pyramid_printer ) | The app reads input argument and builds the required pyramid of letters | +| | [Random Chars Table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/random_chars_table ) | The app reads input arguments and prints a table of random letters based on the data | [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 4d0669d2278427277865931ade58d381e867a7b4 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Fri, 3 Sep 2021 01:55:27 +0300 Subject: [PATCH 08/27] homework_2(2) --- .../pyramid_printer/PyramidPrinter.java | 21 ++-- .../homework_2/random_chars_table/Main.java | 1 + .../random_chars_table/RandomCharsTable.java | 59 +++++----- .../traffic_light/TrafficLight.java | 28 +++-- .../homework_2_tests/PyramidPrinterTest.java | 101 ++++++++++++++++++ .../homework_2_tests/TrafficLightTest.java | 99 +++++++++++++++++ 6 files changed, 265 insertions(+), 44 deletions(-) create mode 100644 src/test/java/homework_2_tests/PyramidPrinterTest.java create mode 100644 src/test/java/homework_2_tests/TrafficLightTest.java diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index a08e06a6..d15e4fb9 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -3,17 +3,26 @@ import java.util.Scanner; public class PyramidPrinter { - public static void run(){ + private static final String ERROR_MESSAGE = "Only 1 non-negative integer is allowed as passed parameter"; + + public void run(){ Scanner sc = new Scanner(System.in); int numb; - System.out.println("Please enter time in seconds:"); + String str; + System.out.println("Please enter the number:"); if (!sc.hasNextInt()) { - System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + System.out.println(ERROR_MESSAGE); return; } else { - numb = sc.nextInt(); + str = sc.nextLine(); + str = str.trim(); + if (!str.matches("[-+]?\\d+")) { + System.out.println(ERROR_MESSAGE); + return; + } + numb = Integer.parseInt(str); if (numb < 0) { - System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + System.out.println(ERROR_MESSAGE); return; } else { printPyramid(numb); @@ -21,7 +30,7 @@ public static void run(){ } } - public static void printPyramid(int numb){ + public void printPyramid(int numb){ if (numb == 0) { return; } 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 682fe366..ac8b35ac 100644 --- a/src/main/java/homework_2/random_chars_table/Main.java +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -2,6 +2,7 @@ public class Main { public static void main(String[] args) { + new RandomCharsTable().run(); } } diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 7131a226..b27588a4 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -4,16 +4,17 @@ import java.util.Scanner; public class RandomCharsTable { - public static void run(){ + + private static final String ERROR_MESSAGE = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; + + public void run(){ System.out.println("Please enter number of rows, columns and even|odd:"); Scanner sc = new Scanner(System.in); String str = sc.nextLine(); - String[] subStr; - String delimiter = " "; - subStr = str.split(delimiter); + String[] subStr= str.split(" "); if (subStr.length != 3) { - System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + System.out.println(ERROR_MESSAGE); return; } @@ -24,39 +25,31 @@ public static void run(){ rows = Integer.parseInt(subStr[0]); columns = Integer.parseInt(subStr[1]); } catch (NumberFormatException ex) { - System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + System.out.println(ERROR_MESSAGE); return; } if ((!subStr[2].equals("even")) && (!subStr[2].equals("odd"))) { - System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + System.out.println(ERROR_MESSAGE); return; } - String evenOrOdd = subStr[2]; - boolean evenCheck = false; - - if (evenOrOdd.equals("even")){ - evenCheck = true; + if (rows < 1 || columns < 1) { + System.out.println(ERROR_MESSAGE); } - String ans = printTable(rows, columns, evenCheck); + String evenOrOdd = subStr[2]; + boolean isEven = false; - if (ans.length() == 0) { - ans = ""; - } else { - ans = ans.substring(0, ans.length() - 1); + if (evenOrOdd.equals("even")){ + isEven = true; } - if (evenCheck){ - System.out.print("Even letters - " + ans); - } else { - System.out.print("Odd letters - " + ans); - } + printTable(rows, columns, isEven); } - private static String printTable(int rows, int columns, boolean evenCheck) { - String ans = ""; + private void printTable(int rows, int columns, boolean isEven) { + String result = ""; Random random = new Random(); int [][] arr = new int[rows][columns]; int a = 65; @@ -67,14 +60,24 @@ private static String printTable(int rows, int columns, boolean evenCheck) { arr[i][j] = a + (random.nextInt(b - a + 1)); System.out.print("|"); System.out.print((char)arr[i][j]); - if (!(arr[i][j] % 2 == 0) ^ (evenCheck)) { - ans = ans.concat(Character.toString((char)arr[i][j])); - ans = ans.concat(","); + if (!(arr[i][j] % 2 == 0) ^ (isEven)) { + result = result.concat(Character.toString((char)arr[i][j])); + result = result.concat(","); } } System.out.print("|\n"); } - return ans; + if (result.length() == 0) { + result = ""; + } else { + result = result.substring(0, result.length() - 1); + } + + if (isEven){ + System.out.print("Even letters - " + result); + } else { + System.out.print("Odd letters - " + result); + } } } diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 91971bae..219b5f85 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -3,33 +3,41 @@ import java.util.Scanner; public class TrafficLight { - public static final String RED = "\u001b[31m"; - public static final String YELLOW = "\u001B[33m"; - public static final String GREEN = "\u001B[32m"; - public static final String RESET = "\u001b[0m"; + private static final String RED = "\u001b[31m"; + private static final String YELLOW = "\u001B[33m"; + private static final String GREEN = "\u001B[32m"; + private static final String RESET = "\u001b[0m"; + private static final String ERROR_MESSAGE = "Only 1 non-negative integer is allowed as passed parameter"; - public static void run(){ + public void run(){ Scanner sc = new Scanner(System.in); int numb; + String str; System.out.println("Please enter time in seconds:"); if (!sc.hasNextInt()) { - System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + System.out.println(ERROR_MESSAGE); return; } else { - numb = sc.nextInt(); + str = sc.nextLine(); + str = str.trim(); + if (!str.matches("[-+]?\\d+")) { + System.out.println(ERROR_MESSAGE); + return; + } + numb = Integer.parseInt(str); if (numb < 0) { - System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + System.out.println(ERROR_MESSAGE); return; } else if (numb > 86399) { System.out.println("The day is over"); return; } else { - color(numb); + printTrafficLight(numb); } } } - public static void color(int sec){ + public void printTrafficLight(int sec){ int light = sec % 60; if ((light >=0) && (light < 35)) { System.out.println(GREEN + "GREEN" + RESET); diff --git a/src/test/java/homework_2_tests/PyramidPrinterTest.java b/src/test/java/homework_2_tests/PyramidPrinterTest.java new file mode 100644 index 00000000..7b42ee4d --- /dev/null +++ b/src/test/java/homework_2_tests/PyramidPrinterTest.java @@ -0,0 +1,101 @@ +package homework_2_tests; + +import homework_2.pyramid_printer.PyramidPrinter; +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class PyramidPrinterTest extends UnitBase{ + + private final String errorMassage = "Only 1 non-negative integer is allowed as passed parameter"; + + private void run(){ + new PyramidPrinter().run(); + removeFromOutput("Please enter the number:"); + printOut(); + } + + @Test + void given0_whenRun_thenEmptyPyramid() { + setInput("0"); + + run(); + + assertEquals("", getOutput()); + } + + @Test + void given1_whenRun_thenPrintPyramid() { + setInput("1"); + + run(); + + assertEquals("x", getOutputLines()[0]); + } + + @Test + void given2_whenRun_thenPrintPyramid() { + setInput("2"); + + run(); + + assertEquals("x", getOutputLines()[0]); + assertEquals("xx", getOutputLines()[1]); + } + + @Test + void givenMinus1_whenRun_thenErrorMassage() { + setInput("-1"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenLetter_whenRun_thenErrorMassage() { + setInput("A"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenWord_whenRun_thenErrorMassage() { + setInput("three"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenDigitWithSpace_whenRun_thenPyramidPrinter() { + setInput(" 2 "); + + run(); + + assertEquals("x", getOutputLines()[0]); + assertEquals("xx", getOutputLines()[1]); + } + + @Test + void givenTwoDigits_whenRun_thenErrorMassage() { + setInput("1 2"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenDouble_whenRun_thenErrorMassage() { + setInput("5.0"); + + run(); + + assertEquals(errorMassage, getOutput()); + } +} diff --git a/src/test/java/homework_2_tests/TrafficLightTest.java b/src/test/java/homework_2_tests/TrafficLightTest.java new file mode 100644 index 00000000..241e0d29 --- /dev/null +++ b/src/test/java/homework_2_tests/TrafficLightTest.java @@ -0,0 +1,99 @@ +package homework_2_tests; + +import homework_2.traffic_light.TrafficLight; +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TrafficLightTest extends UnitBase{ + + private final String errorMassage = "Only 1 non-negative integer is allowed as passed parameter"; + + private void run(){ + new TrafficLight().run(); + removeFromOutput("Please enter time in seconds:"); + printOut(); + } + + @Test + void given0_whenRun_thenGreen() { + setInput("0"); + + run(); + + assertEquals("[32mGREEN\u001B[0m", getOutput()); + } + + @Test + void given34_whenRun_thenGreen() { + setInput("34"); + + run(); + + assertEquals("[32mGREEN\u001B[0m", getOutput()); + } + + @Test + void given35_whenRun_thenYellow() { + setInput("35"); + + run(); + + assertEquals("[33mYELLOW\u001B[0m", getOutput()); + } + + @Test + void given54_whenRun_thenRed() { + setInput("54"); + + run(); + + assertEquals("[31mRED\u001B[0m", getOutput()); + } + + @Test + void given86401_whenRun_thenTheDayIsOver() { + setInput("86401"); + + run(); + + assertEquals("The day is over", getOutput()); + } + + @Test + void givenLetter_whenRun_thenErrorMassage() { + setInput("A"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenWord_whenRun_thenErrorMassage() { + setInput("one"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenTwoDigits_whenRun_thenErrorMassage() { + setInput("8 9"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenDouble_whenRun_thenErrorMassage() { + setInput("5.0"); + + run(); + + assertEquals(errorMassage, getOutput()); + } +} From 0198d99170b2f398e724fb1a5fd045231ae9f464 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 4 Sep 2021 01:42:43 +0300 Subject: [PATCH 09/27] RandomCharsTableTest has been added --- .../RandomCharsTableTest.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/test/java/homework_2_tests/RandomCharsTableTest.java diff --git a/src/test/java/homework_2_tests/RandomCharsTableTest.java b/src/test/java/homework_2_tests/RandomCharsTableTest.java new file mode 100644 index 00000000..17a6cfc1 --- /dev/null +++ b/src/test/java/homework_2_tests/RandomCharsTableTest.java @@ -0,0 +1,121 @@ +package homework_2_tests; + +import homework_2.random_chars_table.RandomCharsTable; +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +public class RandomCharsTableTest extends UnitBase{ + + private final String errorMassage = "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; + + private void run(){ + new RandomCharsTable().run(); + removeFromOutput("Please enter number of rows, columns and even|odd:"); + printOut(); + } + + @Test + void given3_3_even_whenRun_thenValidCase() { + setInput("3 3 even"); + + run(); + + assertTrue(getOutput().matches("\\|[A-Z]\\|[A-Z]\\|[A-Z]\\|\\n\\|[A-Z]\\|[A-Z]\\|[A-Z]\\|\\n\\|[A-Z]\\|[A-Z]\\|[A-Z]\\|\\nEven letters - ([BDFHJLNPRTVXZ],)*[BDFHJLNPRTVXZ]*")); + + String endOfLastString = getOutputLines()[3].substring(15); + for (int i = 0; i < 3; i++) { + for (int j = 1; j < 7; j = j + 2) { + String letter = getOutputLines()[i].substring(j,j+1); + if (letter.matches("[BDFHJLNPRTVXZ]")) { + assertTrue(endOfLastString.contains(letter)); + } + } + } + } + + @Test + void given2_2_odd_whenRun_thenValidCase() { + setInput("2 2 odd"); + + run(); + + assertTrue(getOutput().matches("\\|[A-Z]\\|[A-Z]\\|\\n\\|[A-Z]\\|[A-Z]\\|\\nOdd letters - ([ACEGIKMOQSUWY],)*[ACEGIKMOQSUWY]*")); + + String endOfLastString = getOutputLines()[2].substring(14); + for (int i = 0; i < 2; i++) { + for (int j = 1; j < 5; j = j + 2) { + String letter = getOutputLines()[i].substring(j,j+1); + if (letter.matches("[ACEGIKMOQSUWY]")) { + assertTrue(endOfLastString.contains(letter)); + } + } + } + } + + @Test + void givenDigitEven_whenRun_thenErrorMassage() { + setInput("5 even"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenDigitsIncorrectWord_whenRun_thenErrorMassage() { + setInput("5 5 one"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenDigitsEvenIncorrectWord_whenRun_thenErrorMassage() { + setInput("5 5 even one"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenDigitsOnly_whenRun_thenErrorMassage() { + setInput("5 5 "); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenThreeDigits_whenRun_thenErrorMassage() { + setInput("5 5 5"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenOddOnly_whenRun_thenErrorMassage() { + setInput("Odd"); + + run(); + + assertEquals(errorMassage, getOutput()); + } + + @Test + void givenIncorrectWordOnly_whenRun_thenErrorMassage() { + setInput("Five"); + + run(); + + assertEquals(errorMassage, getOutput()); + } +} From 4a643a29b9e6b4147c2a62c0a08bac9cdfa1ea74 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 4 Sep 2021 01:48:18 +0300 Subject: [PATCH 10/27] Scanner was closed --- src/main/java/homework_2/pyramid_printer/PyramidPrinter.java | 1 + .../java/homework_2/random_chars_table/RandomCharsTable.java | 1 + src/main/java/homework_2/traffic_light/TrafficLight.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index d15e4fb9..ff4c1bab 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -28,6 +28,7 @@ public void run(){ printPyramid(numb); } } + sc.close(); } public void printPyramid(int numb){ 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 b27588a4..af246ba4 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -46,6 +46,7 @@ public void run(){ } printTable(rows, columns, isEven); + sc.close(); } private void printTable(int rows, int columns, boolean isEven) { diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 219b5f85..1bd3324b 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -35,6 +35,7 @@ public void run(){ printTrafficLight(numb); } } + sc.close(); } public void printTrafficLight(int sec){ From 8a71d94dbc0999938aeb5184f48f8b99bcc4e285 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 4 Sep 2021 22:30:51 +0300 Subject: [PATCH 11/27] homework_3 --- src/main/java/homework_3/MyImmutableBag.java | 75 ++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/main/java/homework_3/MyImmutableBag.java diff --git a/src/main/java/homework_3/MyImmutableBag.java b/src/main/java/homework_3/MyImmutableBag.java new file mode 100644 index 00000000..c9721d9c --- /dev/null +++ b/src/main/java/homework_3/MyImmutableBag.java @@ -0,0 +1,75 @@ +package homework_3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Immutable class requirements: + * - class must be declared final, + * - fields in class must be private and final, + * - getters must return a copy of the object, + * - method for changing field of object should return a copy of the object with changed field, and not directly change the field, + * - constructor should copy passed reference objects into new one, not insert direct references. + */ + +public final class MyImmutableBag { + + private final int cash; + private final ArrayList documents; + private final Map pills; + + public MyImmutableBag(){ + documents = new ArrayList<>(); + documents.add("Passport"); + documents.add("INN"); + documents.add("Medical policy"); + cash = 1000; + pills = new HashMap<>(); + pills.put("Allergy pills", "Loratadine"); + pills.put("Headache tablets", "Citramone"); + pills.put("Tablets from temperature", "Paracetamol"); + } + + public MyImmutableBag(int cash){ + this.cash = cash; + documents = new ArrayList<>(); + documents.add("Passport"); + documents.add("INN"); + documents.add("Medical policy"); + pills = new HashMap<>(); + pills.put("Allergy pills", "Loratadine"); + pills.put("Headache tablets", "Citramone"); + pills.put("Tablets from temperature", "Paracetamol"); + } + + public MyImmutableBag(int cash, ArrayList documents, Map pills){ + this.cash = cash; + this.documents = new ArrayList<>(documents); + this.pills = new HashMap<>(pills); + } + + public int getCash() { + return this.cash; + } + + public ArrayList getDocuments() { + return new ArrayList<>(documents); + } + + public Map getPills() { + return new HashMap<>(pills); + } + + public MyImmutableBag changeCash(int newCash) { + return new MyImmutableBag(newCash, documents, pills); + } + + public MyImmutableBag changeDocuments(ArrayList newDocuments) { + return new MyImmutableBag(cash, newDocuments, pills); + } + + public MyImmutableBag changePills(Map newPills) { + return new MyImmutableBag(cash, documents, newPills); + } +} From 1fed33d6ddd0cb0fcf2b124f9e2b17376d2e952f Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sun, 5 Sep 2021 01:06:22 +0300 Subject: [PATCH 12/27] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e16153e8..b103df79 100644 --- a/README.md +++ b/README.md @@ -8,5 +8,7 @@ | HW2 | [Traffic Light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/traffic_light ) | The app reads input argument of seconds from the beginning of the day and shows the traffic light | | | [Pyramid Printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/pyramid_printer ) | The app reads input argument and builds the required pyramid of letters | | | [Random Chars Table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/random_chars_table ) | The app reads input arguments and prints a table of random letters based on the data | +| | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_2_tests ) | Tests to homework_2 | +| HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3/MyImmutableBag ) | Immutable class describing the required contents of my bag | -[Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) +[Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) From cf983dcbe3b0306b60065f3a9d90a044e611af80 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sun, 5 Sep 2021 01:11:07 +0300 Subject: [PATCH 13/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b103df79..7c01c3eb 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,6 @@ | | [Pyramid Printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/pyramid_printer ) | The app reads input argument and builds the required pyramid of letters | | | [Random Chars Table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/random_chars_table ) | The app reads input arguments and prints a table of random letters based on the data | | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_2_tests ) | Tests to homework_2 | -| HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3/MyImmutableBag ) | Immutable class describing the required contents of my bag | +| HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3 ) | Immutable class describing the required contents of my bag | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) From ee0af2b5616905bbc05bb7c2aa159443e1c33e25 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Mon, 6 Sep 2021 02:13:56 +0300 Subject: [PATCH 14/27] homework_4: Singleton --- README.md | 1 + src/main/java/homework_4/singleton/Singleton.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/main/java/homework_4/singleton/Singleton.java diff --git a/README.md b/README.md index 7c01c3eb..fd25dbfc 100644 --- a/README.md +++ b/README.md @@ -10,5 +10,6 @@ | | [Random Chars Table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/random_chars_table ) | The app reads input arguments and prints a table of random letters based on the data | | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_2_tests ) | Tests to homework_2 | | HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3 ) | Immutable class describing the required contents of my bag | +| HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/singleton ) | Singleton app | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) 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..930dcf6b --- /dev/null +++ b/src/main/java/homework_4/singleton/Singleton.java @@ -0,0 +1,14 @@ +package homework_4.singleton; + +public class Singleton { + private static Singleton instance; + + private Singleton() {} + + public static Singleton getInstance() { + if (instance == null) { + instance = new Singleton(); + } + return instance; + } +} From 657ba0f4d8b970cbd7eeacd64a2f5c4c765ce146 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Fri, 10 Sep 2021 02:49:35 +0300 Subject: [PATCH 15/27] homework_5: CastomRegexMatcher --- .../custom_regex_matcher/CustomRegexMatcher.java | 14 ++++++++++++++ .../java/homework_5/custom_regex_matcher/Main.java | 7 +++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java create mode 100644 src/main/java/homework_5/custom_regex_matcher/Main.java diff --git a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java new file mode 100644 index 00000000..23599bb0 --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -0,0 +1,14 @@ +package homework_5.custom_regex_matcher; + +import java.util.Scanner; + +public class CustomRegexMatcher { + + public void run() { + Scanner sc = new Scanner(System.in); + System.out.println("Enter your password: "); + + String str = sc.nextLine(); + System.out.println("Password security: " + str.matches("^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[!$%#^].*)[0-9a-zA-Z!$%#^]{8,}$")); + } +} diff --git a/src/main/java/homework_5/custom_regex_matcher/Main.java b/src/main/java/homework_5/custom_regex_matcher/Main.java new file mode 100644 index 00000000..b154eb1b --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/Main.java @@ -0,0 +1,7 @@ +package homework_5.custom_regex_matcher; + +public class Main { + public static void main(String[] args){ + new CustomRegexMatcher().run(); + } +} From 68a1def311f55196119821a37c5b97ac40f1b92a Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Fri, 10 Sep 2021 02:52:57 +0300 Subject: [PATCH 16/27] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fd25dbfc..7e767cc8 100644 --- a/README.md +++ b/README.md @@ -11,5 +11,6 @@ | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_2_tests ) | Tests to homework_2 | | HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3 ) | Immutable class describing the required contents of my bag | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/singleton ) | Singleton app | +| HW5 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/custom_regex_matcher ) | The app reads input string and checks password strength | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) From ed66aa68d5bcfc7d5794752be95ab353caeaf3ec Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Mon, 13 Sep 2021 17:01:31 +0300 Subject: [PATCH 17/27] homework_4. CustomFileReader --- README.md | 1 + .../custom_file_reader/CustomFileReader.java | 52 +++++++++++++++++++ .../homework_4/custom_file_reader/Main.java | 7 +++ .../resources/custom_file_reader/input.txt | 6 +++ 4 files changed, 66 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/input.txt diff --git a/README.md b/README.md index 7e767cc8..b0242c62 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_2_tests ) | Tests to homework_2 | | HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3 ) | Immutable class describing the required contents of my bag | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/singleton ) | Singleton app | +| | [Custom File Reader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_file_reader ) | The app reads a file in different ways and outputs text excluding the characters "," and ".". | | HW5 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/custom_regex_matcher ) | The app reads input string and checks password strength | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) 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..e092c39a --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -0,0 +1,52 @@ +package homework_4.custom_file_reader; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +public class CustomFileReader { + //reading file with BufferedReader + public void run1() { + try (BufferedReader in = new BufferedReader(new FileReader(new File("src/main/resources/custom_file_reader/input.txt")))) { + String str; + while ((str = in.readLine()) != null) { + System.out.println(str.replaceAll("[,.]", "")); + } + } + catch (IOException e) { + e.printStackTrace(); + } + } + + //reading file with nio Files.readAllLines + public void run2() { + Path path = Paths.get("src/main/resources/custom_file_reader/input.txt"); + List list = null; + try { + list = Files.readAllLines(path); + + for (String str : list) + System.out.println(str.replaceAll("[,.]", "")); + } + catch (IOException | NullPointerException e) { + e.printStackTrace(); + } + } + + //reading a file with BufferedInputStream and FileInputStream + public void run3() { + try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("src/main/resources/custom_file_reader/input.txt"))) { + int i; + + while ((i = in.read()) != -1) { + if ((char)i != ',' && (char)i != '.') + System.out.print((char)i); + } + } + catch (IOException e) { + e.printStackTrace(); + } + } +} 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..3cd5f930 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -0,0 +1,7 @@ +package homework_4.custom_file_reader; + +public class Main { + public static void main(String[] args) { + new CustomFileReader().run1(); + } +} diff --git a/src/main/resources/custom_file_reader/input.txt b/src/main/resources/custom_file_reader/input.txt new file mode 100644 index 00000000..69fa83df --- /dev/null +++ b/src/main/resources/custom_file_reader/input.txt @@ -0,0 +1,6 @@ +I’m sure you’ve been asked many times whether you’re an introvert or an extrovert. For some people, it’s an easy choice, but for most of us, it’s difficult to choose one way or the other. + +It’s hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality. Personality traits exist along a continuum, and the vast majority of us aren’t introverts or extroverts—we fall somewhere in the middle. + +Personality consists of a stable set of preferences and tendencies through which we approach the world. Personality traits form at an early age and are fixed by early adulthood. Many important things about you change over the course of your lifetime, but your personality isn’t one of them. + From 5430f0708d390dd77c6b5d35775ab37f3ccb126d Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Wed, 15 Sep 2021 00:24:50 +0300 Subject: [PATCH 18/27] homework_4. CustomAnnotation --- README.md | 1 + .../homework_4/custom_annotation/Student.java | 46 +++++++++++++++++++ .../custom_annotation/StudentInformation.java | 13 ++++++ 3 files changed, 60 insertions(+) create mode 100644 src/main/java/homework_4/custom_annotation/Student.java create mode 100644 src/main/java/homework_4/custom_annotation/StudentInformation.java diff --git a/README.md b/README.md index b0242c62..7ac8de56 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ | HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3 ) | Immutable class describing the required contents of my bag | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/singleton ) | Singleton app | | | [Custom File Reader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_file_reader ) | The app reads a file in different ways and outputs text excluding the characters "," and ".". | +| | [Custom Annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_annotation ) | Student class uses custom annotation StudentInformation to fill fields in class constructor. | | HW5 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/custom_regex_matcher ) | The app reads input string and checks password strength | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) diff --git a/src/main/java/homework_4/custom_annotation/Student.java b/src/main/java/homework_4/custom_annotation/Student.java new file mode 100644 index 00000000..f81ac4d0 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/Student.java @@ -0,0 +1,46 @@ +package homework_4.custom_annotation; + +@StudentInformation(city = "Saint-Petersburg", language = "Java") +public class Student { + private String name; + private String email; + private String city; + private String language; + + public Student(String name, String email) { + this.name = name; + this.email = email; + city = Student.class.getAnnotation(StudentInformation.class).city(); + language = Student.class.getAnnotation(StudentInformation.class).language(); + } + + public Student(String name, String email, String city) { + this.name = name; + this.email = email; + this.city = city; + language = Student.class.getAnnotation(StudentInformation.class).language(); + } + + public Student(String name, String email, String city, String language) { + this.name = name; + this.email = email; + this.city = city; + this.language = language; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getLanguage() { + return language; + } + + public String getCity() { + return city; + } +} diff --git a/src/main/java/homework_4/custom_annotation/StudentInformation.java b/src/main/java/homework_4/custom_annotation/StudentInformation.java new file mode 100644 index 00000000..e74a6a42 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/StudentInformation.java @@ -0,0 +1,13 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface StudentInformation { + String city(); + String language(); +} From 61294c21fe566ed3a62ccec9df6d665e2eea9361 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Wed, 15 Sep 2021 01:23:56 +0300 Subject: [PATCH 19/27] homework_5. PowerOfNumber --- README.md | 1 + .../java/homework_5/power_of_number/Main.java | 7 ++++ .../power_of_number/PowerOfNumber.java | 41 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/main/java/homework_5/power_of_number/Main.java create mode 100644 src/main/java/homework_5/power_of_number/PowerOfNumber.java diff --git a/README.md b/README.md index 7ac8de56..83241d1d 100644 --- a/README.md +++ b/README.md @@ -14,5 +14,6 @@ | | [Custom File Reader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_file_reader ) | The app reads a file in different ways and outputs text excluding the characters "," and ".". | | | [Custom Annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_annotation ) | Student class uses custom annotation StudentInformation to fill fields in class constructor. | | HW5 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/custom_regex_matcher ) | The app reads input string and checks password strength | +| | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/power_of_number ) | The app reads input arguments(number and power) and prints number raised to the power | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) diff --git a/src/main/java/homework_5/power_of_number/Main.java b/src/main/java/homework_5/power_of_number/Main.java new file mode 100644 index 00000000..930f2040 --- /dev/null +++ b/src/main/java/homework_5/power_of_number/Main.java @@ -0,0 +1,7 @@ +package homework_5.power_of_number; + +public class Main { + public static void main(String[] args) { + new PowerOfNumber().run(); + } +} diff --git a/src/main/java/homework_5/power_of_number/PowerOfNumber.java b/src/main/java/homework_5/power_of_number/PowerOfNumber.java new file mode 100644 index 00000000..c6a2f69a --- /dev/null +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -0,0 +1,41 @@ +package homework_5.power_of_number; + +import java.util.Scanner; + +public class PowerOfNumber { + + private static final String ERROR_MESSAGE = "Only 2 non-negative integers are allowed"; + + public void run() { + System.out.println("Please enter 2 non-negative numbers:"); + Scanner sc = new Scanner(System.in); + String str = sc.nextLine(); + String[] subStr= str.split(" "); + + if (subStr.length != 2) { + System.out.println(ERROR_MESSAGE); + return; + } + + int num = 0; + int pow = 0; + + try { + num = Integer.parseInt(subStr[0]); + pow = Integer.parseInt(subStr[1]); + } catch (NumberFormatException ex) { + System.out.println(ERROR_MESSAGE); + return; + } + + System.out.println(raiseNumToPower(num, pow)); + } + + public int raiseNumToPower(int num, int pow) { + if (pow == 1) return num; + + if (num == 0) return 0; + + return num * raiseNumToPower(num, pow - 1); + } +} From 73c93ca30c59cb5955c26c95e1fb938dab9a4869 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 18 Sep 2021 04:00:00 +0300 Subject: [PATCH 20/27] homework_6. MapProblemsGenerator --- README.md | 1 + .../map_problems_generator/Main.java | 8 ++++ .../MapProblemsCollisionGenerator.java | 34 ++++++++++++++++ .../MapProblemsGenerator.java | 36 +++++++++++++++++ .../MapProblemsMutableGenerator.java | 40 +++++++++++++++++++ 5 files changed, 119 insertions(+) create mode 100644 src/main/java/homework_6/map_problems_generator/Main.java create mode 100644 src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.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/MapProblemsMutableGenerator.java diff --git a/README.md b/README.md index 83241d1d..4159a0c5 100644 --- a/README.md +++ b/README.md @@ -15,5 +15,6 @@ | | [Custom Annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_annotation ) | Student class uses custom annotation StudentInformation to fill fields in class constructor. | | HW5 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/custom_regex_matcher ) | The app reads input string and checks password strength | | | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/power_of_number ) | The app reads input arguments(number and power) and prints number raised to the power | +| HW6 | [Map Problems Generator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_6/map_problems_generator ) | The app shows case with collision in hashmap and case when it is impossible to get object by key from hashmap | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) 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..9ca493ec --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/Main.java @@ -0,0 +1,8 @@ +package homework_6.map_problems_generator; + +public class Main { + public static void main(String[] args) { + new MapProblemsGenerator().run1(); + new MapProblemsGenerator().run2(); + } +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java new file mode 100644 index 00000000..bb11007a --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java @@ -0,0 +1,34 @@ +package homework_6.map_problems_generator; + +public class MapProblemsCollisionGenerator { + + private final String value; + + public MapProblemsCollisionGenerator(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + if (obj == null || obj.getClass() != this.getClass()) { + return false; + } + + MapProblemsCollisionGenerator example = (MapProblemsCollisionGenerator) obj; + + return (value != null && value.equals(example.getValue())); + } + + @Override + public int hashCode() { + return 1; + } +} 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..116b0919 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java @@ -0,0 +1,36 @@ +package homework_6.map_problems_generator; + +import java.util.HashMap; + +public class MapProblemsGenerator { + public void run1() { + HashMap mapWithCollision = new HashMap<>(); + + MapProblemsCollisionGenerator firstObject = new MapProblemsCollisionGenerator("First Object"); + MapProblemsCollisionGenerator secondObject = new MapProblemsCollisionGenerator("Second Object"); + + mapWithCollision.put(firstObject, 1); + mapWithCollision.put(secondObject, 2); + + System.out.println("Collision case in map: "); + mapWithCollision.keySet().forEach(key -> System.out.println(key.getValue() + " = " + mapWithCollision.get(key))); + System.out.println("Are the objects equivalent? " + firstObject.equals(secondObject)); + System.out.println("Does the object have the same hashcode? " + (firstObject.hashCode() == secondObject.hashCode())); + } + + public void run2() { + HashMap mapMutable = new HashMap<>(); + + MapProblemsMutableGenerator thirdObject = new MapProblemsMutableGenerator("Third Object"); + MapProblemsMutableGenerator fourthObject = new MapProblemsMutableGenerator("Fourth Object"); + + mapMutable.put(thirdObject, 3); + mapMutable.put(fourthObject, 4); + + System.out.println("\nMutable class in map: "); + mapMutable.entrySet().forEach(System.out::println); + System.out.println("Trying to get object: " + mapMutable.get(thirdObject)); + System.out.println("Trying to get another object: " + mapMutable.get(fourthObject)); + + } +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java new file mode 100644 index 00000000..707667ff --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java @@ -0,0 +1,40 @@ +package homework_6.map_problems_generator; + +import java.util.Random; + +public class MapProblemsMutableGenerator { + + private String value; + + public MapProblemsMutableGenerator(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + if (obj == null || obj.getClass() != this.getClass()) { + return false; + } + + MapProblemsCollisionGenerator example = (MapProblemsCollisionGenerator) obj; + + return (value != null && value.equals(example.getValue())); + } + + @Override + public int hashCode() { + return new Random().nextInt(121); + } +} From 33cf811efbc141b625dd87b4fe84809c32f17434 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 18 Sep 2021 07:59:04 +0300 Subject: [PATCH 21/27] homework_3,4,5 Tests --- README.md | 5 +- build.gradle | 2 + .../{ => immutable_class}/MyImmutableBag.java | 2 +- .../CustomRegexMatcher.java | 42 ++++++++++++- .../power_of_number/PowerOfNumber.java | 2 + .../resources/custom_file_reader/input.txt | 1 - .../resources/custom_file_reader/output.txt | 5 ++ .../homework_3_tests/ImmutableClassTest.java | 32 ++++++++++ .../CustomAnnotationTest.java | 46 ++++++++++++++ .../java/homework_4_tests/SingletonTest.java | 17 ++++++ .../CustomRegexMatcherTest.java | 61 +++++++++++++++++++ .../homework_5_tests/PowerOfNumberTest.java | 58 ++++++++++++++++++ 12 files changed, 269 insertions(+), 4 deletions(-) rename src/main/java/homework_3/{ => immutable_class}/MyImmutableBag.java (98%) create mode 100644 src/main/resources/custom_file_reader/output.txt create mode 100644 src/test/java/homework_3_tests/ImmutableClassTest.java create mode 100644 src/test/java/homework_4_tests/CustomAnnotationTest.java create mode 100644 src/test/java/homework_4_tests/SingletonTest.java create mode 100644 src/test/java/homework_5_tests/CustomRegexMatcherTest.java create mode 100644 src/test/java/homework_5_tests/PowerOfNumberTest.java diff --git a/README.md b/README.md index 4159a0c5..cc3a6f82 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,15 @@ | | [Pyramid Printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/pyramid_printer ) | The app reads input argument and builds the required pyramid of letters | | | [Random Chars Table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_2/random_chars_table ) | The app reads input arguments and prints a table of random letters based on the data | | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_2_tests ) | Tests to homework_2 | -| HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3 ) | Immutable class describing the required contents of my bag | +| HW3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_3/immutable_class ) | Immutable class describing the required contents of my bag | +| | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_3_tests ) | Tests to homework_3 | | HW4 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/singleton ) | Singleton app | | | [Custom File Reader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_file_reader ) | The app reads a file in different ways and outputs text excluding the characters "," and ".". | | | [Custom Annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_4/custom_annotation ) | Student class uses custom annotation StudentInformation to fill fields in class constructor. | +| | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_4_tests ) | Tests to homework_4 | | HW5 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/custom_regex_matcher ) | The app reads input string and checks password strength | | | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/power_of_number ) | The app reads input arguments(number and power) and prints number raised to the power | +| | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_5_tests ) | Tests to homework_5 | | HW6 | [Map Problems Generator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_6/map_problems_generator ) | The app shows case with collision in hashmap and case when it is impossible to get object by key from hashmap | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) diff --git a/build.gradle b/build.gradle index b91dc843..aee2580c 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,8 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + testImplementation("org.junit.jupiter:junit-jupiter-params:5.6.2") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-params:5.6.2") } test { diff --git a/src/main/java/homework_3/MyImmutableBag.java b/src/main/java/homework_3/immutable_class/MyImmutableBag.java similarity index 98% rename from src/main/java/homework_3/MyImmutableBag.java rename to src/main/java/homework_3/immutable_class/MyImmutableBag.java index c9721d9c..364018bb 100644 --- a/src/main/java/homework_3/MyImmutableBag.java +++ b/src/main/java/homework_3/immutable_class/MyImmutableBag.java @@ -1,4 +1,4 @@ -package homework_3; +package homework_3.immutable_class; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java index 23599bb0..1eb3f562 100644 --- a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -9,6 +9,46 @@ public void run() { System.out.println("Enter your password: "); String str = sc.nextLine(); - System.out.println("Password security: " + str.matches("^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[!$%#^].*)[0-9a-zA-Z!$%#^]{8,}$")); + if (str.isEmpty()) System.out.println("The entered string is empty, password must be at least 8 characters long."); + boolean perfectPassword = str.matches("^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[!$%#^].*)[0-9a-zA-Z!$%#^]{8,}$"); + + if (perfectPassword) + System.out.println("Password security: " + true); + else + printReasonOfFail(str); + } + + public void printReasonOfFail(String str) { + if (str.matches("^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[!$%#^].*)[0-9a-zA-Z!$%#^]")) { + System.out.println("Password must be at least 8 characters long."); + return; + } + + if (str.matches("^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)[0-9a-zA-Z]{8,}$")) { + System.out.println("Password must contain special characters: !, $, %, #, ^"); + return; + } + + if (str.matches("^(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[!$%#^].*)[a-zA-Z!$%#^]{8,}$")) { + System.out.println("Password must contain digits: 0-9"); + return; + } + + if (str.matches("^(?=.*[0-9].*)(?=.*[!$%#^].*)[0-9!$%#^]{8,}$")) { + System.out.println("Password must contain lowercase and uppercase letters."); + return; + } + + if (str.matches("^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[!$%#^].*)[0-9a-z!$%#^]{8,}$")) { + System.out.println("Password must contain uppercase letters."); + return; + } + + if (str.contains(" ")) { + System.out.println("Password must not contain a space."); + return; + } + + System.out.println("Password at least 8 characters long must contain lowercase and uppercase letters, digits and special characters: !, $, %, #, ^."); } } diff --git a/src/main/java/homework_5/power_of_number/PowerOfNumber.java b/src/main/java/homework_5/power_of_number/PowerOfNumber.java index c6a2f69a..e3944ec1 100644 --- a/src/main/java/homework_5/power_of_number/PowerOfNumber.java +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -32,6 +32,8 @@ public void run() { } public int raiseNumToPower(int num, int pow) { + if (pow == 0) return 1; + if (pow == 1) return num; if (num == 0) return 0; diff --git a/src/main/resources/custom_file_reader/input.txt b/src/main/resources/custom_file_reader/input.txt index 69fa83df..26f5b2c8 100644 --- a/src/main/resources/custom_file_reader/input.txt +++ b/src/main/resources/custom_file_reader/input.txt @@ -3,4 +3,3 @@ I’m sure you’ve been asked many times whether you’re an introvert or an ex It’s hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality. Personality traits exist along a continuum, and the vast majority of us aren’t introverts or extroverts—we fall somewhere in the middle. Personality consists of a stable set of preferences and tendencies through which we approach the world. Personality traits form at an early age and are fixed by early adulthood. Many important things about you change over the course of your lifetime, but your personality isn’t one of them. - diff --git a/src/main/resources/custom_file_reader/output.txt b/src/main/resources/custom_file_reader/output.txt new file mode 100644 index 00000000..02a47f9f --- /dev/null +++ b/src/main/resources/custom_file_reader/output.txt @@ -0,0 +1,5 @@ +I’m sure you’ve been asked many times whether you’re an introvert or an extrovert For some people it’s an easy choice but for most of us it’s difficult to choose one way or the other + +It’s hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality Personality traits exist along a continuum and the vast majority of us aren’t introverts or extroverts—we fall somewhere in the middle + +Personality consists of a stable set of preferences and tendencies through which we approach the world Personality traits form at an early age and are fixed by early adulthood Many important things about you change over the course of your lifetime but your personality isn’t one of them diff --git a/src/test/java/homework_3_tests/ImmutableClassTest.java b/src/test/java/homework_3_tests/ImmutableClassTest.java new file mode 100644 index 00000000..7a06c0f0 --- /dev/null +++ b/src/test/java/homework_3_tests/ImmutableClassTest.java @@ -0,0 +1,32 @@ +package homework_3_tests; + +import homework_3.immutable_class.MyImmutableBag; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class ImmutableClassTest { + + @Test + void immutableTest() { + int cash = 2000; + ArrayList documents = new ArrayList<>(Arrays.asList("Passport", "Student ID", "Metro card")); + HashMap pills = new HashMap<>(); + pills.put("Vitamins", "Supradyn"); + pills.put("Medicine for cold", "Coldrex"); + MyImmutableBag myFirstBag = new MyImmutableBag(cash, documents, pills); + pills.remove("Vitamins"); + MyImmutableBag mySecondBag = new MyImmutableBag(cash, documents, pills); + assertNotEquals(myFirstBag, mySecondBag); + assertNotEquals(myFirstBag.getPills(), mySecondBag.getPills()); + + documents.add("Doctor's prescription"); + MyImmutableBag myThirdBag = new MyImmutableBag().changeDocuments(documents); + assertNotEquals(myFirstBag, myThirdBag); + assertNotEquals(myFirstBag.getDocuments(), myThirdBag.getDocuments()); + } +} diff --git a/src/test/java/homework_4_tests/CustomAnnotationTest.java b/src/test/java/homework_4_tests/CustomAnnotationTest.java new file mode 100644 index 00000000..3a95bdeb --- /dev/null +++ b/src/test/java/homework_4_tests/CustomAnnotationTest.java @@ -0,0 +1,46 @@ +package homework_4_tests; + +import homework_4.custom_annotation.Student; +import homework_4.custom_annotation.StudentInformation; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class CustomAnnotationTest { + + @Test + void givenMinimumParametersInput_whenConstructor_thenAllParametersFilled() { + Student student = new Student("Oleg", "Oleg@gmail.com"); + + assertEquals("Oleg", student.getName()); + assertEquals("Oleg@gmail.com", student.getEmail()); + assertEquals("Saint-Petersburg", student.getCity()); + assertEquals("Java", student.getLanguage()); + } + + @Test + void givenParametersInput_whenConstructor_thenCorrectParameters() { + Student student = new Student("Olga", "Olga@gmail.com", "Moscow", "Python"); + + assertEquals("Olga", student.getName()); + assertEquals("Olga@gmail.com", student.getEmail()); + assertEquals("Moscow", student.getCity()); + assertEquals("Python", student.getLanguage()); + } + + @Test + void givenNotAllParametersInput_whenConstructor_thenAllParametersFilled() { + Student student = new Student("Pasha", "Pasha@gmail.com", "Samara"); + + assertEquals("Pasha", student.getName()); + assertEquals("Pasha@gmail.com", student.getEmail()); + assertEquals("Samara", student.getCity()); + assertEquals("Java", student.getLanguage()); + } + + @Test + void givenImplementedAnnotation_whenGetDeclaredAnnotation_thenNotNull() { + assertNotNull(Student.class.getDeclaredAnnotation(StudentInformation.class)); + } +} diff --git a/src/test/java/homework_4_tests/SingletonTest.java b/src/test/java/homework_4_tests/SingletonTest.java new file mode 100644 index 00000000..bbc19ee3 --- /dev/null +++ b/src/test/java/homework_4_tests/SingletonTest.java @@ -0,0 +1,17 @@ +package homework_4_tests; + +import homework_4.singleton.Singleton; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SingletonTest { + + @Test + void getInstanceTest() { + Singleton firstSingleton = Singleton.getInstance(); + Singleton secondSingleton = Singleton.getInstance(); + + assertEquals(firstSingleton, secondSingleton); + } +} diff --git a/src/test/java/homework_5_tests/CustomRegexMatcherTest.java b/src/test/java/homework_5_tests/CustomRegexMatcherTest.java new file mode 100644 index 00000000..75ee54a7 --- /dev/null +++ b/src/test/java/homework_5_tests/CustomRegexMatcherTest.java @@ -0,0 +1,61 @@ +package homework_5_tests; + +import base.UnitBase; +import homework_5.custom_regex_matcher.CustomRegexMatcher; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CustomRegexMatcherTest extends UnitBase { + + private void run() { + new CustomRegexMatcher().run(); + removeFromOutput("Enter your password: "); + printOut(); + } + + @ParameterizedTest + @MethodSource("testTrueCases") + void givenCorrectPassword_whenRun_thenTrue(String input, String expected) { + setInput(input); + + run(); + + assertEquals(expected, getOutput()); + } + + private static Stream testTrueCases() { + return Stream.of( + Arguments.of("Cheeseburger1!", "Password security: true"), + Arguments.of("21$cheeseburgeR", "Password security: true"), + Arguments.of("2cheese!Burger", "Password security: true") + ); + } + + @ParameterizedTest + @MethodSource("testFalseCases") + void givenIncorrectPassword_whenRun_thenFalse(String input, String expected) { + setInput(input); + + run(); + + assertEquals(expected, getOutput()); + } + + private static Stream testFalseCases() { + return Stream.of( + Arguments.of("cheeseburger1!", "Password must contain uppercase letters."), + Arguments.of("21& cheeseburgeR", "Password must not contain a space."), + Arguments.of("cheeseBurger1", "Password must contain special characters: !, $, %, #, ^"), + Arguments.of(" cheeseBurger21! ", "Password must not contain a space."), + Arguments.of("2!", "Password at least 8 characters long must contain lowercase and uppercase letters, digits and special characters: !, $, %, #, ^.") + ); + } + + + +} diff --git a/src/test/java/homework_5_tests/PowerOfNumberTest.java b/src/test/java/homework_5_tests/PowerOfNumberTest.java new file mode 100644 index 00000000..04d43b91 --- /dev/null +++ b/src/test/java/homework_5_tests/PowerOfNumberTest.java @@ -0,0 +1,58 @@ +package homework_5_tests; + +import base.UnitBase; +import homework_5.power_of_number.PowerOfNumber; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class PowerOfNumberTest extends UnitBase { + + private static final String ERROR_MESSAGE = "Only 2 non-negative integers are allowed"; + + private void run() { + new PowerOfNumber().run(); + removeFromOutput("Please enter 2 non-negative numbers:"); + printOut(); + } + + @ParameterizedTest + @MethodSource("testTrueCases") + void givenCorrectPassword_whenRun_thenPrintPower(String input, String expected) { + setInput(input); + + run(); + + assertEquals(expected, getOutput()); + } + + private static Stream testTrueCases() { + return Stream.of( + Arguments.of("2 2", "4"), + Arguments.of("0 2", "0"), + Arguments.of("2 0", "1") + ); + } + + @ParameterizedTest + @MethodSource("testBadInputCases") + void givenIncorrectInput_whenRun_thenErrorMassage(String input, String expected) { + setInput(input); + + run(); + + assertEquals(expected, getOutput()); + } + + private static Stream testBadInputCases() { + return Stream.of( + Arguments.of("1", ERROR_MESSAGE), + Arguments.of("1 2 3", ERROR_MESSAGE), + Arguments.of("one 3", ERROR_MESSAGE) + ); + } +} From 8c3063d1c266c0ac59d82ba7e5976767767a085b Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Sat, 18 Sep 2021 22:18:37 +0300 Subject: [PATCH 22/27] Test of homework_4.CustomFileReader --- .../resources/custom_file_reader/input.txt | 6 +- .../resources/custom_file_reader/output.txt | 6 +- .../CustomFileReaderTest.java | 68 +++++++++++++++++++ 3 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/test/java/homework_4_tests/CustomFileReaderTest.java diff --git a/src/main/resources/custom_file_reader/input.txt b/src/main/resources/custom_file_reader/input.txt index 26f5b2c8..cde8a42f 100644 --- a/src/main/resources/custom_file_reader/input.txt +++ b/src/main/resources/custom_file_reader/input.txt @@ -1,5 +1,5 @@ -I’m sure you’ve been asked many times whether you’re an introvert or an extrovert. For some people, it’s an easy choice, but for most of us, it’s difficult to choose one way or the other. +I'm sure you've been asked many times whether you're an introvert or an extrovert. For some people, it's an easy choice, but for most of us, it's difficult to choose one way or the other. -It’s hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality. Personality traits exist along a continuum, and the vast majority of us aren’t introverts or extroverts—we fall somewhere in the middle. +It's hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality. Personality traits exist along a continuum, and the vast majority of us aren't introverts or extroverts - we fall somewhere in the middle. -Personality consists of a stable set of preferences and tendencies through which we approach the world. Personality traits form at an early age and are fixed by early adulthood. Many important things about you change over the course of your lifetime, but your personality isn’t one of them. +Personality consists of a stable set of preferences and tendencies through which we approach the world. Personality traits form at an early age and are fixed by early adulthood. Many important things about you change over the course of your lifetime, but your personality isn't one of them. diff --git a/src/main/resources/custom_file_reader/output.txt b/src/main/resources/custom_file_reader/output.txt index 02a47f9f..2ef5dc7b 100644 --- a/src/main/resources/custom_file_reader/output.txt +++ b/src/main/resources/custom_file_reader/output.txt @@ -1,5 +1,5 @@ -I’m sure you’ve been asked many times whether you’re an introvert or an extrovert For some people it’s an easy choice but for most of us it’s difficult to choose one way or the other +I'm sure you've been asked many times whether you're an introvert or an extrovert For some people it's an easy choice but for most of us it's difficult to choose one way or the other -It’s hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality Personality traits exist along a continuum and the vast majority of us aren’t introverts or extroverts—we fall somewhere in the middle +It's hard to choose because the introvert/extrovert dichotomy reflects a tired and outdated view of personality Personality traits exist along a continuum and the vast majority of us aren't introverts or extroverts - we fall somewhere in the middle -Personality consists of a stable set of preferences and tendencies through which we approach the world Personality traits form at an early age and are fixed by early adulthood Many important things about you change over the course of your lifetime but your personality isn’t one of them +Personality consists of a stable set of preferences and tendencies through which we approach the world Personality traits form at an early age and are fixed by early adulthood Many important things about you change over the course of your lifetime but your personality isn't one of them diff --git a/src/test/java/homework_4_tests/CustomFileReaderTest.java b/src/test/java/homework_4_tests/CustomFileReaderTest.java new file mode 100644 index 00000000..fe14349a --- /dev/null +++ b/src/test/java/homework_4_tests/CustomFileReaderTest.java @@ -0,0 +1,68 @@ +package homework_4_tests; + +import base.UnitBase; +import homework_4.custom_file_reader.CustomFileReader; +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CustomFileReaderTest extends UnitBase { + + private static final String INPUT_FILE = "src/main/resources/custom_file_reader/output.txt"; + + @Test + void run1Test() { + new CustomFileReader().run1(); + + try (BufferedReader buffer = new BufferedReader(new FileReader(INPUT_FILE))) { + String expect = buffer.lines().collect(Collectors.joining("\r\n")); + assertEquals(expect, getOutput()); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + void run1TestByNio() { + new CustomFileReader().run1(); + + checkOutput(); + } + + @Test + void run2TestByNio() { + new CustomFileReader().run2(); + + checkOutput(); + } + + @Test + void run3TestByNio() { + new CustomFileReader().run3(); + + checkOutput(); + } + + private void checkOutput() { + Path path = Paths.get(INPUT_FILE); + List list; + try { + list = Files.readAllLines(path); + String expect = list.stream() + .map(s -> s.replaceAll("[,.]", "")) + .collect(Collectors.joining("\r\n")); + + assertEquals(expect, getOutput()); + } catch (IOException | NullPointerException e) { + e.printStackTrace(); + } + } +} From 232e3f72e8daf14a42c18900df8dfe58c8d6f92f Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Wed, 22 Sep 2021 07:49:52 +0300 Subject: [PATCH 23/27] Course Project "Sea Battle" --- README.md | 2 + src/main/java/course_project/Game.java | 183 ++++++++++++++++++ src/main/java/course_project/GameField.java | 89 +++++++++ src/main/java/course_project/Main.java | 7 + src/main/java/course_project/Player.java | 106 ++++++++++ .../CourseProjectTest.java | 99 ++++++++++ 6 files changed, 486 insertions(+) create mode 100644 src/main/java/course_project/Game.java create mode 100644 src/main/java/course_project/GameField.java create mode 100644 src/main/java/course_project/Main.java create mode 100644 src/main/java/course_project/Player.java create mode 100644 src/test/java/course_project_test/CourseProjectTest.java diff --git a/README.md b/README.md index cc3a6f82..19d56d24 100644 --- a/README.md +++ b/README.md @@ -19,5 +19,7 @@ | | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/power_of_number ) | The app reads input arguments(number and power) and prints number raised to the power | | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_5_tests ) | Tests to homework_5 | | HW6 | [Map Problems Generator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_6/map_problems_generator ) | The app shows case with collision in hashmap and case when it is impossible to get object by key from hashmap | +| Course Project | [Sea Battle](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/course_project ) | Sea Battle Game | +| | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/course_project_test ) | Course project tests | [Link to CodingBat](https://codingbat.com/done?user=gabdrakhimovarr@gmail.com&tag=707251349) diff --git a/src/main/java/course_project/Game.java b/src/main/java/course_project/Game.java new file mode 100644 index 00000000..740d51d3 --- /dev/null +++ b/src/main/java/course_project/Game.java @@ -0,0 +1,183 @@ +package course_project; + +import java.util.Random; +import java.util.Scanner; + +public class Game { + private static boolean isFinish = false; + private static GameField additionalFieldForComp; + private static GameField additionalFieldForHuman; + private static final String ERROR_MESSAGE = "Input must contain letter from A to J and number from 1 to 10 without a space, please try again:"; + + public void run() { + System.out.println("Hey! Mr computer invites you to play sea battle! The ships are already positioned across the field.\n" + + "Shoot and hit enemy ships. If you shoot successfully, you can shoot again, and the enemy misses a turn. \n" + + "The game continues until one of the players (you or computer) shoot all the enemy ships. \n"); + + Player human = new Player(); + Player comp = new Player(); + + human.printField(comp); + + battle(human, comp); + } + + public void battle(Player human, Player comp) { + Scanner sc = new Scanner(System.in); + additionalFieldForComp = new GameField(false); + additionalFieldForHuman = new GameField(false); + + while (!isFinish) { + boolean humanShotOnTarget = true; + boolean compShotOnTarget = true; + + while (humanShotOnTarget) { + System.out.println("\nEnter the coordinate of the opponent's field (for example A1):"); + int[] input = readInput(sc); + int x = input[0]; + int y = input[1]; + + humanShotOnTarget = changeCellStatus(x, y, comp); + if (humanShotOnTarget) { + human.printField(comp); + } + + if (checkFinishOfGame(comp.getNumHitCells(), human.getNumHitCells())) { + isFinish = true; + return; + } + } + + while (compShotOnTarget) { + int[] enemyMove = enemyMove(); + int enemyX = enemyMove[0]; + int enemyY = enemyMove[1]; + + compShotOnTarget = changeCellStatus(enemyX, enemyY, human); + if (checkFinishOfGame(comp.getNumHitCells(), human.getNumHitCells())) { + isFinish = true; + return; + } + } + + human.printField(comp); + } + } + + private int[] enemyMove() { + boolean shot = false; + int x = 0, y = 0; + while (!shot) { + x = new Random().nextInt(9)+1; + y = new Random().nextInt(9)+1; + + if (additionalFieldForComp.cells[x][y] == GameField.CellStatus.FREE) { + additionalFieldForComp.cells[x][y] = GameField.CellStatus.FILLED; + shot = true; + } + } + + return new int[]{x, y}; + } + + private boolean checkFinishOfGame(int compNumHitCells, int humanNumHitCells) { + if (humanNumHitCells == 20) { + System.out.println("Computer is winner! Don't be upset, you are great too!"); + return true; + } else if (compNumHitCells == 20) { + System.out.println("You are winner! Congratulations!"); + return true; + } + return false; + } + + private boolean changeCellStatus(int x, int y, Player player) { + boolean shotOnTarget = false; + if (player.getField().cells[x][y] == GameField.CellStatus.FREE) { + player.getField().cells[x][y] = GameField.CellStatus.FAULT; + shotOnTarget = false; + } else if (player.getField().cells[x][y] == GameField.CellStatus.SHIP) { + player.getField().cells[x][y] = GameField.CellStatus.HIT; + shotOnTarget = true; + player.increaseNumHitCells(); + } + + return shotOnTarget; + } + + public static int[] readInput(Scanner sc) { + + int[] input = new int[2]; + boolean correctInput = false; + + boolean shot = false; + while (!shot) { + String str = sc.nextLine(); + correctInput = checkingCorrectInput(str); + + if (correctInput) { + input[0] = convertX(str.substring(0,1)); + input[1] = Integer.parseInt(str.substring(1)); + + if (additionalFieldForHuman.cells[input[0]][input[1]] == GameField.CellStatus.FREE) { + additionalFieldForHuman.cells[input[0]][input[1]] = GameField.CellStatus.FILLED; + shot = true; + } else { + System.out.println("You've already shot this cage. Enter coordinate of free cell:"); + shot = false; + } + } else System.out.println(ERROR_MESSAGE); + } + + return input; + } + + public static boolean checkingCorrectInput(String str) { + int[] input = new int[2]; + boolean correctInput = false; + if (str.length() < 2 || str.length() > 3) { + return false; + } + + if (str.substring(0,1).matches("[A-J]") && str.substring(1).matches("[0-9]{1,2}")) { + try { + input[1] = Integer.parseInt(str.substring(1)); + if (input[1] > 0 && input[1] < 11) + correctInput = true; + } catch (NumberFormatException ex) { + correctInput = false; + } + } else { + correctInput = false; + } + + return correctInput; + } + + public static int convertX(String s) { + switch (s) { + case ("A"): + return 1; + case ("B"): + return 2; + case ("C"): + return 3; + case ("D"): + return 4; + case ("E"): + return 5; + case ("F"): + return 6; + case ("G"): + return 7; + case ("H"): + return 8; + case ("I"): + return 9; + case ("J"): + return 10; + } + + return 0; + } +} diff --git a/src/main/java/course_project/GameField.java b/src/main/java/course_project/GameField.java new file mode 100644 index 00000000..b8774bdb --- /dev/null +++ b/src/main/java/course_project/GameField.java @@ -0,0 +1,89 @@ +package course_project; + +import java.util.Random; + +public class GameField { + + public CellStatus[][] cells; + + public GameField(boolean isMainField) { + cells = new CellStatus[12][12]; + for (int i = 0; i < 12; i++) { + for (int j = 0; j < 12; j++) { + cells[i][j] = CellStatus.FREE; + } + } + + if (isMainField) { + createShip(4); + createShip(3); + createShip(3); + createShip(2); + createShip(2); + createShip(2); + createShip(1); + createShip(1); + createShip(1); + createShip(1); + } + } + + public enum CellStatus { + FREE, + FAULT, + HIT, + SHIP, + FILLED + } + + public void createShip(int deckNum) { + boolean enoughSpaceAround = false; + int[] coordinates = new int[]{0,0}; + boolean horizontal = new Random().nextBoolean(); + + while (!enoughSpaceAround) { + coordinates = setRandomCoordinates(deckNum, horizontal); + enoughSpaceAround = checkSpaceAround(coordinates[0], coordinates[1], deckNum, horizontal); + } + + setStatusShipInCell(deckNum, horizontal, coordinates); + } + + public boolean checkSpaceAround(int x, int y, int num, boolean horizontal) { + if (horizontal) { + for (int i = x-1; i < x+num+1; i++) { + for (int j = y-1; j < y+2; j++) { + if (cells[i][j] == CellStatus.SHIP) return false; + } + } + } else { + for (int i = x-1; i < x+1; i++) { + for (int j = y-1; j < y+num+1; j++) { + if (cells[i][j] == CellStatus.SHIP) return false; + } + } + } + + return true; + } + + private int[] setRandomCoordinates(int deckNum, boolean horizontal) { + int x = new Random().nextInt(10-deckNum)+1; + int y = new Random().nextInt(9)+1; + + if (horizontal) return new int[]{x, y}; + else return new int[]{y, x}; + } + + public void setStatusShipInCell(int deckNum, boolean horizontal, int[] coordinates) { + if (horizontal) { + for (int i = 0; i < deckNum; i++) { + cells[coordinates[0]+i][coordinates[1]] = CellStatus.SHIP; + } + } else { + for (int i = 0; i < deckNum; i++) { + cells[coordinates[0]][coordinates[1]+i] = CellStatus.SHIP; + } + } + } +} diff --git a/src/main/java/course_project/Main.java b/src/main/java/course_project/Main.java new file mode 100644 index 00000000..3e49745f --- /dev/null +++ b/src/main/java/course_project/Main.java @@ -0,0 +1,7 @@ +package course_project; + +public class Main { + public static void main(String[] args) { + new Game().run(); + } +} diff --git a/src/main/java/course_project/Player.java b/src/main/java/course_project/Player.java new file mode 100644 index 00000000..8b04a51c --- /dev/null +++ b/src/main/java/course_project/Player.java @@ -0,0 +1,106 @@ +package course_project; + +public class Player { + + private GameField field; + private int numHitCells; + + public Player() { + this.field = new GameField(true); + this.numHitCells = 0; + } + + public GameField getField() { + return field; + } + + public int getNumHitCells() { + return numHitCells; + } + + public void increaseNumHitCells() { + numHitCells++; + } + + public void printField(Player comp) { + System.out.println(" Your field: Field of opponent: "); + StringBuilder letters = new StringBuilder("A B C D E F G H I J"); + System.out.print(" "); + printWithUnderline(letters); + System.out.print(" "); + printWithUnderline(letters); + System.out.println(""); + + for (int i = 1; i < 11; i++) { + StringBuilder s = new StringBuilder(); + if (i != 10) s.append(" "); + s.append(i); + + s.append("|"); + if (i == 10) { + System.out.print(s); + s = s.delete(0,s.length()); + } + for (int j = 1; j < 11; j++) { + s.append(humanSymbolToPrint(field.cells[j][i])); + + if (j != 10) s.append(" "); + } + if (i == 10) { + printWithUnderline(s); + s = s.delete(0,s.length()); + } + + s.append("| "); + if (i != 10) s.append(" "); + s.append(i); + s.append("|"); + if (i == 10) { + System.out.print(s); + s = s.delete(0,s.length()); + } + + for (int j = 1; j < 11; j++) { + s.append(compSymbolToPrint(comp.field.cells[j][i])); + + if (j != 10) s.append(" "); + } + if (i == 10) { + printWithUnderline(s); + System.out.println("|"); + } else { + System.out.println(s + "|"); + } + + } + } + + private String humanSymbolToPrint(GameField.CellStatus cellStatus) { + String s; + if (cellStatus == GameField.CellStatus.FAULT) + s = "-"; + else if (cellStatus == GameField.CellStatus.HIT) + s = "X"; + else if (cellStatus == GameField.CellStatus.SHIP) + s = "#"; + else s = " "; + + return s; + } + + private String compSymbolToPrint(GameField.CellStatus cellStatus) { + String s; + if (cellStatus == GameField.CellStatus.FAULT) + s = "-"; + else if (cellStatus == GameField.CellStatus.HIT) + s = "X"; + else s = " "; + + return s; + } + + private void printWithUnderline(StringBuilder s) { + System.out.print("\033[0;4m" + s + "\033[0;0m"); + } + +} diff --git a/src/test/java/course_project_test/CourseProjectTest.java b/src/test/java/course_project_test/CourseProjectTest.java new file mode 100644 index 00000000..069dfce0 --- /dev/null +++ b/src/test/java/course_project_test/CourseProjectTest.java @@ -0,0 +1,99 @@ +package course_project_test; + +import base.UnitBase; +import course_project.Game; +import course_project.GameField; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CourseProjectTest extends UnitBase { + + @Test + void givenCorrectInput_whenCheckingIncorrectInput_thenTrue() { + assertTrue(Game.checkingCorrectInput("A10")); + assertTrue(Game.checkingCorrectInput("B1")); + assertTrue(Game.checkingCorrectInput("I7")); + assertTrue(Game.checkingCorrectInput("C8")); + assertTrue(Game.checkingCorrectInput("J10")); + } + + @Test + void givenIncorrectInput_whenCheckingIncorrectInput_thenFalse() { + assertFalse(Game.checkingCorrectInput("A11")); + assertFalse(Game.checkingCorrectInput("A 1")); + assertFalse(Game.checkingCorrectInput("A90")); + assertFalse(Game.checkingCorrectInput(" ")); + assertFalse(Game.checkingCorrectInput("")); + assertFalse(Game.checkingCorrectInput("J")); + assertFalse(Game.checkingCorrectInput("a1")); + assertFalse(Game.checkingCorrectInput("two")); + assertFalse(Game.checkingCorrectInput("B100")); + } + + @Test + void givenFieldWithShips_whenCheckSpaceAround() { + GameField field = new GameField(false); + field.setStatusShipInCell(4, true, new int[]{6,9}); + field.setStatusShipInCell(3, true, new int[]{4,1}); + field.setStatusShipInCell(3, false, new int[]{7,5}); + field.setStatusShipInCell(2, false, new int[]{9,1}); + field.setStatusShipInCell(2, false, new int[]{9,6}); + field.setStatusShipInCell(2, true, new int[]{3,8}); + field.setStatusShipInCell(1, true, new int[]{7,3}); + field.setStatusShipInCell(1, true, new int[]{3,6}); + field.setStatusShipInCell(1, true, new int[]{1,4}); + field.setStatusShipInCell(1, true, new int[]{1,9}); + + assertFalse(field.checkSpaceAround(2, 5, 3, false)); + assertFalse(field.checkSpaceAround(4, 4, 3, false)); + assertFalse(field.checkSpaceAround(4, 9, 3, true)); + assertFalse(field.checkSpaceAround(10, 5, 1, true)); + assertTrue(field.checkSpaceAround(2, 1, 2, false)); + assertTrue(field.checkSpaceAround(5, 3, 3, false)); + assertTrue(field.checkSpaceAround(10, 4, 1, true)); + assertTrue(field.checkSpaceAround(3, 3, 3, true)); + } + + @Test + void testConstructorGameField() { + GameField field = new GameField(true); + int countShipCells = countingShipCells(field); + + assertEquals(20, countShipCells); + } + + @Test + void testCreateShip() { + GameField field = new GameField(false); + field.createShip(4); + assertEquals(4, countingShipCells(field)); + + field = new GameField(false); + field.createShip(3); + assertEquals(3, countingShipCells(field)); + + field = new GameField(false); + field.createShip(2); + assertEquals(2, countingShipCells(field)); + + field = new GameField(false); + field.createShip(1); + assertEquals(1, countingShipCells(field)); + } + + private int countingShipCells(GameField field) { + int countShipCells = 0; + + for (int i = 1; i < 11; i++) { + for (int j = 1; j < 11; j++) { + if (field.cells[i][j] == GameField.CellStatus.SHIP) { + countShipCells++; + } + } + } + + return countShipCells; + } +} From 75d466e6098585c36605afd95774b2f3ce2d3f82 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Wed, 22 Sep 2021 10:01:58 +0300 Subject: [PATCH 24/27] homework_7. KittenToCatFunction --- README.md | 1 + src/main/java/homework_7/Cat.java | 18 +++++++++++ src/main/java/homework_7/Kitten.java | 30 +++++++++++++++++++ .../java/homework_7/KittenToCatFunction.java | 6 ++++ src/main/java/homework_7/Main.java | 24 +++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 src/main/java/homework_7/Cat.java create mode 100644 src/main/java/homework_7/Kitten.java create mode 100644 src/main/java/homework_7/KittenToCatFunction.java create mode 100644 src/main/java/homework_7/Main.java diff --git a/README.md b/README.md index 19d56d24..8e627300 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ | | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_5/power_of_number ) | The app reads input arguments(number and power) and prints number raised to the power | | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/homework_5_tests ) | Tests to homework_5 | | HW6 | [Map Problems Generator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_6/map_problems_generator ) | The app shows case with collision in hashmap and case when it is impossible to get object by key from hashmap | +| HW7 | [Kitten To Cat Function](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/homework_7 ) | KittenToCatFunction interface, whose abstract grow() method can only accept Kitten and inheritors and return only Cat and inheritors | | Course Project | [Sea Battle](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/main/java/course_project ) | Sea Battle Game | | | [Tests](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/ReginaGabdrakhimova/src/test/java/course_project_test ) | Course project tests | diff --git a/src/main/java/homework_7/Cat.java b/src/main/java/homework_7/Cat.java new file mode 100644 index 00000000..1c992837 --- /dev/null +++ b/src/main/java/homework_7/Cat.java @@ -0,0 +1,18 @@ +package homework_7; + +public class Cat { + private String name; + private String breed; + private int age; + + public Cat(String name, String breed, int age){ + this.name = name; + this.breed = breed; + this.age = age; + } + + @Override + public String toString() { + return "Cat: " + name + ", " + breed + ", cat is " + age + " years old!"; + } +} diff --git a/src/main/java/homework_7/Kitten.java b/src/main/java/homework_7/Kitten.java new file mode 100644 index 00000000..278ebe03 --- /dev/null +++ b/src/main/java/homework_7/Kitten.java @@ -0,0 +1,30 @@ +package homework_7; + +public class Kitten { + private String name; + private String breed; + private String yearOfBirth; + + public Kitten(String name, String breed, String yearOfBirth) { + this.name = name; + this.breed = breed; + this.yearOfBirth = yearOfBirth; + } + + public String getName() { + return name; + } + + public String getBreed() { + return breed; + } + + public String getYearOfBirth() { + return yearOfBirth; + } + + @Override + public String toString() { + return "Kitten: " + name + ", " + breed + ", was born in " + yearOfBirth; + } +} diff --git a/src/main/java/homework_7/KittenToCatFunction.java b/src/main/java/homework_7/KittenToCatFunction.java new file mode 100644 index 00000000..6f42db2a --- /dev/null +++ b/src/main/java/homework_7/KittenToCatFunction.java @@ -0,0 +1,6 @@ +package homework_7; + +@FunctionalInterface +public interface KittenToCatFunction { + N grow(T t); +} diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java new file mode 100644 index 00000000..62a7b59e --- /dev/null +++ b/src/main/java/homework_7/Main.java @@ -0,0 +1,24 @@ +package homework_7; + +public class Main { + public static void main(String[] args) { + Kitten kitten = new Kitten("Murzik", "simple kitten", "2020"); + KittenToCatFunction kittenToCatFunction = (k) -> { + int yearOfBirth = 0; + try + { + yearOfBirth = Integer.parseInt(k.getYearOfBirth()); + } + catch (NumberFormatException nfe) + { + System.out.println("NumberFormatException: " + nfe.getMessage()); + } + + return new Cat(k.getName(), k.getBreed(), 2021-yearOfBirth); + }; + Cat cat = kittenToCatFunction.grow(kitten); + + System.out.println(kitten); + System.out.println(cat); + } +} From 314ceffb46139e70b9271fa0bf5d9dc476fda556 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Thu, 23 Sep 2021 03:22:50 +0300 Subject: [PATCH 25/27] Fixed bugs in homework 3, 6 and course project. --- src/main/java/course_project/Game.java | 5 ++++- src/main/java/course_project/GameField.java | 2 +- src/main/java/course_project/Player.java | 2 +- .../java/homework_3/immutable_class/MyImmutableBag.java | 6 +++--- .../map_problems_generator/MapProblemsGenerator.java | 9 ++++----- .../MapProblemsMutableGenerator.java | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/course_project/Game.java b/src/main/java/course_project/Game.java index 740d51d3..3836f870 100644 --- a/src/main/java/course_project/Game.java +++ b/src/main/java/course_project/Game.java @@ -14,10 +14,11 @@ public void run() { "Shoot and hit enemy ships. If you shoot successfully, you can shoot again, and the enemy misses a turn. \n" + "The game continues until one of the players (you or computer) shoot all the enemy ships. \n"); - Player human = new Player(); + Player human = new Player(); //oshibka tut Player comp = new Player(); human.printField(comp); + comp.printField(human); battle(human, comp); } @@ -71,6 +72,8 @@ private int[] enemyMove() { x = new Random().nextInt(9)+1; y = new Random().nextInt(9)+1; + // Moment was provided when random coordinate of computer shot could fall into filled cell. + // The cycle will continue until computer enters empty cell. if (additionalFieldForComp.cells[x][y] == GameField.CellStatus.FREE) { additionalFieldForComp.cells[x][y] = GameField.CellStatus.FILLED; shot = true; diff --git a/src/main/java/course_project/GameField.java b/src/main/java/course_project/GameField.java index b8774bdb..ae176322 100644 --- a/src/main/java/course_project/GameField.java +++ b/src/main/java/course_project/GameField.java @@ -57,7 +57,7 @@ public boolean checkSpaceAround(int x, int y, int num, boolean horizontal) { } } } else { - for (int i = x-1; i < x+1; i++) { + for (int i = x-1; i < x+2; i++) { //HERE for (int j = y-1; j < y+num+1; j++) { if (cells[i][j] == CellStatus.SHIP) return false; } diff --git a/src/main/java/course_project/Player.java b/src/main/java/course_project/Player.java index 8b04a51c..e6b55069 100644 --- a/src/main/java/course_project/Player.java +++ b/src/main/java/course_project/Player.java @@ -29,7 +29,7 @@ public void printField(Player comp) { printWithUnderline(letters); System.out.print(" "); printWithUnderline(letters); - System.out.println(""); + System.out.println(); for (int i = 1; i < 11; i++) { StringBuilder s = new StringBuilder(); diff --git a/src/main/java/homework_3/immutable_class/MyImmutableBag.java b/src/main/java/homework_3/immutable_class/MyImmutableBag.java index 364018bb..082e05c3 100644 --- a/src/main/java/homework_3/immutable_class/MyImmutableBag.java +++ b/src/main/java/homework_3/immutable_class/MyImmutableBag.java @@ -62,14 +62,14 @@ public Map getPills() { } public MyImmutableBag changeCash(int newCash) { - return new MyImmutableBag(newCash, documents, pills); + return new MyImmutableBag(newCash, getDocuments(), getPills()); } public MyImmutableBag changeDocuments(ArrayList newDocuments) { - return new MyImmutableBag(cash, newDocuments, pills); + return new MyImmutableBag(cash, new ArrayList<>(newDocuments), getPills()); } public MyImmutableBag changePills(Map newPills) { - return new MyImmutableBag(cash, documents, newPills); + return new MyImmutableBag(cash, getDocuments(), new HashMap<>(newPills)); } } 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 116b0919..8ab37a40 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsGenerator.java @@ -22,15 +22,14 @@ public void run2() { HashMap mapMutable = new HashMap<>(); MapProblemsMutableGenerator thirdObject = new MapProblemsMutableGenerator("Third Object"); - MapProblemsMutableGenerator fourthObject = new MapProblemsMutableGenerator("Fourth Object"); mapMutable.put(thirdObject, 3); - mapMutable.put(fourthObject, 4); - System.out.println("\nMutable class in map: "); - mapMutable.entrySet().forEach(System.out::println); + System.out.println("\nMutable key problem in map: "); System.out.println("Trying to get object: " + mapMutable.get(thirdObject)); - System.out.println("Trying to get another object: " + mapMutable.get(fourthObject)); + + thirdObject.setValue("Modified third object"); + System.out.println("Trying to get modified object: " + mapMutable.get(thirdObject)); } } diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java index 707667ff..4759ab3d 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java @@ -35,6 +35,6 @@ public boolean equals(Object obj) { @Override public int hashCode() { - return new Random().nextInt(121); + return value != null ? value.hashCode() : 0; } } From 395aa287e0536832fd838f3cef1a111d82481db3 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Thu, 23 Sep 2021 16:02:49 +0300 Subject: [PATCH 26/27] Fixed bug in course project. --- src/main/java/course_project/Game.java | 3 +-- src/main/java/course_project/GameField.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/course_project/Game.java b/src/main/java/course_project/Game.java index 3836f870..9fcfa521 100644 --- a/src/main/java/course_project/Game.java +++ b/src/main/java/course_project/Game.java @@ -14,11 +14,10 @@ public void run() { "Shoot and hit enemy ships. If you shoot successfully, you can shoot again, and the enemy misses a turn. \n" + "The game continues until one of the players (you or computer) shoot all the enemy ships. \n"); - Player human = new Player(); //oshibka tut + Player human = new Player(); Player comp = new Player(); human.printField(comp); - comp.printField(human); battle(human, comp); } diff --git a/src/main/java/course_project/GameField.java b/src/main/java/course_project/GameField.java index ae176322..749d8947 100644 --- a/src/main/java/course_project/GameField.java +++ b/src/main/java/course_project/GameField.java @@ -57,7 +57,7 @@ public boolean checkSpaceAround(int x, int y, int num, boolean horizontal) { } } } else { - for (int i = x-1; i < x+2; i++) { //HERE + for (int i = x-1; i < x+2; i++) { for (int j = y-1; j < y+num+1; j++) { if (cells[i][j] == CellStatus.SHIP) return false; } From 1d70974c6b832c94256a7a2a110b55ef39270085 Mon Sep 17 00:00:00 2001 From: GabdrakhimovaRR Date: Thu, 23 Sep 2021 17:38:29 +0300 Subject: [PATCH 27/27] Fixed bug in course project(2). --- src/main/java/course_project/Game.java | 12 +++++++++++- src/main/java/course_project/Player.java | 11 +++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/course_project/Game.java b/src/main/java/course_project/Game.java index 9fcfa521..952f07cd 100644 --- a/src/main/java/course_project/Game.java +++ b/src/main/java/course_project/Game.java @@ -32,7 +32,7 @@ public void battle(Player human, Player comp) { boolean compShotOnTarget = true; while (humanShotOnTarget) { - System.out.println("\nEnter the coordinate of the opponent's field (for example A1):"); + System.out.println("Enter the coordinate of the opponent's field (for example A1):"); int[] input = readInput(sc); int x = input[0]; int y = input[1]; @@ -40,6 +40,7 @@ public void battle(Player human, Player comp) { humanShotOnTarget = changeCellStatus(x, y, comp); if (humanShotOnTarget) { human.printField(comp); + System.out.println("You were lucky! Shoot again, computer skips."); } if (checkFinishOfGame(comp.getNumHitCells(), human.getNumHitCells())) { @@ -48,12 +49,18 @@ public void battle(Player human, Player comp) { } } + comp.setNumOfLastShots(0); + while (compShotOnTarget) { int[] enemyMove = enemyMove(); int enemyX = enemyMove[0]; int enemyY = enemyMove[1]; compShotOnTarget = changeCellStatus(enemyX, enemyY, human); + + if (compShotOnTarget) + comp.setNumOfLastShots(comp.getNumOfLastShots()+1); + if (checkFinishOfGame(comp.getNumHitCells(), human.getNumHitCells())) { isFinish = true; return; @@ -61,6 +68,9 @@ public void battle(Player human, Player comp) { } human.printField(comp); + + if (comp.getNumOfLastShots() > 0) + System.out.println("\nComputer hit well, it fired " + comp.getNumOfLastShots() + " additional shots, you missed a move."); } } diff --git a/src/main/java/course_project/Player.java b/src/main/java/course_project/Player.java index e6b55069..06e8bfed 100644 --- a/src/main/java/course_project/Player.java +++ b/src/main/java/course_project/Player.java @@ -4,16 +4,26 @@ public class Player { private GameField field; private int numHitCells; + private int numOfLastShots; public Player() { this.field = new GameField(true); this.numHitCells = 0; + this.numOfLastShots = 0; } public GameField getField() { return field; } + public int getNumOfLastShots() { + return numOfLastShots; + } + + public void setNumOfLastShots(int numOfLastShots) { + this.numOfLastShots = numOfLastShots; + } + public int getNumHitCells() { return numHitCells; } @@ -73,6 +83,7 @@ public void printField(Player comp) { } } + System.out.println(); } private String humanSymbolToPrint(GameField.CellStatus cellStatus) {