From d44f4f98b528750eb04258001dac21796c500a1b Mon Sep 17 00:00:00 2001 From: Thomas Papendieck Date: Sun, 31 Jan 2021 14:27:55 +0100 Subject: [PATCH] unkommentiert --- pom.xml | 209 ++++++++++++++++++ .../edu/hsfulda/ciip/tdd/NumberRepeater.java | 11 + .../edu/hsfulda/ciip/tdd/StringRepeater.java | 7 + .../edu/hsfulda/ciip/tdd/SymbolRepeater.java | 11 + .../hsfulda/ciip/tdd/TannenbaumRenderer.java | 48 ++++ .../de/edu/hsfulda/ciip/tdd/TannenbaumUi.java | 42 ++++ .../ciip/tdd/TannenbaumRendererTest.java | 39 ++++ .../hsfulda/ciip/tdd/TannenbaumUiTest.java | 83 +++++++ 8 files changed, 450 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/de/edu/hsfulda/ciip/tdd/NumberRepeater.java create mode 100644 src/main/java/de/edu/hsfulda/ciip/tdd/StringRepeater.java create mode 100644 src/main/java/de/edu/hsfulda/ciip/tdd/SymbolRepeater.java create mode 100644 src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumRenderer.java create mode 100644 src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumUi.java create mode 100644 src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumRendererTest.java create mode 100644 src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumUiTest.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0a30bf2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,209 @@ + + 4.0.0 + de.edu.hsfulda.ciip.tdd + tannenbaum + 1.0-SNAPSHOT + + 14 + 14 + UTF-8 + 5.6.0 + 3.0.0-M3 + 3.1.0 + 8.29 + 4.0.1 + 3.0.0-M4 + 0.8.4 + 3.0.0 + 4.3.0 + + 0% + 0% + 20 + 5 + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.mockito + mockito-core + 2.21.0 + test + + + org.mockito + mockito-junit-jupiter + 2.23.0 + test + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + ${maven-enforcer-plugin.version} + + + + enforce + + + + + 3.6.3 + + + true + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin.version} + + + com.puppycrawl.tools + checkstyle + ${checkstyle.version} + + + com.github.ngeor + checkstyle-rules + ${checkstyle-rules.version} + + + + com/github/ngeor/checkstyle.xml + true + true + + + + checkstyle + validate + + check + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + + + pre-unit-test + + prepare-agent + + + + post-unit-test + test + + report + + + + check-unit-test + test + + check + + + ${project.build.directory}/jacoco.exec + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.unit-tests.limit.instruction-ratio} + + + BRANCH + COVEREDRATIO + ${jacoco.unit-tests.limit.branch-ratio} + + + + + CLASS + + + COMPLEXITY + TOTALCOUNT + ${jacoco.unit-tests.limit.class-complexity} + + + + + METHOD + + + COMPLEXITY + TOTALCOUNT + ${jacoco.unit-tests.limit.method-complexity} + + + + + + + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + + + + + travis + + + env.TRAVIS + + + + + + org.eluder.coveralls + coveralls-maven-plugin + ${coveralls-maven-plugin.version} + + + + + + diff --git a/src/main/java/de/edu/hsfulda/ciip/tdd/NumberRepeater.java b/src/main/java/de/edu/hsfulda/ciip/tdd/NumberRepeater.java new file mode 100644 index 0000000..c1d0c01 --- /dev/null +++ b/src/main/java/de/edu/hsfulda/ciip/tdd/NumberRepeater.java @@ -0,0 +1,11 @@ +package de.edu.hsfulda.ciip.tdd; + +public class NumberRepeater implements StringRepeater { + + @Override + public void repeatSymbol(StringBuilder slice, int i, String symbolIndent) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/de/edu/hsfulda/ciip/tdd/StringRepeater.java b/src/main/java/de/edu/hsfulda/ciip/tdd/StringRepeater.java new file mode 100644 index 0000000..1f9c534 --- /dev/null +++ b/src/main/java/de/edu/hsfulda/ciip/tdd/StringRepeater.java @@ -0,0 +1,7 @@ +package de.edu.hsfulda.ciip.tdd; + +public interface StringRepeater { + + void repeatSymbol(StringBuilder slice, int i, String symbolIndent); + +} \ No newline at end of file diff --git a/src/main/java/de/edu/hsfulda/ciip/tdd/SymbolRepeater.java b/src/main/java/de/edu/hsfulda/ciip/tdd/SymbolRepeater.java new file mode 100644 index 0000000..ed539a5 --- /dev/null +++ b/src/main/java/de/edu/hsfulda/ciip/tdd/SymbolRepeater.java @@ -0,0 +1,11 @@ +package de.edu.hsfulda.ciip.tdd; + +public class SymbolRepeater implements StringRepeater { + + public void repeatSymbol(StringBuilder slice, int count, String symbol) { + for (int j = 0; j < count; j++) { + slice.append(symbol); + } + } + +} diff --git a/src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumRenderer.java b/src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumRenderer.java new file mode 100644 index 0000000..be3c88c --- /dev/null +++ b/src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumRenderer.java @@ -0,0 +1,48 @@ +package de.edu.hsfulda.ciip.tdd; + +import java.util.LinkedList; +import java.util.List; + +public class TannenbaumRenderer { + + private static final int BOTH_DIRECTIONS = 2; + private static final int OFFSET = 1; + private static final int MIDDLE_BRANCH = 1; + private static final String SYMBOL_TRUNK = "I"; + private static final String SYMBOL_BRANCH = "X"; + private static final String SYMBOL_INDENT = " "; + private final StringRepeater symbolRepeater; + + + public TannenbaumRenderer(StringRepeater symbolRepeater) { + this.symbolRepeater = symbolRepeater; + } + + public List getTreeOf(int size) { + List tree = new LinkedList<>(); + renderTreeSlices(size, tree); + renderTrunk(size, tree); + return tree; + } + + private void renderTrunk(int size, List tree) { + StringBuilder slice = new StringBuilder(); + symbolRepeater.repeatSymbol(slice, size - MIDDLE_BRANCH, SYMBOL_INDENT); + symbolRepeater.repeatSymbol(slice, MIDDLE_BRANCH, SYMBOL_TRUNK); + tree.add(slice.toString()); + } + + private void renderTreeSlices(int size, List tree) { + for (int sliceWidth = 0; sliceWidth < size; sliceWidth++) { + renderSingleSlice(size, tree, sliceWidth); + } + } + + private void renderSingleSlice(int size, List tree, int sliceWidth) { + StringBuilder slice = new StringBuilder(); + symbolRepeater.repeatSymbol(slice, size - (sliceWidth + OFFSET), SYMBOL_INDENT); + symbolRepeater.repeatSymbol(slice, sliceWidth * BOTH_DIRECTIONS + MIDDLE_BRANCH, SYMBOL_BRANCH); + tree.add(slice.toString()); + } + +} diff --git a/src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumUi.java b/src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumUi.java new file mode 100644 index 0000000..f6d6f36 --- /dev/null +++ b/src/main/java/de/edu/hsfulda/ciip/tdd/TannenbaumUi.java @@ -0,0 +1,42 @@ +package de.edu.hsfulda.ciip.tdd; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.List; + +public class TannenbaumUi { + + public static final String TREE_SIZE_PROMPT = "enter tree size:"; + private InputStream input; + private PrintStream output; + + public TannenbaumUi(InputStream input, PrintStream output) { + this.input = input; + this.output = output; + // TODO Auto-generated constructor stub + } + + public int getTreeSize() { + output.println("enter tree size:"); + try { + int available = input.available(); + int treesize = 0; + for (int i = 0; i < available; i++) { + treesize *= 10; + treesize += input.read() - '0'; + } + return treesize; + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public void print(List messageLines) { + for (String line : messageLines) { + output.println(line); + } + } + +} diff --git a/src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumRendererTest.java b/src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumRendererTest.java new file mode 100644 index 0000000..c23b368 --- /dev/null +++ b/src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumRendererTest.java @@ -0,0 +1,39 @@ +package de.edu.hsfulda.ciip.tdd; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class TannenbaumRendererTest { + + private final SymbolRepeater symbolRepeater = new SymbolRepeater(); + + @BeforeEach + void setUp() throws Exception { + } + + @Test + void renderTreeSize1() { + int size = 1; + List expectedTree = Arrays.asList("X", "I"); + + List tree = new TannenbaumRenderer(symbolRepeater).getTreeOf(size); + + assertArrayEquals(expectedTree.toArray(), tree.toArray(), "tree"); + } + + @Test + void renderTreeSize2() { + int size = 2; + List expectedTree = Arrays.asList(" X", "XXX", " I"); + + List tree = new TannenbaumRenderer(symbolRepeater).getTreeOf(size); + + assertArrayEquals(expectedTree.toArray(), tree.toArray(), "tree"); + } + +} diff --git a/src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumUiTest.java b/src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumUiTest.java new file mode 100644 index 0000000..ca51972 --- /dev/null +++ b/src/test/java/de/edu/hsfulda/ciip/tdd/TannenbaumUiTest.java @@ -0,0 +1,83 @@ +package de.edu.hsfulda.ciip.tdd; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class TannenbaumUiTest { + + @Mock + PrintStream output; + + @Mock + InputStream input; + + @Test + void parseUserInputToInteger() throws IOException { + Mockito.doReturn(1).when(input).available(); + Mockito.doReturn((int) '7').when(input).read(); + int expected = 7; + + int treeSize = new TannenbaumUi(input, output).getTreeSize(); + + assertEquals(expected, treeSize, "tree size"); + + InOrder inOrder = Mockito.inOrder(input, output); + + inOrder.verify(output).println(TannenbaumUi.TREE_SIZE_PROMPT); + inOrder.verify(input).available(); + } + + @Test + void parseUserInputToInteger2() throws IOException { + Mockito.doReturn(1).when(input).available(); + Mockito.doReturn((int) '9').when(input).read(); + int expected = 9; + + int treeSize = new TannenbaumUi(input, output).getTreeSize(); + + assertEquals(expected, treeSize, "tree size"); + } + + @Test + void parseUserInputToInteger2Digits() throws IOException { + Mockito.doReturn(2).when(input).available(); + Mockito.doReturn((int) '3').doReturn((int) '5').when(input).read(); + int expected = 35; + + int treeSize = new TannenbaumUi(input, output).getTreeSize(); + + assertEquals(expected, treeSize, "tree size"); + } + + @Test + void writeSingleLine() throws Exception { + String message = "hello world"; + + new TannenbaumUi(input, output).print(Arrays.asList(message)); + + Mockito.verify(output).println(message); + } + + @Test + void writeMultipeleLines() throws Exception { + List messageLines = Arrays.asList("hello", "world"); + + new TannenbaumUi(input, output).print(messageLines); + + Mockito.verify(output).println(messageLines.get(0)); + Mockito.verify(output).println(messageLines.get(1)); + } +}