Files
goon-game/app/src/test/java/com/projectsacrifice/game/DeterministicInputTapeTest.java
T

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;
}
}
}