70 lines
2.4 KiB
Java
70 lines
2.4 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|