Завершить инженерный кандидат Stage 5
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
package com.projectsacrifice.game;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public final class DeterministicInputTapeTest {
|
||||
@Test
|
||||
public void oneRecordedCommandTapeReplaysToTheSameTerminalSignature() {
|
||||
DeterministicInputTape tape = DeterministicInputTape.builder(2)
|
||||
.record(false, true, false, 16L)
|
||||
.record(false, true, true, 32L)
|
||||
.record(false, false, false, 16L)
|
||||
.build();
|
||||
|
||||
FakeTarget first = new FakeTarget();
|
||||
FakeTarget second = new FakeTarget();
|
||||
|
||||
assertEquals(tape.play(first), tape.play(second));
|
||||
assertEquals("level=2;ticks=64;mask=0", first.terminalSignature());
|
||||
assertEquals(3, tape.commands().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tapeIdIsStableButChangesWithCommands() {
|
||||
DeterministicInputTape first = DeterministicInputTape.builder(1)
|
||||
.record(false, true, false, 16L).build();
|
||||
DeterministicInputTape same = DeterministicInputTape.builder(1)
|
||||
.record(false, true, false, 16L).build();
|
||||
DeterministicInputTape changed = DeterministicInputTape.builder(1)
|
||||
.record(false, true, true, 16L).build();
|
||||
|
||||
assertEquals(first.id(), same.id());
|
||||
assertNotEquals(first.id(), changed.id());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void terminalStateSignatureIncludesPuzzleBytesAndCompletionFlags() {
|
||||
byte[] puzzle = {4, 8, 15, 16, 23, 42};
|
||||
|
||||
assertEquals(ReplayStateSignature.of(puzzle, true, false),
|
||||
ReplayStateSignature.of(puzzle, true, false));
|
||||
assertNotEquals(ReplayStateSignature.of(puzzle, true, false),
|
||||
ReplayStateSignature.of(puzzle, false, false));
|
||||
}
|
||||
|
||||
private static final class FakeTarget implements DeterministicInputTape.Target {
|
||||
private int level;
|
||||
private long ticks;
|
||||
private int mask;
|
||||
|
||||
@Override
|
||||
public void startLevel(int oneBasedLevelNumber) { level = oneBasedLevelNumber; }
|
||||
|
||||
@Override
|
||||
public void setInput(boolean left, boolean right, boolean jump) {
|
||||
mask = (left ? 1 : 0) | (right ? 2 : 0) | (jump ? 4 : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void advance(long milliseconds) { ticks += milliseconds; }
|
||||
|
||||
@Override
|
||||
public String terminalSignature() {
|
||||
return "level=" + level + ";ticks=" + ticks + ";mask=" + mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user