From e280942e6fb45579be15545d1b175ae5424c3b06 Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Wed, 13 Dec 2017 20:25:20 +0100
Subject: [PATCH] Test 4

---
 Tests/Sd1/003/Solve/Doc/klausur.xml           | 127 +----------------
 Tests/Sd1/004/Exam/.gitignore                 |   5 +
 Tests/Sd1/004/Exam/pom.xml                    |  94 +++++++++++++
 .../004/Exam/src/main/assembly/assembly.xml   |  36 +++++
 .../hdm_stuttgart/mi/sd1/aufgabe1/Helper.java |  73 ++++++++++
 .../mi/sd1/aufgabe2/DummyZinsen.java          |  25 ++++
 .../hdm_stuttgart/mi/sd1/aufgabe2/Konto.java  |  92 ++++++++++++
 .../004/Exam/src/main/resources/log4j2.xml    |  21 +++
 .../mi/sd1/test/ShowReachedPoints.java        |  23 +++
 .../mi/sd1/test/aufgabe1/TestHelper.java      |  94 +++++++++++++
 .../mi/sd1/test/aufgabe2/TestKonto.java       |  96 +++++++++++++
 Tests/Sd1/004/Solve/.gitignore                |   5 +
 Tests/Sd1/004/Solve/Doc/.gitignore            |   1 +
 Tests/Sd1/004/Solve/Doc/klausur.xml           | 133 ++++++++++++++++++
 Tests/Sd1/004/Solve/pom.xml                   |  94 +++++++++++++
 .../004/Solve/src/main/assembly/assembly.xml  |  36 +++++
 .../hdm_stuttgart/mi/sd1/aufgabe1/Helper.java | 101 +++++++++++++
 .../mi/sd1/aufgabe2/DummyZinsen.java          |  25 ++++
 .../hdm_stuttgart/mi/sd1/aufgabe2/Konto.java  | 127 +++++++++++++++++
 .../004/Solve/src/main/resources/log4j2.xml   |  21 +++
 .../mi/sd1/test/ShowReachedPoints.java        |  22 +++
 .../mi/sd1/test/aufgabe1/TestHelper.java      |  94 +++++++++++++
 .../mi/sd1/test/aufgabe2/TestKonto.java       |  96 +++++++++++++
 23 files changed, 1318 insertions(+), 123 deletions(-)
 create mode 100644 Tests/Sd1/004/Exam/.gitignore
 create mode 100644 Tests/Sd1/004/Exam/pom.xml
 create mode 100644 Tests/Sd1/004/Exam/src/main/assembly/assembly.xml
 create mode 100644 Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java
 create mode 100644 Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java
 create mode 100644 Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java
 create mode 100644 Tests/Sd1/004/Exam/src/main/resources/log4j2.xml
 create mode 100644 Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java
 create mode 100644 Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java
 create mode 100644 Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java
 create mode 100644 Tests/Sd1/004/Solve/.gitignore
 create mode 100644 Tests/Sd1/004/Solve/Doc/.gitignore
 create mode 100644 Tests/Sd1/004/Solve/Doc/klausur.xml
 create mode 100644 Tests/Sd1/004/Solve/pom.xml
 create mode 100644 Tests/Sd1/004/Solve/src/main/assembly/assembly.xml
 create mode 100644 Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java
 create mode 100644 Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java
 create mode 100644 Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java
 create mode 100644 Tests/Sd1/004/Solve/src/main/resources/log4j2.xml
 create mode 100644 Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java
 create mode 100644 Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java
 create mode 100644 Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java

diff --git a/Tests/Sd1/003/Solve/Doc/klausur.xml b/Tests/Sd1/003/Solve/Doc/klausur.xml
index 623ad422e..059ae43c6 100644
--- a/Tests/Sd1/003/Solve/Doc/klausur.xml
+++ b/Tests/Sd1/003/Solve/Doc/klausur.xml
@@ -99,130 +99,11 @@ Laminat, 2€ pro Meter Sockelleiste  und 37 Km Anfahrt betragen 298.1€</scree
       </tip>
     </section>
 
-    <section xml:id="aufgabe1_commonHints">
-      <title>Allgemeine Hinweise</title>
+    <xi:include href="../../../../Common/commonHints.xml"
+                xpointer="element(/1)"/>
 
