package org.opencv.test.core;

import org.opencv.core.Point;
import org.opencv.core.Point3;
import org.opencv.test.OpenCVTestCase;

public class Point3Test extends OpenCVTestCase {

    private Point3 p1;
    private Point3 p2;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        p1 = new Point3(2, 2, 2);
        p2 = new Point3(1, 1, 1);
    }

    public void testClone() {
        Point3 truth = new Point3(1, 1, 1);
        p1 = truth.clone();
        assertEquals(truth, p1);
    }

    public void testCross() {
        Point3 dstPoint = p1.cross(p2);
        Point3 truth = new Point3(0, 0, 0);
        assertEquals(truth, dstPoint);
    }

    public void testDot() {
        double result = p1.dot(p2);
        assertEquals(6.0, result);
    }

    public void testEqualsObject() {
        boolean flag = p1.equals(p1);
        assertTrue(flag);

        flag = p1.equals(p2);
        assertFalse(flag);
    }

    public void testHashCode() {
        assertEquals(p1.hashCode(), p1.hashCode());
    }

    public void testPoint3() {
        p1 = new Point3();

        assertNotNull(p1);
        assertTrue(0 == p1.x);
        assertTrue(0 == p1.y);
        assertTrue(0 == p1.z);
    }

    public void testPoint3DoubleArray() {
        double[] vals = { 1, 2, 3 };
        p1 = new Point3(vals);

        assertTrue(1 == p1.x);
        assertTrue(2 == p1.y);
        assertTrue(3 == p1.z);
    }

    public void testPoint3DoubleDoubleDouble() {
        p1 = new Point3(1, 2, 3);

        assertEquals(1., p1.x);
        assertEquals(2., p1.y);
        assertEquals(3., p1.z);
    }

    public void testPoint3Point() {
        Point p = new Point(2, 3);
        p1 = new Point3(p);

        assertEquals(2., p1.x);
        assertEquals(3., p1.y);
        assertEquals(0., p1.z);
    }

    public void testSet() {
        double[] vals1 = {};
        p1.set(vals1);

        assertEquals(0., p1.x);
        assertEquals(0., p1.y);
        assertEquals(0., p1.z);

        double[] vals2 = { 3, 6, 10 };
        p1.set(vals2);

        assertEquals(3., p1.x);
        assertEquals(6., p1.y);
        assertEquals(10., p1.z);
    }
    
    public void testToString() {
        String actual = p1.toString();
        String expected = "{2.0, 2.0, 2.0}";
        assertEquals(expected, actual);
    }


}
