Skip to content

Commit 72c4595

Browse files
committed
refactoring
1 parent aa82192 commit 72c4595

File tree

5 files changed

+100
-70
lines changed

5 files changed

+100
-70
lines changed

src/main/java/de/fxnn/brainfuck/interpreter/TddBrainfuckInstructionSet.java

Lines changed: 0 additions & 67 deletions
This file was deleted.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package de.fxnn.brainfuck.interpreter.tdd;
2+
3+
import de.fxnn.brainfuck.interpreter.InterpreterException;
4+
import de.fxnn.brainfuck.interpreter.tdd.MostRecentLabel.Known;
5+
import de.fxnn.brainfuck.interpreter.tdd.MostRecentLabel.NoneYet;
6+
import de.fxnn.brainfuck.interpreter.tdd.MostRecentLabel.StartOfLabelKnown;
7+
import de.fxnn.brainfuck.program.InstructionPointer;
8+
9+
class LabelMachine {
10+
11+
private MostRecentLabel mostRecentLabel = new MostRecentLabel.NoneYet();
12+
13+
String getLabelName() {
14+
return ((Known) mostRecentLabel).name();
15+
}
16+
17+
void startOfTest(InstructionPointer instructionPointer) throws InterpreterException {
18+
switch (mostRecentLabel) {
19+
case NoneYet ignored ->
20+
throw new InterpreterException("'{' without preceding '#' instruction");
21+
case StartOfLabelKnown l -> {
22+
var name = extractName(l.startPointer(), instructionPointer);
23+
mostRecentLabel = new Known(name, l.startPointer());
24+
}
25+
case Known ignored -> {
26+
// nothing to do
27+
}
28+
}
29+
}
30+
31+
void startOfLabel(InstructionPointer instructionPointer) {
32+
mostRecentLabel = new StartOfLabelKnown(instructionPointer);
33+
}
34+
35+
private String extractName(InstructionPointer start, InstructionPointer max) {
36+
var nameBuilder = new StringBuilder();
37+
var current = start;
38+
while (nameBuilder.length() < 20 && !current.equals(max)) {
39+
nameBuilder.append(current.getInstruction());
40+
current = current.forward();
41+
}
42+
return nameBuilder.toString();
43+
}
44+
}

src/main/java/de/fxnn/brainfuck/interpreter/MostRecentLabel.java renamed to src/main/java/de/fxnn/brainfuck/interpreter/tdd/MostRecentLabel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.fxnn.brainfuck.interpreter;
1+
package de.fxnn.brainfuck.interpreter.tdd;
22

33
import de.fxnn.brainfuck.program.InstructionPointer;
44

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package de.fxnn.brainfuck.interpreter.tdd;
2+
3+
import de.fxnn.brainfuck.interpreter.InstructionSet;
4+
import de.fxnn.brainfuck.interpreter.InterpreterException;
5+
import de.fxnn.brainfuck.program.InstructionPointer;
6+
import java.io.PrintWriter;
7+
8+
class TddBrainfuckInstructionSet implements InstructionSet {
9+
10+
private final PrintWriter output;
11+
private final LabelMachine labelMachine = new LabelMachine();
12+
private boolean withinTest = false;
13+
private InstructionPointer lastInstructionPointer;
14+
15+
public TddBrainfuckInstructionSet(PrintWriter output) {
16+
this.output = output;
17+
}
18+
19+
public InstructionPointer step(InstructionPointer instructionPointer)
20+
throws InterpreterException {
21+
switch (instructionPointer.getInstruction()) {
22+
case '#' -> {
23+
if (lastInstructionPointer == null || lastInstructionPointer.getInstruction() != '#') {
24+
labelMachine.startOfLabel(instructionPointer);
25+
}
26+
}
27+
case '{' -> {
28+
labelMachine.startOfTest(instructionPointer);
29+
withinTest = true;
30+
}
31+
case '}' -> {
32+
if (!withinTest) {
33+
throw new InterpreterException("'}' without preceding '{' instruction");
34+
}
35+
withinTest = false;
36+
output.println("PASSED " + labelMachine.getLabelName());
37+
}
38+
}
39+
lastInstructionPointer = instructionPointer;
40+
return instructionPointer.forward();
41+
}
42+
43+
}

src/test/java/de/fxnn/brainfuck/interpreter/TddBrainfuckInstructionSetTest.java renamed to src/test/java/de/fxnn/brainfuck/interpreter/tdd/TddBrainfuckInstructionSetTest.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
package de.fxnn.brainfuck.interpreter;
1+
package de.fxnn.brainfuck.interpreter.tdd;
22

3+
import de.fxnn.brainfuck.interpreter.InterpreterException;
34
import de.fxnn.brainfuck.program.InstructionPointer;
45
import de.fxnn.brainfuck.program.StringInstructionPointer;
56
import java.io.PrintWriter;
67
import java.io.StringWriter;
78
import org.junit.Assert;
89
import org.junit.Before;
10+
import org.junit.Ignore;
911
import org.junit.Test;
1012

1113
public class TddBrainfuckInstructionSetTest {
@@ -49,7 +51,7 @@ public void step__endOfTestWithoutBeginOfTest__throws() {
4951
}
5052

5153
@Test
52-
public void step__labelBeginEnd__passes() throws InterpreterException {
54+
public void step__labelBeginEnd__passed() throws InterpreterException {
5355
var underTest = createUnderTest();
5456
stepUntilEndOfProgram(underTest, "#{}");
5557
Assert.assertEquals("PASSED #\n", output.toString());
@@ -77,6 +79,14 @@ public void step__labelBeginEnd__forward() throws InterpreterException {
7779
Assert.assertTrue(result.isEndOfProgram());
7880
}
7981

82+
@Ignore
83+
@Test
84+
public void step__tapeOutputDiffersFromInput__failed() throws InterpreterException {
85+
var underTest = createUnderTest();
86+
stepUntilEndOfProgram(underTest, "#{0~1}");
87+
Assert.assertEquals("FAILED #\n", output.toString());
88+
}
89+
8090
private void stepUntilEndOfProgram(TddBrainfuckInstructionSet underTest,
8191
String stringProgram) throws InterpreterException {
8292
InstructionPointer instructionPointer = new StringInstructionPointer(stringProgram, 0);

0 commit comments

Comments
 (0)