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