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