-      <itemizedlist>
-        <listitem>
-          <para>Für jede Methode stehen Ihnen in der zugehörigen Testklasse
-          korrespondierende Tests zur Verfügung. Nutzen Sie diese!</para>
-        </listitem>
-
-        <listitem>
-          <para>Die von Ihnen erreichte Punktzahl richtet sich nach der Anzahl
-          positiv bestandener Tests. Sie bekommen keine Punkte, wenn Ihre
-          Implementierung in Bezug auf einen einzelnen Test lediglich
-          <quote>fast richtig</quote> ist. Implementieren Sie im Zweifelsfall
-          weniger Methoden, diese dafür aber vollständig.</para>
-        </listitem>
-
-        <listitem>
-          <para>Die <productname>Javadoc</productname> Kommentare der
-          jeweiligen Methoden beschreiben das gewünschte Verhalten. Unter
-          <link
-          xlink:href="https://freedocs.mi.hdm-stuttgart.de/sd1SectMavenGenerateJavadoc.html">Generating
-          Javadocâ„¢ project documentation</link> finden Sie eine Anleitung zur
-          Umwandlung in das HTML Format zwecks besserer Lesbarkeit.</para>
-
-          <para>Lesen Sie die (generierte) Dokumentation <emphasis
-          role="bold">sehr genau</emphasis>.</para>
-        </listitem>
-
-        <listitem>
-          <para>Beachten Sie alle Sonderfälle. Dazu zählen insbesondere
-          <code>null</code> Werte von Variablen oder enthaltene
-          <code>null</code> Werte in <foreignphrase
-          xml:lang="en">Arrays</foreignphrase>.</para>
-        </listitem>
-
-        <listitem>
-          <para>Nutzen Sie den <foreignphrase
-          xml:lang="en">Debugger</foreignphrase> oder logging <foreignphrase
-          xml:lang="en">Statements</foreignphrase> im Fall fehlgeschlagener
-          Testfälle.</para>
-        </listitem>
-
-        <listitem>
-          <para>Die Ausführung von
-          <package>de.hdm_stuttgart.mi.sd1.test</package>.<classname>ShowAllReachedPoints</classname>
-          im Testzweig Ihres Projekts als <productname>Java</productname>
-          Anwendung (nicht als Junit Test!) zeigt Ihnen zu jedem Zeitpunkt die
-          in allen Programmieraufgaben bislang erreichten Punkte.</para>
-        </listitem>
-      </itemizedlist>
-    </section>
-
-    <section version="5.1" xml:id="uploadFirst" xml:lang="de">
-      <title>Hochladen Ihrer Lösung in das Klausursystem</title>
-
-      <para>Exportieren Sie Ihre Implementierung dieser und weiterer
-      Programmieraufgaben per Rechtsklick im <foreignphrase
-      xml:lang="en">Package Explorer</foreignphrase> Ihres
-      <productname>Eclipse</productname> Projekts. Klicken Sie im
-      <foreignphrase xml:lang="en">Package Explorer</foreignphrase> (Maus
-      Rechtsklick) auf Ihre Projektwurzel und exportieren Sie über das
-      Kontextmenü <quote>Export</quote> → <quote>General</quote> →
-      <quote>Archive File</quote> einen auf <filename>.zip</filename> endenden
-      Archivnamen, z.B. <filename>solution_1.zip</filename>. Laden Sie danach
-      <filename>solution_1.zip</filename> über die <quote><foreignphrase
-      xml:lang="en">Upload</foreignphrase> File</quote> Funktion am unteren
-      Seitenende des <productname>Ilias</productname> Klausursystems hoch.
-      Wichtige Punkte:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para>Achten Sie auf vollständigen Export. Im Exportmenü können Sie
-          (versehentlich) einzelne Ordner, wie z.B. <filename>src</filename>,
-          abwählen. In diesem Fall wird Ihr Quellcode nicht in das Archiv
-          <filename>solution_1.zip</filename> exportiert.</para>
-        </listitem>
-
-        <listitem>
-          <para>Wählen Sie beim Hochladen nicht die falsche Datei, etwa das
-          Ausgangsarchiv <filename>exam.zip</filename> oder eine ältere
-          Version Ihres Projekts.</para>
-        </listitem>
-
-        <listitem>
-          <para>Kontrollieren Sie nach dem Hochladen die Sichtbarkeit Ihres
-          <filename>solution_1.zip</filename> Archivs im Klausursystem.</para>
-        </listitem>
-
-        <listitem>
-          <para>Sie können mehrere Versionen
-          <filename>solution_2.zip</filename> ... hochladen und bei Bedarf
-          ältere im <productname>Ilias</productname> System löschen. Nur die
-          zuletzt hochgeladene Version wird bewertet.</para>
-        </listitem>
-      </itemizedlist>
-
-      <caution>
-        <itemizedlist>
-          <listitem>
-            <para>Reservieren Sie für den Vorgang des Hochladens ausreichend
-            Zeit vor Klausurende.</para>
-          </listitem>
-
-          <listitem>
-            <para>Bearbeitungen, welche sich nach Klausurende lediglich auf
-            Ihrem Arbeitsplatzrechner befinden, werden nicht gewertet.</para>
-          </listitem>
-
-          <listitem>
-            <para>Laden Sie keine Projekte mit <productname>Java</productname>
-            Syntaxfehlern hoch, diese werden nicht bewertet!</para>
-          </listitem>
-
-          <listitem>
-            <para>Exportieren Sie Ihr Projekt nicht als
-            <filename>.tgz</filename>, <filename>.java</filename>,
-            <filename>.tar.gz</filename> <acronym>o.ä.</acronym>. Das
-            Klausursystem akzeptiert nur Archive mit der Endung
-            <filename>.zip</filename>.</para>
-          </listitem>
-        </itemizedlist>
-      </caution>
-    </section>
+    <xi:include href="../../../../Common/uploadIlias.xml"
+                xpointer="element(/1)"/>
   </chapter>
 
   <chapter xml:id="task2">
