From a6476184c0670205390832e7bb925c6aeef46226 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Mar 2026 21:57:35 +0000 Subject: [PATCH] chore: publish labs from solution Source: it-ninjas/solution@8b4dbadceb46651df4e0f386e7c6a81c16da210f Triggered by: andiaeg --- .../.itninja.index.json | 45 ++ .../backend.java.grundlagen.console/README.md | 92 ++++ .../backend.java.grundlagen.console/pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 16 + .../labs/basicexercises/AsciiHouse.java | 14 + .../labs/basicexercises/AsciiSwissFlag.java | 14 + .../labs/basicexercises/HelloWorld.java | 20 + .../labs/basicexercises/AsciiHouseTest.java | 54 +++ .../basicexercises/AsciiSwissFlagTest.java | 70 +++ .../labs/basicexercises/HelloWorldTest.java | 33 ++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 37 ++ .../README.md | 239 ++++++++++ .../pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 15 + .../labs/basicexercises/CompareNumbers.java | 20 + .../itninja/labs/basicexercises/LeapYear.java | 19 + .../basicexercises/CompareNumbersTest.java | 40 ++ .../labs/basicexercises/LeapYearTest.java | 46 ++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 29 ++ .../README.md | 221 +++++++++ .../pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 15 + .../labs/basicexercises/NumberHelper.java | 26 ++ .../labs/basicexercises/NumberHelperTest.java | 122 +++++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 37 ++ .../README.md | 188 ++++++++ .../pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 17 + .../labs/basicexercises/MonthHelper.java | 17 + .../labs/basicexercises/WeekHelper.java | 17 + .../labs/basicexercises/MonthHelperTest.java | 42 ++ .../labs/basicexercises/WeekHelperTest.java | 44 ++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 33 ++ .../README.md | 87 ++++ .../backend.java.grundlagen.debugging/pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 20 + .../labs/basicexercises/MagicNumber.java | 31 ++ .../util/MagicNumberHelper.java | 168 +++++++ .../labs/basicexercises/MagicNumberTest.java | 27 ++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 37 ++ .../README.md | 238 ++++++++++ .../pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 27 ++ .../labs/basicexercises/AgeValidator.java | 15 + .../labs/basicexercises/Calculator.java | 38 ++ .../ch/itninja/labs/AgeValidatorTest.java | 47 ++ .../java/ch/itninja/labs/CalculatorTest.java | 81 ++++ .../ch/itninja/labs/util/ItNinjaOutput.java | 10 + .../.gitignore | 5 + .../.itninja.index.json | 17 + .../README.md | 30 ++ .../src/Main.java | 6 + .../.itninja.index.json | 45 ++ .../backend.java.grundlagen.logic/README.md | 419 ++++++++++++++++++ .../backend.java.grundlagen.logic/pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 24 + .../labs/basicexercises/AgeCalculator.java | 24 + .../itninja/labs/basicexercises/Basket.java | 54 +++ .../labs/basicexercises/CalculateForms.java | 37 ++ .../basicexercises/AgeCalculatorTest.java | 71 +++ .../labs/basicexercises/BasketTest.java | 58 +++ .../basicexercises/CalculateFormsTest.java | 122 +++++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 45 ++ .../backend.java.grundlagen.methods/README.md | 345 ++++++++++++++ .../backend.java.grundlagen.methods/pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 22 + .../labs/basicexercises/FibonacciHelper.java | 9 + .../labs/basicexercises/MessageHelper.java | 9 + .../labs/basicexercises/NumberHelper.java | 9 + .../basicexercises/FibonacciHelperTest.java | 47 ++ .../basicexercises/MessageHelperTest.java | 49 ++ .../labs/basicexercises/NumberHelperTest.java | 44 ++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 25 ++ .../README.md | 68 +++ .../backend.java.grundlagen.packages/pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 12 + .../labs/basicexercises/EmptyTest.java | 14 + .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 53 +++ .../backend.java.grundlagen.regex/README.md | 153 +++++++ .../data/mixed.txt | 6 + .../backend.java.grundlagen.regex/pom.xml | 36 ++ .../ch/itninja/labs/regex/RegexTasks.java | 65 +++ .../ch/itninja/labs/regex/ItNinjaOutput.java | 23 + .../ch/itninja/labs/regex/RegexChPlzTest.java | 38 ++ .../ch/itninja/labs/regex/RegexEmailTest.java | 41 ++ .../ch/itninja/labs/regex/RegexIbanTest.java | 39 ++ .../itninja/labs/regex/RegexMatcherUtil.java | 22 + .../itninja/labs/regex/RegexPasswordTest.java | 38 ++ .../ch/itninja/labs/regex/RegexPhoneTest.java | 40 ++ .../ch/itninja/labs/regex/RegexUrlTest.java | 40 ++ .../.itninja.index.json | 25 ++ .../backend.java.grundlagen.strings/README.md | 95 ++++ .../backend.java.grundlagen.strings/pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 12 + .../labs/basicexercises/EmptyTest.java | 14 + .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.itninja.index.json | 37 ++ .../README.md | 95 ++++ .../pom.xml | 45 ++ .../src/main/java/ch/itninja/labs/Main.java | 15 + .../labs/basicexercises/HelloName.java | 18 + .../labs/basicexercises/TravelReport.java | 16 + .../labs/basicexercises/HelloNameTest.java | 34 ++ .../labs/basicexercises/TravelReportTest.java | 55 +++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + .../.gitignore | 1 + .../.itninja.index.json | 33 ++ .../README.md | 47 ++ .../tools.java.secrets.simple-example/pom.xml | 57 +++ .../src/main/java/ch/itninja/labs/Main.java | 13 + .../java/ch/itninja/labs/secrets/Basic.java | 29 ++ .../ch/itninja/labs/secrets/BasicTest.java | 25 ++ .../ch/itninja/labs/util/ItNinjaOutput.java | 12 + 121 files changed, 5860 insertions(+) create mode 100644 generated/labs/backend.java.grundlagen.console/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.console/README.md create mode 100644 generated/labs/backend.java.grundlagen.console/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiHouse.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiSwissFlag.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/HelloWorld.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiHouseTest.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiSwissFlagTest.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/HelloWorldTest.java create mode 100644 generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/README.md create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/CompareNumbers.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/LeapYear.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/CompareNumbersTest.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/LeapYearTest.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/README.md create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/README.md create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/MonthHelper.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/WeekHelper.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/MonthHelperTest.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/WeekHelperTest.java create mode 100644 generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.debugging/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.debugging/README.md create mode 100644 generated/labs/backend.java.grundlagen.debugging/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java create mode 100644 generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/util/MagicNumberHelper.java create mode 100644 generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/basicexercises/MagicNumberTest.java create mode 100644 generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/README.md create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/AgeValidator.java create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/Calculator.java create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/AgeValidatorTest.java create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/CalculatorTest.java create mode 100644 generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.hello-world/.gitignore create mode 100644 generated/labs/backend.java.grundlagen.hello-world/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.hello-world/README.md create mode 100644 generated/labs/backend.java.grundlagen.hello-world/src/Main.java create mode 100644 generated/labs/backend.java.grundlagen.logic/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.logic/README.md create mode 100644 generated/labs/backend.java.grundlagen.logic/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/AgeCalculator.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/Basket.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/CalculateForms.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/AgeCalculatorTest.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/BasketTest.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/CalculateFormsTest.java create mode 100644 generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.methods/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.methods/README.md create mode 100644 generated/labs/backend.java.grundlagen.methods/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/FibonacciHelper.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/MessageHelper.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/FibonacciHelperTest.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/MessageHelperTest.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java create mode 100644 generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.packages/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.packages/README.md create mode 100644 generated/labs/backend.java.grundlagen.packages/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.packages/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java create mode 100644 generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.regex/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.regex/README.md create mode 100644 generated/labs/backend.java.grundlagen.regex/data/mixed.txt create mode 100644 generated/labs/backend.java.grundlagen.regex/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.regex/src/main/java/ch/itninja/labs/regex/RegexTasks.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexChPlzTest.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexEmailTest.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexIbanTest.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexMatcherUtil.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPasswordTest.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPhoneTest.java create mode 100644 generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexUrlTest.java create mode 100644 generated/labs/backend.java.grundlagen.strings/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.strings/README.md create mode 100644 generated/labs/backend.java.grundlagen.strings/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.strings/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java create mode 100644 generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/.itninja.index.json create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/README.md create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/pom.xml create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/HelloName.java create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/TravelReport.java create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/HelloNameTest.java create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/TravelReportTest.java create mode 100644 generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java create mode 100644 generated/labs/tools.java.secrets.simple-example/.gitignore create mode 100644 generated/labs/tools.java.secrets.simple-example/.itninja.index.json create mode 100644 generated/labs/tools.java.secrets.simple-example/README.md create mode 100644 generated/labs/tools.java.secrets.simple-example/pom.xml create mode 100644 generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/Main.java create mode 100644 generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/secrets/Basic.java create mode 100644 generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/secrets/BasicTest.java create mode 100644 generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java diff --git a/generated/labs/backend.java.grundlagen.console/.itninja.index.json b/generated/labs/backend.java.grundlagen.console/.itninja.index.json new file mode 100644 index 0000000..458a6c0 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/.itninja.index.json @@ -0,0 +1,45 @@ +{ + "generatedAt" : "2026-03-22T21:56:45.789807222Z", + "project" : "backend.java.grundlagen.console", + "files" : [ { + "path" : "README.md", + "size" : 2201, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1365, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 422, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/AsciiHouse.java", + "size" : 233, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/AsciiSwissFlag.java", + "size" : 245, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/HelloWorld.java", + "size" : 314, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/AsciiHouseTest.java", + "size" : 1754, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/AsciiSwissFlagTest.java", + "size" : 2499, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/HelloWorldTest.java", + "size" : 926, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.console/README.md b/generated/labs/backend.java.grundlagen.console/README.md new file mode 100644 index 0000000..071819e --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/README.md @@ -0,0 +1,92 @@ + + +# Java Exercises - Ausgabe auf die Kommandozeile + +Mit diesen Übungen kannst du dein Wissen über die Ausgabe auf die Kommandozeile (Konsole) vertiefen. + +## Voraussetzung + +- Du weisst, was mit Konsole gemeint ist. +- Du kannst Ausgaben auf die Konsole machen. +- Du weisst wie und warum man Zeichen escapen muss. + + + +## Aufgabe 1 - Hello World + +Passe den Code an damit `Hello World` auf der Konsole ausgegeben wird. + +```java + public static void printHelloWorld(){ + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/HelloWorld.java) + + + +## Aufgabe 2 - Ascii House + +Zeichne ein Haus in der Konsole. Du darfst dazu folgende Zeichen verwenden: + +- `'/'`, `'\'`, `'+'`, `'-'`, `'_'`, `'['`, `']'`, `'|'`, Leerzeichen (`' '`) + +```java + public static void printHouse(){ + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/AsciiHouse.java) + +> **Hinweis:** Vorsicht bei `'\'`, das ist ein besonderes Zeichen in einem String und muss escaped werden, das +> heisst für ein `'\'` muss man innerhalb von einem String das Zeichen zweimal schreiben → `".\\."` + +Falls unklar ist, was hier gemeint ist, schau dir [ASCII-Art](https://de.wikipedia.org/wiki/ASCII-Art) an. + +Hier eine Katze als Beispiel: + +```console + /\_/\ +( o.o ) + > ^ < +``` + +## Aufgabe 3 - Ascii Swiss Flag + +Zeichne eine Schweizer Fahne. Die Fahne muss einen Rahmen haben. Du darfst dazu +folgende Zeichen verwenden: + +- Im Rahmen: `'|'`, `'-'`, `'+''`, Leerzeichen (`' '`) +- Innerhalb: `'|'`, `'-'`, `'+'`, `'*'`, `'='`, `'@''`, Leerzeichen (`' '`) + +```java + public static void printSwissFlag(){ + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/AsciiSwissFlag.java) + +Falls unklar ist, was hier gemeint ist, schau dir [ASCII-Art](https://de.wikipedia.org/wiki/ASCII-Art) an. + +Hier ist die japanische Flagge als Beispiel: + +```console + ------------------ +| | +| @@@@ | +| @@@@@@@@ | +| @@@@@@@@@@ | +| @@@@@@@@ | +| @@@@ | +| | + ------------------ +``` diff --git a/generated/labs/backend.java.grundlagen.console/pom.xml b/generated/labs/backend.java.grundlagen.console/pom.xml new file mode 100644 index 0000000..6343b74 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + <>17 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..5a24353 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,16 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.AsciiHouse; +import ch.itninja.labs.basicexercises.AsciiSwissFlag; +import ch.itninja.labs.basicexercises.HelloWorld; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + HelloWorld.printHelloWorld(); + AsciiHouse.printHouse(); + AsciiSwissFlag.printSwissFlag(); + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiHouse.java b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiHouse.java new file mode 100644 index 0000000..86adf4b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiHouse.java @@ -0,0 +1,14 @@ +package ch.itninja.labs.basicexercises; + +public class AsciiHouse { + + private AsciiHouse() { + // Prevent instantiation + } + + public static void printHouse(){ + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} diff --git a/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiSwissFlag.java b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiSwissFlag.java new file mode 100644 index 0000000..ada0a5c --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/AsciiSwissFlag.java @@ -0,0 +1,14 @@ +package ch.itninja.labs.basicexercises; + +public class AsciiSwissFlag { + + private AsciiSwissFlag() { + // Prevent instantiation + } + + public static void printSwissFlag(){ + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} diff --git a/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/HelloWorld.java b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/HelloWorld.java new file mode 100644 index 0000000..dcfde5d --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/main/java/ch/itninja/labs/basicexercises/HelloWorld.java @@ -0,0 +1,20 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for basic Hello World output. + */ +public class HelloWorld { + + private HelloWorld() { + // Prevent instantiation + } + + public static void printHelloWorld(){ + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} + + + diff --git a/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiHouseTest.java b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiHouseTest.java new file mode 100644 index 0000000..34ee223 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiHouseTest.java @@ -0,0 +1,54 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.List; +import java.util.Set; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +class AsciiHouseTest { + + @Test + void givenPrintHouse_whenCalled_thenOutputHasOnlyAllowedCharacters() { + // GIVEN + Set allowedChars = Set.of( + ' ', '/', '\\', '+', '-', '_', '[', ']', '|', '\n', '\r' + ); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + AsciiHouse.printHouse(); + } finally { + // System.out zurücksetzen, egal ob Fehler auftritt oder nicht + System.setOut(originalOut); + } + + // THEN + List lines = outputStream.toString().lines().toList(); + + System.out.println(lines); + + assertFalse(lines.isEmpty(), "Output should not be empty"); + assertTrue(lines.size() >= 2, "A house should have at least 2 lines, but has " + lines.size()); + + for (String line : lines) { + for (int pos = 0; pos < line.length(); pos++) { + char c = line.charAt(pos); + if (!allowedChars.contains(c)) { + fail("Invalid character '" + c + "' in line: " + line); + } + } + } + + ItNinjaOutput.PrintItNinjaOutput("AsciiHouse", "", String.join("\r\n", lines)); + } +} diff --git a/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiSwissFlagTest.java b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiSwissFlagTest.java new file mode 100644 index 0000000..75a3d96 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/AsciiSwissFlagTest.java @@ -0,0 +1,70 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.List; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class AsciiSwissFlagTest { + + @Test + void givenPrintSwissFlag_whenCalled_thenOutputHasValidFrameAndCharacters() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + AsciiSwissFlag.printSwissFlag(); + } finally { + System.setOut(originalOut); + } + + // THEN + List lines = outputStream.toString().lines().toList(); + + assertFalse(lines.isEmpty(), "Output should not be empty"); + assertTrue(lines.size() >= 3, "Flag should have at least 3 lines"); + + String allowedInnerChars = " +*"; + String allowedFrameChars = "|-_=`~"; + + int firstLineNumber = 0; + int lastLineNumber = lines.size() - 1; + for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { + String line = lines.get(lineNumber); + + boolean isFirstLine = lineNumber == firstLineNumber; + boolean isLastLine = lineNumber == lastLineNumber; + if (isFirstLine || isLastLine) { + // Top or bottom line must contain a horizontal frame character + assertTrue( + line.chars().anyMatch(ch -> "-_=`~".indexOf(ch) >= 0), + "Top/bottom line must contain at least one horizontal border character" + ); + } else { + // Middle lines must start and end with '|' + assertTrue( + line.length() >= 2 && line.startsWith("|") && line.endsWith("|"), + "Line " + (lineNumber + 1) + " must start and end with '|'" + ); + } + + // All characters must be allowed + for (char c : line.toCharArray()) { + if (!allowedInnerChars.contains(String.valueOf(c)) && + !allowedFrameChars.contains(String.valueOf(c))) { + fail("Invalid character '" + c + "' in line: " + line); + } + } + } + + ItNinjaOutput.PrintItNinjaOutput("AsciiSwissFlag", "", String.join("\r\n", lines)); + + } +} diff --git a/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/HelloWorldTest.java b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/HelloWorldTest.java new file mode 100644 index 0000000..7aeedb1 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/basicexercises/HelloWorldTest.java @@ -0,0 +1,33 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class HelloWorldTest { + + @Test + void givenPrintHelloWorld_whenCalled_thenOutputIsHelloWorld() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + HelloWorld.printHelloWorld(); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals("Hello World", output, "Output should be exactly 'Hello World'"); + + ItNinjaOutput.PrintItNinjaOutput("HelloWorld", "", output); + } +} diff --git a/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.console/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/.itninja.index.json b/generated/labs/backend.java.grundlagen.control-structures-if/.itninja.index.json new file mode 100644 index 0000000..a5c6607 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/.itninja.index.json @@ -0,0 +1,37 @@ +{ + "generatedAt" : "2026-03-22T21:57:29.904269411Z", + "project" : "backend.java.grundlagen.control-structures-if", + "files" : [ { + "path" : "README.md", + "size" : 4039, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 339, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/CompareNumbers.java", + "size" : 339, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/LeapYear.java", + "size" : 359, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/CompareNumbersTest.java", + "size" : 1449, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/LeapYearTest.java", + "size" : 2167, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/README.md b/generated/labs/backend.java.grundlagen.control-structures-if/README.md new file mode 100644 index 0000000..460a08b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/README.md @@ -0,0 +1,239 @@ + + +# Java Exercises - Variablen und bedingte Anweisungen + +Mit diesen Übungen kannst du dein Wissen über bedingte Ausführung vertiefen. + +#### Voraussetzung + +- Du verstehst und kennst die verschiedenen Conditional Statements. +- Du weisst, wann und wie welches Conditional Statement eingesetzt werden sollte. + + + +## Aufgabe 1 - Zahlenvergleich + +Passe die folgende Methode an. Vergleiche die beiden Zahlen 'zahl1' und 'zahl2' und gib das Resultat des Vergleichs auf +auf der Konsole aus: + +- `Zahl1(value1) ist kleiner als Zahl2(value2)` +- `Zahl1(value1) ist grösser als Zahl2(value2)` +- `Zahl1(value1) ist gleich gross wie Zahl2(value2)` + +Wobei in der Ausgabe `value1` und `value2` durch die tatsächlichen Werte ersetzt werden sollen. + +```java + public static void compareNumbers(int number1, int number2) { + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/CompareNumbers.java) + +**Beispiel 1:** + +Eingabe: + +```console +CompareNumbers.compareNumbers(-1, 5); +``` + +Ausgabe: + +```console +Zahl1(-1) ist kleiner als Zahl2(5) +``` + +**Beispiel 2:** + +Eingabe: + +```console +CompareNumbers.compareNumbers(23, 7); +``` + +Ausgabe: + +```console +Zahl1(23) ist grösser als Zahl2(7) +``` + +**Beispiel 3:** + +Eingabe: + +```console +CompareNumbers.compareNumbers(47, 47); +``` + +Ausgabe: + +```console +Zahl1(47) ist gleich gross wie Zahl2(47) +``` + +**Beispiel 4:** + +Eingabe: + +```console +CompareNumbers.compareNumbers(0, 0); +``` + +Ausgabe: + +```console +Zahl1(0) ist gleich gross wie Zahl2(0) +``` + +## Aufgabe 2 - Schaltjahr + +Passe die folgende Methode an. Stell fest, ob das übergebene Jahr ein Schaltjahr ist (gemäss gregorianischer Kalender). +Gib auf der Konsole das Resultat aus: + +- `Das Jahr year ist ein Schaltjahr gemäss gregorianischem Kalender` +- `Das Jahr year ist kein Schaltjahr gemäss gregorianischem Kalender` + +Wobei in der Ausgabe `year` durch das tatsächliche Jahr ersetzt werden soll. +Falls das Jahr ein Schaltjahr gemäss gregorianischem Kalender ist, soll die Methode `true` zurückgeben, andernfalls +`false`. + +> Verwende keine logischen Ausdrücke zur Berechnung des Schaltjahres. Nutze stattdessen if-else- und else-if Anweisungen. + +```java + public static boolean isLeapYear(int year) { + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/LeapYear.java) + +**Beispiel 1:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(1200); +``` + +Ausgabe: + +```console +Das Jahr 1200 ist kein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 2:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(1996); +``` + +Ausgabe: + +```console +Das Jahr 1996 ist ein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 3:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(1900); +``` + +Ausgabe: + +```console +Das Jahr 1900 ist kein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 4:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(2000); +``` + +Ausgabe: + +```console +Das Jahr 2000 ist ein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 5:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(2021); +``` + +Ausgabe: + +```console +Das Jahr 2021 ist kein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 6:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(2024); +``` + +Ausgabe: + +```console +Das Jahr 2024 ist ein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 7:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(2100); +``` + +Ausgabe: + +```console +Das Jahr 2100 ist kein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 8:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(2400); +``` + +Ausgabe: + +```console +Das Jahr 2400 ist ein Schaltjahr gemäss gregorianischem Kalender +``` + +**Beispiel 9:** + +Eingabe: + +```console +boolean result = LeapYear.isLeapYear(2023); +``` + +Ausgabe: + +```console +Das Jahr 2023 ist kein Schaltjahr gemäss gregorianischem Kalender +``` diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/pom.xml b/generated/labs/backend.java.grundlagen.control-structures-if/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..6ed9140 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,15 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.CompareNumbers; +import ch.itninja.labs.basicexercises.LeapYear; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + CompareNumbers.compareNumbers(4, 7); + LeapYear.isLeapYear(1973); + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/CompareNumbers.java b/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/CompareNumbers.java new file mode 100644 index 0000000..d80f82a --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/CompareNumbers.java @@ -0,0 +1,20 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for comparing numbers. + */ +public class CompareNumbers { + + private CompareNumbers() { + // Prevent instantiation + } + + public static void compareNumbers(int number1, int number2) { + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} + + + diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/LeapYear.java b/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/LeapYear.java new file mode 100644 index 0000000..5cb3155 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/src/main/java/ch/itninja/labs/basicexercises/LeapYear.java @@ -0,0 +1,19 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for leap year calculation. + */ +public class LeapYear { + + // IT-Ninja: Füge hier Deinen Code ein... + + private LeapYear() { + // Prevent instantiation + } + + public static boolean isLeapYear(int year) { + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/CompareNumbersTest.java b/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/CompareNumbersTest.java new file mode 100644 index 0000000..9551037 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/CompareNumbersTest.java @@ -0,0 +1,40 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CompareNumbersTest { + + @ParameterizedTest + @CsvSource({ + "1, -1, 5, 'Zahl1(-1) ist kleiner als Zahl2(5)'", + "2, 23, 7, 'Zahl1(23) ist grösser als Zahl2(7)'", + "3, 47, 47, 'Zahl1(47) ist gleich gross wie Zahl2(47)'", + "4, 0, 0, 'Zahl1(0) ist gleich gross wie Zahl2(0)'", + }) + void givenNumbers_whenCalled_thenOutputAsExpected(int lab, int value1, int value2, String expectedResult) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + CompareNumbers.compareNumbers(value1, value2); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "For "+value1+" and "+value2+" output should be '"+ expectedResult +"'"); + + ItNinjaOutput.PrintItNinjaOutput("CompareNumbers"+lab, "CompareNumbers.compareNumbers("+value1+", "+value2+");", output); + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/LeapYearTest.java b/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/LeapYearTest.java new file mode 100644 index 0000000..f77affe --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/basicexercises/LeapYearTest.java @@ -0,0 +1,46 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class LeapYearTest { + @ParameterizedTest + @CsvSource({ + "1, 1200, false, 'Das Jahr 1200 ist kein Schaltjahr gemäss gregorianischem Kalender'", + "2, 1996, true, 'Das Jahr 1996 ist ein Schaltjahr gemäss gregorianischem Kalender'", + "3, 1900, false, 'Das Jahr 1900 ist kein Schaltjahr gemäss gregorianischem Kalender'", + "4, 2000, true, 'Das Jahr 2000 ist ein Schaltjahr gemäss gregorianischem Kalender'", + "5, 2021, false, 'Das Jahr 2021 ist kein Schaltjahr gemäss gregorianischem Kalender'", + "6, 2024, true, 'Das Jahr 2024 ist ein Schaltjahr gemäss gregorianischem Kalender'", + "7, 2100, false, 'Das Jahr 2100 ist kein Schaltjahr gemäss gregorianischem Kalender'", + "8, 2400, true, 'Das Jahr 2400 ist ein Schaltjahr gemäss gregorianischem Kalender'", + "9, 2023, false, 'Das Jahr 2023 ist kein Schaltjahr gemäss gregorianischem Kalender'" + }) + void givenYears_whenCalled_thenOutputAsExpected(int lab, int year, boolean expectedResult, String expectedOutput) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + boolean result; + + try { + // WHEN + result = LeapYear.isLeapYear(year); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedOutput, output, "For "+year+" output should be '"+ expectedOutput +"'"); + assertEquals(expectedResult, result, "For "+year+" result should be '"+ result +"'"); + ItNinjaOutput.PrintItNinjaOutput("LeapYear"+lab, "boolean result = LeapYear.isLeapYear("+year+");", output); + } + +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-if/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/.itninja.index.json b/generated/labs/backend.java.grundlagen.control-structures-loops/.itninja.index.json new file mode 100644 index 0000000..f2b7964 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/.itninja.index.json @@ -0,0 +1,29 @@ +{ + "generatedAt" : "2026-03-22T21:56:55.597104753Z", + "project" : "backend.java.grundlagen.control-structures-loops", + "files" : [ { + "path" : "README.md", + "size" : 4354, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 364, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java", + "size" : 605, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java", + "size" : 4380, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/README.md b/generated/labs/backend.java.grundlagen.control-structures-loops/README.md new file mode 100644 index 0000000..8932aeb --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/README.md @@ -0,0 +1,221 @@ + + +# Java Exercises - Loops + +Mit diesen Übungen kannst du dein Wissen über die Befehle `for`, `while` und `do` vertiefen. + +#### Voraussetzung + +- Du kennst die Befehle `for`, `while` und `do`. + + + +## Aufgabe 1 - Summe aller durch 8 teilbaren Zahlen von 1 bis 100 + +Passe die folgende Methode an. Zähle alle Zahlen von **1 bis 100** zusammen, welche durch **8** teilbar sind und gib das +Resultat auf der Konsole aus: + +- `Die Summe aller durch 8 teilbaren Zahlen von 1 bis 100 beträgt 624.` + +```java + public static void sumDivisibleByEightFixedRange() { + + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java) + +**Beispiel:** + +Eingabe: + +```console +NumberHelper.sumDivisibleByEightFixedRange() +``` + +Ausgabe: + +```console +Die Summe aller durch 8 teilbaren Zahlen von 1 bis 100 beträgt 624. +``` + +## Aufgabe 2 - Summe aller durch X teilbaren Zahlen + +Passe die folgende Methode an. Zähle alle Zahlen von `min` bis `max` zusammen, welche durch `divisor` teilbar sind und gib das +Resultat auf der Konsole aus: + +- `Die Summe aller durch [divisor] teilbaren Zahlen von [min] bis [max] beträgt [result].` + +> Abgrenzung: Wenn `max` kleiner als `min` ist oder wenn `divisor` kleiner gleich 0 ist, soll folgender Text auf der +> Konsole ausgegeben werden: `Berechnung mit diesen Werten nicht möglich` + + +```java + public static void sumDivisibleBy(int min, int max, int divisor) { + + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java) + +**Beispiel 1:** + +Eingabe: + +```console +NumberHelper.sumDivisibleBy(10, 30, 7); +``` + +Ausgabe: + +```console +Die Summe aller durch 7 teilbaren Zahlen von 10 bis 30 beträgt 63. +``` + +**Beispiel 2:** + +Eingabe: + +```console +NumberHelper.sumDivisibleBy(30, 10, 7); +``` + +Ausgabe: + +```console +Berechnung mit diesen Werten nicht möglich. +``` + +## Aufgabe 3 - Summe gemeinsames Vielfaches zweier Zahlen + +Passe die folgende Methode an. Zähle alle Zahlen von `min` bis `max` zusammen, welche ein gemeinsames Vielfaches von den +beiden Zahlen `number1` und `number2`sind und gib das Resultat auf der Konsole aus: + +- `Summe der Zahlen von [min] bis [max], die ein gemeinsames Vielfache von [number1] und [number2] sind: [result].` + +> Abgrenzung: Wenn `max` kleiner als `min` ist oder wenn eine der Zahlen `number1` oder 'number2' kleiner gleich 0 ist, +> soll folgender Text auf der Konsole ausgegeben werden: `Berechnung mit diesen Werten nicht möglich` + + +```java + public static void sumCommonMultiples(int min, int max, int number1, int number2) { + + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java) + +**Beispiel 1:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(1, 50, 3, 5); +``` + +Ausgabe: + +```console +Summe der Zahlen von 1 bis 50, die ein gemeinsames Vielfache von 3 und 5 sind: 90. +``` + +**Beispiel 2:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(1, 100, 4, 6); +``` + +Ausgabe: + +```console +Summe der Zahlen von 1 bis 100, die ein gemeinsames Vielfache von 4 und 6 sind: 432. +``` + +**Beispiel 3:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(1, 10, 4, 6); +``` + +Ausgabe: + +```console +Summe der Zahlen von 1 bis 10, die ein gemeinsames Vielfache von 4 und 6 sind: 0. +``` + +**Beispiel 4:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(50, 1, 3, 5); +``` + +Ausgabe: + +```console +Berechnung mit diesen Werten nicht möglich. +``` + +**Beispiel 5:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(15, 15, 3, 5); +``` + +Ausgabe: + +```console +Summe der Zahlen von 15 bis 15, die ein gemeinsames Vielfache von 3 und 5 sind: 15. +``` + +**Beispiel 6:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(60, 60, 4, 6); +``` + +Ausgabe: + +```console +Summe der Zahlen von 60 bis 60, die ein gemeinsames Vielfache von 4 und 6 sind: 60. +``` + +**Beispiel 7:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(-30, 30, 6, 10); +``` + +Ausgabe: + +```console +Summe der Zahlen von -30 bis 30, die ein gemeinsames Vielfache von 6 und 10 sind: 0. +``` + +**Beispiel 8:** + +Eingabe: + +```console +NumberHelper.sumCommonMultiples(1, 1000, 8, 12); +``` + +Ausgabe: + +```console +Summe der Zahlen von 1 bis 1000, die ein gemeinsames Vielfache von 8 und 12 sind: 20664. +``` diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/pom.xml b/generated/labs/backend.java.grundlagen.control-structures-loops/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..ca6c7bd --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,15 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.NumberHelper; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + NumberHelper.sumDivisibleByEightFixedRange(); + NumberHelper.sumDivisibleBy(2, 64, 4); + NumberHelper.sumCommonMultiples(1, 88, 3, 5); + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java b/generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java new file mode 100644 index 0000000..69b1b5f --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java @@ -0,0 +1,26 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing helper methods for month operations. +*/ +public class NumberHelper { + + private NumberHelper() { + // Prevent instantiation + } + + public static void sumDivisibleByEightFixedRange() { + + // IT-Ninja: Füge hier Deinen Code ein... + } + + public static void sumDivisibleBy(int min, int max, int divisor) { + + // IT-Ninja: Füge hier Deinen Code ein... + } + + public static void sumCommonMultiples(int min, int max, int number1, int number2) { + + // IT-Ninja: Füge hier Deinen Code ein... + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java b/generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java new file mode 100644 index 0000000..9dcd3fe --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java @@ -0,0 +1,122 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class NumberHelperTest { + + @Test + void givenSumDivisibleByEightFixedRange_whenCalled_thenOutputAsExpected() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + NumberHelper.sumDivisibleByEightFixedRange(); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + String expected = "Die Summe aller durch 8 teilbaren Zahlen von 1 bis 100 beträgt 624."; + assertEquals(expected, output, "Output is not as expected"); + + ItNinjaOutput.PrintItNinjaOutput("SumDivisibleByEightFixedRange", "NumberHelper.sumDivisibleByEightFixedRange()", output); + } + + @ParameterizedTest + @CsvSource({ + "1, 10, 30, 7, 63", + "2, 30, 10, 7, -1", + }) + void givenSumDivisibleBy_whenCalled_thenOutputAsExpected(int lab, int min, int max, int divisor, int result) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + NumberHelper.sumDivisibleBy(min, max, divisor); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + String expectedResult = result > 0 ? String.format("Die Summe aller durch %d teilbaren Zahlen von %d bis %d beträgt %d." + , divisor, min, max, result) : "Berechnung mit diesen Werten nicht möglich."; + + assertEquals(expectedResult, output, "Output is not as expected."); + + // For documentation + String input = String.format("NumberHelper.sumDivisibleBy(%d, %d, %d);" + , min, max, divisor); + + ItNinjaOutput.PrintItNinjaOutput("SumDivisibleBy"+lab, input, output); + } + + @ParameterizedTest + @CsvSource({ + // einfache Beispiele mit kleinem Bereich + "1, 1, 50, 3, 5, 90", + "2, 1, 100, 4, 6, 432", + "0, 10, 30, 2, 3, 84", + "0, 1, 60, 5, 10, 210", + + // keine gemeinsamen Vielfachen im Bereich + "3, 1, 10, 4, 6, 0", + "0, 20, 24, 3, 5, 0", + + // min > max → Berechnung nicht möglich + "4, 50, 1, 3, 5, -1", + + // Randwert = genau ein gemeinsames Vielfaches + "5, 15, 15, 3, 5, 15", + "6, 60, 60, 4, 6, 60", + + // negatives Intervall (z. B. für erweiterte Version) + "7, -30, 30, 6, 10, 0", // negatives Vielfaches ignoriert (nach Bedarf anpassen) + + // sehr großer Bereich + "8, 1, 1000, 8, 12, 20664" + }) + + void givenSumCommonMultiples_whenCalled_thenOutputAsExpected(int lab, int min, int max, int number1, int number2, int result) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + NumberHelper.sumCommonMultiples(min, max, number1, number2); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + String expectedResult = result >= 0 ? String.format("Summe der Zahlen von %d bis %d, die ein gemeinsames Vielfache von %d und %d sind: %d." + , min, max, number1, number2, result) : "Berechnung mit diesen Werten nicht möglich."; + + assertEquals(expectedResult, output, "Output is not as expected."); + + // For documentation + String input = String.format("NumberHelper.sumCommonMultiples(%d, %d, %d, %d);" + , min, max, number1, number2); + + ItNinjaOutput.PrintItNinjaOutput("SumCommonMultiples"+lab, input, output); + } + +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-loops/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/.itninja.index.json b/generated/labs/backend.java.grundlagen.control-structures-switch/.itninja.index.json new file mode 100644 index 0000000..622e5b4 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/.itninja.index.json @@ -0,0 +1,37 @@ +{ + "generatedAt" : "2026-03-22T21:56:50.669661600Z", + "project" : "backend.java.grundlagen.control-structures-switch", + "files" : [ { + "path" : "README.md", + "size" : 2767, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 379, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/MonthHelper.java", + "size" : 325, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/WeekHelper.java", + "size" : 331, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/MonthHelperTest.java", + "size" : 1317, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/WeekHelperTest.java", + "size" : 1751, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/README.md b/generated/labs/backend.java.grundlagen.control-structures-switch/README.md new file mode 100644 index 0000000..242b9a8 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/README.md @@ -0,0 +1,188 @@ + + +# Java Exercises - Das Switch Statement + +Mit diesen Übungen kannst du dein Wissen über den Befehl `switch` vertiefen. + +#### Voraussetzung + +- Du kennst den `switch` Befehl. + + + +## Aufgabe 1 - Monat ausgeben + +Passe die folgende Methode an. Gib abhängig von der Variable `month` den passenden Monat auf der Konsole aus. Der Wert +`1` soll dabei dem Monat `Januar` entsprechen, `2` dem Monat `Februar`, usw. Für Zahlen welche keinem Monat entsprechen +soll `ungültiger Monat` auf der Konsole ausgegeben werden. + +```java + public static void printMonthByNumber(int month) { + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/MonthHelper.java) + +**Beispiel 1:** + +Eingabe: + +```console +MonthHelper.printMonthByNumber(1); +``` + +Ausgabe: + +```console +Januar +``` + +**Beispiel 2:** + +Eingabe: + +```console +MonthHelper.printMonthByNumber(5); +``` + +Ausgabe: + +```console +Mai +``` + +**Beispiel 3:** + +Eingabe: + +```console +MonthHelper.printMonthByNumber(9); +``` + +Ausgabe: + +```console +September +``` + +**Beispiel 4:** + +Eingabe: + +```console +MonthHelper.printMonthByNumber(12); +``` + +Ausgabe: + +```console +Dezember +``` + +**Beispiel 5:** + +Eingabe: + +```console +MonthHelper.printMonthByNumber(22); +``` + +Ausgabe: + +```console +ungültiger Monat +``` + +**Beispiel 6:** + +Eingabe: + +```console +MonthHelper.printMonthByNumber(-3); +``` + +Ausgabe: + +```console +ungültiger Monat +``` + +## Aufgabe 2 - Wochentag + +Passe die folgende Methode an. Gib abhängig von der Variable `weekdayName` auf der Konsole aus, um welchen Wochentag es sich +handelt: + +- `Der [weekdayName] ist der [weekday]. Tag in der Woche.` +- `[weekdayName] entspricht keinem bekannten Wochentag.` + +Wobei in der Ausgabe `[weekdayName]` durch den Namen des Wochentags ersetzt werden soll und `[weekday]` durch den Tag +der Woche, welche dem Wochentag entspricht. Der Montag soll dabei der erste Tag in der Woche sein. + +```java + public static void printWeekdayNumber(String weekdayName) { + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/WeekHelper.java) + +**Beispiel 1:** + +Eingabe: + +```console +WeekHelper.printWeekdayNumber("Freitag"); +``` + +Ausgabe: + +```console +Der Freitag ist der 5. Tag in der Woche. +``` + +**Beispiel 2:** + +Eingabe: + +```console +WeekHelper.printWeekdayNumber("Donnerstag"); +``` + +Ausgabe: + +```console +Der Donnerstag ist der 4. Tag in der Woche. +``` + +**Beispiel 3:** + +Eingabe: + +```console +WeekHelper.printWeekdayNumber("Weihnachten"); +``` + +Ausgabe: + +```console +Weihnachten entspricht keinem bekannten Wochentag. +``` + +**Beispiel 4:** + +Eingabe: + +```console +WeekHelper.printWeekdayNumber("Samstag"); +``` + +Ausgabe: + +```console +Der Samstag ist der 6. Tag in der Woche. +``` diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/pom.xml b/generated/labs/backend.java.grundlagen.control-structures-switch/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..0430f33 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,17 @@ +package ch.itninja.labs; + +import java.time.Month; + +import ch.itninja.labs.basicexercises.MonthHelper; +import ch.itninja.labs.basicexercises.WeekHelper; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + WeekHelper.printWeekdayNumber("Donnerstag"); + MonthHelper.printMonthByNumber(3); + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/MonthHelper.java b/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/MonthHelper.java new file mode 100644 index 0000000..5be76b0 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/MonthHelper.java @@ -0,0 +1,17 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing helper methods for month operations. +*/ +public class MonthHelper { + + private MonthHelper() { + // Prevent instantiation + } + + public static void printMonthByNumber(int month) { + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/WeekHelper.java b/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/WeekHelper.java new file mode 100644 index 0000000..0e9727f --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/src/main/java/ch/itninja/labs/basicexercises/WeekHelper.java @@ -0,0 +1,17 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing helper methods for week operations. + */ +public class WeekHelper { + + private WeekHelper() { + // Prevent instantiation + } + + public static void printWeekdayNumber(String weekdayName) { + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/MonthHelperTest.java b/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/MonthHelperTest.java new file mode 100644 index 0000000..eb97714 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/MonthHelperTest.java @@ -0,0 +1,42 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MonthHelperTest { + + @ParameterizedTest + @CsvSource({ + "1, 1, 'Januar'", + "2, 5, 'Mai'", + "3, 9, 'September'", + "4, 12, 'Dezember'", + "5, 22, 'ungültiger Monat'", + "6, -3, 'ungültiger Monat'", + }) + void givenNumbers_whenCalled_thenOutputAsExpected(int lab, int month, String expectedResult) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + MonthHelper.printMonthByNumber(month); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "Output is not as expected."); + + ItNinjaOutput.PrintItNinjaOutput("MonthByNumber"+lab, "MonthHelper.printMonthByNumber("+month+");", output); + } +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/WeekHelperTest.java b/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/WeekHelperTest.java new file mode 100644 index 0000000..df07e73 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/basicexercises/WeekHelperTest.java @@ -0,0 +1,44 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class WeekHelperTest { + @ParameterizedTest + @CsvSource({ + "1, 'Montag', 'Der Montag ist der 1. Tag in der Woche.'", + "0, 'Dienstag', 'Der Dienstag ist der 2. Tag in der Woche.'", + "0, 'Mittwoch', 'Der Mittwoch ist der 3. Tag in der Woche.'", + "2, 'Donnerstag', 'Der Donnerstag ist der 4. Tag in der Woche.'", + "1, 'Freitag', 'Der Freitag ist der 5. Tag in der Woche.'", + "4, 'Samstag', 'Der Samstag ist der 6. Tag in der Woche.'", + "0, 'Sonntag', 'Der Sonntag ist der 7. Tag in der Woche.'", + "3, 'Weihnachten', 'Weihnachten entspricht keinem bekannten Wochentag.'" + }) + void givenYears_whenCalled_thenOutputAsExpected(int lab, String weekdayName, String expectedOutput) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + boolean result; + + try { + // WHEN + WeekHelper.printWeekdayNumber(weekdayName); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedOutput, output, "Output is not as expected."); + ItNinjaOutput.PrintItNinjaOutput("Weekday"+lab, "WeekHelper.printWeekdayNumber(\""+weekdayName+"\");", output); + } + +} diff --git a/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.control-structures-switch/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.debugging/.itninja.index.json b/generated/labs/backend.java.grundlagen.debugging/.itninja.index.json new file mode 100644 index 0000000..c55c572 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/.itninja.index.json @@ -0,0 +1,33 @@ +{ + "generatedAt" : "2026-03-22T21:57:14.386068352Z", + "project" : "backend.java.grundlagen.debugging", + "files" : [ { + "path" : "README.md", + "size" : 2492, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 578, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java", + "size" : 977, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/util/MagicNumberHelper.java", + "size" : 5510, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/MagicNumberTest.java", + "size" : 792, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.debugging/README.md b/generated/labs/backend.java.grundlagen.debugging/README.md new file mode 100644 index 0000000..f4903c4 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/README.md @@ -0,0 +1,87 @@ + + +# Java Exercises - Debugging + +Mit diesen Übungen kannst du dein Wissen zum Thema Debuggen vertiefen. + +#### Voraussetzung + +- Du weisst was ein Breakpoint ist. +- Du kannst den Debugger starten und den Code Schritt für Schritt ausführen + + + +{{< ninja warning>}} +Zum Lösen der folgenden Aufgaben darfst du den Quellcode nicht verändern! +{{< /ninja >}} + +## Aufgabe 1 - Wert in Zwischenberechnung herausfinden + +Finde heraus, welcher Wert z hat, wenn x = 500 ist. + +```java + public static int generate(int iterations) throws InterruptedException { + + // IT-Ninja: Zum Lösen der folgenden Aufgaben darfst du den Quellcode nicht verändern! + + // IT-Ninja: Aufgabe 1 - Finde heraus, welcher Wert z hat, wenn x = 500 ist. + + // IT-Ninja: Aufgabe 2 - Hat z am Ende immer den gleichen Wert, auch wenn du in der 'for'-Schleife einen + // Breakpoint gesetzt hast? + + // IT-Ninja: Erstelle Screenshots und diskutiere deine Resultate und Erkenntnisse mit deinem Praxisbildner. + + int z = 0; + for(int x = 0; x < iterations; x++) { + z = MagicNumberHelper.getSecretValue(x); + } + return z; + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java) + +## Aufgabe 2 - Verhalten des Programms beim Debuggen + +Beantworte folgende Frage: Hat z am Ende immer den gleichen Wert, auch wenn du in der 'for'-Schleife einen Breakpoint +gesetzt hast? + +```java + public static int generate(int iterations) throws InterruptedException { + + // IT-Ninja: Zum Lösen der folgenden Aufgaben darfst du den Quellcode nicht verändern! + + // IT-Ninja: Aufgabe 1 - Finde heraus, welcher Wert z hat, wenn x = 500 ist. + + // IT-Ninja: Aufgabe 2 - Hat z am Ende immer den gleichen Wert, auch wenn du in der 'for'-Schleife einen + // Breakpoint gesetzt hast? + + // IT-Ninja: Erstelle Screenshots und diskutiere deine Resultate und Erkenntnisse mit deinem Praxisbildner. + + int z = 0; + for(int x = 0; x < iterations; x++) { + z = MagicNumberHelper.getSecretValue(x); + } + return z; + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java) + +**Beispiel:** + +Eingabe: + +```console +MagicNumber.generate(1000); +``` + +Ausgabe: + +```console +-32414486 +``` + +{{< ninja info>}} +Erstelle ScreenShots und diskutiere deine Resultate und Erkenntnisse mit deinem Praxisbildner. +{{< /ninja >}} diff --git a/generated/labs/backend.java.grundlagen.debugging/pom.xml b/generated/labs/backend.java.grundlagen.debugging/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..9b455ce --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,20 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.MagicNumber; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + try { + int iterations = 1000; + System.out.println("Starting calculation..."); + int z = MagicNumber.generate(iterations); + System.out.println("The z-Value after " + iterations + " iterations is " + z); + } catch (Exception exception){ + System.out.println("Exception occurred: " + exception); + } + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java b/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java new file mode 100644 index 0000000..e595669 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/MagicNumber.java @@ -0,0 +1,31 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.basicexercises.util.MagicNumberHelper; + +/** + * Utility class providing helper methods for debug operations. + */ +public class MagicNumber { + + private MagicNumber() { + // Prevent instantiation + } + + public static int generate(int iterations) throws InterruptedException { + + // IT-Ninja: Zum Lösen der folgenden Aufgaben darfst du den Quellcode nicht verändern! + + // IT-Ninja: Aufgabe 1 - Finde heraus, welcher Wert z hat, wenn x = 500 ist. + + // IT-Ninja: Aufgabe 2 - Hat z am Ende immer den gleichen Wert, auch wenn du in der 'for'-Schleife einen + // Breakpoint gesetzt hast? + + // IT-Ninja: Erstelle Screenshots und diskutiere deine Resultate und Erkenntnisse mit deinem Praxisbildner. + + int z = 0; + for(int x = 0; x < iterations; x++) { + z = MagicNumberHelper.getSecretValue(x); + } + return z; + } +} diff --git a/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/util/MagicNumberHelper.java b/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/util/MagicNumberHelper.java new file mode 100644 index 0000000..7716340 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/src/main/java/ch/itninja/labs/basicexercises/util/MagicNumberHelper.java @@ -0,0 +1,168 @@ +package ch.itninja.labs.basicexercises.util; + +/** + * DebugHelper provides a deterministic but non-trivial mapping from integers to integers, + * useful for debugging exercises that require conditional breakpoints. + * + * Features: + * - Two consecutive calls with the same input in the same epoch produce different values + * (output depends on internal state/history). + * - If more than thresholdMs (default: 20 ms) pass between calls, a new epoch starts: + * the internal state is re-initialized deterministically from (seed, epochId), + * and the same first N calls in each epoch repeat the same values. + * + * Usage (default instance): + * int v1 = DebugHelper.getSecretValue(10); + * int v2 = DebugHelper.getSecretValue(10); // different from v1 (same epoch) + * Thread.sleep(200); + * int v3 = DebugHelper.getSecretValue(10); // same as v1 (new epoch) + */ +public final class MagicNumberHelper { + + private MagicNumberHelper() { /* no instances */ } + + // Default mapper: deterministic with fixed seed and 20 ms threshold + private static final EpochHistoryMapper DEFAULT_MAPPER = + new EpochHistoryMapper(12345, 20); + + /** + * Returns a secret value for the given input using the default mapper. + */ + public static int getSecretValue(int input) { + return DEFAULT_MAPPER.getSecretValue(input); + } + + /** + * Returns the current epoch id of the default mapper. + */ + public static int getCurrentEpochId() { + return DEFAULT_MAPPER.getEpochId(); + } + + /** + * Resets the default mapper to epoch 0 and initial state. + */ + public static void resetDefault() { + DEFAULT_MAPPER.reset(); + } + + // ===================================================================== + // Inner class: stateful, epoch-based, history-dependent number mapper + // ===================================================================== + + /** + * Stateful mapper whose output depends on: + * - seed + * - current epoch + * - previous output (internal state) + * - input + * - position within epoch + * + * Same sequence of calls within an epoch produces the same sequence of outputs. + * Waiting more than thresholdMs between calls starts a new epoch with the same + * initial state, so the sequence repeats. + */ + public static final class EpochHistoryMapper { + + private final int seed; + private final long thresholdMs; + + private int epochId = 0; + private long lastCallNanos = 0L; + + // Per-epoch evolving state + private int state; + private int position = 0; + + public EpochHistoryMapper(int seed) { + this(seed, 20); + } + + public EpochHistoryMapper(int seed, long thresholdMs) { + this.seed = seed; + this.thresholdMs = thresholdMs; + startNewEpoch(); + } + + /** + * Returns a value that depends on (seed, epochId, previous state, input, position). + * Two consecutive calls with the same input within the same epoch yield different outputs. + * After a gap > thresholdMs, a new epoch starts and the first calls repeat deterministically. + */ + public synchronized int getSecretValue(int input) { + long now = System.nanoTime(); + if (lastCallNanos != 0L && nanosToMillis(now - lastCallNanos) > thresholdMs) { + startNewEpoch(); + } + lastCallNanos = now; + + // Output depends on evolving state and current input + int out = strongMix(state, input, epochId, position); + + // Evolve state for next call + state = evolve(state, out, input, epochId, position); + + position++; + return out; + } + + /** + * Returns the current epoch id. + */ + public synchronized int getEpochId() { + return epochId; + } + + /** + * Resets everything to epoch 0 with initial state. + */ + public synchronized void reset() { + epochId = 0; + lastCallNanos = 0L; + startNewEpoch(); + } + + // ------- internals ------- + + private void startNewEpoch() { + state = initialState(seed, epochId); + position = 0; + epochId++; + } + + private static int initialState(int seed, int epochId) { + int x = seed ^ (epochId * 0x9E3779B9); + x ^= Integer.rotateLeft(x, 13); + x *= 0x7FEB352D; + x ^= (x >>> 15); + x *= 0x846CA68B; + x ^= (x >>> 16); + return x; + } + + private static int strongMix(int prevState, int input, int epoch, int pos) { + int x = prevState; + x ^= Integer.rotateLeft(input * 0x9E3779B9, (pos & 31)); + x ^= (epoch * 0x7F4A7C15); + x ^= (x >>> 16); + x *= 0x7FEB352D; + x ^= (x >>> 15); + x *= 0x846CA68B; + x ^= (x >>> 16); + return x; + } + + private static int evolve(int prevState, int out, int input, int epoch, int pos) { + int y = out ^ Integer.rotateLeft(prevState, (pos % 29) + 1); + y ^= (input * 0x85EBCA6B); + y ^= Integer.rotateLeft(epoch, (pos % 5) + 3); + y *= 0xC2B2AE35; + y ^= (y >>> 13); + return y; + } + + private static long nanosToMillis(long nanos) { + return nanos / 1_000_000L; + } + } +} diff --git a/generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/basicexercises/MagicNumberTest.java b/generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/basicexercises/MagicNumberTest.java new file mode 100644 index 0000000..ca64669 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/basicexercises/MagicNumberTest.java @@ -0,0 +1,27 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class MagicNumberTest { + @Test + void givenNumber_whenCalled_thenResultAsExpected() { + // GIVEN + int iterations = 1000; + int expected = -32414486; + + int result = 0; + try { + // WHEN + result = MagicNumber.generate(iterations); + } catch (Exception exception){ + System.out.println("Exception occured: " + exception); + } + + // THEN + assertEquals(expected, result, "Result is not as expected."); + ItNinjaOutput.PrintItNinjaOutput("Debug", "MagicNumber.generate("+iterations+");", "" + result); + } +} diff --git a/generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.debugging/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.exception-handling/.itninja.index.json b/generated/labs/backend.java.grundlagen.exception-handling/.itninja.index.json new file mode 100644 index 0000000..0139dbf --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/.itninja.index.json @@ -0,0 +1,37 @@ +{ + "generatedAt" : "2026-03-22T21:57:25.001258407Z", + "project" : "backend.java.grundlagen.exception-handling", + "files" : [ { + "path" : "README.md", + "size" : 6744, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1385, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 792, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/AgeValidator.java", + "size" : 310, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/Calculator.java", + "size" : 1472, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/AgeValidatorTest.java", + "size" : 1611, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/CalculatorTest.java", + "size" : 3139, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 370, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.exception-handling/README.md b/generated/labs/backend.java.grundlagen.exception-handling/README.md new file mode 100644 index 0000000..ff4ab62 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/README.md @@ -0,0 +1,238 @@ + + +# Java Exercises - Exception Handling + +Mit diesen Übungen kannst du erste Erfahrungen beim behandeln von Exceptions sammeln. + +## Voraussetzungen + +- Du kennst `try`, `catch`, `throw`, `throws` und `finally`. + + + +## Aufgabe 1 – Sichere Division + +Passe untenstehenden Quellcode an und füge folgende Methode hinzu: + +--- +**Name der Methode:** *Bestimme selber einen passenden Namen für die Methode* +**Funktion:** Liefert das Resultat der Divsion von `a` durch `b`. Bei einer Divsion durch 0 wird der Wert +`Integer.MAX_VALUE` zurückgeben. +**Parameter1:** a [int] +**Parameter2:** b [int] +**Rückgabewert:** Resultat der Berechnung [int], `Integer,MAX_VALUE` bei Division durch 0. +**Bedingungen:** Verwende `try` / `catch`, um Division durch 0 korrekt abzufangen. `if` darf nicht verwendet werden. + +--- + +> Halte die Coding Guidelines ein! + +```java +public class Calculator { + + private Calculator() { + // Prevent instantiation + } + + // Place here the methode for "Sichere Division". + + // IT-Ninja: Füge hier Deinen Code ein: + + // Place here the methode for "Mindestwert sicherstellen". + + // IT-Ninja: Füge hier Deinen Code ein: +} +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/Calculator.java) + +Wenn du die Methode implementiert hast, kannst du sie aus `main` aufrufen. + +```java + public static void main(String[] args) { + + // Sample call for "Sichere Division" + // IT-Ninja: Füge hier Deinen Code ein: + + try { + int age = 16; + // Sample call for "Alter prüfen" + // IT-Ninja: Füge hier Deinen Code ein: + System.out.printf("Das Alter %d ist gültig.%n", age); + } catch (IllegalArgumentException e) { + System.out.println("Fehler: " + e.getMessage()); + } + + // Sample call for "Mindestwert sicherstellen" + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +Falls du sie testen willst, kannst du sie aus dem vorbereiteten Test aufrufen. + +```java + try { + // WHEN + // Aufruf der Methode für "Sichere Division", welche wir testen wollen (etwas wie: res = methode(a, b);): + // IT-Ninja: Füge hier Deinen Code ein: + } finally { + } +``` + +::src(src/test/java/ch/itninja/labs/CalculatorTest.java) + + + +## Aufgabe 2 – Alter prüfen + +Passe untenstehenden Quellcode an und füge folgende Methode hinzu: + +--- + +**Name der Methode:** *Bestimme selber einen passenden Namen für die Methode* +**Funktion:** Prüft das Alter und wirft eine `IllegalArgumentException`, wenn das Alter kleiner 0 oder grösser 130 ist. +Für gültige Werte passiert nichts. +**Parameter1:** age [int] +**Rückgabewert:** keiner, `IllegalArgumentException` wenn Alter ausserhalb des erlaubten Bereichs ist. + +--- + +> Halte die Coding Guidelines ein! + +```java +public class AgeValidator { + + // IT-Ninja: Füge hier Deinen Code ein: + + private AgeValidator() { + // Prevent instantiation + } + + // IT-Ninja: Füge hier Deinen Code ein: +} +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/AgeValidator.java) + +Wenn du die Methode implementiert hast, kannst du sie aus `main` aufrufen. + +```java + public static void main(String[] args) { + + // Sample call for "Sichere Division" + // IT-Ninja: Füge hier Deinen Code ein: + + try { + int age = 16; + // Sample call for "Alter prüfen" + // IT-Ninja: Füge hier Deinen Code ein: + System.out.printf("Das Alter %d ist gültig.%n", age); + } catch (IllegalArgumentException e) { + System.out.println("Fehler: " + e.getMessage()); + } + + // Sample call for "Mindestwert sicherstellen" + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +Falls du sie testen willst, kannst du sie aus dem vorbereiteten Test aufrufen. + +```java + try { + // WHEN + // Aufruf der Methode für "Sichere Division", welche wir testen wollen (etwas wie: res = methode(a, b);): + // IT-Ninja: Füge hier Deinen Code ein: + } catch (IllegalArgumentException e) { + excptionOccured = true; + exceptionMessage = e.getMessage(); + } +``` + +::src(src/test/java/ch/itninja/labs/AgeValidatorTest.java) + + + +## Aufgabe 3 – Mindestwert sicherstellen + +Passe untenstehenden Quellcode an und füge folgende Methode hinzu: + +--- + +**Name der Methode:** *Bestimme selber einen passenden Namen für die Methode* +**Funktion:** Dividiert `a` durch `b` und danach `c` durch `d`. Das Resultat wird jeweils zum Total hinzugefügt. Fehler +werden mit **einem einzigen** `try` / `catch` abgefangen. Im `finally`-Block wird abschliessend sichergestellt, dass das +Total mindestens 100 beträgt. +**Parameter1:** a [int] +**Parameter2:** b [int] +**Parameter3:** c [int] +**Parameter4:** b [int] +**Rückgabewert:** Total der Berechnung [int] + +--- +Bei dieser Aufgabe ist es wichtig, dass du die Funktion genau umsetzt auch wenn sie eigentlich keinen Sinn macht oder +besser implementiert werden könnte. + +> Halte die Coding Guidelines trotzdem ein! + +```java +public class Calculator { + + private Calculator() { + // Prevent instantiation + } + + // Place here the methode for "Sichere Division". + + // IT-Ninja: Füge hier Deinen Code ein: + + // Place here the methode for "Mindestwert sicherstellen". + + // IT-Ninja: Füge hier Deinen Code ein: +} +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/Calculator.java) + +Wenn du die Methode implementiert hast, kannst du sie aus `main` aufrufen. + +```java + public static void main(String[] args) { + + // Sample call for "Sichere Division" + // IT-Ninja: Füge hier Deinen Code ein: + + try { + int age = 16; + // Sample call for "Alter prüfen" + // IT-Ninja: Füge hier Deinen Code ein: + System.out.printf("Das Alter %d ist gültig.%n", age); + } catch (IllegalArgumentException e) { + System.out.println("Fehler: " + e.getMessage()); + } + + // Sample call for "Mindestwert sicherstellen" + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +Falls du sie testen willst, kannst du sie aus dem vorbereiteten Test aufrufen. + +```java + try { + // WHEN + // Aufruf der Methode für "Mindestwert sicherstellen", welche wir testen wollen (etwas wie: min = methode(a, b, c);): + // IT-Ninja: Füge hier Deinen Code ein: + } finally { + } +``` + +::src(src/test/java/ch/itninja/labs/CalculatorTest.java) + + diff --git a/generated/labs/backend.java.grundlagen.exception-handling/pom.xml b/generated/labs/backend.java.grundlagen.exception-handling/pom.xml new file mode 100644 index 0000000..41b8c00 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-02-03-08-methods + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..3fd2c44 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,27 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.Calculator; +import ch.itninja.labs.basicexercises.AgeValidator; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + // Sample call for "Sichere Division" + // IT-Ninja: Füge hier Deinen Code ein... + + try { + int age = 16; + // Sample call for "Alter prüfen" + // IT-Ninja: Füge hier Deinen Code ein... + System.out.printf("Das Alter %d ist gültig.%n", age); + } catch (IllegalArgumentException e) { + System.out.println("Fehler: " + e.getMessage()); + } + + // Sample call for "Mindestwert sicherstellen" + // IT-Ninja: Füge hier Deinen Code ein... + } +} diff --git a/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/AgeValidator.java b/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/AgeValidator.java new file mode 100644 index 0000000..e589de0 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/AgeValidator.java @@ -0,0 +1,15 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for age validation operations. + */ +public class AgeValidator { + + // IT-Ninja: Füge hier Deinen Code ein... + + private AgeValidator() { + // Prevent instantiation + } + + // IT-Ninja: Füge hier Deinen Code ein... +} diff --git a/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/Calculator.java b/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/Calculator.java new file mode 100644 index 0000000..e54da59 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/src/main/java/ch/itninja/labs/basicexercises/Calculator.java @@ -0,0 +1,38 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for some calculations. + */ +public class Calculator { + + private Calculator() { + // Prevent instantiation + } + + // Place here the methode for "Sichere Division". + /** + * Name der Methode: Bestimme selber einen passenden Namen für die Methode + * Funktion: Liefert das Resultat der Divsion von a durch b. Bei einer Divsion durch 0 wird der Wert + * Integer.MAX_VALUE zurückgeben. + * Parameter1: a [int] + * Parameter2: b [int] + * Rückgabewert: Resultat der Berechnung [int], Integer,MAX_VALUE bei Division durch 0. + * Bedingungen: Verwende try / catch, um Division durch 0 korrekt abzufangen. if darf nicht verwendet werden. + */ + // IT-Ninja: Füge hier Deinen Code ein... + + // Place here the methode for "Mindestwert sicherstellen". + /** + * + * Name der Methode: Bestimme selber einen passenden Namen für die Methode + * Funktion: Dividiert a durch b und danach c durch d. Das Resultat wird jeweils zum Total hinzugefügt. Fehler + * werden mit einem einzigen try / catch abgefangen. Im finally-Block wird abschliessend sichergestellt, dass das + * Total mindestens 100 beträgt. + * Parameter1: a [int] + * Parameter2: b [int] + * Parameter3: c [int] + * Parameter4: b [int] + * Rückgabewert: Total der Berechnung [int] + */ + // IT-Ninja: Füge hier Deinen Code ein... +} diff --git a/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/AgeValidatorTest.java b/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/AgeValidatorTest.java new file mode 100644 index 0000000..d496bf1 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/AgeValidatorTest.java @@ -0,0 +1,47 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.AgeValidator; +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +public class AgeValidatorTest { + + @ParameterizedTest + @CsvSource({ + "1, 120, false", + "2, 21, false", + "3, 0, false", + "4, 130, false", + "5, -12, true", + "6, 145, true", + }) + void givenValidateAge_whenCalled_thenResultAsExpected(int lab, int age, boolean exceptionExpected) { + + // Init to a number not used by the methode. + boolean excptionOccured = false; + String exceptionMessage = null; + + try { + // WHEN + // Aufruf der Methode für "Sichere Division", welche wir testen wollen (etwas wie: res = methode(a, b);): + // IT-Ninja: Füge hier Deinen Code ein... + } catch (IllegalArgumentException e) { + excptionOccured = true; + exceptionMessage = e.getMessage(); + } + + // THEN + assertEquals(exceptionExpected, excptionOccured, "Program flow was not throwing as expected."); + + // For documentation + String input = String.format("yourImplementation(%d);", age); + String output = "Beispiel Ausgabe: " + (excptionOccured? + String.format("Fehler: %s%n", exceptionMessage): + String.format("Das Alter %d ist gültig.%n", age)); + + ItNinjaOutput.PrintItNinjaOutput("AgeValidator"+lab, input, output); + } +} diff --git a/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/CalculatorTest.java b/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/CalculatorTest.java new file mode 100644 index 0000000..92618ff --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/CalculatorTest.java @@ -0,0 +1,81 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.Calculator; + +import static org.junit.jupiter.api.Assertions.*; +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +public class CalculatorTest { + + private static final int METHOD_NOT_IMPLEMENTED = -2; + + @ParameterizedTest + @CsvSource({ + "1, 120, 2, 60", + "2, 21, 3, 7", + "3, 4, 8, 0", + "4, 48, 0, 2147483647", + }) + void givenDivide_whenCalled_thenResultAsExpected(int lab, int a, int b, int expected) { + + // Init to a number not used by the methode. + int res = METHOD_NOT_IMPLEMENTED; + + try { + // WHEN + // Aufruf der Methode für "Sichere Division", welche wir testen wollen (etwas wie: res = methode(a, b);): + // IT-Ninja: Füge hier Deinen Code ein... + } finally { + } + + // Pre-Check for implementation + assertNotEquals(METHOD_NOT_IMPLEMENTED , res + , "Please ensure that the method is called in try code block and the result is stored in variable 'res'!"); + + // THEN + assertEquals(expected, res, "The number seems not to be the minimum of three."); + + // For documentation + String input = String.format("total = yourImplementation(%d, %d);", a, b); + String output = String.format("Beispiel Ausgabe: Die Division von '%d / %d' ergibt %d.%n", a, b, res); + + ItNinjaOutput.PrintItNinjaOutput("SafeDivision"+lab, input, output); + } + + @ParameterizedTest + @CsvSource({ + "1, 120, 2, 230, 2, 175, ''", + "2, 21, 3, 32, 2, 100, 'Total zu klein -> 100'", + "3, 240, 2, 48, 0, 120, 'Exception bei `c / d`, aber `a / b` > 100'", + "4, 48, 0, 240, 2, 100, 'Exception bei `a / b`, Total darum 0 und zu klein -> 100'", + }) + void givenCalculation_whenCalled_thenResultAsExpected(int lab, int a, int b, int c, int d, int expected, String comment) { + + // Init to a number not used by the methode. + int total = METHOD_NOT_IMPLEMENTED; + + try { + // WHEN + // Aufruf der Methode für "Mindestwert sicherstellen", welche wir testen wollen (etwas wie: min = methode(a, b, c);): + // IT-Ninja: Füge hier Deinen Code ein... + } finally { + } + + // Pre-Check for implementation + assertNotEquals(METHOD_NOT_IMPLEMENTED , total + , "Please ensure that the method is called in try code block and the result is stored in variable 'total'!"); + + // THEN + assertEquals(expected, total, "The number seems not to be the minimum of three."); + + // For documentation + String input = String.format("total = yourImplementation(%d, %d, %d, %d);", a, b, c, d); + String output = String.format("Beispiel Ausgabe: Das Total für die Berechnung mit '%d, %d, %d, %d' ist %d%s.%n" + , a, b, c, d, total, comment.isEmpty() ? "" : " // " + comment); + + ItNinjaOutput.PrintItNinjaOutput("Calculation"+lab, input, output); + } + +} diff --git a/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..b64244b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.exception-handling/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,10 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, Object output) { + System.out.printf("\n", lab); + System.out.printf("Eingabe: %s\n", input); + System.out.printf("Ausgabe: %s\n", output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.hello-world/.gitignore b/generated/labs/backend.java.grundlagen.hello-world/.gitignore new file mode 100644 index 0000000..0d2599c --- /dev/null +++ b/generated/labs/backend.java.grundlagen.hello-world/.gitignore @@ -0,0 +1,5 @@ +*.iml +.idea/ +out/ +target/ +build/ \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.hello-world/.itninja.index.json b/generated/labs/backend.java.grundlagen.hello-world/.itninja.index.json new file mode 100644 index 0000000..3009ec7 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.hello-world/.itninja.index.json @@ -0,0 +1,17 @@ +{ + "generatedAt" : "2026-03-22T21:57:15.092279995Z", + "project" : "backend.java.grundlagen.hello-world", + "files" : [ { + "path" : ".gitignore", + "size" : 32, + "language" : "gitignore" + }, { + "path" : "README.md", + "size" : 740, + "language" : "markdown" + }, { + "path" : "src/Main.java", + "size" : 119, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.hello-world/README.md b/generated/labs/backend.java.grundlagen.hello-world/README.md new file mode 100644 index 0000000..0a3f33b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.hello-world/README.md @@ -0,0 +1,30 @@ +# Java Exercises - Einfaches Hello World + +Hier kannst Du erste Erfahrungen sammeln mit einem einfachen Java Programm + +## Voraussetzung + +- Du bist bereit die nachfolgende Anleitung gründlich zu lesen. + + + +## Einführung + +Der zur Übung gehörende Quellcode zeigt dir ein einfaches Programm, welches den Text `Hello World` auf die Konsole +ausgibt. Er soll dir helfen, dich mit der Entwicklungsumgebung (IntelliJ) vertraut zu machen. + +## Aufgabe - Hello World + +Schau Dir das Programm an und versuche es zum Laufen zu bringen. Versuche, ein paar kleine Änderungen am Programm +vorzunehmen. + +```java +public class Main { + public static void main(String[] args) { + + System.out.println("Hello, world!"); + } +} +``` + +::src(src/Main.java) diff --git a/generated/labs/backend.java.grundlagen.hello-world/src/Main.java b/generated/labs/backend.java.grundlagen.hello-world/src/Main.java new file mode 100644 index 0000000..645dcf8 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.hello-world/src/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + + System.out.println("Hello, world!"); + } +} diff --git a/generated/labs/backend.java.grundlagen.logic/.itninja.index.json b/generated/labs/backend.java.grundlagen.logic/.itninja.index.json new file mode 100644 index 0000000..bb622f1 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/.itninja.index.json @@ -0,0 +1,45 @@ +{ + "generatedAt" : "2026-03-22T21:56:39.197515656Z", + "project" : "backend.java.grundlagen.logic", + "files" : [ { + "path" : "README.md", + "size" : 8679, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 658, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/AgeCalculator.java", + "size" : 554, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/Basket.java", + "size" : 1666, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/CalculateForms.java", + "size" : 746, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/AgeCalculatorTest.java", + "size" : 2546, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/BasketTest.java", + "size" : 1832, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/CalculateFormsTest.java", + "size" : 5133, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.logic/README.md b/generated/labs/backend.java.grundlagen.logic/README.md new file mode 100644 index 0000000..b41ac55 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/README.md @@ -0,0 +1,419 @@ + + +# Java Exercises - Einfache Berechnungen + +Mit diesen Übungen kannst du dein Wissen über einfache Berechnungen vertiefen. + +#### Voraussetzung + +- Du weisst, wie man in Java mit Zahlen rechnet. + + + +## Aufgabe 1 - geometrische Berechnungen + +Passe die folgenden Methoden an. Berechne Flächen, Umfang und Volumen und gib das Resultat auf der Konsole aus: + +- `Das Rechteck mit a=[value1]cm und b=[value2]cm hat eine Fläche von [result]cm2.` +- `Das Dreieck mit g=[value1]cm und h=[value2]cm hat eine Fläche von [result]cm2.` +- `Der Kreis mit dem Radius [value]cm hat eine Fläche von [result]cm2.` +- `Das Rechteck mit a=[value1]cm und b=[value2]cm hat einen Umfang von [result]cm.` + +Wobei in der Ausgabe die Platzhalter mit den eckigen Klammern durch die entsprechenden Zahlen ersetzt werden sollen. +Ganzzahlen sollen ohne '.' und Nachkommastellen angezeigt werden, Dezimalzahlen mit 2 Stellen hinter dem Punkt. + +```java + public static void printRectArea(int sideA, int sideB) { + + // IT-Ninja: Füge hier Deinen Code ein: + } + + public static void printTriangleArea(int sideC, int heightC) { + + // IT-Ninja: Füge hier Deinen Code ein: + } + + public static void printCircleArea(int radius) { + + // IT-Ninja: Füge hier Deinen Code ein: + } + + public static void printRectPerimeter(int sideA, int sideB) { + + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/CalculateForms.java) + +### Rechteck Flächenberechnung + +**Beispiel 1:** + +Eingabe: + +```console +CalculateForms.printRectArea(4, 5); +``` + +Ausgabe: + +```console +Das Rechteck mit a=4cm und b=5cm hat eine Fläche von 20cm2. +``` + +**Beispiel 2:** + +Eingabe: + +```console +CalculateForms.printRectArea(3, 7); +``` + +Ausgabe: + +```console +Das Rechteck mit a=3cm und b=7cm hat eine Fläche von 21cm2. +``` + +**Beispiel 3:** + +Eingabe: + +```console +CalculateForms.printRectArea(6, 4); +``` + +Ausgabe: + +```console +Das Rechteck mit a=6cm und b=4cm hat eine Fläche von 24cm2. +``` + +**Beispiel 4:** + +Eingabe: + +```console +CalculateForms.printRectArea(0, 0); +``` + +Ausgabe: + +```console +Das Rechteck mit a=0cm und b=0cm hat eine Fläche von 0cm2. +``` + +### Dreieck Flächenberechnung + +**Beispiel 1:** + +Eingabe: + +```console +CalculateForms.printTriangleArea(4, 5); +``` + +Ausgabe: + +```console +Das Dreieck mit c=4cm und h=5cm hat eine Fläche von 10cm2. +``` + +**Beispiel 2:** + +Eingabe: + +```console +CalculateForms.printTriangleArea(3, 12); +``` + +Ausgabe: + +```console +Das Dreieck mit c=3cm und h=12cm hat eine Fläche von 18cm2. +``` + +**Beispiel 3:** + +Eingabe: + +```console +CalculateForms.printTriangleArea(6, 4); +``` + +Ausgabe: + +```console +Das Dreieck mit c=6cm und h=4cm hat eine Fläche von 12cm2. +``` + +**Beispiel 4:** + +Eingabe: + +```console +CalculateForms.printTriangleArea(0, 0); +``` + +Ausgabe: + +```console +Das Dreieck mit c=0cm und h=0cm hat eine Fläche von 0cm2. +``` + +### Kreis Flächenberechnung + +**Beispiel 1:** + +Eingabe: + +```console +CalculateForms.printCircleArea(4); +``` + +Ausgabe: + +```console +Der Kreis mit r=4cm hat eine Fläche von 50.27cm2. +``` + +**Beispiel 2:** + +Eingabe: + +```console +CalculateForms.printCircleArea(3); +``` + +Ausgabe: + +```console +Der Kreis mit r=3cm hat eine Fläche von 28.27cm2. +``` + +**Beispiel 3:** + +Eingabe: + +```console +CalculateForms.printCircleArea(6); +``` + +Ausgabe: + +```console +Der Kreis mit r=6cm hat eine Fläche von 113.10cm2. +``` + +**Beispiel 4:** + +Eingabe: + +```console +CalculateForms.printCircleArea(0); +``` + +Ausgabe: + +```console +Der Kreis mit r=0cm hat eine Fläche von 0.00cm2. +``` + +### Rechteck Umfangberechnung + +**Beispiel 1:** + +Eingabe: + +```console +CalculateForms.printRectPerimeter(4, 5); +``` + +Ausgabe: + +```console +Das Rechteck mit a=4cm und b=5cm hat einen Umfang von 18cm. +``` + +**Beispiel 2:** + +Eingabe: + +```console +CalculateForms.printRectPerimeter(3, 12); +``` + +Ausgabe: + +```console +Das Rechteck mit a=3cm und b=12cm hat einen Umfang von 30cm. +``` + +**Beispiel 3:** + +Eingabe: + +```console +CalculateForms.printRectPerimeter(6, 4); +``` + +Ausgabe: + +```console +Das Rechteck mit a=6cm und b=4cm hat einen Umfang von 20cm. +``` + +**Beispiel 4:** + +Eingabe: + +```console +CalculateForms.printRectPerimeter(0, 0); +``` + +Ausgabe: + +```console +Das Rechteck mit a=0cm und b=0cm hat einen Umfang von 0cm. +``` + +## Aufgabe 2 - Checkout + +Passe die folgenden Methoden an. Nutze in einer Methode nur `double`, in der anderen `BigDecimal`. Erstelle für die untenstehende Einkaufsliste für jeden Artikel eine Variable und weise +der Variable den entsprechenden Wert zu: + +- Apfel: CHF 0.10 +- Brot: CHF 1.10 +- Milch: CHF 2.20 +- Ei: CHF 0.20 +- Butter: CHF 2.10 + +Erstelle ebenfalls eine Variable `totalExpected` mit dem zu erwartenden Total und berechne es (im Kopf oder Taschenrechner). + +Zähle die Preise der Produkte mittels Java-Code zusammen und speichere sie in der Variable `total`. Der darauf folgende +Code wird dann die beiden Werte vergleichen und eine entsprechende Ausgabe machen (was der Code macht wirst du im +nächsten Modul kennenlernen). + +> Denke beim Erstellen der Variablen daran, dass bei it-ninja der Code immer in englisch sein sollte, nur die Ausgabe +> auf den Bildschirm soll auf deutsch sein. + + +```java + public static void printTotalBigDecimal(){ + + BigDecimal totalExpected = new BigDecimal("0.0"); // Expected total price (your calculation) + BigDecimal total = new BigDecimal(0); // Actual total price (computed) + // to add 2 BigDecimal you can use total = big1.add(big2).add(big3) + + // IT-Ninja: Füge hier Deinen Code ein: + String expectedResult; + if(total.compareTo(totalExpected) == 0){ + expectedResult = "wie erwartet"; + } + else if(total.compareTo(totalExpected) > 0){ + expectedResult = "zu hoch"; + } + else { + expectedResult = "zu tief"; + } + System.out.println("Alle Artikel zusammen kosten CHF " + total + ". Der Preis ist " + expectedResult + "."); + } + + public static void printTotalDouble(){ + + double totalExpected = 0; // Expected total price (your calculation) + double total = 0; // Actual total price (computed) + + // IT-Ninja: Füge hier Deinen Code ein: + String expectedResult; + if(total == totalExpected){ + expectedResult = "wie erwartet"; + } + else if(total > totalExpected){ + expectedResult = "zu hoch"; + } + else { + expectedResult = "zu tief"; + } + System.out.printf("Alle Artikel zusammen kosten CHF %.2f. Der Preis ist %s.%n", total, expectedResult); + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/Basket.java) + +Wenn du beide Methoden angepasst hat, vergleiche die Ausgabe. Du solltest folgende Ausgabe erhalten: + +**Beispielausgabe:** + +```console +Alle Artikel zusammen kosten CHF 5.70. Der Preis ist wie erwartet. +``` + + +## Aufgabe 3 - Alter in Monaten + +Passe die folgende Methode an. Berechne dein Alter in ganzen Monaten. Zähle den Monat wo du geboren wurdest und den +aktuellen als ganzen Monat dazu. Gib Dein Alter auf der Konsole aus: + +- `Ich bin am dd.mm.yyyy geboren und heute am dd.mm.yyyy z Monate alt.` + +Wobei in der Ausgabe `dd.mm.yyyy` durch das tatsächliche Datum von Deinem Geburtstag resp. dem heutigen Datum ersetzt +werden soll und `z` durch die Anzahl Monate. + +> Im Quellcode findest du auch statische Variablen (`dayOfBirth`, `monthOfBirth`, `yearOfBirth`, `dayOfToday`, +> `monthOfToday`, `yearOfToday`). Passe diese Variablen an und nutze sie in in deinem Code. Es wird erwartet, dass sich +> eine Änderung einer dieser Variablen auf die Berechnung aber auch auf die Ausgabe in der Konsole auswirkt. Was es +> genau mit `static` auf sich hat lernst du bald. + +```java + public static void ageInMonths() { + + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/AgeCalculator.java) + +**Beispiel 1:** + +Eingabe: + +```console +AgeCalculator.dayOfBirth = 1; +AgeCalculator.monthOfBirth = 9; +AgeCalculator.yearOfBirth = 1973; +AgeCalculator.dayOfToday = 22; +AgeCalculator.monthOfToday = 7; +AgeCalculator.yearOfToday = 2025; + +AgeCalculator.ageInMonths(); +``` + +Ausgabe: + +```console +Ich bin am 01.09.1973 geboren und heute am 22.07.2025 623 Monate alt. +``` + +**Beispiel 2:** + +Eingabe: + +```console +AgeCalculator.dayOfBirth = 15; +AgeCalculator.monthOfBirth = 4; +AgeCalculator.yearOfBirth = 2008; +AgeCalculator.dayOfToday = 8; +AgeCalculator.monthOfToday = 8; +AgeCalculator.yearOfToday = 2025; + +AgeCalculator.ageInMonths(); +``` + +Ausgabe: + +```console +Ich bin am 15.04.2008 geboren und heute am 08.08.2025 209 Monate alt. +``` diff --git a/generated/labs/backend.java.grundlagen.logic/pom.xml b/generated/labs/backend.java.grundlagen.logic/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..476bcd6 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,24 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.AgeCalculator; +import ch.itninja.labs.basicexercises.Basket; +import ch.itninja.labs.basicexercises.CalculateForms; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + // call methodes with some test parameters + CalculateForms.printRectArea(5, 4); + CalculateForms.printTriangleArea(8, 3); + CalculateForms.printCircleArea(4); + CalculateForms.printRectPerimeter(5, 4); + + Basket.printTotalBigDecimal(); + Basket.printTotalDouble(); + + AgeCalculator.ageInMonths(); + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/AgeCalculator.java b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/AgeCalculator.java new file mode 100644 index 0000000..1d25192 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/AgeCalculator.java @@ -0,0 +1,24 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for leap year calculation. + */ +public class AgeCalculator { + + public static int dayOfBirth = 11; + public static int monthOfBirth = 5; + public static int yearOfBirth = 1973; + + public static int dayOfToday = 22; + public static int monthOfToday = 7; + public static int yearOfToday = 2025; + + private AgeCalculator() { + // Prevent instantiation + } + + public static void ageInMonths() { + + // IT-Ninja: Füge hier Deinen Code ein... + } +} diff --git a/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/Basket.java b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/Basket.java new file mode 100644 index 0000000..92bc3ce --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/Basket.java @@ -0,0 +1,54 @@ +package ch.itninja.labs.basicexercises; + +import java.math.BigDecimal; + +/** + * Utility class providing methods for basket calculation. + */ +public class Basket { + + private Basket() { + // Prevent instantiation + } + + public static void printTotalBigDecimal(){ + + BigDecimal totalExpected = new BigDecimal("0.0"); // Expected total price (your calculation) + BigDecimal total = new BigDecimal(0); // Actual total price (computed) + // to add 2 BigDecimal you can use total = big1.add(big2).add(big3) + + // IT-Ninja: Füge hier Deinen Code ein... + String expectedResult; + if(total.compareTo(totalExpected) == 0){ + expectedResult = "wie erwartet"; + } + else if(total.compareTo(totalExpected) > 0){ + expectedResult = "zu hoch"; + } + else { + expectedResult = "zu tief"; + } + System.out.println("Alle Artikel zusammen kosten CHF " + total + ". Der Preis ist " + expectedResult + "."); + } + + public static void printTotalDouble(){ + + double totalExpected = 0; // Expected total price (your calculation) + double total = 0; // Actual total price (computed) + + // IT-Ninja: Füge hier Deinen Code ein... + String expectedResult; + if(total == totalExpected){ + expectedResult = "wie erwartet"; + } + else if(total > totalExpected){ + expectedResult = "zu hoch"; + } + else { + expectedResult = "zu tief"; + } + System.out.printf("Alle Artikel zusammen kosten CHF %.2f. Der Preis ist %s.%n", total, expectedResult); + + } + +} diff --git a/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/CalculateForms.java b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/CalculateForms.java new file mode 100644 index 0000000..005f413 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/main/java/ch/itninja/labs/basicexercises/CalculateForms.java @@ -0,0 +1,37 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing methods for comparing numbers. + */ +public class CalculateForms { + + static final double PI = 3.141592653589793; + + private CalculateForms() { + // Prevent instantiation + } + + public static void printRectArea(int sideA, int sideB) { + + // IT-Ninja: Füge hier Deinen Code ein... + } + + public static void printTriangleArea(int sideC, int heightC) { + + // IT-Ninja: Füge hier Deinen Code ein... + } + + public static void printCircleArea(int radius) { + + // IT-Ninja: Füge hier Deinen Code ein... + } + + public static void printRectPerimeter(int sideA, int sideB) { + + // IT-Ninja: Füge hier Deinen Code ein... + } + +} + + + diff --git a/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/AgeCalculatorTest.java b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/AgeCalculatorTest.java new file mode 100644 index 0000000..5be300a --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/AgeCalculatorTest.java @@ -0,0 +1,71 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AgeCalculatorTest { + + @ParameterizedTest + @CsvSource({ + "1, 1, 9, 1973, 22, 7, 2025, 623", + "2, 15, 4, 2008, 8, 8, 2025, 209", + }) + void givenNumbers_whenCalled_thenOutputAsExpected(int lab, int dayOfBirth, int monthOfBirth, int yearOfBirth, + int dayOfToday, int monthOfToday, int yearOfToday, + int monthsExpected) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + AgeCalculator.dayOfBirth = dayOfBirth; + AgeCalculator.monthOfBirth = monthOfBirth; + AgeCalculator.yearOfBirth = yearOfBirth; + AgeCalculator.dayOfToday = dayOfToday; + AgeCalculator.monthOfToday = monthOfToday; + AgeCalculator.yearOfToday = yearOfToday; + + String expectedResult = String.format("Ich bin am %02d.%02d.%04d geboren und heute am %02d.%02d.%04d %d Monate alt.", + dayOfBirth, monthOfBirth, yearOfBirth, + dayOfToday, monthOfToday, yearOfToday, + monthsExpected); + + try { + // WHEN + AgeCalculator.ageInMonths(); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "Output is not as expected"); + + // For documentation + String input = String.format( + "AgeCalculator.dayOfBirth = %d;\n" + + "AgeCalculator.monthOfBirth = %d;\n" + + "AgeCalculator.yearOfBirth = %d;\n" + + "AgeCalculator.dayOfToday = %d;\n" + + "AgeCalculator.monthOfToday = %d;\n" + + "AgeCalculator.yearOfToday = %d;\n" + + "\n" + + "AgeCalculator.ageInMonths();", + dayOfBirth, + monthOfBirth, + yearOfBirth, + dayOfToday, + monthOfToday, + yearOfToday + ); + ItNinjaOutput.PrintItNinjaOutput("AgeInMonths"+lab, input, output); + } + + +} diff --git a/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/BasketTest.java b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/BasketTest.java new file mode 100644 index 0000000..0d2afdf --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/BasketTest.java @@ -0,0 +1,58 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class BasketTest { + + @Test + void givenPrintTotalBigDecimal_whenCalled_thenOutputAsExpected() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + Basket.printTotalBigDecimal(); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + final String expectedResult = "Alle Artikel zusammen kosten CHF 5.70. Der Preis ist wie erwartet."; + assertEquals(expectedResult, output, "Output not as expected"); + + ItNinjaOutput.PrintItNinjaOutput("Basket.BigDecimal", "", output); + } + + @Test + void givenPrintTotalDouble_whenCalled_thenOutputAsExpected() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + Basket.printTotalDouble(); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + final String expectedResult = "Alle Artikel zusammen kosten CHF 5.70. Der Preis ist zu hoch."; + assertEquals(expectedResult, output, "Output not as expected"); + + ItNinjaOutput.PrintItNinjaOutput("Basket.Double", "", output); + } + +} diff --git a/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/CalculateFormsTest.java b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/CalculateFormsTest.java new file mode 100644 index 0000000..e735006 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/basicexercises/CalculateFormsTest.java @@ -0,0 +1,122 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CalculateFormsTest { + + @ParameterizedTest + @CsvSource({ + "1, 4, 5, 'Das Rechteck mit a=4cm und b=5cm hat eine Fläche von 20cm2.'", + "2, 3, 7, 'Das Rechteck mit a=3cm und b=7cm hat eine Fläche von 21cm2.'", + "3, 6, 4, 'Das Rechteck mit a=6cm und b=4cm hat eine Fläche von 24cm2.'", + "4, 0, 0, 'Das Rechteck mit a=0cm und b=0cm hat eine Fläche von 0cm2.'", + }) + void givenNumbers_whenCalledPrintRectArea_thenOutputAsExpected(int lab, int value1, int value2, String expectedResult) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + CalculateForms.printRectArea(value1, value2); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "For "+value1+" and "+value2+" output should be '"+ expectedResult +"'"); + + ItNinjaOutput.PrintItNinjaOutput("CalculateForms.RectArea"+lab, "CalculateForms.printRectArea("+value1+", "+value2+");", output); + } + + @ParameterizedTest + @CsvSource({ + "1, 4, 5, 'Das Dreieck mit c=4cm und h=5cm hat eine Fläche von 10cm2.'", + "2, 3, 12, 'Das Dreieck mit c=3cm und h=12cm hat eine Fläche von 18cm2.'", + "3, 6, 4, 'Das Dreieck mit c=6cm und h=4cm hat eine Fläche von 12cm2.'", + "4, 0, 0, 'Das Dreieck mit c=0cm und h=0cm hat eine Fläche von 0cm2.'", + }) + void givenNumbers_whenCalledPrintTriangleArea_thenOutputAsExpected(int lab, int value1, int value2, String expectedResult) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + CalculateForms.printTriangleArea(value1, value2); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "For "+value1+" and "+value2+" output should be '"+ expectedResult +"'"); + + ItNinjaOutput.PrintItNinjaOutput("CalculateForms.TriangleArea"+lab, "CalculateForms.printTriangleArea("+value1+", "+value2+");", output); + } + + @ParameterizedTest + @CsvSource({ + "1, 4, 'Der Kreis mit r=4cm hat eine Fläche von 50.27cm2.'", + "2, 3, 'Der Kreis mit r=3cm hat eine Fläche von 28.27cm2.'", + "3, 6, 'Der Kreis mit r=6cm hat eine Fläche von 113.10cm2.'", + "4, 0, 'Der Kreis mit r=0cm hat eine Fläche von 0.00cm2.'", + }) + void givenNumbers_whenCalledPrintCircleArea_thenOutputAsExpected(int lab, int value1, String expectedResult) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + CalculateForms.printCircleArea(value1); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "For "+value1+" output should be '"+ expectedResult +"'"); + + ItNinjaOutput.PrintItNinjaOutput("CalculateForms.CircleArea"+lab, "CalculateForms.printCircleArea("+value1+");", output); + } + + @ParameterizedTest + @CsvSource({ + "1, 4, 5, 'Das Rechteck mit a=4cm und b=5cm hat einen Umfang von 18cm.'", + "2, 3, 12, 'Das Rechteck mit a=3cm und b=12cm hat einen Umfang von 30cm.'", + "3, 6, 4, 'Das Rechteck mit a=6cm und b=4cm hat einen Umfang von 20cm.'", + "4, 0, 0, 'Das Rechteck mit a=0cm und b=0cm hat einen Umfang von 0cm.'", + }) + void givenNumbers_whenCalledPrintRectPerimeter_thenOutputAsExpected(int lab, int value1, int value2, String expectedResult) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + CalculateForms.printRectPerimeter(value1, value2); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertEquals(expectedResult, output, "For "+value1+" and "+value2+" output should be '"+ expectedResult +"'"); + + ItNinjaOutput.PrintItNinjaOutput("CalculateForms.RectPerimeter"+lab, "CalculateForms.printRectPerimeter("+value1+", "+value2+");", output); + } + +} diff --git a/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.logic/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.methods/.itninja.index.json b/generated/labs/backend.java.grundlagen.methods/.itninja.index.json new file mode 100644 index 0000000..10a11d2 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/.itninja.index.json @@ -0,0 +1,45 @@ +{ + "generatedAt" : "2026-03-22T21:57:20.200219913Z", + "project" : "backend.java.grundlagen.methods", + "files" : [ { + "path" : "README.md", + "size" : 6615, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1385, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 612, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/FibonacciHelper.java", + "size" : 198, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/MessageHelper.java", + "size" : 196, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java", + "size" : 195, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/FibonacciHelperTest.java", + "size" : 1544, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/MessageHelperTest.java", + "size" : 1804, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java", + "size" : 1537, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.methods/README.md b/generated/labs/backend.java.grundlagen.methods/README.md new file mode 100644 index 0000000..b9080bd --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/README.md @@ -0,0 +1,345 @@ + + +# Java Exercises - Methoden + +Mit diesen Übungen kannst du dein Wissen über Methoden vertiefen. + +#### Voraussetzung + + + + +## Aufgabe 1: Nachricht drucken + +Passe untenstehenden Quellcode an und füge folgende Methode hinzu: + +--- + +**Name der Methode:** *Bestimme selber einen passenden Namen für die Methode* +**Funktion:** Gibt eine Nachricht auf der Konsole aus, Format: `Nachricht an [Name des Empfängers]: [Nachricht]` +**Parameter1:** Name des Empfängers [String] +**Parameter2:** Nachricht [String] +**Rückgabewert:** Keiner + +--- + +> Halte die Coding Guidelines ein! + +```java +public class MessageHelper { + + // IT-Ninja: Füge hier Deinen Code ein: +} +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/MessageHelper.java) + +Wenn du die Methode implementiert hast, kannst du sie aus `main` aufrufen. + +```java + public static void main(String[] args) { + + // Sample call for "Nachricht drucken" + // IT-Ninja: Füge hier Deinen Code ein: + + // Sample call for "Minimum von drei Zahlen" + // IT-Ninja: Füge hier Deinen Code ein: + + // Sample call for "Fibonacci" + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +Falls du sie testen willst, kannst du sie aus dem vorbereiteten Test aufrufen. + +```java + try { + // WHEN + // Aufruf der Methode, welche wir testen wollen (etwas wie: methode(name, message);): + // IT-Ninja: Füge hier Deinen Code ein: + } finally { + System.setOut(originalOut); + } +``` + +::src(src/test/java/ch/itninja/labs/basicexercises/MessageHelperTest.java) + +**Beispiel 1:** + +Eingabe: + +```console +yourImplementation("Peter", "Das Meeting beginnt um 9 Uhr."); +``` + +Ausgabe: + +```console +Nachricht an Peter: Das Meeting beginnt um 9 Uhr. +``` + +**Beispiel 2:** + +Eingabe: + +```console +yourImplementation("Linda", "Bitte rufe Hans Mustermann zurück."); +``` + +Ausgabe: + +```console +Nachricht an Linda: Bitte rufe Hans Mustermann zurück. +``` + +## Aufgabe 2: Minimum von drei Zahlen + +Passe untenstehenden Quellcode an und füge folgende Methode hinzu: + +--- + +**Name der Methode:** *Bestimme selber einen passenden Namen für die Methode* +**Funktion:** Gibt die kleinste von 3 Zahlen zurück +**Parameter1:** Erste Zahl [int] +**Parameter2:** Zweite Zahl [int] +**Parameter3:** Dritte Zahl [int] +**Rückgabewert:** Kleinste der 3 Zahlen [int] + +--- + +> Halte die Coding Guidelines ein! + +```java +public class NumberHelper { + + // IT-Ninja: Füge hier Deinen Code ein: +} +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java) + +Wenn du die Methode implementiert hast, kannst du sie aus `main` aufrufen. + +```java + public static void main(String[] args) { + + // Sample call for "Nachricht drucken" + // IT-Ninja: Füge hier Deinen Code ein: + + // Sample call for "Minimum von drei Zahlen" + // IT-Ninja: Füge hier Deinen Code ein: + + // Sample call for "Fibonacci" + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +Falls du sie testen willst, kannst du sie aus dem vorbereiteten Test aufrufen. + +```java + try { + // WHEN + // Aufruf der Methode, welche wir testen wollen (etwas wie: min = methode(a, b, c);): + // IT-Ninja: Füge hier Deinen Code ein: + } finally { + } +``` + +::src(src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java) + +**Beispiel 1:** + +Eingabe: + +```console +min = yourImplementation(63, 22, 98); +``` + +Ausgabe: + +```console +Example Output: The minimum from 63, 22 and 98 is 22. + +``` + +**Beispiel 2:** + +Eingabe: + +```console +min = yourImplementation(17, 67, 32); +``` + +Ausgabe: + +```console +Example Output: The minimum from 17, 67 and 32 is 17. + +``` + +**Beispiel 3:** + +Eingabe: + +```console +min = yourImplementation(4, 56, 3); +``` + +Ausgabe: + +```console +Example Output: The minimum from 4, 56 and 3 is 3. + +``` + +## Aufgabe 3: Fibonacci + +Passe untenstehenden Quellcode an und füge folgende Methode hinzu: + +--- + +**Name der Methode:** *Bestimme selber einen passenden Namen für die Methode* +**Funktion:** Berechnet die n-te Zahl der Fibonacci-Folge. +**Parameter1:** n [int] +**Rückgabewert:** n-te Zahl der Fibonacci-Folge [int] +**Abgrenzung:** Gibt -1 zurück, wenn Fibonacci-Folge ausserhalb des Wertebreichs von int ist. + +--- + +Informationen zur Fibonacci-Folge findest du [hier](https://de.wikipedia.org/wiki/Fibonacci-Folge). + +> Halte die Coding Guidelines ein! + +```java +public class FibonacciHelper { + + // IT-Ninja: Füge hier Deinen Code ein: +} +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/FibonacciHelper.java) + +Wenn du die Methode implementiert hast, kannst du sie aus `main` aufrufen. + +```java + public static void main(String[] args) { + + // Sample call for "Nachricht drucken" + // IT-Ninja: Füge hier Deinen Code ein: + + // Sample call for "Minimum von drei Zahlen" + // IT-Ninja: Füge hier Deinen Code ein: + + // Sample call for "Fibonacci" + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +Falls du sie testen willst, kannst du sie aus dem vorbereiteten Test aufrufen. + +```java + try { + // WHEN + // Aufruf der Methode, welche wir testen wollen (etwas wie: fibonacci = methode(n);): + // IT-Ninja: Füge hier Deinen Code ein: + } finally { + } +``` + +::src(src/test/java/ch/itninja/labs/basicexercises/FibonacciHelperTest.java) + +**Beispiel 1:** + +Eingabe: + +```console +fibonacci = yourImplementation(0); +``` + +Ausgabe: + +```console +Example Output: The 0. element of the Fibonacci sequence is 0. + +``` + +**Beispiel 2:** + +Eingabe: + +```console +fibonacci = yourImplementation(1); +``` + +Ausgabe: + +```console +Example Output: The 1. element of the Fibonacci sequence is 1. + +``` + +**Beispiel 3:** + +Eingabe: + +```console +fibonacci = yourImplementation(2); +``` + +Ausgabe: + +```console +Example Output: The 2. element of the Fibonacci sequence is 1. + +``` + +**Beispiel 4:** + +Eingabe: + +```console +fibonacci = yourImplementation(7); +``` + +Ausgabe: + +```console +Example Output: The 7. element of the Fibonacci sequence is 13. + +``` + +**Beispiel 5:** + +Eingabe: + +```console +fibonacci = yourImplementation(-5); +``` + +Ausgabe: + +```console +Example Output: The -5. element of the Fibonacci sequence is 0. + +``` + +**Beispiel 6:** + +Eingabe: + +```console +fibonacci = yourImplementation(100); +``` + +Ausgabe: + +```console +Example Output: The 100. element of the Fibonacci sequence is -1. + +``` diff --git a/generated/labs/backend.java.grundlagen.methods/pom.xml b/generated/labs/backend.java.grundlagen.methods/pom.xml new file mode 100644 index 0000000..41b8c00 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-02-03-08-methods + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..6bad907 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,22 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.FibonacciHelper; +import ch.itninja.labs.basicexercises.MessageHelper; +import ch.itninja.labs.basicexercises.NumberHelper; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + // Sample call for "Nachricht drucken" + // IT-Ninja: Füge hier Deinen Code ein... + + // Sample call for "Minimum von drei Zahlen" + // IT-Ninja: Füge hier Deinen Code ein... + + // Sample call for "Fibonacci" + // IT-Ninja: Füge hier Deinen Code ein... + } +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/FibonacciHelper.java b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/FibonacciHelper.java new file mode 100644 index 0000000..78e8501 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/FibonacciHelper.java @@ -0,0 +1,9 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing helper methods for fibonacci operations. + */ +public class FibonacciHelper { + + // IT-Ninja: Füge hier Deinen Code ein... +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/MessageHelper.java b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/MessageHelper.java new file mode 100644 index 0000000..fda7c99 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/MessageHelper.java @@ -0,0 +1,9 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing helper methods for fibonacci operations. + */ +public class MessageHelper { + + // IT-Ninja: Füge hier Deinen Code ein... +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java new file mode 100644 index 0000000..bc609fb --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/main/java/ch/itninja/labs/basicexercises/NumberHelper.java @@ -0,0 +1,9 @@ +package ch.itninja.labs.basicexercises; + +/** + * Utility class providing helper methods for fibonacci operations. + */ +public class NumberHelper { + + // IT-Ninja: Füge hier Deinen Code ein... +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/FibonacciHelperTest.java b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/FibonacciHelperTest.java new file mode 100644 index 0000000..5c72269 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/FibonacciHelperTest.java @@ -0,0 +1,47 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +public class FibonacciHelperTest { + + private static final int METHOD_NOT_IMPLEMENTED = -2; + + @ParameterizedTest + @CsvSource({ + "1, 0, 0", + "2, 1, 1", + "3, 2, 1", + "4, 7, 13", + "5, -5, 0", + "6, 100, -1", + }) + void testFibonacci(int lab, int n, int expected) { + + // Init to a number not used by the methode. + int fibonacci = METHOD_NOT_IMPLEMENTED; + + try { + // WHEN + // Aufruf der Methode, welche wir testen wollen (etwas wie: fibonacci = methode(n);): + // IT-Ninja: Füge hier Deinen Code ein... + } finally { + } + + // Pre-Check for implementation + assertNotEquals(METHOD_NOT_IMPLEMENTED , fibonacci + , "Please ensure that the method is called in try code block and the result is stored in variable 'fibonacci'!"); + + // THEN + assertEquals(expected, fibonacci, "The fibonacci number is not correct"); + + // For documentation + String input = String.format("fibonacci = yourImplementation(%d);", n); + String output = String.format("Example Output: The %d. element of the Fibonacci sequence is %d.%n", n, fibonacci); + + ItNinjaOutput.PrintItNinjaOutput("Fibonacci"+lab, input, output); + } +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/MessageHelperTest.java b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/MessageHelperTest.java new file mode 100644 index 0000000..61da719 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/MessageHelperTest.java @@ -0,0 +1,49 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class MessageHelperTest { + + @ParameterizedTest + @CsvSource({ + "1, 'Peter', 'Das Meeting beginnt um 9 Uhr.', 'Nachricht an Peter: Das Meeting beginnt um 9 Uhr.'", + "2, 'Linda', 'Bitte rufe Hans Mustermann zurück.', 'Nachricht an Linda: Bitte rufe Hans Mustermann zurück.'", + }) + void givenPrintMessage_whenCalled_thenOutputAsExpected(int lab, String name, String message, String expected) { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + // Aufruf der Methode, welche wir testen wollen (etwas wie: methode(name, message);): + // IT-Ninja: Füge hier Deinen Code ein... + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + + // Pre-Check for implementation + assertNotEquals("" , output + , "Output empty. Please ensure that the method is called in try code block!"); + + assertEquals(expected, output, "Output is not as expected."); + + // For documentation + String input = String.format("yourImplementation(\"%s\", \"%s\");" + , name, message); + + ItNinjaOutput.PrintItNinjaOutput("PrintMessage"+lab, input, output); + } +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java new file mode 100644 index 0000000..a2dcc54 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/basicexercises/NumberHelperTest.java @@ -0,0 +1,44 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.*; + +public class NumberHelperTest { + + private static final int METHOD_NOT_IMPLEMENTED = -2; + + @ParameterizedTest + @CsvSource({ + "1, 63, 22, 98, 22", + "2, 17, 67, 32, 17", + "3, 4, 56, 3, 3", + }) + void givenMinimumOfThree_whenCalled_thenOutputAsExpected(int lab, int a, int b, int c, int expected) { + + // Init to a number not used by the methode. + int min = METHOD_NOT_IMPLEMENTED; + + try { + // WHEN + // Aufruf der Methode, welche wir testen wollen (etwas wie: min = methode(a, b, c);): + // IT-Ninja: Füge hier Deinen Code ein... + } finally { + } + + // Pre-Check for implementation + assertNotEquals(METHOD_NOT_IMPLEMENTED , min + , "Please ensure that the method is called in try code block and the result is stored in variable 'min'!"); + + // THEN + assertEquals(expected, min, "The number seems not to be the minimum of three."); + + // For documentation + String input = String.format("min = yourImplementation(%d, %d, %d);", a, b, c); + String output = String.format("Example Output: The minimum from %d, %d and %d is %d.%n", a, b, c, min); + + ItNinjaOutput.PrintItNinjaOutput("MinimumOfThree"+lab, input, output); + } +} diff --git a/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.methods/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.packages/.itninja.index.json b/generated/labs/backend.java.grundlagen.packages/.itninja.index.json new file mode 100644 index 0000000..480adc2 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.packages/.itninja.index.json @@ -0,0 +1,25 @@ +{ + "generatedAt" : "2026-03-22T21:57:05.217080970Z", + "project" : "backend.java.grundlagen.packages", + "files" : [ { + "path" : "README.md", + "size" : 2341, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 250, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java", + "size" : 332, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.packages/README.md b/generated/labs/backend.java.grundlagen.packages/README.md new file mode 100644 index 0000000..c231087 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.packages/README.md @@ -0,0 +1,68 @@ + + +# Java Exercises - Packages + +Mit diesen Übungen kannst du dein Wissen zum Thema Packages vertiefen. + +#### Voraussetzung + +- Du weisst was ein Package ist. + + + +## Aufgabe 1 + +Erstelle ein eigenes Package, welches dir ein paar mathematische Hilfsfunktionen zur Verfügung +stellt: + +* Kleinerer Wert von 2 Integerzahlen +* Grösserer Wert von 2 Integerzahlen +* Absoluter Wert von einer Integerzahl +* Abstand von 2 Integerzahlen + +**Achtung:** Das von dir erstellte Package darf nicht `ch.itninja.labs` enthalten. + +Passe main an, damit deine Package verwendet wird. Erstelle ein paar Aufrufe und gib das Resultat auf der Konsole aus. + +```java + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +## Aufgabe 2 + +Erstelle ein weiteres Package im gleichen Projekt, welches einen Zähler verwaltet. Der Zähler ist statisch und der +Datentyp soll int sein. Der Zähler kann mit folgenden Methoden verändert werden: + +* Increment -> Zähler um eins erhöhen +* Decrement -> Zähler um eins reduzieren +* Add -> Wert zu Zähler hinzufügen +* Subtract -> Wert vom Zähler abziehen. +* Reset -> Wert vom Zähler auf 0 setzen. + +Bei allen Operationen darf der Zähler den Bereich 0..1000 nicht verlassen. Würde bei einer Operation der Zähler den +Bereich verlassen, wird er auf die Grenze des Bereichs gesetzt (limitiert). + +**Achtung:** Das von dir erstellte Package darf nicht `ch.itninja.labs` enthalten. + +Passe main an, damit deine Package verwendet wird. Erstelle ein paar Aufrufe und gib das Resultat auf der Konsole aus. + +## Aufgabe 3 + +{{< ninja warning >}} +**Zusätzliche Vorbereitung:** +Erstelle 2 Kopien des IntelliJ-Projekts. Kopiere dazu den Ordner welcher das pom.xml beinhaltet. Normalerweise +sollte der Ordner `12_packages` heissen und die Kopie zum Beispiel `12_packages.create` und `12_packages.use`. +{{< /ninja >}} + +Passe die beiden Projekte so an, dass du mit dem Projekt `12_packages.create` ein Java Package erstellst und dieses im +Projekt `12_packages.use` verwendest. + +Es wird erwartet, dass dein Package JavaDoc beinhaltet. + +Am Ende der Übung soll deine Ausgabe auf der Konsole bei Aufgabe 3 dasselbe ausgeben, was auch bei Aufgabe 1 und 2 +ausgegeben wird. diff --git a/generated/labs/backend.java.grundlagen.packages/pom.xml b/generated/labs/backend.java.grundlagen.packages/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.packages/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.packages/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.packages/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..8831c42 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.packages/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,12 @@ +package ch.itninja.labs; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +} diff --git a/generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java b/generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java new file mode 100644 index 0000000..dc140b4 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java @@ -0,0 +1,14 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EmptyTest { + @Test + void emptyTest() { + + // This is just a placeholder for upcoming tests. Required by LabGenerator + } +} diff --git a/generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.packages/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/.itninja.index.json b/generated/labs/backend.java.grundlagen.regex/.itninja.index.json new file mode 100644 index 0000000..130bffa --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/.itninja.index.json @@ -0,0 +1,53 @@ +{ + "generatedAt" : "2026-03-22T21:57:00.748027257Z", + "project" : "backend.java.grundlagen.regex", + "files" : [ { + "path" : "README.md", + "size" : 4633, + "language" : "markdown" + }, { + "path" : "data/mixed.txt", + "size" : 449, + "language" : "text" + }, { + "path" : "pom.xml", + "size" : 1200, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/regex/RegexTasks.java", + "size" : 1925, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/ItNinjaOutput.java", + "size" : 793, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexChPlzTest.java", + "size" : 1097, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexEmailTest.java", + "size" : 1240, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexIbanTest.java", + "size" : 1164, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexMatcherUtil.java", + "size" : 564, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexPasswordTest.java", + "size" : 1108, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexPhoneTest.java", + "size" : 1195, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/regex/RegexUrlTest.java", + "size" : 1223, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.regex/README.md b/generated/labs/backend.java.grundlagen.regex/README.md new file mode 100644 index 0000000..c48137b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/README.md @@ -0,0 +1,153 @@ + + +# Java Exercises - Regex + +Mit diesen Übungen kannst du dein Wissen zum Thema Regex vertiefen. + +#### Voraussetzung + +- Ich kann mit Regex Zeichenketten im Text erkennen und extrahieren. +- Ich verstehe, wie man Regex schrittweise und sicher testet. + + + +## Aufgabe 1 - E-Mail-Adressen aus einem Text extrahieren +Schreibe eine Regex, die alle E-Mail-Adressen in einem Text findet. Nutze die bereitgestellte Beispieldatei `data/mixed.txt`. + + +- Beispieleingabe: `Meine Adresse: max.mustermann@example.com; Info: test@mail.de` +- Erwartete Treffer: `["max.mustermann@example.com", "test@mail.de"]` + +```java + /** + * Build a Pattern that matches email-like addresses. + * Tip: local-part + "@" + domain + TLD of length >= 2. + */ + public static Pattern buildEmailPattern() { + // TODO: implement + return Pattern.compile(""); + } +``` + +::src(src/main/java/ch/itninja/labs/regex/RegexTasks.java) + +--- + +## Aufgabe 2 - IBAN formatvalidieren + +Validiere IBANs rein syntaktisch (ohne Mod-97-Prüfung). Akzeptiere optionale Leerzeichen zwischen Blöcken. + + +- Beispiele: `CH93 0076 2011 6238 5295 7`, `DE89 3704 0044 0532 0130 00` +- Hinweis: Landeskürzel (2 Grossbuchstaben), 2 Ziffern Prüfsumme, restliche Zeichen: A–Z oder 0–9. + +```java + /** + * Build a Pattern that matches IBANs syntactically with optional spaces. + * Examples: "CH93 0076 2011 6238 5295 7", "DE89 3704 0044 0532 0130 00" + * Note: Only format validation here, not the Mod-97 checksum. + */ + public static Pattern buildIbanPattern() { + // TODO: implement + return Pattern.compile(""); + } +``` + +::src(src/main/java/ch/itninja/labs/regex/RegexTasks.java) + +--- + +## Aufgabe 3 - Telefonnummern (Schweiz und international) + +Erkenne Telefonnummern mit optionalem Ländercode (z. B. +41) und unterschiedlichen Trennzeichen (Leerzeichen, Punkt, Bindestrich). + + +- Beispiele: `+41 31 987 65 43`, `031 987 65 43` + +```java + /** + * Build a Pattern for (Swiss/international) phone numbers with optional country code + * and separators (space, dot, hyphen). Keep it reasonably permissive. + */ + public static Pattern buildPhonePattern() { + // TODO: implement + return Pattern.compile(""); + } +``` + +::src(src/main/java/ch/itninja/labs/regex/RegexTasks.java) + +--- + +## Aufgabe 4 - URLs extrahieren + +Extrahiere http- und https-URLs aus einem Text, ohne ans Zeilenende zu laufen oder nachfolgende Satzzeichen mitzunehmen. + + +- Beispiele: `https://it-ninjas.ch`, `http://example.org/test` + +```java + /** + * Build a Pattern that captures http/https URLs without trailing punctuation. + */ + public static Pattern buildUrlPattern() { + // TODO: implement + return Pattern.compile(""); + } +``` + +::src(src/main/java/ch/itninja/labs/regex/RegexTasks.java) + +--- + +## Aufgabe 5 - Passwort-Policy prüfen + +Mindestens 8 Zeichen, je 1 Klein- und Grossbuchstabe, 1 Ziffer, 1 Sonderzeichen. Prüfe mit einem einzigen Regex. + + +- Beispiel gültig: `SecuRe!234` +- Beispiel ungültig: `password1` + +```java + /** + * Build a Pattern enforcing: >= 8 chars, at least 1 lowercase, 1 uppercase, 1 digit, 1 symbol. + * Hint: lookaheads. + */ + public static Pattern buildPasswordPolicyPattern() { + // TODO: implement + return Pattern.compile(""); + } +``` + +::src(src/main/java/ch/itninja/labs/regex/RegexTasks.java) + +--- + +### Aufgabe 6 - Schweizer Postleitzahlen (CH-PLZ) + +Erkenne CH-Postleitzahlen (genau 4 Ziffern, keine führende 0). Beachte, dass nach der PLZ eine Ortsbezeichnung kommen +muss. + + +- Beispiele gültig: `3007`, `1000` +- Beispiele ungültig: `0123`, `12345` + +```java + /** + * Build a Pattern that matches Swiss postal codes (4 digits, no leading zero). + */ + public static Pattern buildChPostalCodePattern() { + // TODO: implement + return Pattern.compile(""); + } +``` + +::src(src/main/java/ch/itninja/labs/regex/RegexTasks.java) + +--- + +## Hinweise + +- Teste deine Regex iterativ, nutze Raw-Strings (z. B. in Java `Pattern.compile("...")`) und kleine Testfälle. +- Achte darauf, bei Extraktion *nicht zu gierig* zu matchen und Mehrfachtreffer zu ermöglichen. +- Für IBANs ist eine vollständige Validierung inkl. Prüfziffernrechnung ausserhalb des Regex sinnvoll. diff --git a/generated/labs/backend.java.grundlagen.regex/data/mixed.txt b/generated/labs/backend.java.grundlagen.regex/data/mixed.txt new file mode 100644 index 0000000..1cea910 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/data/mixed.txt @@ -0,0 +1,6 @@ +Kontakt: max.mustermann@example.com, info@test.mail, support@sub.domain.co.uk +Telefone: +41 31 987 65 43, 031 987 65 43, +41-44-668-18-00 +URLs: https://it-ninjas.ch, http://example.org/test, https://sub.domain.tld/path?x=1#anchor. +IBANs: CH93 0076 2011 6238 5295 7, DE89370400440532013000, XX12 TEST 1234 +Passwörter: SecuRe!234, password1, N0SymbolsHere, Sh0rt! +PLZ: 3007 Bern (BE), 1000 Lausanne (VD), 0123 Silberwyl (GN), 12345 Sternenbrugg (TN) diff --git a/generated/labs/backend.java.grundlagen.regex/pom.xml b/generated/labs/backend.java.grundlagen.regex/pom.xml new file mode 100644 index 0000000..0a41f1b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/pom.xml @@ -0,0 +1,36 @@ + + 4.0.0 + ch.itninja.labs + regex-lab + 1.0-SNAPSHOT + + 21 + 21 + UTF-8 + 5.10.2 + + + + + org.junit.jupiter + junit-jupiter + ${junit.jupiter.version} + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + false + + + + + diff --git a/generated/labs/backend.java.grundlagen.regex/src/main/java/ch/itninja/labs/regex/RegexTasks.java b/generated/labs/backend.java.grundlagen.regex/src/main/java/ch/itninja/labs/regex/RegexTasks.java new file mode 100644 index 0000000..a784a3c --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/main/java/ch/itninja/labs/regex/RegexTasks.java @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Regex tasks for learners. Methods are intentionally left unimplemented. + * Keep code/comments in English. Implement solutions inside the marked blocks. + */ +public class RegexTasks { + + /** + * Build a Pattern that matches email-like addresses. + * Tip: local-part + "@" + domain + TLD of length >= 2. + */ + public static Pattern buildEmailPattern() { + // TODO: implement + return Pattern.compile(""); + } + + /** + * Build a Pattern that matches IBANs syntactically with optional spaces. + * Examples: "CH93 0076 2011 6238 5295 7", "DE89 3704 0044 0532 0130 00" + * Note: Only format validation here, not the Mod-97 checksum. + */ + public static Pattern buildIbanPattern() { + // TODO: implement + return Pattern.compile(""); + } + + /** + * Build a Pattern for (Swiss/international) phone numbers with optional country code + * and separators (space, dot, hyphen). Keep it reasonably permissive. + */ + public static Pattern buildPhonePattern() { + // TODO: implement + return Pattern.compile(""); + } + + /** + * Build a Pattern that captures http/https URLs without trailing punctuation. + */ + public static Pattern buildUrlPattern() { + // TODO: implement + return Pattern.compile(""); + } + + /** + * Build a Pattern enforcing: >= 8 chars, at least 1 lowercase, 1 uppercase, 1 digit, 1 symbol. + * Hint: lookaheads. + */ + public static Pattern buildPasswordPolicyPattern() { + // TODO: implement + return Pattern.compile(""); + } + + /** + * Build a Pattern that matches Swiss postal codes (4 digits, no leading zero). + */ + public static Pattern buildChPostalCodePattern() { + // TODO: implement + return Pattern.compile(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/ItNinjaOutput.java new file mode 100644 index 0000000..f6bbc1b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/ItNinjaOutput.java @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import java.util.Collection; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * Prints well-formed blocks for the it-ninja generator. + * Keep console output stable and simple so the generator can parse it. + */ +public final class ItNinjaOutput { + + private ItNinjaOutput() {} + + public static void PrintItNinjaOutput(String lab, String input, Collection output) { + String outJoined = output == null ? "" : + output.stream().filter(Objects::nonNull).collect(Collectors.joining(", ")); + + System.out.println("" + input + ""); + System.out.println("" + outJoined + ""); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexChPlzTest.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexChPlzTest.java new file mode 100644 index 0000000..d1f0b15 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexChPlzTest.java @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class RegexChPlzTest { + + static String readMixed() { + try { + return Files.readString(Path.of("data/mixed.txt")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + static Stream> expectedProvider() { + return Stream.of(List.of("3007", "1000")); + } + + @ParameterizedTest + @MethodSource("expectedProvider") + void ch_plz_extraction(List expected) { + var text = readMixed(); + var p = RegexTasks.buildChPostalCodePattern(); + var matches = RegexMatcherUtil.findAll(p, text); + ItNinjaOutput.PrintItNinjaOutput("regex-ch-plz", text, matches); + assertEquals(expected, matches); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexEmailTest.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexEmailTest.java new file mode 100644 index 0000000..1623797 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexEmailTest.java @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class RegexEmailTest { + + static String readMixed() { + try { + return Files.readString(Path.of("data/mixed.txt")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + static Stream> expectedProvider() { + return Stream.of(List.of("max.mustermann@example.com", + "info@test.mail", + "support@sub.domain.co.uk")); + } + + @ParameterizedTest + @MethodSource("expectedProvider") + void email_extraction(List expected) { + var text = readMixed(); + var p = RegexTasks.buildEmailPattern(); + var matches = RegexMatcherUtil.findAll(p, text); + // Print for docs + ItNinjaOutput.PrintItNinjaOutput("regex-email", text, matches); + assertEquals(expected, matches); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexIbanTest.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexIbanTest.java new file mode 100644 index 0000000..cc9ed8b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexIbanTest.java @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class RegexIbanTest { + + static String readMixed() { + try { + return Files.readString(Path.of("data/mixed.txt")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + static Stream> expectedProvider() { + return Stream.of(List.of("CH93 0076 2011 6238 5295 7", + "DE89370400440532013000")); + } + + @ParameterizedTest + @MethodSource("expectedProvider") + void iban_format_validation(List expected) { + var text = readMixed(); + var p = RegexTasks.buildIbanPattern(); + var matches = RegexMatcherUtil.findAll(p, text); + ItNinjaOutput.PrintItNinjaOutput("regex-iban", text, matches); + assertEquals(expected, matches); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexMatcherUtil.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexMatcherUtil.java new file mode 100644 index 0000000..c7c3976 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexMatcherUtil.java @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Utility to collect regex matches from a text. */ +public final class RegexMatcherUtil { + + private RegexMatcherUtil() {} + + public static List findAll(Pattern pattern, String text) { + List res = new ArrayList<>(); + Matcher m = pattern.matcher(text); + while (m.find()) { + res.add(m.group()); + } + return res; + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPasswordTest.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPasswordTest.java new file mode 100644 index 0000000..4742c35 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPasswordTest.java @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class RegexPasswordTest { + + static String readMixed() { + try { + return Files.readString(Path.of("data/mixed.txt")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + static Stream> expectedProvider() { + return Stream.of(List.of("SecuRe!234")); + } + + @ParameterizedTest + @MethodSource("expectedProvider") + void password_policy_matches(List expected) { + var text = readMixed(); + var p = RegexTasks.buildPasswordPolicyPattern(); + var matches = RegexMatcherUtil.findAll(p, text); + ItNinjaOutput.PrintItNinjaOutput("regex-password", text, matches); + assertEquals(expected, matches); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPhoneTest.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPhoneTest.java new file mode 100644 index 0000000..01f27b8 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexPhoneTest.java @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class RegexPhoneTest { + + static String readMixed() { + try { + return Files.readString(Path.of("data/mixed.txt")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + static Stream> expectedProvider() { + return Stream.of(List.of("+41 31 987 65 43", + "031 987 65 43", + "+41-44-668-18-00")); + } + + @ParameterizedTest + @MethodSource("expectedProvider") + void phone_extraction(List expected) { + var text = readMixed(); + var p = RegexTasks.buildPhonePattern(); + var matches = RegexMatcherUtil.findAll(p, text); + ItNinjaOutput.PrintItNinjaOutput("regex-phone", text, matches); + assertEquals(expected, matches); + } +} diff --git a/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexUrlTest.java b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexUrlTest.java new file mode 100644 index 0000000..bfc992e --- /dev/null +++ b/generated/labs/backend.java.grundlagen.regex/src/test/java/ch/itninja/labs/regex/RegexUrlTest.java @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +package ch.itninja.labs.regex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class RegexUrlTest { + + static String readMixed() { + try { + return Files.readString(Path.of("data/mixed.txt")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + static Stream> expectedProvider() { + return Stream.of(List.of("https://it-ninjas.ch", + "http://example.org/test", + "https://sub.domain.tld/path?x=1#anchor")); + } + + @ParameterizedTest + @MethodSource("expectedProvider") + void url_extraction(List expected) { + var text = readMixed(); + var p = RegexTasks.buildUrlPattern(); + var matches = RegexMatcherUtil.findAll(p, text); + ItNinjaOutput.PrintItNinjaOutput("regex-url", text, matches); + assertEquals(expected, matches); + } +} diff --git a/generated/labs/backend.java.grundlagen.strings/.itninja.index.json b/generated/labs/backend.java.grundlagen.strings/.itninja.index.json new file mode 100644 index 0000000..6c0d0e6 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.strings/.itninja.index.json @@ -0,0 +1,25 @@ +{ + "generatedAt" : "2026-03-22T21:57:09.709648739Z", + "project" : "backend.java.grundlagen.strings", + "files" : [ { + "path" : "README.md", + "size" : 2615, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 250, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java", + "size" : 332, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.strings/README.md b/generated/labs/backend.java.grundlagen.strings/README.md new file mode 100644 index 0000000..68c4451 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.strings/README.md @@ -0,0 +1,95 @@ + + +# Java Exercises - Strings + +Mit diesen Übungen kannst du dein Wissen zum Thema Strings vertiefen. + +#### Voraussetzung + +- Du weisst was ein String ist. +- Du kannst eigene Packages und Methoden erstellen + + + +## Ausgangslage + +Du hast den folgenden String: + +``` +String poem = """ + Ein Ninja leise wie der Wind, + Seine Waffen stets geschwind. + "Shurikens" fliegen, scharf und schnell, + Klingen funkeln, furchterregend hell. + "Nunchakus" wirbeln im Tanz, + Mit jedem Schlag, im Vorteil er ganz. + Seine Waffen, geheim und klug, + Begleiten ihn bei jedem Zug."""; +``` + +{{< ninja info >}} +Schreibe für jede Aufgabe eine eigene Methode, welche den String als Parameter nimmt. +Passe die `main(...)` Methode an, um deinen Quellcode aufzurufen. +{{< /ninja >}} + +## Aufgabe 1 - Wörter zählen + +Gib in der Konsole die Anzahl Wörtern aus. Als Wort gilt alles was eine Folge von Buchstaben und Zahlen sind. + +{{< ninja warning >}} +Die Methode `String.split(...)` darf in dieser Aufgabe nicht verwendet werden. `String.split(...)` wird erst in einem +späteren Modul behandelt. +{{< /ninja >}} + +```java + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +## Aufgabe 2 - Grossbuchstaben + +Gib den Text in Grossbuchstaben aus. + +```java + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +## Aufgabe 3 - Punkte setzen +Gib den Text so aus, dass jedes Leerzeichen mit einem Punkt ersetzt wurde. + +```java + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) + +## Aufgabe 4 - Wort ausschneiden +Schneide das Wort “Shurikens” aus. Ermittle hierfür die Position des Wortes anhand des "-Zeichens. + +**Hinweis:** Die indexOf()-Methode bietet ein optionales Argument fromIndex an. Übergibst du die Position des ersten +Anführungszeichen + 1, dann wird die Position des zweiten zurückgegeben. + +{{< ninja warning >}} +Die Methode `String.replace(...)` darf in dieser Aufgabe nicht verwendet werden. +{{< /ninja >}} + +```java + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +``` + +::src(src/main/java/ch/itninja/labs/Main.java) diff --git a/generated/labs/backend.java.grundlagen.strings/pom.xml b/generated/labs/backend.java.grundlagen.strings/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.strings/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.strings/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.strings/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..8831c42 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.strings/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,12 @@ +package ch.itninja.labs; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + + public static void main(String[] args) { + + // IT-Ninja: rufe hier deine Methoden auf und gib die Resultate auf der Konsole aus + } +} diff --git a/generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java b/generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java new file mode 100644 index 0000000..dc140b4 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/basicexercises/EmptyTest.java @@ -0,0 +1,14 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EmptyTest { + @Test + void emptyTest() { + + // This is just a placeholder for upcoming tests. Required by LabGenerator + } +} diff --git a/generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.strings/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/.itninja.index.json b/generated/labs/backend.java.grundlagen.variable-and-types/.itninja.index.json new file mode 100644 index 0000000..ec5de5a --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/.itninja.index.json @@ -0,0 +1,37 @@ +{ + "generatedAt" : "2026-03-22T21:56:44.010127579Z", + "project" : "backend.java.grundlagen.variable-and-types", + "files" : [ { + "path" : "README.md", + "size" : 2564, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1386, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 336, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/HelloName.java", + "size" : 308, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/basicexercises/TravelReport.java", + "size" : 322, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/HelloNameTest.java", + "size" : 922, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/basicexercises/TravelReportTest.java", + "size" : 2067, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/README.md b/generated/labs/backend.java.grundlagen.variable-and-types/README.md new file mode 100644 index 0000000..6f20c7c --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/README.md @@ -0,0 +1,95 @@ + + +# Java Exercises - Variablen und primitive Datentypen + +Mit diesen Übungen kannst du dein Wissen über Variablen und primitive Datentypen vertiefen. + +#### Voraussetzung + +- Du weisst was Variablen sind. +- Du kannst eine Variable deklarieren und initialisieren. +- Du weisst was primitive Datentypen sind. +- Du weisst wie man Variablen formatiert auf der Konsole ausgibt. + + + +## Aufgabe 1 - Hello It-Ninja + +Erstelle eine Variable, welche deinen Namen beinhaltet. +Gib `Hello [name]` auf der Konsole aus. + +```java + public static void printHelloName(){ + + // IT-Ninja: Füge hier Deinen Code ein: + + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/HelloName.java) + +**Beispielausgabe:** + +```console +Hello It-Ninja +``` + +## Aufgabe 2 - Reise Report + +Gib den folgenden Text mit `System.out.printf(...)` aus. Ersetze die kursiv, fett dargestellten Werte im Logbuch durch +Variablen, welche du selber definieren musst. + +--- +Reise Report – **_Takeshi_**, Codename **_ShadowFox_** +Datum der Abreise: **_26. Juli 2025_** +Mission: **_Code-Review_** +Startpunkt: **_Lausanne_** +Zielort: **_St. Gallen_** +Abfahrt: **_06:14 Uhr_** +Ankunft: **_09:07 Uhr_** +Zwischenhalte: **_5_** +Reisekosten: **_51.80_** **_CHF_** + +**_ShadowFox_** nutzte die **_1. Klasse_** am **_26. Juli 2025_**, um sich auf den anstehenden **_Code-Review_** +vorzubereiten. Mit einem Akku-Ladestand von **_92%_** und **_2_** mitgeführten Laptops war **_er_** bestens gerüstet. +Die Mission wurde **_erfolgreich_** abgeschlossen. Die Reisekosten sind in **_CHF_**. + +--- + +Anforderungen: +- Verwende sinnvolle Datentypen (String, int, double, boolean) +- Nutze `printf` mit Formatangaben wie `%.2f`, `%d`, `%s`, `%%` +- Achte auf Lesbarkeit und saubere Struktur + +```java + public static void printTravelReport() { + + // IT-Ninja: Füge hier Deinen Code ein: + } +``` + +::src(src/main/java/ch/itninja/labs/basicexercises/TravelReport.java) + +**Beispiel:** + +Eingabe: + +```console +TravelReport.printTravelReport(); +``` + +Ausgabe: + +```console +Reise Report – Takeshi, Codename ShadowFox +Datum der Abreise: 26. Juli 2025 +Mission: Code-Review +Startpunkt: Lausanne +Zielort: St. Gallen +Abfahrt: 06:14 Uhr +Ankunft: 09:07 Uhr +Zwischenhalte: 5 +Reisekosten: 51.80 CHF + +ShadowFox nutzte die 1. Klasse am 26. Juli 2025, um sich auf die anstehende Code-Review vorzubereiten. Mit einem Akku-Ladestand von 92% und 2 mitgeführten Laptops war er bestens gerüstet. Die Mission wurde erfolgreich abgeschlossen. Die Reisekosten sind in CHF. +``` diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/pom.xml b/generated/labs/backend.java.grundlagen.variable-and-types/pom.xml new file mode 100644 index 0000000..ca47410 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-basicexercises + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/Main.java b/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..796f530 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,15 @@ +package ch.itninja.labs; + +import ch.itninja.labs.basicexercises.HelloName; +import ch.itninja.labs.basicexercises.TravelReport; + +/** + * Entry point for the It-Ninja basic exercises. + */ +public class Main { + public static void main(String[] args) { + + HelloName.printHelloName(); + TravelReport.printTravelReport(); + } +} \ No newline at end of file diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/HelloName.java b/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/HelloName.java new file mode 100644 index 0000000..b8d9fa5 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/HelloName.java @@ -0,0 +1,18 @@ +package ch.itninja.labs.basicexercises; + + +/** + * Utility class providing methods for basic Hello Name output. + */ +public class HelloName { + + private HelloName() { + // Prevent instantiation + } + + public static void printHelloName(){ + + // IT-Ninja: Füge hier Deinen Code ein... + + } +} diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/TravelReport.java b/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/TravelReport.java new file mode 100644 index 0000000..c600d9e --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/src/main/java/ch/itninja/labs/basicexercises/TravelReport.java @@ -0,0 +1,16 @@ +package ch.itninja.labs.basicexercises; + +/** + * Gibt einen Reisebericht eines it-ninjas formatiert mit printf aus. + */ +public class TravelReport { + + private TravelReport() { + // Prevent instantiation + } + + public static void printTravelReport() { + + // IT-Ninja: Füge hier Deinen Code ein... + } +} diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/HelloNameTest.java b/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/HelloNameTest.java new file mode 100644 index 0000000..c3c7d11 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/HelloNameTest.java @@ -0,0 +1,34 @@ +package ch.itninja.labs.basicexercises; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class HelloNameTest { + + @Test + void givenPrintHelloName_whenCalled_thenOutputStartsWithHello() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + HelloName.printHelloName(); + } finally { + System.setOut(originalOut); + } + + // THEN + String output = outputStream.toString().trim(); + assertTrue(output.startsWith("Hello "), "Output should start with 'Hello '"); + + ItNinjaOutput.PrintItNinjaOutput("HelloName", "", output); + + } +} diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/TravelReportTest.java b/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/TravelReportTest.java new file mode 100644 index 0000000..b1117f7 --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/basicexercises/TravelReportTest.java @@ -0,0 +1,55 @@ +package ch.itninja.labs.basicexercises; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TravelReportTest { + + @Test + void givenPrintTravelReport_whenCalled_thenOutputShowsExpectedReport() { + // GIVEN + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + try { + // WHEN + TravelReport.printTravelReport(); + } finally { + System.setOut(originalOut); + } + + // THEN + String expectedReport = new StringBuilder() + .append("Reise Report – Takeshi, Codename ShadowFox\n") + .append("Datum der Abreise: 26. Juli 2025\n") + .append("Mission: Code-Review\n") + .append("Startpunkt: Lausanne\n") + .append("Zielort: St. Gallen\n") + .append("Abfahrt: 06:14 Uhr\n") + .append("Ankunft: 09:07 Uhr\n") + .append("Zwischenhalte: 5\n") + .append("Reisekosten: 51.80 CHF\n\n") + .append("ShadowFox nutzte die 1. Klasse am 26. Juli 2025, um sich auf die anstehende Code-Review ") + .append("vorzubereiten. Mit einem Akku-Ladestand von 92% und 2 mitgeführten Laptops war er bestens ") + .append("gerüstet. Die Mission wurde erfolgreich abgeschlossen. Die Reisekosten sind in CHF.") + .toString(); + + // Make output independent of linux or windows line endings + String output = outputStream + .toString() + .trim() + .replaceAll("\r\n", "\n") + .replaceAll("\r", "\n"); + + assertEquals(expectedReport, output, "Output is not as expected"); + + ItNinjaOutput.PrintItNinjaOutput("TravelReport", "TravelReport.printTravelReport();", output); + + } +} diff --git a/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/backend.java.grundlagen.variable-and-types/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +} diff --git a/generated/labs/tools.java.secrets.simple-example/.gitignore b/generated/labs/tools.java.secrets.simple-example/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/.gitignore @@ -0,0 +1 @@ +.env diff --git a/generated/labs/tools.java.secrets.simple-example/.itninja.index.json b/generated/labs/tools.java.secrets.simple-example/.itninja.index.json new file mode 100644 index 0000000..f221ecc --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/.itninja.index.json @@ -0,0 +1,33 @@ +{ + "generatedAt" : "2026-03-22T21:57:35.265761759Z", + "project" : "tools.java.secrets.simple-example", + "files" : [ { + "path" : ".gitignore", + "size" : 5, + "language" : "gitignore" + }, { + "path" : "README.md", + "size" : 1373, + "language" : "markdown" + }, { + "path" : "pom.xml", + "size" : 1723, + "language" : "xml" + }, { + "path" : "src/main/java/ch/itninja/labs/Main.java", + "size" : 309, + "language" : "java" + }, { + "path" : "src/main/java/ch/itninja/labs/secrets/Basic.java", + "size" : 750, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/secrets/BasicTest.java", + "size" : 666, + "language" : "java" + }, { + "path" : "src/test/java/ch/itninja/labs/util/ItNinjaOutput.java", + "size" : 435, + "language" : "java" + } ] +} \ No newline at end of file diff --git a/generated/labs/tools.java.secrets.simple-example/README.md b/generated/labs/tools.java.secrets.simple-example/README.md new file mode 100644 index 0000000..9a221ef --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/README.md @@ -0,0 +1,47 @@ + + +# Secrets - Geheimnisse sicher hinterlegen + +Dieses Beispiel zeigt, wie man Geheimnisse in einer Java Applikation sicher hinterlegen kann. + +## Voraussetzung + +- Du weisst, was mit Geheimnissen gemeint ist. +- Du weisst was Umgebungsvariablen sind. +- Du weisst was Maven ist und kannst Maven-Projekte aufsetzen. +- Du weisst wie man bei Maven ein Paket hinzufügt. + + + +## Übung + +Das Beispiel zeigt, wie ein Projekt korrekt aufgesetzt wird, damit es sicher in einem Git-Repository gesichert werden +kann. + +Schaue dir die Datei `.env.template` an und folge den Anweisungen dort. Ersetze dabei `das_geheimnis` mit +`mein_geheimnis`. + +{{< pom >}} + +```xml + + io.github.cdimascio + dotenv-java + 3.0.0 + +``` + +{{< /pom >}} + +Wenn Du alles korrekt erledigt hast, sollte der Unittest erfolgreich durchlaufen: + +``` +mvn test +``` + +{{< ninja tip>}} +Wenn du den Unittest anschaust, wirst du feststellen, dass auch dort nirgends das Geheimnis im Klartext steht. Um zu +testen, ob du das Geheimnis korrekt konfiguriert hast vergleichen wir es mit einem Hash. Der Hash kann nicht zurück in +einen Klartext verwandelt werden, aber mit der Funktion `match` kann man feststellen, ob ein Wert den gleich Hash +erzeugt und so verifizieren, ob der Wert korrekt ist. +{{< /ninja >}} diff --git a/generated/labs/tools.java.secrets.simple-example/pom.xml b/generated/labs/tools.java.secrets.simple-example/pom.xml new file mode 100644 index 0000000..378c4a5 --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + ch.itninja + itninja-labs-01-security + 1.0.0 + + + UTF-8 + 21 + 21 + + + + + + io.github.cdimascio + dotenv-java + 3.0.0 + + + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + + + + org.mindrot + jbcrypt + 0.4 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + UTF-8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/Main.java b/generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/Main.java new file mode 100644 index 0000000..81fb42f --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/Main.java @@ -0,0 +1,13 @@ +package ch.itninja.labs; + +import ch.itninja.labs.secrets.Basic; + +/** + * Entry point for the It-Ninja basic secret example. + */ +public class Main { + public static void main(String[] args) { + String secret = Basic.getSecret(); + System.out.println("Das Geheimnis ist: '" + secret + "'"); + } +} \ No newline at end of file diff --git a/generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/secrets/Basic.java b/generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/secrets/Basic.java new file mode 100644 index 0000000..c69abac --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/src/main/java/ch/itninja/labs/secrets/Basic.java @@ -0,0 +1,29 @@ +package ch.itninja.labs.secrets; + +import io.github.cdimascio.dotenv.Dotenv; +import java.util.MissingResourceException; + +public class Basic { + + private static final String API_KEY_NAME = "SAMPLE_API_KEY"; + + private Basic() { + // Prevent instantiation + } + + public static String getSecret (){ + Dotenv dotenv = Dotenv.configure() + .ignoreIfMissing() + .load(); + + String apiKey = dotenv.get(API_KEY_NAME); + if (apiKey == null) { + throw new MissingResourceException( + "API key not set. Please check your .env file or environment variables.", + API_KEY_NAME, + null + ); + } + return apiKey; + } +} diff --git a/generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/secrets/BasicTest.java b/generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/secrets/BasicTest.java new file mode 100644 index 0000000..8324ccc --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/secrets/BasicTest.java @@ -0,0 +1,25 @@ +package ch.itninja.labs.secrets; + +import ch.itninja.labs.util.ItNinjaOutput; +import org.junit.jupiter.api.Test; +import org.mindrot.jbcrypt.BCrypt; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class BasicTest { + + @Test + void givenBasicExample_whenCalled_thenReturnSecret() { + // GIVEN + String output = "Das Geheimnis ist: "; + String hash = "$2a$10$HidiMxXZdm1KEIT1nqGoHeiQoiruQd0VrL8I6yz6L.DucmcKjXp2."; + + // WHEN + String secret = Basic.getSecret(); + + // THEN + assertTrue(BCrypt.checkpw(secret, hash)); + + ItNinjaOutput.PrintItNinjaOutput("Basic", "", output + "'" + secret + "'"); + } +} diff --git a/generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java b/generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java new file mode 100644 index 0000000..d189f3b --- /dev/null +++ b/generated/labs/tools.java.secrets.simple-example/src/test/java/ch/itninja/labs/util/ItNinjaOutput.java @@ -0,0 +1,12 @@ +package ch.itninja.labs.util; + +public class ItNinjaOutput { + public static void PrintItNinjaOutput(String lab, String input, String output) { + System.out.println(""); + System.out.println(input); + System.out.println(""); + System.out.println(""); + System.out.println(output); + System.out.println(""); + } +}