From 38c9efb30cb4a45c51e03b858e0f275c001352a8 Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Mon, 5 Feb 2024 18:18:05 +0100 Subject: [PATCH] Exam winter 2023/24 --- Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml | 202 ++++++++++++++++++ Doc/Sd1/Appendix/appendix.xml | 4 + Klausuren/Sd1/2023winter/Exam/Readme.md | 55 +++++ Klausuren/Sd1/2023winter/Exam/pom.xml | 129 +++++++++++ .../Exam/src/main/assembly/assembly.xml | 36 ++++ .../mi/sd1/task1/A_TrafficLight.java | 94 ++++++++ .../de/hdm_stuttgart/mi/sd1/task1/B_Max.java | 59 +++++ .../hdm_stuttgart/mi/sd1/task1/C_WebUrl.java | 77 +++++++ .../hdm_stuttgart/mi/sd1/task1/D_Array.java | 67 ++++++ .../mi/sd1/task1/package-info.java | 22 ++ .../hdm_stuttgart/mi/sd1/task2/Direction.java | 47 ++++ .../mi/sd1/task2/WindForecast.java | 37 ++++ .../mi/sd1/task2/package-info.java | 18 ++ .../mi/sd1/task1/doc-files/weburlBlank.png | Bin 0 -> 13604 bytes .../mi/sd1/task1/doc-files/weburlProtocol.png | Bin 0 -> 10900 bytes .../main/javadoc/resources/fonts/dejavu.css | 3 + .../main/javadoc/resources/jdocSupplement.css | 72 +++++++ .../main/javadoc/resources/jdocSupplement.js | 7 + .../Exam/src/main/resources/log4j2.xml | 21 ++ .../mi/sd1/ShowReachedPoints.java | 26 +++ .../mi/sd1/task1/A_TrafficLightTest.java | 28 +++ .../hdm_stuttgart/mi/sd1/task1/B_MaxTest.java | 37 ++++ .../mi/sd1/task1/C_WebUrlTest.java | 66 ++++++ .../mi/sd1/task1/D_ArrayTest.java | 118 ++++++++++ .../mi/sd1/task2/WindForecastTest.java | 56 +++++ Klausuren/Sd1/2023winter/Solve/Readme.md | 55 +++++ Klausuren/Sd1/2023winter/Solve/pom.xml | 129 +++++++++++ .../Solve/src/main/assembly/assembly.xml | 36 ++++ .../hdm_stuttgart/mi/sd1/ignore_me/Error.java | 19 ++ .../mi/sd1/ignore_me/WindSearch.java | 26 +++ .../mi/sd1/task1/A_TrafficLight.java | 97 +++++++++ .../de/hdm_stuttgart/mi/sd1/task1/B_Max.java | 49 +++++ .../hdm_stuttgart/mi/sd1/task1/C_WebUrl.java | 83 +++++++ .../hdm_stuttgart/mi/sd1/task1/D_Array.java | 77 +++++++ .../mi/sd1/task1/package-info.java | 22 ++ .../hdm_stuttgart/mi/sd1/task2/Direction.java | 42 ++++ .../mi/sd1/task2/WindForecast.java | 64 ++++++ .../mi/sd1/task2/package-info.java | 18 ++ .../mi/sd1/task1/doc-files/weburlBlank.png | Bin 0 -> 13604 bytes .../mi/sd1/task1/doc-files/weburlProtocol.png | Bin 0 -> 10900 bytes .../main/javadoc/resources/fonts/dejavu.css | 3 + .../main/javadoc/resources/jdocSupplement.css | 72 +++++++ .../main/javadoc/resources/jdocSupplement.js | 7 + .../Solve/src/main/resources/log4j2.xml | 21 ++ .../mi/sd1/ShowReachedPoints.java | 26 +++ .../mi/sd1/task1/A_TrafficLightTest.java | 28 +++ .../hdm_stuttgart/mi/sd1/task1/B_MaxTest.java | 37 ++++ .../mi/sd1/task1/C_WebUrlTest.java | 66 ++++++ .../mi/sd1/task1/D_ArrayTest.java | 118 ++++++++++ .../mi/sd1/task2/WindForecastTest.java | 56 +++++ 50 files changed, 2432 insertions(+) create mode 100644 Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml create mode 100644 Klausuren/Sd1/2023winter/Exam/Readme.md create mode 100644 Klausuren/Sd1/2023winter/Exam/pom.xml create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java create mode 100644 Klausuren/Sd1/2023winter/Solve/Readme.md create mode 100644 Klausuren/Sd1/2023winter/Solve/pom.xml create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java diff --git a/Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml b/Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml new file mode 100644 index 000000000..e072eb5e2 --- /dev/null +++ b/Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml @@ -0,0 +1,202 @@ +<?xml version="1.0" encoding="UTF-8"?> +<section version="5.0" xml:id="sd1_exam_2023_winter" xml:lang="en" + xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes" + xmlns:xi="http://www.w3.org/2001/XInclude" + xmlns:trans="http://docbook.org/ns/transclusion" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:m="http://www.w3.org/1998/Math/MathML" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:db="http://docbook.org/ns/docbook"> + <title>SD1 examination winter 2023</title> + + <section xml:id="sd1_exam_2023_winter_task1"> + <title>Implementing tasks</title> + + <section xml:id="sd1_exam_2023_winter_task1_preparation"> + <title>Preparation</title> + + <orderedlist> + <listitem> + <para>Download and unzip the above file + <filename>exam.zip</filename>. You should see a directory + »<filename>Exam</filename>« containing a + <filename>pom.xml</filename> file.</para> + </listitem> + + <listitem> + <para>Open this project in your <productname>IDEA</productname> IDE + by selecting the <filename>Exam/pom.xml</filename> file. Your home + directory is <filename>/home/student</filename>.</para> + </listitem> + </orderedlist> + </section> + + <section xml:id="sd1_exam_2023_winter_task1_task"> + <title>Task</title> + + <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_winter_task1Qanda"> + <qandadiv> + <qandaentry> + <question> + <para>Open the <filename>Readme.md</filename> file in your + project's root. It contains all necessary instructions for + solving the implementation tasks.</para> + </question> + + <answer> + <para>Solution see <link + xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/-/tree/master/Klausuren/Sd1/2023winter/Solve">winter + 2023 exam</link>.</para> + </answer> + </qandaentry> + </qandadiv> + </qandaset> + </section> + + <section xml:id="sd1_exam_2023_winter_task1Caveats"> + <title>Caveats</title> + + <itemizedlist> + <listitem> + <para>When approaching end of examination check your input for + completeness prior to being automatically logged out by the system. + Remember: There is 120 minutes for the examination and another 5 + minutes to check for completeness.</para> + </listitem> + + <listitem> + <para>Projects residing just on your local workstation's file system + cannot be recovered after finishing the exam.</para> + </listitem> + </itemizedlist> + </section> + </section> + + <section xml:id="sd1_exam_2023_winter_task2"> + <title>Beginner's nightmare</title> + + <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_winter_task3Qanda"> + <qandadiv> + <qandaentry> + <question> + <para>We consider the following class method + <methodname>sum</methodname>:</para> + + <programlisting language="none">01 /** +02 * Summing up an int array's values +03 * +04 * @param values An array of int values +05 * @return The sum of all array values +06 */ +07 public static int sum(int[] values) { +08 +09 int sum; +10 +11 for (i = 0; i <= values.length; i++) { +12 sum += values[i]; +13 } +14 return sum; +15 }</programlisting> + + <para>This code does contain errors. Explain and correct each of + those. Line numbers are being provided for your convenience</para> + </question> + + <answer> + <para>There are errors:</para> + + <glosslist> + <glossentry> + <glossterm>Line 9</glossterm> + + <glossdef> + <para>The variable <code language="java">sum</code> lacks + initialization <code language="java">int sum = + 0</code>.</para> + </glossdef> + </glossentry> + + <glossentry> + <glossterm>Line 16</glossterm> + + <glossdef> + <para>There are two errors here:</para> + + <itemizedlist> + <listitem> + <para>Variable i has not been declared: <code + language="java">int i = 0; ...</code></para> + </listitem> + + <listitem> + <para>The loop's upper limit is being breached: <code + language="java">i < values.length</code> rather then + <code language="java">i <= values.length</code> is + being required.</para> + </listitem> + </itemizedlist> + </glossdef> + </glossentry> + </glosslist> + </answer> + </qandaentry> + </qandadiv> + </qandaset> + </section> + + <section xml:id="sd1_exam_2023_winter_task3"> + <title>Strange endless loop result</title> + + <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_winter_task2Qanda"> + <qandadiv> + <qandaentry> + <question> + <para>We consider:</para> + + <programlisting language="java">for (byte b = 0; b <= Byte.MAX_VALUE; b++);</programlisting> + + <para>This snippet causes an endless loop. Give an + explanation.</para> + + <tip> + <para>Consider the ++ operator's behavior when reaching variable + <code>b</code>'s upper limit.</para> + </tip> + </question> + + <answer> + <para>The operator ++ acting on a byte variable will cycle between + <code language="java">Byte.MIN_VALUE</code> and <code + language="java">Byte.MAX_VALUE</code>. Consider:</para> + + <informaltable border="1"> + <tr> + <th>Code</th> + + <th>Output</th> + </tr> + + <tr> + <td valign="top"><programlisting language="java">byte b = Byte.MAX_VALUE; +System.out.println(b); +b++; +System.out.println(b);</programlisting></td> + + <td valign="top"><screen>127 +-128</screen></td> + </tr> + </informaltable> + + <para>Before breeching the loop's upper limit <code + language="java">Byte.MAX_VALUE</code> our variable <code + language="java">b will thus transition</code> from Byte.MAX_VALUE + to <code language="java">Byte.MIN_VALUE</code>. The loop will thus + continue forever.</para> + </answer> + </qandaentry> + </qandadiv> + </qandaset> + </section> +</section> diff --git a/Doc/Sd1/Appendix/appendix.xml b/Doc/Sd1/Appendix/appendix.xml index cb9d8e3c6..c7ed5a8fc 100644 --- a/Doc/Sd1/Appendix/appendix.xml +++ b/Doc/Sd1/Appendix/appendix.xml @@ -2353,6 +2353,10 @@ Value 2147483645 is not prime. </listitem> </orderedlist> + + <xi:include href="Exam/2023/Winter/exam.xml" xpointer="element(/1)" + ns:idfixup="auto"/> + <xi:include href="Exam/2023/Summer/exam.xml" xpointer="element(/1)" ns:idfixup="auto"/> diff --git a/Klausuren/Sd1/2023winter/Exam/Readme.md b/Klausuren/Sd1/2023winter/Exam/Readme.md new file mode 100644 index 000000000..caf9ae0dd --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/Readme.md @@ -0,0 +1,55 @@ +# Generate and open class/method javadoc for browsing + +Grab a terminal in this IDE (By lower left icon or Alt+F12) and issue the following command: + +<pre>Exam> mvn javadoc:javadoc +... +[<span style="color:blue;font-weight:bold;">INFO</span>] Executing tasks +[<span style="color:orange;font-weight:bold;">WARNING</span>] [echo] Javadoc root at <span style="color:blue;">file:///home/.../Downloads/Exam/target/site/apidocs/index.html</span> +[<span style="color:blue;font-weight:bold;">INFO</span>] Executed tasks +...</pre> + +Click the <span style="color:blue;">file:///.../index.html</span> link opening your project's `index.html` Javadoc root +in your system's default web browser. + +# Implementation tasks + +Your project's following packages do contain implementation tasks: + +- `de.hdm_stuttgart.mi.sd1.task1` (50 Points) + +- `de.hdm_stuttgart.mi.sd1.task2` (20 points, more difficult) + +Read the generated documentation and implement the skeleton methods and classes. + +Your project's `test` branch does contain corresponding unit tests for verifying your solutions' correctness. + +# Hints + +- Your score solely depends on the number of successfully executing unit tests. A »nearly correct« implementation failing +with respect to a given unit tests will not contribute any points at all. + +- General advice: Implement less but correctly. + +- Mind special cases i.e. `null` variable values or null values being contained in arrays. + +- In case of test failures both the IDEA debugger and logging statements are your friend. + +Executing `de.hdm_stuttgart.mi.sd1.ShowReachedPoints` in your project's test branch as a Java application +(not as Junit test!) shows your number of points reached so far. + +Do not model your implementations along unit test definitions i.e. avoid cheating this way! Such behaviour will be +regarded as an attempt at deception (Täuschungsversuch). + +# Exam system upload + +After finishing implementing: + +1. Export this project by hitting **»File âž” Export âž” Project to Zip File«**. +1. Use a self-explanatory file name like e.g. `solution1.zip`. +1. Go to your exam browser window and upload `solution1.zip` . +1. Complete by **clicking the »<span style="background: #527A35;color:white;">Speichern + weiter âžž </span>«** button. +1. Hit **<span style="background: #446684;color:white;"> 🠬 Speichern + zurück</span>** and check if your + upload is visible. +1. If you advance on implementing: Repeat steps 1. to 5.: Only the least uploaded `.zip` archive will become subject to + marking. diff --git a/Klausuren/Sd1/2023winter/Exam/pom.xml b/Klausuren/Sd1/2023winter/Exam/pom.xml new file mode 100644 index 000000000..b8ab3bc98 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/pom.xml @@ -0,0 +1,129 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>de.hdm_stuttgart.mi.sd1</groupId> + <artifactId>sd1_2023winter_exam</artifactId> + <version>0.9</version> + <packaging>jar</packaging> + + <name>sd1_2023winter_exam</name> + + <url>https://freedocs.mi.hdm-stuttgart.de/sd1_sect_mavenCli.html</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>17</maven.compiler.release> + + <freedocs.url>https://freedocs.mi.hdm-stuttgart.de</freedocs.url> + <mathjax.url>${freedocs.url}/lib/MathJax/es5/tex-chtml.js</mathjax.url> + <libhighlight.url>${freedocs.url}/lib/highlight.js</libhighlight.url> + </properties> + + <repositories> + <repository> + <id>hdm-mi-internal-maven-repo</id> + <url>https://maven.mi.hdm-stuttgart.de/nexus/repository/mi-maven</url> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>de.hdm_stuttgart.mi.exam</groupId> + <artifactId>unitmarking</artifactId> + <version>1.3</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.11.0</version> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <version>3.1.0</version> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <target> + <echo>Javadoc root at file://${project.basedir}/target/site/apidocs/index.html</echo> + </target> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>3.5.0</version> + <configuration> + <release>17</release> + <doclint>all</doclint> + <show>public</show> + <docfilessubdirs>true</docfilessubdirs> + <addStylesheets> + <stylesheet>resources/jdocSupplement.css</stylesheet> + </addStylesheets> + + <windowtitle>Exam documentation</windowtitle> + <links> + <link>${freedocs.url}/doc/openjdk-21-doc/api/</link> + </links> + <additionalOptions> + <additionalOption>-html5 --allow-script-in-comments</additionalOption> + </additionalOptions> + <nohelp>true</nohelp> + + <header><![CDATA[ + <script type="text/javascript" src="${mathjax.url}"></script> + <script type="text/javascript" src="{@docRoot}/resources/jdocSupplement.js"></script> + + <link rel="stylesheet" href="${libhighlight.url}/styles/idea.min.css"> + <script src="${libhighlight.url}/highlight.min.js"></script> + <script type="text/javascript">hljs.highlightAll();</script>]]> + </header> + <bottom><![CDATA[Copyright © 2023 Stuttgart Media University / MI. Licensed under + <a style="font-weight:bold;" href="https://creativecommons.org/licenses/by/4.0/legalcode" target="_blank" + >Creative Commons Attribution 4.0 International Public License</a>.]]></bottom> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-assembly-plugin</artifactId> + <version>3.6.0</version> + <configuration> + <descriptors> + <descriptor>src/main/assembly/assembly.xml</descriptor> + </descriptors> + </configuration> + <executions> + <execution> + <id>make-assembly</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + <configuration> + <archive> + <manifest> + <mainClass>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</mainClass> + </manifest> + </archive> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml b/Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml new file mode 100644 index 000000000..85268e296 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml @@ -0,0 +1,36 @@ +<assembly + xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> + <id>fat-tests</id> + <formats> + <format>jar</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <dependencySets> + <dependencySet> + <outputDirectory/> + <useProjectArtifact>true</useProjectArtifact> + <unpack>true</unpack> + <scope>test</scope> + </dependencySet> + </dependencySets> + <fileSets> + <fileSet> + <directory>${project.build.directory}/test-classes</directory> + <outputDirectory/> + <includes> + <include>**/*.class</include> + </includes> + <useDefaultExcludes>true</useDefaultExcludes> + </fileSet> + <fileSet> + <directory>${project.build.directory}/classes</directory> + <outputDirectory/> + <includes> + <include>**/*.class</include> + </includes> + <useDefaultExcludes>true</useDefaultExcludes> + </fileSet> + </fileSets> +</assembly> \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java new file mode 100644 index 000000000..24f51ff2d --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java @@ -0,0 +1,94 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * <p>Valid German traffic light states.</p> + */ +public class A_TrafficLight { + /** + * <p>Traffic light state validation.</p> + * + * <p>German traffic lights feature three different colours red, yellow and green. Only the following four states + * are valid:</p> + * + * <table style="outline: 2px solid;border-spacing: 10ex 0;"> + * <caption style="background: lightgrey;text-align: left;"><em>Valid German traffic light states</em></caption> + * <tr> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:red;"></li> + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Wait</td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:red;"></li> + * <li style="color:yellow;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Start</td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * <li style="color:green;"></li> + * </ul> + * </td> + * <td>Go</td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:black;"></li> + * <li style="color:yellow;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Stop</td> + * </tr> + * </table> + * + * <p>On contrary <em>any</em> other pattern due to e.g. broken bulbs or other technical failures is invalid:</p> + * + * <table style="outline: 2px solid;border-spacing: 10ex 0;"> + * <caption style="background:lightgrey;text-align:left;"> + * <em>Invalid German traffic light state examples</em> + * </caption> + * <tr> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul > + * <li style="color:red;"></li> + * <li style="color:black;"></li> + * <li style="color:green;"></li> + * </ul> + * </td> + * <td> + * <p>Wait or go?</p> + * <p>(Fix my</p> + * <p>control</p> + * <p>unit!)</p> + * </td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul > + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Broken bulb(s)</td> + * <td>...</td> + * </tr> + * </table> + * + * @param red <code>true</code> represents »on«, <code>false</code> represents »off«. + * @param yellow <code>true</code> represents »on«, <code>false</code> represents »off«. + * @param green <code>true</code> represents »on«, <code>false</code> represents »off«. + * + * @return <code>true</code> if in a valid state, <code>false</code> otherwise. + */ + static public boolean stateIsValid(boolean red, boolean yellow, boolean green) { + return true; //TODO: Implement me! + } + + private A_TrafficLight(){/* Ignore me: My sole purpose is suppressing default constructor javadoc generation */} +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java new file mode 100644 index 000000000..6bd47576d --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java @@ -0,0 +1,59 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * <p>Doing basic calculations.</p> + */ +public class B_Max { + /** + * <p>Get the largest basic calculation result of two values.</p> + * + * <p>We have four different basic calculation operations:</p> + * + * <ul style="list-style:none"> + * <li><code style="font-weight: bolder">+</code>: Addition</li> + * <li><code style="font-weight: bolder">-</code>: Subtraction</li> + * <li><code style="font-weight: bolder">*</code>: Multiplication</li> + * <li><code style="font-weight: bolder">/</code>: Division</li> + * </ul> + * + * <p>Given two values like e.g 4 and 0.1 we can construct four different basic calculation terms:</p> + * + * <ul style="list-style:none"> + * <li><code>4 + 0.1 == 4.1</code></li> + * <li><code>4 - 0.1 == 3.9</code></li> + * <li><code>4 * 0.1 == 0.4</code></li> + * <li><code style="background: lightgreen">4 / 0.1 == 40</code></li> + * </ul> + * + * <p>The above example features a maximum result value of 40 resulting from dividing 4 by 0.1 . + * Depending on both values the maximum may result from either of our four basic operations. We take a + * second set of example values 3 and -1:</p> + * + * <ul style="list-style:none"> + * <li><code>3 + (-1) == 2</code></li> + * <li><code style="background: lightgreen">3 - (-1) == 4</code></li> + * <li><code>3 * (-1) == -3</code></li> + * <li><code>3 / (-1) == -3</code></li> + * </ul> + * + * <p>This time we get a maximum of 4 by subtracting -1 from 3 .</p> + * + * @param first The first operand + * @param second The second operand + * @return The largest basic calculation result taking both arguments in their respective order. + * + * <section class="implementationHints"> + * <h4 class="implementationHints">Hints:</h4> + * + * <ol> + * <li>Create all four possible arithmetic results</li> + * <li>Then choose the largest among these four values</li> + * </ol> + * + * </section> + */ + public static double getBasicCalculationMax(final double first, final double second) { + return 42.0; //TODO: Implement me! + } + private B_Max(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */} +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java new file mode 100644 index 000000000..02916a8d2 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java @@ -0,0 +1,77 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * <p>Handle web addresses.</p> + */ +public class C_WebUrl { + + /** + * <p>Accessing web sites e.g. <code>www.wikipedia.org</code> requires entering the address in a web browser:</p> + * + * <img style="outline: 2px solid;" + * src="doc-files/weburlBlank.png" alt="A web address without protocol specification" > + * + * <p>Entering <code>www.wikipedia.org</code> fulfills its purpose. However behind the scenes either a + * <code>http://</code> or <code>https://</code> protocol specification is being silently prepended:</p> + * + * <img style="outline: 2px solid;" + * src="doc-files/weburlProtocol.png" alt="A web address including a protocol specification"> + * + * <p>The current method adds a missing protocol specification according to the following rules:</p> + * + * <ul> + * <li>An address already starting with either <code>http://</code> or <code>https://</code> is just being + * copied.</li> + * + * <li> + * <p>An address not starting with either <code>http://</code> or <code>https://</code> receives a + * protocol prefix according to the <code>tlsSupport</code> parameter.</p> + * </li> + * </ul> + * <p>Some examples:</p> + * <table class="goikTableDefaults"> + * <caption>Optional protocol prefix examples for <code>www.wikipedia.org</code></caption> + * <tr> + * <th><code>address</code></th> + * <th><code>tlsSupport</code></th> + * <th>Return value</th> + * </tr> + * <tr> + * <td style="color:blue"><code>www.wikipedia.org</code></td> + * <td><code style="color:red">true</code></td> + * <td><code style="color:red">https</code>://<code style="color:blue">www.wikipedia.org</code></td> + * </tr> + * <tr> + * <td style="color:blue"><code>www.wikipedia.org</code></td> + * <td><code style="color:red">false</code></td> + * <td><code style="color:red">http</code>://<code style="color:blue">www.wikipedia.org</code></td> + * </tr> + * <tr> + * <td style="color:blue"><code>http://www.wikipedia.org</code></td> + * <td>Protocol specification <code>http://</code> present, value irrelevant</td> + * <td style="color:blue"><code>http://www.wikipedia.org</code></td> + * </tr> + * <tr> + * <td style="color:blue"><code>https://www.wikipedia.org</code></td> + * <td>Protocol specification <code>https://</code> present, value irrelevant</td> + * <td style="color:blue"><code>https://www.wikipedia.org</code></td> + * </tr> + * </table> + * + * @param address A website's address. May either be a raw name or a full http/https prefixed protocol address. + * @param tlsSupport If <code>true</code> the server supports + * <code><span style="color:red">https</span>://...</code> connections. Otherwise, only + * <code><span style="color:red">http</span>://...</code> is being supported. + * + * @return A fully <code>http://</code> or <code>https://</code> prefixed protocol address. + * + * <section class="implementationHints"> + * <h4 class="implementationHints">Hint:</h4> + * + * <p>{@link String#startsWith(String)}</p> + * </section> + */ + public static String amendWebAddress(final String address, final boolean tlsSupport) { + return "Not yet implemented!"; //TODO: Implement me! + } +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java new file mode 100644 index 000000000..752b2f02b --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java @@ -0,0 +1,67 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * Array helper method. + */ +public class D_Array { + + /** + * The special value -1 indicating two arrays are not being related by any sequence of right cyclic rotations. + * Example: {1, 2} and {1, 3}. + */ + static public final int NOT_CYCLICALLY_RELATED = -1 ; + + /** + * <p>Part 2: Check two arrays for being related by an integer number of successive right cyclic rotations or not.</p> + * + * <p>Consider a right cyclic array rotating example:</p> + * + * <pre> + * <span style="color:red">â¬â”€â”€â”€â”€â”€â”</span> + * {1, 7, <span style="color:blue">3</span>} ⇨ {<span style="color:blue">3</span>, 1, 7} + * <span style="color:red">⤻ ⤻</span> + * </pre> + * + * <p>The arrays <code>{1, 7, 3}</code> and <code>{3, 1, 7}</code> are thus being related by one right + * cyclic rotation.</p> + * + * <p>Arrays may also be related by a succession of multiple right cyclic rotations. Example:</p> + * + * <p><code>{1, 8, 3, 4}</code> and <code>{3, 4, 1, 8}</code> are being related by a sequence of two right cyclic + * rotations:</p> + * + * <pre> + * <span style="color:red"> â¬â”€â”€â”€â”€â”€â”€â”€â”€â” â¬â”€â”€â”€â”€â”€â”€â”€â”€â”</span> + * {1, 8, 3, <span style="color:blue">4</span>} ⇨ {<span style="color:blue">4</span>, 1, 8, <span + * style="color:orange">3</span>} ⇨ {<span style="color:orange">3</span>, <span style="color:blue">4</span>, 1, 8} + * <span style="color:red"> ⤻ ⤻ ⤻ ⤻ ⤻ ⤻</span> + * </pre> + * + * <p>In this case a value of 2 rotations is being returned.</p> + * + * <h4>Special cases: </h4> + * + * <ul> + * <li>Two identical arrays are being related by zero rotations.</li> + * <li>Two arrays of different size are always unrelated / {@link #NOT_CYCLICALLY_RELATED} .</li> + * </ul> + * + * @param array1 The first array. Values must remain untouched. + * @param array2 The second array. Values must remain untouched. + * + * @return Either the number of right cyclic rotations or the special value {@link #NOT_CYCLICALLY_RELATED} if both + * arrays are not being related by a sequence of cyclic rotations. + * + * <section class="implementationHints"> + * <h4 class="implementationHints">Hints:</h4> + * + * <p>You likely need two nested loops: One representing all possible array shift values. A second one + * comparing all index positions with respect to the given shift value.</p> + * + * </section> + */ + static public int isRotatedBy(final int[] array1, int[] array2) { + return 42; //TODO: Implement me! + } + private D_Array(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */} +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java new file mode 100644 index 000000000..6152c2c29 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java @@ -0,0 +1,22 @@ +/** + * <p>Classes here mostly (if not completely) contain static methods to be implemented.</p> + * + * <p>The ordering being implied by (test) class names and related methods reflect the author's opinion about ascending + * implementation difficulty. You are free to proceed differently. Hints:</p> + * + * <ul> + * <li>Run <code>mvn javadoc:javadoc</code> and open the generated + * <code><projectroot>/target/site/apidocs/index.html</code> file in your browser of choice.</li> + * + * <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior + * to implementing.</li> + * + * <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's + * correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number + * of examination points reached so far.</li> + * + * <li>The debugger is your friend</li> + * </ul> + * + */ +package de.hdm_stuttgart.mi.sd1.task1; \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java new file mode 100644 index 000000000..999e98a8c --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java @@ -0,0 +1,47 @@ +package de.hdm_stuttgart.mi.sd1.task2; + +// You probably don't want to edit this auxiliary class. Start with + +/** <p>The 8 main wind directions.</p> + * + * <p>You probably don't want to edit this auxiliary class. Start working on class {@link WindForecast} </p> + * + */ +public enum Direction { + /** + * North + */ + N, + /** + * Northeast + */ + NE, + /** + * East + */ + E, + + /** + * Southeast + */ + SE, + + /** + * South + */ + S, + + /** + * Southwest + */ + SW, + + /** + * West + */ + W, + /** + * Northwest + */ + NW +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java new file mode 100644 index 000000000..97dfecfe1 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java @@ -0,0 +1,37 @@ +package de.hdm_stuttgart.mi.sd1.task2; + +/** + * <p>Check for matching wind conditions.</p> + * + * <p>Many water sport addicts depend on suitable wind conditions being described by wind speed and + * optionally wind direction.</p> + * + * <p>We start an example forecasting <span style="color:green">40</span> Km Wind speed from north using + * enum {@link Direction}:</p> + * + * <pre style="background-color: lightgray"><code class="nohighlight"> final WindForecast forecast = new WindForecast(<span style="color:green">40</span>, Direction.N);</code></pre> + * + * <p>A kitesurfer wants to get notified if the wind forecast at his or her spot predicts + * wind ranging from <span style="color:blue">30</span> Km/h to <span style="color:red">50</span> Km/h in speed coming + * either from northern ({@link Direction#N}) or northwestern ({@link Direction#NW}) directions.</p> + * + * <p>The <code>matchingConditions(...)</code> method in the following code snippet expects minimum and maximum desired + * wind speed and a (possibly empty) list of desired wind directions. One of our surfer's desired directions being + * {@link Direction#N} and the forcast of <span style="color:green">40</span> Km/h being within the desired <span style="color:blue">30</span> Km/h to + * <span style="color:red">50</span> Km/h range calling <code>matchingConditions(...)</code> will thus return + * <code>true</code>:</p> + * + * <pre style="background-color: lightgray"><code class="nohighlight"> final WindForecast forecast = new WindForecast(<span style="color:green">40</span>, Direction.N); + * + * if (forecast.matchingConditions(<span style="color:blue">30</span>, <span style="color:red">50</span>, new Direction[]{Direction.N, Direction.NW})) { + * System.out.println("Yeah, let's go for it! \uD83D\uDE0E"); + * else { + * System.out.println("I hate waiting for the wind! \uD83E\uDD2C"); + * }</code></pre> + * + * <p>Complete the implementation of {@link WindForecast} allowing to run code like above using the + * pre-defined enum {@link Direction}.</p> + */ +public class WindForecast { + //TODO: Implement me! +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java new file mode 100644 index 000000000..b12e6627a --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java @@ -0,0 +1,18 @@ +/** + * <p>This package hosts more advanced implementation tasks.</p> + * + * <ul> + * <li>Run <code>mvn javadoc:javadoc</code> and open the generated + * <code><projectroot>/target/site/apidocs/index.html</code> file in your browser of choice.</li> + * + * <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior + * to implementing.</li> + * + * <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's + * correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number + * of examination points reached so far.</li> + * + * <li>The debugger is your friend</li> + * </ul> + */ +package de.hdm_stuttgart.mi.sd1.task2; \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png new file mode 100644 index 0000000000000000000000000000000000000000..01376dac6c420ef680afbbb82f147dfa569b0766 GIT binary patch literal 13604 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 Ynz`xU#kc<i-*bXUeUulg5HSq=FK2LcivR!s literal 0 HcmV?d00001 diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c648b8d28812201ab15b272b7e953c7c0fb642 GIT binary patch literal 10900 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 literal 0 HcmV?d00001 diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css new file mode 100644 index 000000000..4fec2b593 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css @@ -0,0 +1,3 @@ +/* shame on you, javadoc! Still providing +@import url('resources/fonts/dejavu.css') line in stylesheet.css +*/ \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css new file mode 100644 index 000000000..08840cdbf --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css @@ -0,0 +1,72 @@ +/* Javadoc extensions: */ + +ul > li > ul { + list-style-type: circle; +} + +table.goikTableDefaults, +table.goikTableDefaults>caption, +table.goikTableDefaults>tr>th, +table.goikTableDefaults>tr>td, +table.goikTableDefaults>tbody>tr>th, +table.goikTableDefaults>tbody>tr>td { + border: 2px solid black; + border-collapse: collapse; + padding: 1ex; + vertical-align: top; +} + +table.goikTableDefaults>caption { + /* border-top-style: solid; border-left-style: solid; border-right-style: solid' */ + border-bottom-style: none; + font-weight: bold; + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} + +table.goikTableDefaults>tbody>tr>td { + vertical-align:top; +} +table.goikTableDefaults { + border-spacing: 0px !important; +} + +table.indexTable { + border-collapse: collapse; + border-style: hidden; +} + +table.indexTable caption { + text-align: left; +} + +table.indexTable td, table.indexTable th { + border: 1px solid black; + padding: 0.5ex; +} + +em { + font-weight: bold; + font-style: normal; +} +section.implementationHints>h3 { + font-weight: bold; + background-color: rgb(222, 227, 233); +} + +code { + white-space: pre; +} + +.implementationHints { + background-color: hsl(120, 100%, 95%) !important; +} + +.myRed { + color: red; +} + +.myGreen { + color: limegreen; +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js new file mode 100644 index 000000000..97911e558 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js @@ -0,0 +1,7 @@ +for(var i in document.links) { + var link = document.links[i]; + if (link.href && link.href.indexOf('http') === 0) { + link.target = '_blank'; + } +} + diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml b/Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml new file mode 100644 index 000000000..130f87a14 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <File name="A1" fileName="A1.log" append="false"> + <PatternLayout pattern="%t %-5p %c{2} - %m%n"/> + </File> + <Console name="STDOUT" target="SYSTEM_OUT"> + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> + </Console> + </Appenders> + <Loggers> + + <!-- You my want to define class or package level per-logger rules --> + <Logger name="de.hdm_stuttgart.mi.sd1.App" level="debug"> + <AppenderRef ref="A1"/> + </Logger> + <Root level="info"> + <AppenderRef ref="STDOUT"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java new file mode 100644 index 000000000..651f0a5cd --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java @@ -0,0 +1,26 @@ +package de.hdm_stuttgart.mi.sd1; + +import de.hdm_stuttgart.mi.exam.unitmarking.RunTests; + +import de.hdm_stuttgart.mi.sd1.task1.A_TrafficLightTest; +import de.hdm_stuttgart.mi.sd1.task1.B_MaxTest; +import de.hdm_stuttgart.mi.sd1.task1.C_WebUrlTest; +import de.hdm_stuttgart.mi.sd1.task1.D_ArrayTest; + +import de.hdm_stuttgart.mi.sd1.task2.WindForecastTest; + +public class ShowReachedPoints { + + /** + * Revealing total number of reached points from all tasks. + * + * @param args Unused + */ + public static void main(String[] args) { + RunTests.exec( + "Task 1", + A_TrafficLightTest.class, B_MaxTest.class, C_WebUrlTest.class, D_ArrayTest.class + ); + RunTests.exec("Task 2", WindForecastTest.class); + } +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java new file mode 100644 index 000000000..3e3960d04 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java @@ -0,0 +1,28 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import static de.hdm_stuttgart.mi.sd1.task1.A_TrafficLight.stateIsValid; + + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class A_TrafficLightTest extends ExaminationTestDefaults { + + @Test + @Marking(points = 18) + public void test_100() { + Assert.assertFalse( stateIsValid(false, false, false)); + Assert.assertTrue( stateIsValid(false, false, true)); + Assert.assertTrue( stateIsValid(false, true, false)); + Assert.assertFalse( stateIsValid(false, true, true)); + Assert.assertTrue( stateIsValid(true, false, false)); + Assert.assertFalse( stateIsValid(true, false, true)); + Assert.assertTrue( stateIsValid(true, true, false)); + Assert.assertFalse( stateIsValid(true, true, true)); + } +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java new file mode 100644 index 000000000..d1e177907 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java @@ -0,0 +1,37 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class B_MaxTest extends ExaminationTestDefaults { + static final public double PRECISION = 1.E-12; + + @Test + @Marking(points = 15) + public void test() { + assertMaximum(12, 4, 3, '*'); + assertMaximum(5, 2, -3, '-'); + assertMaximum(5.1, 0.1, 5, '+'); + assertMaximum(35, 7, 0.2, '/'); + assertMaximum(-1.4,-7, 0.2, '*'); + assertMaximum(4,2, 2, '+'); + } + + private static void assertMaximum(final double expected, final double first, final double second, char operation) { + + final StringBuilder errMsg = new StringBuilder("Expected maximum is " + expected + " == " + first + " " + + operation + " "); + + if (second < 0) { + errMsg.append("(" + second + ")"); + } else { + errMsg.append(second); + } + Assert.assertEquals(errMsg.toString(), expected, B_Max.getBasicCalculationMax(first, second), PRECISION); + } +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java new file mode 100644 index 000000000..4df40473b --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java @@ -0,0 +1,66 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + + + + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class C_WebUrlTest extends ExaminationTestDefaults { + + static private final String dnsNames[] = { + "www.der-postillon.com", "www.duh.de", "www.amnesty.org" + }; + + + @Test + @Marking(points = 14) + public void test() { + + for(final String dns: dnsNames) { + final String + httpUrl = "http://" + dns, + httpsUrl = "https://" + dns, + + actualByHttpsTlsTrue = C_WebUrl.amendWebAddress(httpsUrl, true), + actualByHttpsTlsFalse = C_WebUrl.amendWebAddress(httpsUrl, false), + + actualByHttpTlsTrue = C_WebUrl.amendWebAddress(httpUrl, true), + actualByHttpTlsFalse = C_WebUrl.amendWebAddress(httpUrl, false), + + actualByDnsTlsTrue = C_WebUrl.amendWebAddress(dns, true), + actualByDnsTlsFalse = C_WebUrl.amendWebAddress(dns, false); + + Assert.assertEquals( + "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsTrue + "'", + httpsUrl, actualByHttpsTlsTrue); + + Assert.assertEquals( + "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsFalse + "'", + httpsUrl, actualByHttpsTlsFalse); + + Assert.assertEquals( + "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsTrue + "'", + httpUrl, actualByHttpTlsTrue); + + Assert.assertEquals( + "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsFalse + "'", + httpUrl, actualByHttpTlsFalse); + + + Assert.assertEquals( + "Passing '" + dns + "' when tlsSupport is 'true' should return '" + httpsUrl + "' rather than " + actualByDnsTlsTrue, + httpsUrl, actualByDnsTlsTrue); + + Assert.assertEquals( + "Passing '" + dns + "' when tlsSupport is 'false' should return '" + httpUrl + "' rather than " + actualByDnsTlsFalse, + httpUrl, actualByDnsTlsFalse); + + } + } +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java new file mode 100644 index 000000000..24b763ada --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java @@ -0,0 +1,118 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import java.util.Arrays; + +import static de.hdm_stuttgart.mi.sd1.task1.D_Array.NOT_CYCLICALLY_RELATED; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class D_ArrayTest extends ExaminationTestDefaults { + + private static void assertRelatedByRotation(final int expectedRotation, final int[] array1, int[] array2) { + + final int[] array1Copy = Arrays.copyOf(array1, array1.length), + array2Copy = Arrays.copyOf(array2, array2.length); + + final String errorMessage; + if (NOT_CYCLICALLY_RELATED == expectedRotation) { + errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) + + " are not being cyclically related."; + } else { + errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) + + " are being cyclically related by " + expectedRotation + " right rotation(s)."; + } + Assert.assertEquals(errorMessage, expectedRotation, D_Array.isRotatedBy(array1, array2)); + + Assert.assertArrayEquals("You must not change values in array1 parameter", array1Copy, array1); + Assert.assertArrayEquals("You must not change values in array2 parameter", array2Copy, array2); + } + + @Test + public void test010_Minimum() { + assertRelatedByRotation(0, new int[]{}, new int[]{}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{}, new int[]{1}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{3}, new int[]{}); + } + @Test + public void test020One() { + assertRelatedByRotation(0, new int[]{77}, new int[]{77}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{8}, new int[]{77}); + } + + @Test + @Marking(points = 2) + public void test030Two() { + assertRelatedByRotation(0, new int[]{-1, 5}, new int[]{-1, 5}); + assertRelatedByRotation(1, new int[]{-1, 5}, new int[]{5, -1}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 5}, new int[]{-5, 1}); + } + @Test + @Marking(points = 2) + public void test040Three() { + assertRelatedByRotation( 0, new int[]{2, -6, 9}, new int[]{ 2, -6, 9}); + assertRelatedByRotation( 1, new int[]{2, -6, 9}, new int[]{ 9, 2, -6}); + assertRelatedByRotation( 2, new int[]{2, -6, 9}, new int[]{-6, 9, 2}); + + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{2, -6, 9}, new int[]{ 2, 9, -6}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{2, -6, 9}, new int[]{-6, 2, 9}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{2, -6, 9}, new int[]{-6, 2}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-1, 2, 5}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-2, 2, 4}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-1, 3, 4}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-1, 3, 4, 3}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4, 1}, new int[]{-1, 3, 4}); + } + @Test + @Marking(points = 2) + public void test050Twenty() { + assertRelatedByRotation( 0, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + + assertRelatedByRotation( 1, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{10, 1, 2, 3, 4, 5, 6, 7, 8, 9}); + + assertRelatedByRotation( 2, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{9, 10, 1, 2, 3, 4, 5, 6, 7, 8}); + + assertRelatedByRotation( 3, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{8, 9, 10, 1, 2, 3, 4, 5, 6, 7}); + + assertRelatedByRotation( 4, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{7, 8, 9, 10, 1, 2, 3, 4, 5, 6}); + + assertRelatedByRotation( 5, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{6, 7, 8, 9, 10, 1, 2, 3, 4, 5}); + + assertRelatedByRotation( 6, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{5, 6, 7, 8, 9, 10, 1, 2, 3, 4}); + + assertRelatedByRotation( 7, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{4, 5, 6, 7, 8, 9, 10, 1, 2, 3}); + + assertRelatedByRotation( 8, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{3, 4, 5, 6, 7, 8, 9, 10, 1, 2}); + + assertRelatedByRotation( 9, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{2, 3, 4, 5, 6, 7, 8, 9, 10, 1}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}, + /* */ new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{}); + + + } +} diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java new file mode 100644 index 000000000..00f5f04be --- /dev/null +++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java @@ -0,0 +1,56 @@ +package de.hdm_stuttgart.mi.sd1.task2; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import de.hdm_stuttgart.mi.exam.unitmarking.reflect.ObjectWrapper; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import static de.hdm_stuttgart.mi.sd1.task2.Direction.*; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) + +public class WindForecastTest extends ExaminationTestDefaults { + + final ObjectWrapper<WindForecast> forecast_30_S = + new ObjectWrapper<>(WindForecast.class, 30, S); + + @Test + @Marking(points = 10) + public void test_100_noDirection() { + + Assert.assertTrue("Forecast speed 30 being within [30, 40] expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, new Direction[]{})); + + Assert.assertTrue("Forecast speed 30 being within [10, 40] expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 10, 40, new Direction[]{})); + + Assert.assertTrue("Forecast speed 30 being within [20, 30] expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 30, new Direction[]{})); + + Assert.assertFalse("Forecast speed 30 outside [31, 40] expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40, new Direction[]{})); + + Assert.assertFalse("Forecast speed 30 outside [20, 29] expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 29, new Direction[]{})); + } + + @Test + @Marking(points = 5) + public void test_200_Direction() { + + Assert.assertTrue("Forecast speed 30 being within [30, 40] and direction containing S expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, + new Direction[]{SE, SW, S})); + + Assert.assertFalse("Forecast speed 30 not within [31, 40] expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40, + new Direction[]{SE, SW, S})); + + Assert.assertFalse("Forecast speed 30 being within [30, 40] but direction not containing S expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, + new Direction[]{N,NE,E,W,NW})); + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/Readme.md b/Klausuren/Sd1/2023winter/Solve/Readme.md new file mode 100644 index 000000000..caf9ae0dd --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/Readme.md @@ -0,0 +1,55 @@ +# Generate and open class/method javadoc for browsing + +Grab a terminal in this IDE (By lower left icon or Alt+F12) and issue the following command: + +<pre>Exam> mvn javadoc:javadoc +... +[<span style="color:blue;font-weight:bold;">INFO</span>] Executing tasks +[<span style="color:orange;font-weight:bold;">WARNING</span>] [echo] Javadoc root at <span style="color:blue;">file:///home/.../Downloads/Exam/target/site/apidocs/index.html</span> +[<span style="color:blue;font-weight:bold;">INFO</span>] Executed tasks +...</pre> + +Click the <span style="color:blue;">file:///.../index.html</span> link opening your project's `index.html` Javadoc root +in your system's default web browser. + +# Implementation tasks + +Your project's following packages do contain implementation tasks: + +- `de.hdm_stuttgart.mi.sd1.task1` (50 Points) + +- `de.hdm_stuttgart.mi.sd1.task2` (20 points, more difficult) + +Read the generated documentation and implement the skeleton methods and classes. + +Your project's `test` branch does contain corresponding unit tests for verifying your solutions' correctness. + +# Hints + +- Your score solely depends on the number of successfully executing unit tests. A »nearly correct« implementation failing +with respect to a given unit tests will not contribute any points at all. + +- General advice: Implement less but correctly. + +- Mind special cases i.e. `null` variable values or null values being contained in arrays. + +- In case of test failures both the IDEA debugger and logging statements are your friend. + +Executing `de.hdm_stuttgart.mi.sd1.ShowReachedPoints` in your project's test branch as a Java application +(not as Junit test!) shows your number of points reached so far. + +Do not model your implementations along unit test definitions i.e. avoid cheating this way! Such behaviour will be +regarded as an attempt at deception (Täuschungsversuch). + +# Exam system upload + +After finishing implementing: + +1. Export this project by hitting **»File âž” Export âž” Project to Zip File«**. +1. Use a self-explanatory file name like e.g. `solution1.zip`. +1. Go to your exam browser window and upload `solution1.zip` . +1. Complete by **clicking the »<span style="background: #527A35;color:white;">Speichern + weiter âžž </span>«** button. +1. Hit **<span style="background: #446684;color:white;"> 🠬 Speichern + zurück</span>** and check if your + upload is visible. +1. If you advance on implementing: Repeat steps 1. to 5.: Only the least uploaded `.zip` archive will become subject to + marking. diff --git a/Klausuren/Sd1/2023winter/Solve/pom.xml b/Klausuren/Sd1/2023winter/Solve/pom.xml new file mode 100644 index 000000000..d22d8efbc --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/pom.xml @@ -0,0 +1,129 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>de.hdm_stuttgart.mi.sd1</groupId> + <artifactId>sd1_2023winter_solve</artifactId> + <version>0.9</version> + <packaging>jar</packaging> + + <name>sd1_2023winter</name> + + <url>https://freedocs.mi.hdm-stuttgart.de/sd1_sect_mavenCli.html</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>17</maven.compiler.release> + + <freedocs.url>https://freedocs.mi.hdm-stuttgart.de</freedocs.url> + <mathjax.url>${freedocs.url}/lib/MathJax/es5/tex-chtml.js</mathjax.url> + <libhighlight.url>${freedocs.url}/lib/highlight.js</libhighlight.url> + </properties> + + <repositories> + <repository> + <id>hdm-mi-internal-maven-repo</id> + <url>https://maven.mi.hdm-stuttgart.de/nexus/repository/mi-maven</url> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>de.hdm_stuttgart.mi.exam</groupId> + <artifactId>unitmarking</artifactId> + <version>1.3</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.11.0</version> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <version>3.1.0</version> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <target> + <echo>Javadoc root at file://${project.basedir}/target/site/apidocs/index.html</echo> + </target> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>3.5.0</version> + <configuration> + <release>17</release> + <doclint>all</doclint> + <show>public</show> + <docfilessubdirs>true</docfilessubdirs> + <addStylesheets> + <stylesheet>resources/jdocSupplement.css</stylesheet> + </addStylesheets> + + <windowtitle>Exam documentation</windowtitle> + <links> + <link>${freedocs.url}/doc/openjdk-21-doc/api/</link> + </links> + <additionalOptions> + <additionalOption>-html5 --allow-script-in-comments</additionalOption> + </additionalOptions> + <nohelp>true</nohelp> + + <header><![CDATA[ + <script type="text/javascript" src="${mathjax.url}"></script> + <script type="text/javascript" src="{@docRoot}/resources/jdocSupplement.js"></script> + + <link rel="stylesheet" href="${libhighlight.url}/styles/idea.min.css"> + <script src="${libhighlight.url}/highlight.min.js"></script> + <script type="text/javascript">hljs.highlightAll();</script>]]> + </header> + <bottom><![CDATA[Copyright © 2023 Stuttgart Media University / MI. Licensed under + <a style="font-weight:bold;" href="https://creativecommons.org/licenses/by/4.0/legalcode" target="_blank" + >Creative Commons Attribution 4.0 International Public License</a>.]]></bottom> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-assembly-plugin</artifactId> + <version>3.6.0</version> + <configuration> + <descriptors> + <descriptor>src/main/assembly/assembly.xml</descriptor> + </descriptors> + </configuration> + <executions> + <execution> + <id>make-assembly</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + <configuration> + <archive> + <manifest> + <mainClass>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</mainClass> + </manifest> + </archive> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml b/Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml new file mode 100644 index 000000000..85268e296 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml @@ -0,0 +1,36 @@ +<assembly + xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> + <id>fat-tests</id> + <formats> + <format>jar</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <dependencySets> + <dependencySet> + <outputDirectory/> + <useProjectArtifact>true</useProjectArtifact> + <unpack>true</unpack> + <scope>test</scope> + </dependencySet> + </dependencySets> + <fileSets> + <fileSet> + <directory>${project.build.directory}/test-classes</directory> + <outputDirectory/> + <includes> + <include>**/*.class</include> + </includes> + <useDefaultExcludes>true</useDefaultExcludes> + </fileSet> + <fileSet> + <directory>${project.build.directory}/classes</directory> + <outputDirectory/> + <includes> + <include>**/*.class</include> + </includes> + <useDefaultExcludes>true</useDefaultExcludes> + </fileSet> + </fileSets> +</assembly> \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java new file mode 100644 index 000000000..608afde27 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java @@ -0,0 +1,19 @@ +package de.hdm_stuttgart.mi.sd1.ignore_me; + +public class Error { + /** + * Summing up an int array's values + * + * @param values An array of int values + * @return The sum of all array values + */ +// public static int sum(int[] values) { +// +// int sum; +// +// for (i = 0; i <= values.length; i++) { +// sum += values[i]; +// } +// return sum; +// } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java new file mode 100644 index 000000000..fff07aa2d --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java @@ -0,0 +1,26 @@ +package de.hdm_stuttgart.mi.sd1.ignore_me; + +import de.hdm_stuttgart.mi.sd1.task2.Direction; +import de.hdm_stuttgart.mi.sd1.task2.WindForecast; + +/** + * Sample code + */ +public class WindSearch { + + /** + * Main entry point + * + * @param args not used + */ + public static void main(String[] args) { + + final WindForecast forcast = new WindForecast(40, Direction.N); + + if (forcast.matchingConditions(30, 50, new Direction[]{Direction.N, Direction.NW})) { + System.out.println("Yeah, let's go for it! \uD83D\uDE0E"); + } else { + System.out.println("I hate waiting for the wind! \uD83E\uDD2C"); + } + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java new file mode 100644 index 000000000..bf35b2a8d --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java @@ -0,0 +1,97 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * <p>Valid German traffic light states.</p> + */ +public class A_TrafficLight { + /** + * <p>Traffic light state validation.</p> + * + * <p>German traffic lights feature three different colours red, yellow and green. Only the following four states + * are valid:</p> + * + * <table style="outline: 2px solid;border-spacing: 10ex 0;"> + * <caption style="background: lightgrey;text-align: left;"><em>Valid German traffic light states</em></caption> + * <tr> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:red;"></li> + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Wait</td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:red;"></li> + * <li style="color:yellow;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Start</td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * <li style="color:green;"></li> + * </ul> + * </td> + * <td>Go</td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul> + * <li style="color:black;"></li> + * <li style="color:yellow;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Stop</td> + * </tr> + * </table> + * + * <p>On contrary <em>any</em> other pattern due to e.g. broken bulbs or other technical failures is invalid:</p> + * + * <table style="outline: 2px solid;border-spacing: 10ex 0;"> + * <caption style="background:lightgrey;text-align:left;"> + * <em>Invalid German traffic light state examples</em> + * </caption> + * <tr> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul > + * <li style="color:red;"></li> + * <li style="color:black;"></li> + * <li style="color:green;"></li> + * </ul> + * </td> + * <td> + * <p>Wait or go?</p> + * <p>(Fix my</p> + * <p>control</p> + * <p>unit!)</p> + * </td> + * <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;"> + * <ul > + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * <li style="color:black;"></li> + * </ul> + * </td> + * <td>Broken bulb(s)</td> + * <td>...</td> + * </tr> + * </table> + * + * @param red <code>true</code> represents »on«, <code>false</code> represents »off«. + * @param yellow <code>true</code> represents »on«, <code>false</code> represents »off«. + * @param green <code>true</code> represents »on«, <code>false</code> represents »off«. + * + * @return <code>true</code> if in a valid state, <code>false</code> otherwise. + */ + static public boolean stateIsValid(boolean red, boolean yellow, boolean green) { + return true == red & false == green | // (red, yellow, -) and (red, -, -) + false == red & (yellow ^ green); // ( -, yellow, -) and ( -, -, green) + + // Hint: yellow ^ green is equivalent to (yellow & !green) | (!yellow & green) + } + + private A_TrafficLight(){/* Ignore me: My sole purpose is suppressing default constructor javadoc generation */} +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java new file mode 100644 index 000000000..ba8ac4751 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java @@ -0,0 +1,49 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * <p>Doing basic calculations.</p> + */ +public class B_Max { + /** + * <p>Get the largest basic calculation result of two values.</p> + * + * <p>We have four different basic calculation operations:</p> + * + * <ul style="list-style:none"> + * <li><code style="font-weight: bolder">+</code>: Addition</li> + * <li><code style="font-weight: bolder">-</code>: Subtraction</li> + * <li><code style="font-weight: bolder">*</code>: Multiplication</li> + * <li><code style="font-weight: bolder">/</code>: Division</li> + * </ul> + * + * <p>Given two values like e.g 4 and 0.1 we can construct four different basic calculation terms:</p> + * + * <ul style="list-style:none"> + * <li><code>4 + 0.1 == 4.1</code></li> + * <li><code>4 - 0.1 == 3.9</code></li> + * <li><code>4 * 0.1 == 0.4</code></li> + * <li><code style="background: lightgreen">4 / 0.1 == 40</code></li> + * </ul> + * + * <p>The above example features a maximum result value of 40 resulting from dividing 4 by 0.1 . + * Depending on both values the maximum may result from either of our four basic operations. We take a + * second set of example values 3 and -1:</p> + * + * <ul style="list-style:none"> + * <li><code>3 + (-1) == 2</code></li> + * <li><code style="background: lightgreen">3 - (-1) == 4</code></li> + * <li><code>3 * (-1) == -3</code></li> + * <li><code>3 / (-1) == -3</code></li> + * </ul> + * + * <p>This time we get a maximum of 4 by subtracting -1 from 3 .</p> + * + * @param first The first operand + * @param second The second operand + * @return The largest basic calculation result taking both arguments in their respective order. + */ + public static double getBasicCalculationMax(final double first, final double second) { + return Math.max(Math.max(Math.max(first + second, first - second), first * second), first / second); + } + private B_Max(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */} +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java new file mode 100644 index 000000000..5c678eeb6 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java @@ -0,0 +1,83 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * <p>Handle web addresses.</p> + */ +public class C_WebUrl { + + /** + * <p>Accessing web sites e.g. <code>www.wikipedia.org</code> requires entering the address in a web browser:</p> + * + * <img style="outline: 2px solid;" + * src="doc-files/weburlBlank.png" alt="A web address without protocol specification" > + * + * <p>Entering <code>www.wikipedia.org</code> fulfills its purpose. However behind the scenes either a + * <code>http://</code> or <code>https://</code> protocol specification is being silently prepended:</p> + * + * <img style="outline: 2px solid;" + * src="doc-files/weburlProtocol.png" alt="A web address including a protocol specification"> + * + * <p>The current method adds a missing protocol specification according to the following rules:</p> + * + * <ul> + * <li>An address already starting with either <code>http://</code> or <code>https://</code> is just being + * copied.</li> + * + * <li> + * <p>An address not starting with either <code>http://</code> or <code>https://</code> receives a + * protocol prefix according to the <code>tlsSupport</code> parameter.</p> + * </li> + * </ul> + * <p>Some examples:</p> + * <table class="goikTableDefaults"> + * <caption>Optional protocol prefix examples for <code>www.wikipedia.org</code></caption> + * <tr> + * <th><code>address</code></th> + * <th><code>tlsSupport</code></th> + * <th>Return value</th> + * </tr> + * <tr> + * <td style="color:blue"><code>www.wikipedia.org</code></td> + * <td><code style="color:red">true</code></td> + * <td><code style="color:red">https</code>://<code style="color:blue">www.wikipedia.org</code></td> + * </tr> + * <tr> + * <td style="color:blue"><code>www.wikipedia.org</code></td> + * <td><code style="color:red">false</code></td> + * <td><code style="color:red">http</code>://<code style="color:blue">www.wikipedia.org</code></td> + * </tr> + * <tr> + * <td style="color:blue"><code>http://www.wikipedia.org</code></td> + * <td>Protocol specification <code>http://</code> present, value irrelevant</td> + * <td style="color:blue"><code>http://www.wikipedia.org</code></td> + * </tr> + * <tr> + * <td style="color:blue"><code>https://www.wikipedia.org</code></td> + * <td>Protocol specification <code>https://</code> present, value irrelevant</td> + * <td style="color:blue"><code>https://www.wikipedia.org</code></td> + * </tr> + * </table> + * + * @param address A website's address. May either be a raw name or a full http/https prefixed protocol address. + * @param tlsSupport If <code>true</code> the server supports + * <code><span style="color:red">https</span>://...</code> connections. Otherwise, only + * <code><span style="color:red">http</span>://...</code> is being supported. + * + * @return A fully <code>http://</code> or <code>https://</code> prefixed protocol address. + * + * <section class="implementationHints"> + * <h4 class="implementationHints">Hint:</h4> + * + * <p>{@link String#startsWith(String)}</p> + * </section> + */ + public static String amendWebAddress(final String address, final boolean tlsSupport) { + if (address.startsWith("http://") | address.startsWith("https://")) { + return address; + } else if (tlsSupport){ + return "https://" + address; + } else { + return "http://" + address; + } + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java new file mode 100644 index 000000000..c2e8c019e --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java @@ -0,0 +1,77 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +/** + * Array helper method. + */ +public class D_Array { + + /** + * The special value -1 indicating two arrays are not being related by any sequence of right cyclic rotations. + * Example: {1, 2} and {1, 3}. + */ + static public final int NOT_CYCLICALLY_RELATED = -1 ; + + /** + * <p>Part 2: Check two arrays for being related by an integer number of successive right cyclic rotations or not.</p> + * + * <p>Consider a right cyclic array rotating example:</p> + * + * <pre> + * <span style="color:red">â¬â”€â”€â”€â”€â”€â”</span> + * {1, 7, <span style="color:blue">3</span>} ⇨ {<span style="color:blue">3</span>, 1, 7} + * <span style="color:red">⤻ ⤻</span> + * </pre> + * + * <p>The arrays <code>{1, 7, 3}</code> and <code>{3, 1, 7}</code> are thus being related by one right + * cyclic rotation.</p> + * + * <p>Arrays may also be related by a succession of multiple right cyclic rotations. Example:</p> + * + * <p><code>{1, 8, 3, 4}</code> and <code>{3, 4, 1, 8}</code> are being related by a sequence of two right cyclic + * rotations:</p> + * + * <pre> + * <span style="color:red"> â¬â”€â”€â”€â”€â”€â”€â”€â”€â” â¬â”€â”€â”€â”€â”€â”€â”€â”€â”</span> + * {1, 8, 3, <span style="color:blue">4</span>} ⇨ {<span style="color:blue">4</span>, 1, 8, <span + * style="color:orange">3</span>} ⇨ {<span style="color:orange">3</span>, <span style="color:blue">4</span>, 1, 8} + * <span style="color:red"> ⤻ ⤻ ⤻ ⤻ ⤻ ⤻</span> + * </pre> + * + * <p>In this case a value of 2 rotations is being returned.</p> + * + * <h4>Special cases: </h4> + * + * <ul> + * <li>Two identical arrays are being related by zero rotations.</li> + * <li>Two arrays of different size are always unrelated / {@link #NOT_CYCLICALLY_RELATED} .</li> + * </ul> + * + * @param array1 The first array. Values must remain untouched. + * @param array2 The second array. Values must remain untouched. + * + * @return Either the number of right cyclic rotations or the special value {@link #NOT_CYCLICALLY_RELATED} if both + * arrays are not being related by a sequence of cyclic rotations. + */ + static public int isRotatedBy(final int[] array1, int[] array2) { + final int length = array1.length; + if (length == array2.length) { + if (0 == length) { + return 0; + } + for (int rotation = 0; rotation < length; rotation++) { + boolean allValuesEqual = true; + for (int i = 0; i < length; i++) { + if (array1[i] != array2[(i + rotation) % length]) { + allValuesEqual = false; + break; + } + } + if (allValuesEqual) { + return rotation; + } + } + } + return NOT_CYCLICALLY_RELATED; // No rotation found + } + private D_Array(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */} +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java new file mode 100644 index 000000000..6152c2c29 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java @@ -0,0 +1,22 @@ +/** + * <p>Classes here mostly (if not completely) contain static methods to be implemented.</p> + * + * <p>The ordering being implied by (test) class names and related methods reflect the author's opinion about ascending + * implementation difficulty. You are free to proceed differently. Hints:</p> + * + * <ul> + * <li>Run <code>mvn javadoc:javadoc</code> and open the generated + * <code><projectroot>/target/site/apidocs/index.html</code> file in your browser of choice.</li> + * + * <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior + * to implementing.</li> + * + * <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's + * correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number + * of examination points reached so far.</li> + * + * <li>The debugger is your friend</li> + * </ul> + * + */ +package de.hdm_stuttgart.mi.sd1.task1; \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java new file mode 100644 index 000000000..9ecc88117 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java @@ -0,0 +1,42 @@ +package de.hdm_stuttgart.mi.sd1.task2; + +/** <p>The 8 main wind directions.</p> + */ +public enum Direction { + /** + * North + */ + N, + /** + * Northeast + */ + NE, + /** + * East + */ + E, + + /** + * Southeast + */ + SE, + + /** + * South + */ + S, + + /** + * Southwest + */ + SW, + + /** + * West + */ + W, + /** + * Northwest + */ + NW +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java new file mode 100644 index 000000000..640cc343c --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java @@ -0,0 +1,64 @@ +package de.hdm_stuttgart.mi.sd1.task2; + +/** + * <p>Matching wind forecast conditions</p> + */ +public class WindForecast { + + private final Direction direction; + + private final int windSpeed; + + /** + * <p>Wind forecast by range and directions.</p> + * + * @param windSpeed Expected wind speed in Km/h. + * @param directions The main wid direction to be expected + */ + public WindForecast(final int windSpeed, final Direction directions) { + this.direction = directions; + this.windSpeed = windSpeed; + } + + /** + * <p>Check for matching conditions.</p> + * + * <p>Many water sports addicts depend on suitable wind conditions being described by wind speed and + * optionally wind direction.</p> + * + * <p>As an example a kitesurfer might want to get notified if the wind forecast at his or her suitable spot predicts + * wind ranging from 30 Km/h to 50 Km/h in speed and coming either from northern or northwestern direction. The + * wind prediction is wind at 40 Km from north. Corresponding code sample:</p> + * + * <pre><code class="java"> final WindForecast forecast = new WindForecast(40, Direction.N); + * + * if (forecast.matchingConditions(30, 50, new Direction[]{Direction.N, Direction.NW})) { + * System.out.println("Yeah, let's go for it! \uD83D\uDE0E"); + * else { + * System.out.println("I hate waiting for the wind! \uD83E\uDD2C"); + * }</code></pre> + * + * @param speedMinimum Minimum required wind speed. + * @param speedMaximum Maximum tolerable wind speed. + * @param directions List of favourable wind directions + * @return <code>true</code> if current wind's speed and one of the provided directions match the + * {@link #WindForecast(int, Direction)} criteria, <code>false</code> otherwise. + */ + public boolean matchingConditions(final int speedMinimum, final int speedMaximum, final Direction[] directions) { + + if (windSpeed < speedMinimum || speedMaximum < windSpeed) { + return false; + } + + if (0 == directions.length) { // Direction does not matter to customer + return true; + } else { + for (final Direction d: directions) { + if (d == direction) { + return true; + } + } + return false; + } + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java new file mode 100644 index 000000000..b12e6627a --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java @@ -0,0 +1,18 @@ +/** + * <p>This package hosts more advanced implementation tasks.</p> + * + * <ul> + * <li>Run <code>mvn javadoc:javadoc</code> and open the generated + * <code><projectroot>/target/site/apidocs/index.html</code> file in your browser of choice.</li> + * + * <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior + * to implementing.</li> + * + * <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's + * correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number + * of examination points reached so far.</li> + * + * <li>The debugger is your friend</li> + * </ul> + */ +package de.hdm_stuttgart.mi.sd1.task2; \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png new file mode 100644 index 0000000000000000000000000000000000000000..01376dac6c420ef680afbbb82f147dfa569b0766 GIT binary patch literal 13604 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 Ynz`xU#kc<i-*bXUeUulg5HSq=FK2LcivR!s literal 0 HcmV?d00001 diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c648b8d28812201ab15b272b7e953c7c0fb642 GIT binary patch literal 10900 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 literal 0 HcmV?d00001 diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css new file mode 100644 index 000000000..4fec2b593 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css @@ -0,0 +1,3 @@ +/* shame on you, javadoc! Still providing +@import url('resources/fonts/dejavu.css') line in stylesheet.css +*/ \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css new file mode 100644 index 000000000..08840cdbf --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css @@ -0,0 +1,72 @@ +/* Javadoc extensions: */ + +ul > li > ul { + list-style-type: circle; +} + +table.goikTableDefaults, +table.goikTableDefaults>caption, +table.goikTableDefaults>tr>th, +table.goikTableDefaults>tr>td, +table.goikTableDefaults>tbody>tr>th, +table.goikTableDefaults>tbody>tr>td { + border: 2px solid black; + border-collapse: collapse; + padding: 1ex; + vertical-align: top; +} + +table.goikTableDefaults>caption { + /* border-top-style: solid; border-left-style: solid; border-right-style: solid' */ + border-bottom-style: none; + font-weight: bold; + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} + +table.goikTableDefaults>tbody>tr>td { + vertical-align:top; +} +table.goikTableDefaults { + border-spacing: 0px !important; +} + +table.indexTable { + border-collapse: collapse; + border-style: hidden; +} + +table.indexTable caption { + text-align: left; +} + +table.indexTable td, table.indexTable th { + border: 1px solid black; + padding: 0.5ex; +} + +em { + font-weight: bold; + font-style: normal; +} +section.implementationHints>h3 { + font-weight: bold; + background-color: rgb(222, 227, 233); +} + +code { + white-space: pre; +} + +.implementationHints { + background-color: hsl(120, 100%, 95%) !important; +} + +.myRed { + color: red; +} + +.myGreen { + color: limegreen; +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js new file mode 100644 index 000000000..97911e558 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js @@ -0,0 +1,7 @@ +for(var i in document.links) { + var link = document.links[i]; + if (link.href && link.href.indexOf('http') === 0) { + link.target = '_blank'; + } +} + diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml b/Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml new file mode 100644 index 000000000..130f87a14 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <File name="A1" fileName="A1.log" append="false"> + <PatternLayout pattern="%t %-5p %c{2} - %m%n"/> + </File> + <Console name="STDOUT" target="SYSTEM_OUT"> + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> + </Console> + </Appenders> + <Loggers> + + <!-- You my want to define class or package level per-logger rules --> + <Logger name="de.hdm_stuttgart.mi.sd1.App" level="debug"> + <AppenderRef ref="A1"/> + </Logger> + <Root level="info"> + <AppenderRef ref="STDOUT"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java new file mode 100644 index 000000000..c408929ee --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java @@ -0,0 +1,26 @@ +package de.hdm_stuttgart.mi.sd1; + +import de.hdm_stuttgart.mi.exam.unitmarking.RunTests; + +import de.hdm_stuttgart.mi.sd1.task1.A_TrafficLightTest; +import de.hdm_stuttgart.mi.sd1.task1.B_MaxTest; +import de.hdm_stuttgart.mi.sd1.task1.C_WebUrlTest; +import de.hdm_stuttgart.mi.sd1.task1.D_ArrayTest; + +import de.hdm_stuttgart.mi.sd1.task2.WindForecastTest; + +public class ShowReachedPoints { + + /** + * Revealing total number of reached points from all tasks. + * + * @param args Unused + */ + public static void main(String[] args) { + RunTests.exec( + "Task 1", + A_TrafficLightTest.class, B_MaxTest.class, C_WebUrlTest.class, D_ArrayTest.class + ); + RunTests.exec("Task 2", WindForecastTest.class); + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java new file mode 100644 index 000000000..3e3960d04 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java @@ -0,0 +1,28 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import static de.hdm_stuttgart.mi.sd1.task1.A_TrafficLight.stateIsValid; + + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class A_TrafficLightTest extends ExaminationTestDefaults { + + @Test + @Marking(points = 18) + public void test_100() { + Assert.assertFalse( stateIsValid(false, false, false)); + Assert.assertTrue( stateIsValid(false, false, true)); + Assert.assertTrue( stateIsValid(false, true, false)); + Assert.assertFalse( stateIsValid(false, true, true)); + Assert.assertTrue( stateIsValid(true, false, false)); + Assert.assertFalse( stateIsValid(true, false, true)); + Assert.assertTrue( stateIsValid(true, true, false)); + Assert.assertFalse( stateIsValid(true, true, true)); + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java new file mode 100644 index 000000000..d1e177907 --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java @@ -0,0 +1,37 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class B_MaxTest extends ExaminationTestDefaults { + static final public double PRECISION = 1.E-12; + + @Test + @Marking(points = 15) + public void test() { + assertMaximum(12, 4, 3, '*'); + assertMaximum(5, 2, -3, '-'); + assertMaximum(5.1, 0.1, 5, '+'); + assertMaximum(35, 7, 0.2, '/'); + assertMaximum(-1.4,-7, 0.2, '*'); + assertMaximum(4,2, 2, '+'); + } + + private static void assertMaximum(final double expected, final double first, final double second, char operation) { + + final StringBuilder errMsg = new StringBuilder("Expected maximum is " + expected + " == " + first + " " + + operation + " "); + + if (second < 0) { + errMsg.append("(" + second + ")"); + } else { + errMsg.append(second); + } + Assert.assertEquals(errMsg.toString(), expected, B_Max.getBasicCalculationMax(first, second), PRECISION); + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java new file mode 100644 index 000000000..4df40473b --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java @@ -0,0 +1,66 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + + + + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class C_WebUrlTest extends ExaminationTestDefaults { + + static private final String dnsNames[] = { + "www.der-postillon.com", "www.duh.de", "www.amnesty.org" + }; + + + @Test + @Marking(points = 14) + public void test() { + + for(final String dns: dnsNames) { + final String + httpUrl = "http://" + dns, + httpsUrl = "https://" + dns, + + actualByHttpsTlsTrue = C_WebUrl.amendWebAddress(httpsUrl, true), + actualByHttpsTlsFalse = C_WebUrl.amendWebAddress(httpsUrl, false), + + actualByHttpTlsTrue = C_WebUrl.amendWebAddress(httpUrl, true), + actualByHttpTlsFalse = C_WebUrl.amendWebAddress(httpUrl, false), + + actualByDnsTlsTrue = C_WebUrl.amendWebAddress(dns, true), + actualByDnsTlsFalse = C_WebUrl.amendWebAddress(dns, false); + + Assert.assertEquals( + "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsTrue + "'", + httpsUrl, actualByHttpsTlsTrue); + + Assert.assertEquals( + "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsFalse + "'", + httpsUrl, actualByHttpsTlsFalse); + + Assert.assertEquals( + "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsTrue + "'", + httpUrl, actualByHttpTlsTrue); + + Assert.assertEquals( + "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsFalse + "'", + httpUrl, actualByHttpTlsFalse); + + + Assert.assertEquals( + "Passing '" + dns + "' when tlsSupport is 'true' should return '" + httpsUrl + "' rather than " + actualByDnsTlsTrue, + httpsUrl, actualByDnsTlsTrue); + + Assert.assertEquals( + "Passing '" + dns + "' when tlsSupport is 'false' should return '" + httpUrl + "' rather than " + actualByDnsTlsFalse, + httpUrl, actualByDnsTlsFalse); + + } + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java new file mode 100644 index 000000000..24b763ada --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java @@ -0,0 +1,118 @@ +package de.hdm_stuttgart.mi.sd1.task1; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import java.util.Arrays; + +import static de.hdm_stuttgart.mi.sd1.task1.D_Array.NOT_CYCLICALLY_RELATED; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class D_ArrayTest extends ExaminationTestDefaults { + + private static void assertRelatedByRotation(final int expectedRotation, final int[] array1, int[] array2) { + + final int[] array1Copy = Arrays.copyOf(array1, array1.length), + array2Copy = Arrays.copyOf(array2, array2.length); + + final String errorMessage; + if (NOT_CYCLICALLY_RELATED == expectedRotation) { + errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) + + " are not being cyclically related."; + } else { + errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) + + " are being cyclically related by " + expectedRotation + " right rotation(s)."; + } + Assert.assertEquals(errorMessage, expectedRotation, D_Array.isRotatedBy(array1, array2)); + + Assert.assertArrayEquals("You must not change values in array1 parameter", array1Copy, array1); + Assert.assertArrayEquals("You must not change values in array2 parameter", array2Copy, array2); + } + + @Test + public void test010_Minimum() { + assertRelatedByRotation(0, new int[]{}, new int[]{}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{}, new int[]{1}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{3}, new int[]{}); + } + @Test + public void test020One() { + assertRelatedByRotation(0, new int[]{77}, new int[]{77}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{8}, new int[]{77}); + } + + @Test + @Marking(points = 2) + public void test030Two() { + assertRelatedByRotation(0, new int[]{-1, 5}, new int[]{-1, 5}); + assertRelatedByRotation(1, new int[]{-1, 5}, new int[]{5, -1}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 5}, new int[]{-5, 1}); + } + @Test + @Marking(points = 2) + public void test040Three() { + assertRelatedByRotation( 0, new int[]{2, -6, 9}, new int[]{ 2, -6, 9}); + assertRelatedByRotation( 1, new int[]{2, -6, 9}, new int[]{ 9, 2, -6}); + assertRelatedByRotation( 2, new int[]{2, -6, 9}, new int[]{-6, 9, 2}); + + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{2, -6, 9}, new int[]{ 2, 9, -6}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{2, -6, 9}, new int[]{-6, 2, 9}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{2, -6, 9}, new int[]{-6, 2}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-1, 2, 5}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-2, 2, 4}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-1, 3, 4}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4}, new int[]{-1, 3, 4, 3}); + assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{-1, 2, 4, 1}, new int[]{-1, 3, 4}); + } + @Test + @Marking(points = 2) + public void test050Twenty() { + assertRelatedByRotation( 0, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + + assertRelatedByRotation( 1, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{10, 1, 2, 3, 4, 5, 6, 7, 8, 9}); + + assertRelatedByRotation( 2, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{9, 10, 1, 2, 3, 4, 5, 6, 7, 8}); + + assertRelatedByRotation( 3, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{8, 9, 10, 1, 2, 3, 4, 5, 6, 7}); + + assertRelatedByRotation( 4, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{7, 8, 9, 10, 1, 2, 3, 4, 5, 6}); + + assertRelatedByRotation( 5, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{6, 7, 8, 9, 10, 1, 2, 3, 4, 5}); + + assertRelatedByRotation( 6, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{5, 6, 7, 8, 9, 10, 1, 2, 3, 4}); + + assertRelatedByRotation( 7, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{4, 5, 6, 7, 8, 9, 10, 1, 2, 3}); + + assertRelatedByRotation( 8, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{3, 4, 5, 6, 7, 8, 9, 10, 1, 2}); + + assertRelatedByRotation( 9, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{2, 3, 4, 5, 6, 7, 8, 9, 10, 1}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}, + /* */ new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10}); + + assertRelatedByRotation( NOT_CYCLICALLY_RELATED, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + /* */ new int[]{}); + + + } +} diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java new file mode 100644 index 000000000..00f5f04be --- /dev/null +++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java @@ -0,0 +1,56 @@ +package de.hdm_stuttgart.mi.sd1.task2; + +import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults; +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import de.hdm_stuttgart.mi.exam.unitmarking.reflect.ObjectWrapper; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import static de.hdm_stuttgart.mi.sd1.task2.Direction.*; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) + +public class WindForecastTest extends ExaminationTestDefaults { + + final ObjectWrapper<WindForecast> forecast_30_S = + new ObjectWrapper<>(WindForecast.class, 30, S); + + @Test + @Marking(points = 10) + public void test_100_noDirection() { + + Assert.assertTrue("Forecast speed 30 being within [30, 40] expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, new Direction[]{})); + + Assert.assertTrue("Forecast speed 30 being within [10, 40] expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 10, 40, new Direction[]{})); + + Assert.assertTrue("Forecast speed 30 being within [20, 30] expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 30, new Direction[]{})); + + Assert.assertFalse("Forecast speed 30 outside [31, 40] expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40, new Direction[]{})); + + Assert.assertFalse("Forecast speed 30 outside [20, 29] expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 29, new Direction[]{})); + } + + @Test + @Marking(points = 5) + public void test_200_Direction() { + + Assert.assertTrue("Forecast speed 30 being within [30, 40] and direction containing S expects true", + forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, + new Direction[]{SE, SW, S})); + + Assert.assertFalse("Forecast speed 30 not within [31, 40] expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40, + new Direction[]{SE, SW, S})); + + Assert.assertFalse("Forecast speed 30 being within [30, 40] but direction not containing S expects false", + forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, + new Direction[]{N,NE,E,W,NW})); + } +} -- GitLab