FOP-2425-Marathon/src/graderPrivate/java/h04/movement/TeleportingMoveStrategyTest.java
Oshgnacknak 638df0b63d Squashed 'solution/H04/' content from commit 2ed3e56
git-subtree-dir: solution/H04
git-subtree-split: 2ed3e5642f6d0a6d1d02ae17ffc33f3a1076f8bb
2025-01-11 16:41:09 +01:00

76 lines
3.1 KiB
Java

package h04.movement;
import fopbot.Robot;
import fopbot.World;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.objectweb.asm.Type;
import org.sourcegrade.jagr.api.rubric.TestForSubmission;
import org.tudalgo.algoutils.transform.SubmissionExecutionHandler;
import org.tudalgo.algoutils.transform.util.headers.ClassHeader;
import org.tudalgo.algoutils.transform.util.headers.MethodHeader;
import org.tudalgo.algoutils.tutor.general.assertions.Context;
import java.util.Arrays;
import static org.tudalgo.algoutils.tutor.general.assertions.Assertions2.assertEquals;
import static org.tudalgo.algoutils.tutor.general.assertions.Assertions2.assertTrue;
import static org.tudalgo.algoutils.tutor.general.assertions.Assertions2.call;
import static org.tudalgo.algoutils.tutor.general.assertions.Assertions2.contextBuilder;
import static org.tudalgo.algoutils.tutor.general.assertions.Assertions2.emptyContext;
@TestForSubmission
public class TeleportingMoveStrategyTest {
private final MethodHeader teleportingMoveStrategy_move = MethodHeader.of(TeleportingMoveStrategy.class,
"move", Robot.class, int.class, int.class);
@AfterEach
public void tearDown() {
SubmissionExecutionHandler.resetAll();
}
@Test
public void testClassHeader() {
ClassHeader originalClassHeader = SubmissionExecutionHandler.getOriginalClassHeader(TeleportingMoveStrategy.class);
assertTrue(Arrays.stream(originalClassHeader.interfaces()).anyMatch(s -> s.equals(Type.getInternalName(MoveStrategy.class))),
emptyContext(),
result -> "Class h04.movement.TeleportingMoveStrategy does not implement interface h04.movement.MoveStrategy");
}
@ParameterizedTest
@ValueSource(ints = {0, 1, 2, 4, 5, 6, 8, 9, 10})
public void testMove(int n) { // encoding: 4 bits, lower 2: x-coordinate, upper 2: y-coordinate
SubmissionExecutionHandler.Delegation.disable(teleportingMoveStrategy_move);
Robot robot = setupEnvironment();
int expectedX = n & 0b11;
int expectedY = n >> 2;
int dx = expectedX - 1;
int dy = expectedY - 1;
Context context = contextBuilder()
.add("robot", robot)
.add("dx", dx)
.add("dy", dy)
.build();
TeleportingMoveStrategy teleportingMoveStrategyInstance = new TeleportingMoveStrategy();
call(() -> teleportingMoveStrategyInstance.move(robot, dx, dy), context, result ->
"An exception occurred while invoking method move");
assertEquals(expectedX, robot.getX(), context, result -> "Robot was not teleported to correct x-coordinate");
assertEquals(expectedY, robot.getY(), context, result -> "Robot was not teleported to correct y-coordinate");
}
private Robot setupEnvironment() {
World.setSize(3, 3);
World.setDelay(0);
return new Robot(1, 1) {
@Override
public void move() {
// do nothing
}
};
}
}