//package worms.model;
//
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.BeforeAll;
//import org.junit.jupiter.api.RepeatedTest;
//import static org.junit.jupiter.api.Assertions.*;
//import worms.util.Coordinate;
//
//import java.util.Random;
//
//class WormTest {
//
//    private static Worm worm;
//    private static Random r = new Random();
//
//    @BeforeAll
//    static void setUp() {
//        worm = new Worm(Coordinate.create(0.0, 0.0), 0, "Test", 1);
//    }
//
//    @RepeatedTest(5000)
//    void move() {
//        worm = new Worm(Coordinate.create(0.0, 0.0), 0, "Test", 1);
//        int steps = r.nextInt(5101) - 100;
//        double maxAngle = Math.abs(2 * Math.PI - worm.getOrientation());
//        double minAngle = worm.getOrientation();
//        double combAngle = maxAngle + minAngle;
//        double angle = r.nextDouble() * combAngle - minAngle;
//        worm.turn(angle);
//        long cost = (long) Math.ceil(Math.abs(Math.cos(worm.getOrientation())) + Math.abs(4 * Math.sin(worm.getOrientation()))) * steps;
//        if (steps < 0 || cost > worm.getActionPoints()) {
//            assertThrows(IllegalArgumentException.class, () -> worm.move(steps));
//        }
//        else {
//
//            double newLocX = worm.getLocation().item1 + steps * worm.getRadius() * Math.cos(worm.getOrientation());
//            double newLocY = worm.getLocation().item2 + steps * worm.getRadius() * Math.sin(worm.getOrientation());
//            worm.move(steps);
//            assertEquals(Coordinate.create(newLocX, newLocY), worm.getLocation());
//        }
//    }
//
//    @RepeatedTest(5000)
//    void turn() {
//        double angle = r.nextDouble() * 4 * Math.PI - 2 * Math.PI;
//        double oldAngle = worm.getOrientation();
//
//         if (!Worm.isValidOrientation(oldAngle + angle) || worm.getActionPoints() - (long) Math.ceil(Math.toDegrees(angle) / 6) < 0) {
//             assertThrows(AssertionError.class, () -> worm.turn(angle));
//             worm = new Worm(Coordinate.create(0.0, 0.0), 0, "Test", 1);
//         }
//         else {
//             worm.turn(angle);
//             assertEquals(oldAngle + angle, worm.getOrientation());
//         }
//
//    }
//
//    @Test
//    void turnInvalidValue() {
//        assertThrows(AssertionError.class, () -> worm.turn(Double.NaN));
//    }
//
//    @RepeatedTest(5000)
//    void jump() {
//
//        worm = new Worm(Coordinate.create(0.0, 0.0), 0, "Test", 1);
//        double maxAngle = Math.abs(2 * Math.PI - worm.getOrientation());
//        double minAngle = worm.getOrientation();
//        double combAngle = maxAngle + minAngle;
//        double angle = r.nextDouble() * combAngle - minAngle;
//        worm.turn(angle);
//        int steps = r.nextInt(100);
//        worm.move(steps);
//
//        if (worm.getOrientation() >= Math.PI || worm.getActionPoints() == 0){
//            assertThrows(IllegalStateException.class, () -> worm.jump());
//        }
//        else {
//            double orient = worm.getOrientation();
//            double force = 5 * worm.getActionPoints() + worm.getMass() * Worm.G;
//            double v = force / worm.getMass() * Worm.FORCE_TIME;
//            double newLocX = worm.getLocation().item1 + Math.pow(v, 2) * Math.sin(2 * orient) / Worm.G;
//            worm.jump();
//            assertEquals(Coordinate.create(newLocX, worm.getLocation().getY()), worm.getLocation());
//        }
//    }
//    @Test
//    void doubleJump() {
//        worm = new Worm(Coordinate.create(0.0, 0.0), 0, "Test", 1);
//        worm.jump();
//        assertThrows(IllegalStateException.class, () -> worm.jump());
//    }
//}