package tc.oc.commons.bukkit.geometry;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;

@RunWith(JUnit4.class)
public class CapsuleTest {

    @Test
    public void testIntersectsPoint() throws Exception {
        final Capsule C = Capsule.fromCenterAndRadius(LineSegment.of(0, 0, 0, 1, 1, 1), 0.5);
        assertTrue(C.intersects(ImVector.of(0, 0, 0)));
        assertTrue(C.intersects(ImVector.of(1, 1, 1)));
        assertTrue(C.intersects(ImVector.of(0.5, 0.5, 0.5)));
        assertTrue(C.intersects(ImVector.of(0.5, 0, 0)));
        assertFalse(C.intersects(ImVector.of(0.9, 0, 0)));
    }

    @Test
    public void testIntersectsSphere() throws Exception {
        final Capsule C = Capsule.fromCenterAndRadius(LineSegment.of(0, 0, 0, 1, 1, 1), 0.5);
        assertTrue(C.intersects(Sphere.fromCenterAndRadius(ImVector.of(1, 0, 0), 0.5)));
        assertFalse(C.intersects(Sphere.fromCenterAndRadius(ImVector.of(2, 0, 0), 0.5)));
        assertTrue(C.intersects(Sphere.fromCenterAndRadius(ImVector.of(2, 1, 2), 1)));
        assertTrue(C.intersects(Sphere.fromCenterAndRadius(ImVector.of(2, 2, 2), 1.3)));

        final Capsule LONG = Capsule.fromCenterAndRadius(LineSegment.of(0, 0, 0, 10, 10, 10), 1);
        assertTrue(LONG.intersects(Sphere.fromCenterAndRadius(ImVector.of(5, 5, 5), 1)));
        assertTrue(LONG.intersects(Sphere.fromCenterAndRadius(ImVector.of(6, 5, 5), 1)));
        assertFalse(LONG.intersects(Sphere.fromCenterAndRadius(ImVector.of(8, 5, 5), 1)));
    }
}