diff --git a/Tests/Sd1/004/Exam/.gitignore b/Tests/Sd1/004/Exam/.gitignore
new file mode 100644
index 000000000..a2fa20469
--- /dev/null
+++ b/Tests/Sd1/004/Exam/.gitignore
@@ -0,0 +1,5 @@
+/.classpath
+/.project
+/.settings
+/.idea
+/*.iml
diff --git a/Tests/Sd1/004/Exam/pom.xml b/Tests/Sd1/004/Exam/pom.xml
new file mode 100644
index 000000000..f5c49c658
--- /dev/null
+++ b/Tests/Sd1/004/Exam/pom.xml
@@ -0,0 +1,94 @@
+<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_test_4</artifactId>
+	<version>0.8</version>
+	<packaging>jar</packaging>
+
+	<name>sd1_test_4</name>
+
+	<url>http://www.mi.hdm-stuttgart.de/freedocs/topic/de.hdm_stuttgart.mi.lectures/sd1SectUsingMaven.html</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<repositories>
+		<repository>
+			<id>hdm-mi-internal-maven-repo</id>
+			<url>https://maven.mi.hdm-stuttgart.de/artifacts</url>
+		</repository>
+	</repositories>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>2.6</version>
+		</dependency>
+
+		<dependency>
+			<groupId>de.hdm_stuttgart.mi.exam</groupId>
+			<artifactId>unitmarking</artifactId>
+			<version>0.9</version>
+		</dependency>
+
+	</dependencies>
+
+	<build>
+		<plugins>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.5.1</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.10.3</version>
+				<configuration />
+			</plugin>
+
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.3</version>
+				<configuration>
+					<descriptor>src/main/assembly/assembly.xml</descriptor>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<configuration>
+							<archive>
+								<manifest>
+									<mainClass>de.hdm_stuttgart.mi.sd1.test.ShowReachedPoints</mainClass>
+								</manifest>
+							</archive>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>
diff --git a/Tests/Sd1/004/Exam/src/main/assembly/assembly.xml b/Tests/Sd1/004/Exam/src/main/assembly/assembly.xml
new file mode 100644
index 000000000..1a2cd6054
--- /dev/null
+++ b/Tests/Sd1/004/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>/</outputDirectory>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>true</unpack>
+            <scope>test</scope>
+        </dependencySet>
+    </dependencySets>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/test-classes</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/classes</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+    </fileSets>
+</assembly>
diff --git a/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java b/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java
new file mode 100644
index 000000000..188e84695
--- /dev/null
+++ b/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java
@@ -0,0 +1,73 @@
+package de.hdm_stuttgart.mi.sd1.aufgabe1;
+
+
+/**
+ * Hilfsmethoden.
+ *
+ */
+public class Helper {
+   
+   /**
+    * <p>Liefert die Deutschen Klartextnamen der Zahlen von 0 bis Zwölf, also:</p>
+    * 
+    *  <p>{0, 1, 2, ..., 12} wird zu {"null", "eins", "zwei", ..., "zwölf"}</p>
+    *  
+    *  <p>Für alle anderen Werte, wie z.B. »14«, soll "Uuups, keine Regel
+    *     für den Wert 14" zurückgegeben werden.</p>
+    * 
+    * @param a Umzuwandelnder Wert
+    * @return Klartextname.
+    */
+   static public String klartextName(final int a) {
+      return "allesWirdGut"; // ToDo: Implementiere mich richtig!
+   }
+
+   /**
+    * <p>Gibt den Betrag des Produkts der beiden Faktoren zurück.</p> 
+    * 
+    * @param a Erster Wert
+    * @param b Zweiter Wert
+    * @return Betrag des Produkts.
+    */
+   static public int getProduktBetrag(final int a, final int b) {
+      return -13; // ToDo: Implementiere mich richtig!
+   }
+
+   /**
+    * <p>Der Quadrant für einen gegebenen Winkel.</p> 
+    * 
+    * <p>Der Vollkreis wird in 0 bis 360 Grad eingeteilt. Je nach Winkel liegt ein Vektor
+    * im Quadrant 1, 2 3 oder 4:</p> 
+    *
+    * <pre>
+    *              |
+    * Quadrant 2   |  Quadrant 1
+    *              |
+    *              |
+    *--------------+-------------
+    *              |
+    *              |
+    * Quadrant 3   | Quadrant 4
+    *              |</pre>
+    *              
+    *  <p>Beispiel: 45 Grad liegt im ersten Quadranten, 200 Grad im Dritten.</p>            
+    *  
+    * @param winkel Winkel des zu betrachtenden Vektors aus dem Intervall [0, 360[.
+    * @return zugehöriger Quadrant.
+    */
+   static public int getQuadrant(final double winkel) {
+      return -13; // ToDo: Implementiere mich richtig!
+   }
+	
+   /**
+    * <p>Umwandlung von Sekundenangaben in das Format hh:mm:ss.</p> 
+    * 
+    * <p>Beispiel: 7290 Sekunden entsprechen 2 Stunden, einer Minute und 30 Sekunden, also "2:1:30"</p> 
+    * 
+    * @param sekunden Nicht-negative Sekundenangabe
+    * @return Angabe in Stunden:Minuten:Sekunden
+    */
+   static public String getZeitangabe(final long sekunden) {
+      return "allesWirdGut"; // ToDo: Implementiere mich richtig!
+   }
+}
\ No newline at end of file
diff --git a/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java b/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java
new file mode 100644
index 000000000..c69f35101
--- /dev/null
+++ b/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java
@@ -0,0 +1,25 @@
+package de.hdm_stuttgart.mi.sd1.aufgabe2;
+
+
+/**
+ * Demo zur Verwendung der Klasse {@link Konto}. Beachten Sie bitte die
+ * zugehörigen Junit Tests.
+ *
+ */
+public class DummyZinsen {
+
+	/**
+	 * @param args unused
+	 */
+	public static void main(String[] args) {
+		
+		final Konto konto = new Konto(100, 1.0, 10); // Start mit 100€, Guthabenzins 1%, Sollzins 10%
+		
+      konto.neuesJahr(100); // Verzinsung des bisherigen Betrags und Aufstockung um 100€ 
+      konto.neuesJahr(200, 2.0, 8); // Verzinsung des bisherigen Betrags, Aufstockung um 200€, Änderung der Zinssätze für das Folgejahr. 
+      konto.neuesJahr(-500);// Verzinsung des bisherigen Betrags, Abbuchung von 500€ 
+		
+		System.out.println(konto.getJournal());// Ausgabe des Journals
+	}
+
+}
diff --git a/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java b/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java
new file mode 100644
index 000000000..84c04c931
--- /dev/null
+++ b/Tests/Sd1/004/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java
@@ -0,0 +1,92 @@
+package de.hdm_stuttgart.mi.sd1.aufgabe2;
+
+/**
+ * <p>Verzinsung von Guthaben oder Schulden. Es gelten folgende Regeln:</p>
+ *
+ * <p>Einmal pro Jahr kann über eine der beiden Methoden  {@link #neuesJahr(double, double, double)} oder {@link #neuesJahr(double)}
+ *   gemäß Vorzeichen des Betrags eingezahlt oder abgehoben werden.</p>
+ *
+ * <p>Gleichzeitig können zu diesem Zeitpunkt die Zinssätze für Guthaben und Schulden (Soll) für das Folgejahr angepasst werden.</p>
+ *
+ */
+public class Konto {
+
+  /**
+   * Erstelle neues Konto.
+   *
+   * @param kontostand Initialer Kontostand.
+   * @param guthabenZins Initialer Guthabenzins.
+   * @param sollZins Initialer Schuldzins.
+   */
+  public Konto(double kontostand, double guthabenZins, double sollZins) {
+    // ToDo: Implementiere mich!
+  }
+
+  /**
+   * <p>Diese oder alternativ die Methode {@link #neuesJahr(double)} wird einmal
+   * jährlich ausgeführt.</p>
+   *
+   * <p>Die Methode bewirkt folgende Änderungen:</p>
+   *
+   * <ul>
+   *   <li>Durchführung der Verzinsung für das zurückliegende Jahr zu aktuellen Guthaben- bzw. Schuldzinsen.</li>
+   *   <li>Einzahlung für das jeweils nächste Jahr</li>
+   *   <li>Anpassung von Guthaben- und Schuldzins für das kommende Verzinsungsjahr.</li>
+   * </ul>
+   *
+   * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag.
+   * @param guthabenZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für nichtnegative Kontostände.
+   * @param sollZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für negative Kontostände.
+   *
+   * <p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in {@link #getJournal()} können Sie alle
+   * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für den jeweils
+   * aktuellen Kontostand.</p>
+   */
+  public void neuesJahr(double betrag, double guthabenZins, double sollZins) {
+    // ToDo: Implementiere mich!
+  }
+
+  /**
+   * Wie {@link #neuesJahr(double, double, double)} allerdings ohne Änderung von Guthaben- und Sollzins für
+   * das kommende Verzinsungsjahr.
+   *
+   * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag.
+   */
+  public void neuesJahr(double betrag) {
+
+  }
+
+  /**
+   * @return Der aktuelle Kontostand.
+   */
+  public double getKontostand() {
+    return -234.;// ToDo: Implementiere mich richtig!
+  }
+
+  /**
+   * <p>Die Entwicklung der Kontostände kaufmännisch auf ganzzahlige Werte gerundet.
+   * Für das Beispiel {@link DummyZinsen#main(String[])} ergibt sich:</p>
+   *
+   * <pre>Jahr 0, Kontostand=100, verzinsung=1.0%
+   *Jahr 1, Kontostand=201, verzinsung=1.0%
+   *Jahr 2, Kontostand=403, verzinsung=2.0%
+   *Jahr 3, Kontostand=-89, verzinsung=-8.0%</pre>
+   *
+   * @return Ausdruckbarer Verlauf der Kontoentwicklung
+   *
+   * <ul>
+   *   <li><p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in können Sie alle
+   * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies
+   * auch für den jeweils aktuellen Kontostand. Beachten Sie die Methode {@link Math#round(double)}</p></li>
+   *
+   * <li><p style="color: red;font-weight: bold;">Tip: Ein Hang zum Erbsenzählen erleichtert die Lösung.
+   * Bereits ein falsches Leer- oder fehlendes Newline Zeichen (auch am Ende!)
+   * lässt die zugehörigen Tests scheitern. Beachten Sie allfällige Junit Fehlermeldungen sehr genau.</p></li>
+   *
+   * </ul>
+   *
+   */
+  public String getJournal() {
+    return "allesWirdGut"; // ToDo: Implementiere mich richtig!
+  }
+}
\ No newline at end of file
diff --git a/Tests/Sd1/004/Exam/src/main/resources/log4j2.xml b/Tests/Sd1/004/Exam/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..130f87a14
--- /dev/null
+++ b/Tests/Sd1/004/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/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java b/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java
new file mode 100644
index 000000000..2881d9786
--- /dev/null
+++ b/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java
@@ -0,0 +1,23 @@
+package de.hdm_stuttgart.mi.sd1.test;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.RunTests;
+import de.hdm_stuttgart.mi.sd1.test.aufgabe1.TestHelper;
+import de.hdm_stuttgart.mi.sd1.test.aufgabe2.TestKonto;
+
+public class ShowReachedPoints {
+
+  /**
+   * Execution reveals the number of reached points.
+   *
+   * @param args Unused
+   */
+  public static void main(String[] args) {
+    RunTests.exec(
+      "Aufgabe 1"
+      , TestHelper.class, TestHelper.class);
+
+    RunTests.exec(
+      "Aufgabe 2", TestKonto.class);
+
+  }
+}
\ No newline at end of file
diff --git a/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java b/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java
new file mode 100644
index 000000000..678ec3334
--- /dev/null
+++ b/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java
@@ -0,0 +1,94 @@
+package de.hdm_stuttgart.mi.sd1.test.aufgabe1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.sd1.aufgabe1.Helper;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.DisableOnDebug;
+import org.junit.rules.TestRule;
+import org.junit.rules.Timeout;
+import org.junit.runners.MethodSorters;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+
+
+@SuppressWarnings({"javadoc"})
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class TestHelper extends ExaminationTestDefaults {
+
+  @Rule // Kill test if tests last longer than 1000 milliseconds unless in debugging mode
+  public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000));
+
+  /**
+   * Tests zu {@link Helper#klartextName(int)}
+   */
+  @Test
+  @Marking(points=3)
+  public void test_100_klartext() {
+    Assert.assertEquals("sieben", Helper.klartextName(7));
+  }
+
+  @Test
+  @Marking(points=3)
+  public void test_120_klartext() {
+    Assert.assertEquals("null", Helper.klartextName(0));
+  }
+
+  @Test
+  @Marking(points=3)
+  public void test_130_klartextNegativ() {
+    Assert.assertEquals("Uuups, keine Regel für den Wert -1", Helper.klartextName(-1));
+    Assert.assertEquals("Uuups, keine Regel für den Wert 13", Helper.klartextName(13));
+  }
+
+  /**
+   * Tests zu {@link Helper#getProduktBetrag(int, int)}
+   */
+  @Test
+  @Marking(points=8)
+  public void test_145_produktbetrag() {
+    Assert.assertEquals(10, Helper.getProduktBetrag(2, 5));
+    Assert.assertEquals(110, Helper.getProduktBetrag(2, -55));
+    Assert.assertEquals(120, Helper.getProduktBetrag(-40, 3));
+    Assert.assertEquals(21, Helper.getProduktBetrag(-3, -7));
+  }
+
+  /**
+   * Tests zu {@link Helper#getQuadrant(double)}
+   */
+  @Test
+  @Marking(points=8)
+  public void test_160_quadrant() {
+
+    for (int i = 0; i < 90; i++) {
+      Assert.assertEquals(1, Helper.getQuadrant(i));
+    }
+
+    for (int i = 90; i < 180; i++) {
+      Assert.assertEquals(2, Helper.getQuadrant(i));
+    }
+
+    for (int i = 180; i < 270; i++) {
+      Assert.assertEquals(3, Helper.getQuadrant(i));
+    }
+
+    for (int i = 270; i < 360; i++) {
+      Assert.assertEquals(4, Helper.getQuadrant(i));
+    }
+  }
+
+  /**
+   * Tests zu {@link Helper#getZeitangabe(long)}
+   */
+  @Test
+  @Marking(points=8)
+  public void test_180_zeitangabe() {
+    Assert.assertEquals("0:0:31", Helper.getZeitangabe(31));
+    Assert.assertEquals("0:2:5", Helper.getZeitangabe(125));
+    Assert.assertEquals("0:5:1", Helper.getZeitangabe(301));
+    Assert.assertEquals("0:10:42", Helper.getZeitangabe(642));
+    Assert.assertEquals("2:0:41", Helper.getZeitangabe(7241));
+  }
+}
\ No newline at end of file
diff --git a/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java b/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java
new file mode 100644
index 000000000..9079b773d
--- /dev/null
+++ b/Tests/Sd1/004/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java
@@ -0,0 +1,96 @@
+package de.hdm_stuttgart.mi.sd1.test.aufgabe2;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.sd1.aufgabe2.Konto;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.DisableOnDebug;
+import org.junit.rules.TestRule;
+import org.junit.rules.Timeout;
+import org.junit.runners.MethodSorters;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+
+@SuppressWarnings({ "javadoc" })
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class TestKonto extends ExaminationTestDefaults {
+
+   // Kill test if tests last longer than 1000 milliseconds unless in debugging mode
+   @Rule
+   public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000));
+
+   @Test
+   @Marking(points=2)
+   public void test_200_NeuesKonto() {
+      final Konto konto = new Konto(100, 1, 10);
+      Assert.assertEquals(100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=1)
+   public void test_210_NeuesKontoJournal() {
+      final Konto konto = new Konto(100, 1, 10);
+      Assert.assertEquals("Jahr 0, Kontostand=100, verzinsung=1.0%\n", konto.getJournal());
+   }
+
+   @Test
+   @Marking(points=3)
+   public void test_220_einJahrPositiv() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(100);
+      Assert.assertEquals(100 + 100*(1 + 1./100), konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=2)
+   public void test_240_einJahrNegativ() {
+      final Konto konto = new Konto(-100, 1, 10);
+      konto.neuesJahr(100);
+      Assert.assertEquals(-100*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=2)
+   public void test_250_einJahrJournal() {
+      final Konto konto = new Konto(-100, 1, 10);
+      konto.neuesJahr(100);
+      Assert.assertEquals(
+        "Jahr 0, Kontostand=-100, verzinsung=-10.0%\n" +
+          "Jahr 1, Kontostand=-10, verzinsung=-10.0%\n",
+        konto.getJournal());
+   }
+
+   @Test
+   @Marking(points=4)
+   public void test_260_zweiJahre() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(200, 2, 12);
+      konto.neuesJahr(100);
+      Assert.assertEquals((100 *(1 + 1./100) + 200) * (1 + 2./100) + 100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=4)
+   public void test_280_zweiJahrePlusMinus() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(-200);
+      konto.neuesJahr(100);
+      Assert.assertEquals((100 *(1 + 1./100) - 200)*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=2)
+   public void test_300_zweiJahrePlusMinusJournal() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(-200);
+      konto.neuesJahr(100);
+      System.out.println(konto.getJournal());
+      Assert.assertEquals(
+        "Jahr 0, Kontostand=100, verzinsung=1.0%\n" +
+          "Jahr 1, Kontostand=-99, verzinsung=-10.0%\n" +
+          "Jahr 2, Kontostand=-9, verzinsung=-10.0%\n",
+        konto.getJournal());
+   }
+}
\ No newline at end of file
diff --git a/Tests/Sd1/004/Solve/.gitignore b/Tests/Sd1/004/Solve/.gitignore
new file mode 100644
index 000000000..a2fa20469
--- /dev/null
+++ b/Tests/Sd1/004/Solve/.gitignore
@@ -0,0 +1,5 @@
+/.classpath
+/.project
+/.settings
+/.idea
+/*.iml
diff --git a/Tests/Sd1/004/Solve/Doc/.gitignore b/Tests/Sd1/004/Solve/Doc/.gitignore
new file mode 100644
index 000000000..6ef94b7da
--- /dev/null
+++ b/Tests/Sd1/004/Solve/Doc/.gitignore
@@ -0,0 +1 @@
+task*.html
diff --git a/Tests/Sd1/004/Solve/Doc/klausur.xml b/Tests/Sd1/004/Solve/Doc/klausur.xml
new file mode 100644
index 000000000..a349ca81a
--- /dev/null
+++ b/Tests/Sd1/004/Solve/Doc/klausur.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<book version="5.0" xml:id="klausur_SoSe_2017" xml:lang="de"
+      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">
+  <!-- saxon9he-xslt -s:klausur.xml -xsl:/usr/share/hdm-docbook-xsl/CustomLayer/Klausur/docbook2klausur.xsl -->
+
+  <info>
+    <title/>
+
+    <author>
+      <personname/>
+    </author>
+
+    <pubdate/>
+  </info>
+
+  <chapter xml:id="task1">
+    <title>Klassenmethoden</title>
+
+    <section xml:id="aufgabe1_prepare">
+      <title>Vorbereitung</title>
+
+      <para>Entpacken Sie das oben sichtbare Archiv
+      <filename>exam.zip</filename> und importieren Sie den resultierenden
+      Ordner <filename>Exam</filename> als <productname>Maven</productname>
+      Projekt in Ihre IDE.</para>
+    </section>
+
+    <section xml:id="aufgabe1_descr">
+      <title>Beschreibung</title>
+
+      <para>Implementierung vorbereiteter Methoden gemäß
+      <productname>Javadoc</productname> Beschreibungen und nachfolgend
+      beschriebener Funktionalitäten. Sie bekommen bei unvollständiger
+      Implementierung Teilpunkte.</para>
+    </section>
+
+    <section xml:id="aufgabe1_task">
+      <title>Aufgabe</title>
+
+      <para>Vervollständigen Sie die Implementierung aller Methoden der
+      Klasse<foreignphrase xml:lang="en"> package</foreignphrase>
+      <package>de.hdm_stuttgart.mi.sd1.aufgabe1.Helper</package>.</para>
+
+      <tip>
+        <para>Das <foreignphrase xml:lang="en">package</foreignphrase>
+        <package>de.hdm_stuttgart.mi.sd1.test.aufgabe1</package> im Test Zweig
+        Ihres Projekts enthält eine zugehörige
+        <productname>Junit</productname> Testklasse
+        <classname>TestHelper</classname>.</para>
+      </tip>
+    </section>
+
+    <xi:include href="../../../../Common/commonHints.xml"
+                xpointer="element(/1)"/>
+
+    <xi:include href="../../../../Common/uploadIlias.xml"
+                xpointer="element(/1)"/>
+  </chapter>
+
+  <chapter xml:id="task2">
+    <title>Jährliche Verzinsung</title>
+
+    <section xml:id="hinweisBewertung">
+      <title>Hinweis zur Bewertung</title>
+
+      <para>Diese Aufgabe erbringt im Vergleich zur ihrer Schwierigkeit eine
+      geringere Punktzahl als die Aufgabe »Helper Methoden«.</para>
+    </section>
+
+    <section xml:id="aufgabe2_prepare">
+      <title>Vorbereitung</title>
+
+      <para>Falls Sie die erste Aufgabe »<xref linkend="task1"/>« bearbeitet
+      haben, arbeiten Sie einfach an Ihrem <productname>Maven</productname>
+      Projekt weiter. Ansonsten lesen Sie bitte die Anleitung in der Aufgabe
+      »<xref linkend="task1"/>« zum Projektimport sowie weitere Hinweise für
+      das Hochladen in das <productname>Ilias</productname> System.</para>
+    </section>
+
+    <section xml:id="aufgabe2_descr">
+      <title>Beschreibung</title>
+
+      <para>Vervollständigen Sie die Implementierung der Klasse
+      <classname>de.hdm_stuttgart.mi.sd1.aufgabe2.Konto</classname> gemäß den
+      angegebenen Javadoc Kommentaren. Hilfreich sind:</para>
+
+      <orderedlist>
+        <listitem>
+          <para>Eine beispielhafte Applikation in
+          <classname>de.hdm_stuttgart.mi.sd1.aufgabe2.DummyZinsen</classname>.</para>
+        </listitem>
+
+        <listitem>
+          <para>Die zugehörige Testklasse in
+          <classname>de.hdm_stuttgart.mi.sd1.test.aufgabe2.TestKonto</classname>.</para>
+        </listitem>
+      </orderedlist>
+    </section>
+
+    <section version="5.1" xml:id="uploadFollow" xml:lang="de">
+      <title>Hochladen Ihrer Lösung in das Klausursystem</title>
+
+      <para>Laden Sie die Lösung dieser Aufgabe als gemeinsamen Projekt Export
+      mit der ersten Aufgabe <xref linkend="task1"/> gemäß den dortigen
+      Hinweisen hoch. Falls Sie die Aufgabe »<xref linkend="task1"/>«
+      ebenfalls bearbeitet haben, enthält Ihr <foreignphrase
+      xml:lang="en">Upload</foreignphrase> die Lösungen zu beiden
+      Aufgaben.</para>
+
+      <para>Tragen Sie im Freitextfeld weiter unten genau einen der beiden
+      Texte ein:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>Ich habe die aktuelle Aufgabe bearbeitet und erhoffe dafür
+          Punkte.</para>
+        </listitem>
+
+        <listitem>
+          <para>Ich habe die aktuelle Aufgabe nicht bearbeitet.</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+  </chapter>
+</book>
diff --git a/Tests/Sd1/004/Solve/pom.xml b/Tests/Sd1/004/Solve/pom.xml
new file mode 100644
index 000000000..9c1e68927
--- /dev/null
+++ b/Tests/Sd1/004/Solve/pom.xml
@@ -0,0 +1,94 @@
+<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_test_4</artifactId>
+	<version>0.9</version>
+	<packaging>jar</packaging>
+
+	<name>sd1_test_4</name>
+
+	<url>http://www.mi.hdm-stuttgart.de/freedocs/topic/de.hdm_stuttgart.mi.lectures/sd1SectUsingMaven.html</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<repositories>
+		<repository>
+			<id>hdm-mi-internal-maven-repo</id>
+			<url>https://maven.mi.hdm-stuttgart.de/artifacts</url>
+		</repository>
+	</repositories>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>2.6</version>
+		</dependency>
+
+		<dependency>
+			<groupId>de.hdm_stuttgart.mi.exam</groupId>
+			<artifactId>unitmarking</artifactId>
+			<version>0.9</version>
+		</dependency>
+
+	</dependencies>
+
+	<build>
+		<plugins>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.5.1</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.10.3</version>
+				<configuration />
+			</plugin>
+
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.3</version>
+				<configuration>
+					<descriptor>src/main/assembly/assembly.xml</descriptor>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<configuration>
+							<archive>
+								<manifest>
+									<mainClass>de.hdm_stuttgart.mi.sd1.test.ShowReachedPoints</mainClass>
+								</manifest>
+							</archive>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>
diff --git a/Tests/Sd1/004/Solve/src/main/assembly/assembly.xml b/Tests/Sd1/004/Solve/src/main/assembly/assembly.xml
new file mode 100644
index 000000000..1a2cd6054
--- /dev/null
+++ b/Tests/Sd1/004/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>/</outputDirectory>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>true</unpack>
+            <scope>test</scope>
+        </dependencySet>
+    </dependencySets>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/test-classes</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/classes</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+    </fileSets>
+</assembly>
diff --git a/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java b/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java
new file mode 100644
index 000000000..c1fcb9856
--- /dev/null
+++ b/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/Helper.java
@@ -0,0 +1,101 @@
+package de.hdm_stuttgart.mi.sd1.aufgabe1;
+
+
+/**
+ * Hilfsmethoden.
+ *
+ */
+public class Helper {
+   
+   /**
+    * <p>Liefert die Deutschen Klartextnamen der Zahlen von 0 bis Zwölf, also:</p>
+    * 
+    *  <p>{0, 1, 2, ..., 12} wird zu {"null", "eins", "zwei", ..., "zwölf"}</p>
+    *  
+    *  <p>Für alle anderen Werte, wie z.B. »14«, soll "Uuups, keine Regel
+    *     für den Wert 14" zurückgegeben werden.</p>
+    * 
+    * @param a Umzuwandelnder Wert
+    * @return Klartextname.
+    */
+   static public String klartextName(final int a) {
+      switch(a) {
+      case 0: return "null";
+      case 1: return "eins";
+      case 2: return "zwei";
+      case 3: return "drei";
+      case 4: return "vier";
+      case 5: return "fünf";
+      case 6: return "sechs";
+      case 7: return "sieben";
+      case 8: return "acht";
+      case 9: return "neun";
+      case 10: return "zehn";
+      case 11: return "elf";
+      case 12: return "zwölf";
+
+      default : return "Uuups, keine Regel für den Wert " + a;
+      }
+   }
+
+   /**
+    * <p>Gibt den Betrag des Produkts der beiden Faktoren zurück.</p> 
+    * 
+    * @param a Erster Wert
+    * @param b Zweiter Wert
+    * @return Betrag des Produkts.
+    */
+   static public int getProduktBetrag(final int a, final int b) {
+      return Math.abs(a * b);
+   }
+
+   /**
+    * <p>Der Quadrant für einen gegebenen Winkel.</p> 
+    * 
+    * <p>Der Vollkreis wird in 0 bis 360 Grad eingeteilt. Je nach Winkel liegt ein Vektor
+    * im Quadrant 1, 2 3 oder 4:</p> 
+    *
+    * <pre>
+    *              |
+    * Quadrant 2   |  Quadrant 1
+    *              |
+    *              |
+    *--------------+-------------
+    *              |
+    *              |
+    * Quadrant 3   | Quadrant 4
+    *              |</pre>
+    *              
+    *  <p>Beispiel: 45 Grad liegt im ersten Quadranten, 200 Grad im Dritten.</p>            
+    *  
+    * @param winkel Winkel des zu betrachtenden Vektors aus dem Intervall [0, 360[.
+    * @return zugehöriger Quadrant.
+    */
+   static public int getQuadrant(final double winkel) {
+      if (winkel < 90) {
+         return 1;
+      } else if (winkel < 180) {
+         return 2;
+      } else if (winkel < 270) {
+         return 3;
+      } else {
+         return 4;
+      }
+   }
+	
+   /**
+    * <p>Umwandlung von Sekundenangaben in das Format hh:mm:ss.</p> 
+    * 
+    * <p>Beispiel: 7290 Sekunden entsprechen 2 Stunden, einer Minute und 30 Sekunden, also "2:1:30"</p> 
+    * 
+    * @param sekunden Nicht-negative Sekundenangabe
+    * @return Angabe in Stunden:Minuten:Sekunden
+    */
+   static public String getZeitangabe(final long sekunden) {
+      final long stunden = sekunden / (60 * 60);
+      long rest = sekunden  % (60 * 60);
+      long minuten = rest / 60;
+      rest = rest % 60;
+      return stunden + ":" + minuten + ":" + rest;
+   }
+}
diff --git a/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java b/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java
new file mode 100644
index 000000000..c69f35101
--- /dev/null
+++ b/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/DummyZinsen.java
@@ -0,0 +1,25 @@
+package de.hdm_stuttgart.mi.sd1.aufgabe2;
+
+
+/**
+ * Demo zur Verwendung der Klasse {@link Konto}. Beachten Sie bitte die
+ * zugehörigen Junit Tests.
+ *
+ */
+public class DummyZinsen {
+
+	/**
+	 * @param args unused
+	 */
+	public static void main(String[] args) {
+		
+		final Konto konto = new Konto(100, 1.0, 10); // Start mit 100€, Guthabenzins 1%, Sollzins 10%
+		
+      konto.neuesJahr(100); // Verzinsung des bisherigen Betrags und Aufstockung um 100€ 
+      konto.neuesJahr(200, 2.0, 8); // Verzinsung des bisherigen Betrags, Aufstockung um 200€, Änderung der Zinssätze für das Folgejahr. 
+      konto.neuesJahr(-500);// Verzinsung des bisherigen Betrags, Abbuchung von 500€ 
+		
+		System.out.println(konto.getJournal());// Ausgabe des Journals
+	}
+
+}
diff --git a/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java b/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java
new file mode 100644
index 000000000..798627f10
--- /dev/null
+++ b/Tests/Sd1/004/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Konto.java
@@ -0,0 +1,127 @@
+package de.hdm_stuttgart.mi.sd1.aufgabe2;
+
+/**
+ * <p>Verzinsung von Guthaben oder Schulden. Es gelten folgende Regeln:</p>
+ *
+ * <p>Einmal pro Jahr kann über eine der beiden Methoden  {@link #neuesJahr(double, double, double)} oder {@link #neuesJahr(double)}
+ *   gemäß Vorzeichen des Betrags eingezahlt oder abgehoben werden.</p>
+ *
+ * <p>Gleichzeitig können zu diesem Zeitpunkt die Zinssätze für Guthaben und Schulden (Soll) für das Folgejahr angepasst werden.</p>
+ *
+ */
+public class Konto {
+
+  private int jahr = 0;
+
+  private double kontostand = 0,
+    guthabenZins, sollZins;
+
+  private final StringBuffer journal = new StringBuffer();
+
+  private void verzinsung() {
+    if (0 < kontostand) {
+      kontostand *= (1 + guthabenZins / 100);
+    } else {
+      kontostand *= (1 + sollZins / 100);
+    }
+    jahr++;
+  }
+
+  private void journalEintrag() {
+    journal.append("Jahr ").append(jahr).append(", Kontostand=").append(Math.round(kontostand));
+    if (0 <= kontostand) {
+      journal.append(", verzinsung=").append(guthabenZins);
+    } else {
+      journal.append(", verzinsung=-").append(sollZins);
+    }
+    journal.append("%\n");
+  }
+
+  /**
+   * Erstelle neues Konto.
+   *
+   * @param kontostand Initialer Kontostand.
+   * @param guthabenZins Initialer Guthabenzins.
+   * @param sollZins Initialer Schuldzins.
+   */
+  public Konto(double kontostand, double guthabenZins, double sollZins) {
+    this.kontostand = kontostand;
+    this.guthabenZins = guthabenZins;
+    this.sollZins = sollZins;
+    journalEintrag();
+  }
+
+  /**
+   * <p>Diese oder alternativ die Methode {@link #neuesJahr(double)} wird einmal
+   * jährlich ausgeführt.</p>
+   *
+   * <p>Die Methode bewirkt folgende Änderungen:</p>
+   *
+   * <ul>
+   *   <li>Durchführung der Verzinsung für das zurückliegende Jahr zu aktuellen Guthaben- bzw. Schuldzinsen.</li>
+   *   <li>Einzahlung für das jeweils nächste Jahr</li>
+   *   <li>Anpassung von Guthaben- und Schuldzins für das kommende Verzinsungsjahr.</li>
+   * </ul>
+   *
+   * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag.
+   * @param guthabenZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für nichtnegative Kontostände.
+   * @param sollZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für negative Kontostände.
+   *
+   * <p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in {@link #getJournal()} können Sie alle
+   * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für den jeweils
+   * aktuellen Kontostand.</p>
+   */
+  public void neuesJahr(double betrag, double guthabenZins, double sollZins) {
+    verzinsung();
+    this.guthabenZins= guthabenZins;
+    this.sollZins = sollZins;
+    kontostand += betrag;
+    journalEintrag();
+  }
+
+  /**
+   * Wie {@link #neuesJahr(double, double, double)} allerdings ohne Änderung von Guthaben- und Sollzins für
+   * das kommende Verzinsungsjahr.
+   *
+   * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag.
+   */
+  public void neuesJahr(double betrag) {
+    verzinsung();
+    kontostand += betrag;
+    journalEintrag();
+  }
+
+  /**
+   * @return Der aktuelle Kontostand.
+   */
+  public double getKontostand() {
+    return kontostand;
+  }
+
+  /**
+   * <p>Die Entwicklung der Kontostände kaufmännisch auf ganzzahlige Werte gerundet.
+   * Für das Beispiel {@link DummyZinsen#main(String[])} ergibt sich:</p>
+   *
+   * <pre>Jahr 0, Kontostand=100, verzinsung=1.0%
+   *Jahr 1, Kontostand=201, verzinsung=1.0%
+   *Jahr 2, Kontostand=403, verzinsung=2.0%
+   *Jahr 3, Kontostand=-89, verzinsung=-8.0%</pre>
+   *
+   * @return Ausdruckbarer Verlauf der Kontoentwicklung
+   *
+   * <ul>
+   *   <li><p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in können Sie alle
+   * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies
+   * auch für den jeweils aktuellen Kontostand. Beachten Sie die Methode {@link Math#round(double)}</p></li>
+   *
+   * <li><p style="color: red;font-weight: bold;">Tip: Ein Hang zum Erbsenzählen erleichtert die Lösung.
+   * Bereits ein falsches Leer- oder fehlendes Newline Zeichen (auch am Ende!)
+   * lässt die zugehörigen Tests scheitern. Beachten Sie allfällige Junit Fehlermeldungen sehr genau.</p></li>
+   *
+   * </ul>
+   *
+   */
+  public String getJournal() {
+    return journal.toString();
+  }
+}
diff --git a/Tests/Sd1/004/Solve/src/main/resources/log4j2.xml b/Tests/Sd1/004/Solve/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..130f87a14
--- /dev/null
+++ b/Tests/Sd1/004/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/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java b/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java
new file mode 100644
index 000000000..c65edb43f
--- /dev/null
+++ b/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/ShowReachedPoints.java
@@ -0,0 +1,22 @@
+package de.hdm_stuttgart.mi.sd1.test;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.RunTests;
+import de.hdm_stuttgart.mi.sd1.test.aufgabe1.TestHelper;
+import de.hdm_stuttgart.mi.sd1.test.aufgabe2.TestKonto;
+
+public class ShowReachedPoints {
+
+  /**
+   * Execution reveals the number of reached points.
+   *
+   * @param args Unused
+   */
+  public static void main(String[] args) {
+    RunTests.exec(
+      "Aufgabe 1"
+      , TestHelper.class, TestHelper.class);
+    RunTests.exec(
+      "Aufgabe 2", TestKonto.class);
+
+  }
+}
diff --git a/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java b/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java
new file mode 100644
index 000000000..2fd1fdab2
--- /dev/null
+++ b/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe1/TestHelper.java
@@ -0,0 +1,94 @@
+package de.hdm_stuttgart.mi.sd1.test.aufgabe1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.sd1.aufgabe1.Helper;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.DisableOnDebug;
+import org.junit.rules.TestRule;
+import org.junit.rules.Timeout;
+import org.junit.runners.MethodSorters;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+
+
+@SuppressWarnings({"javadoc"})
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class TestHelper extends ExaminationTestDefaults {
+
+  @Rule // Kill test if tests last longer than 1000 milliseconds unless in debugging mode
+  public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000));
+
+  /**
+   * Tests zu {@link Helper#klartextName(int)}
+   */
+  @Test
+  @Marking(points=3)
+  public void test_100_klartext() {
+    Assert.assertEquals("sieben", Helper.klartextName(7));
+  }
+
+  @Test
+  @Marking(points=3)
+  public void test_120_klartext() {
+    Assert.assertEquals("null", Helper.klartextName(0));
+  }
+
+  @Test
+  @Marking(points=3)
+  public void test_130_klartextNegativ() {
+    Assert.assertEquals("Uuups, keine Regel für den Wert -1", Helper.klartextName(-1));
+    Assert.assertEquals("Uuups, keine Regel für den Wert 13", Helper.klartextName(13));
+  }
+
+  /**
+   * Tests zu {@link Helper#getProduktBetrag(int, int)}
+   */
+  @Test
+  @Marking(points=8)
+  public void test_145_produktbetrag() {
+    Assert.assertEquals(10, Helper.getProduktBetrag(2, 5));
+    Assert.assertEquals(110, Helper.getProduktBetrag(2, -55));
+    Assert.assertEquals(120, Helper.getProduktBetrag(-40, 3));
+    Assert.assertEquals(21, Helper.getProduktBetrag(-3, -7));
+  }
+
+  /**
+   * Tests zu {@link Helper#getQuadrant(double)}
+   */
+  @Test
+  @Marking(points=8)
+  public void test_160_quadrant() {
+
+    for (int i = 0; i < 90; i++) {
+      Assert.assertEquals(1, Helper.getQuadrant(i));
+    }
+
+    for (int i = 90; i < 180; i++) {
+      Assert.assertEquals(2, Helper.getQuadrant(i));
+    }
+
+    for (int i = 180; i < 270; i++) {
+      Assert.assertEquals(3, Helper.getQuadrant(i));
+    }
+
+    for (int i = 270; i < 360; i++) {
+      Assert.assertEquals(4, Helper.getQuadrant(i));
+    }
+  }
+
+  /**
+   * Tests zu {@link Helper#getZeitangabe(long)}
+   */
+  @Test
+  @Marking(points=8)
+  public void test_180_zeitangabe() {
+    Assert.assertEquals("0:0:31", Helper.getZeitangabe(31));
+    Assert.assertEquals("0:2:5", Helper.getZeitangabe(125));
+    Assert.assertEquals("0:5:1", Helper.getZeitangabe(301));
+    Assert.assertEquals("0:10:42", Helper.getZeitangabe(642));
+    Assert.assertEquals("2:0:41", Helper.getZeitangabe(7241));
+  }
+}
diff --git a/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java b/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java
new file mode 100644
index 000000000..9079b773d
--- /dev/null
+++ b/Tests/Sd1/004/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/test/aufgabe2/TestKonto.java
@@ -0,0 +1,96 @@
+package de.hdm_stuttgart.mi.sd1.test.aufgabe2;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.sd1.aufgabe2.Konto;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.DisableOnDebug;
+import org.junit.rules.TestRule;
+import org.junit.rules.Timeout;
+import org.junit.runners.MethodSorters;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+
+@SuppressWarnings({ "javadoc" })
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class TestKonto extends ExaminationTestDefaults {
+
+   // Kill test if tests last longer than 1000 milliseconds unless in debugging mode
+   @Rule
+   public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000));
+
+   @Test
+   @Marking(points=2)
+   public void test_200_NeuesKonto() {
+      final Konto konto = new Konto(100, 1, 10);
+      Assert.assertEquals(100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=1)
+   public void test_210_NeuesKontoJournal() {
+      final Konto konto = new Konto(100, 1, 10);
+      Assert.assertEquals("Jahr 0, Kontostand=100, verzinsung=1.0%\n", konto.getJournal());
+   }
+
+   @Test
+   @Marking(points=3)
+   public void test_220_einJahrPositiv() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(100);
+      Assert.assertEquals(100 + 100*(1 + 1./100), konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=2)
+   public void test_240_einJahrNegativ() {
+      final Konto konto = new Konto(-100, 1, 10);
+      konto.neuesJahr(100);
+      Assert.assertEquals(-100*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=2)
+   public void test_250_einJahrJournal() {
+      final Konto konto = new Konto(-100, 1, 10);
+      konto.neuesJahr(100);
+      Assert.assertEquals(
+        "Jahr 0, Kontostand=-100, verzinsung=-10.0%\n" +
+          "Jahr 1, Kontostand=-10, verzinsung=-10.0%\n",
+        konto.getJournal());
+   }
+
+   @Test
+   @Marking(points=4)
+   public void test_260_zweiJahre() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(200, 2, 12);
+      konto.neuesJahr(100);
+      Assert.assertEquals((100 *(1 + 1./100) + 200) * (1 + 2./100) + 100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=4)
+   public void test_280_zweiJahrePlusMinus() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(-200);
+      konto.neuesJahr(100);
+      Assert.assertEquals((100 *(1 + 1./100) - 200)*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6);
+   }
+
+   @Test
+   @Marking(points=2)
+   public void test_300_zweiJahrePlusMinusJournal() {
+      final Konto konto = new Konto(100, 1, 10);
+      konto.neuesJahr(-200);
+      konto.neuesJahr(100);
+      System.out.println(konto.getJournal());
+      Assert.assertEquals(
+        "Jahr 0, Kontostand=100, verzinsung=1.0%\n" +
+          "Jahr 1, Kontostand=-99, verzinsung=-10.0%\n" +
+          "Jahr 2, Kontostand=-9, verzinsung=-10.0%\n",
+        konto.getJournal());
+   }
+}
\ No newline at end of file
-- 
GitLab