001/**
002 * Copyright (c) 2008-2014 Ardor Labs, Inc.
003 *
004 * This file is part of Ardor3D.
005 *
006 * Ardor3D is free software: you can redistribute it and/or modify it 
007 * under the terms of its license which may be found in the accompanying
008 * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
009 */
010
011package com.ardor3d.math;
012
013import static org.junit.Assert.*;
014
015import org.junit.Test;
016
017public class TestTriangle {
018
019    @Test
020    public void testGetSet() {
021        final Triangle tri1 = new Triangle();
022        assertEquals(Vector3.ZERO, tri1.getA());
023        assertEquals(Vector3.ZERO, tri1.getB());
024        assertEquals(Vector3.ZERO, tri1.getC());
025        assertTrue(tri1.getIndex() == 0);
026
027        tri1.setA(Vector3.NEG_ONE);
028        tri1.setB(Vector3.UNIT_X);
029        tri1.setC(Vector3.UNIT_Z);
030        tri1.setIndex(1);
031        assertEquals(Vector3.NEG_ONE, tri1.getA());
032        assertEquals(Vector3.UNIT_X, tri1.getB());
033        assertEquals(Vector3.UNIT_Z, tri1.getC());
034        assertTrue(tri1.getIndex() == 1);
035
036        final Triangle tri2 = new Triangle(tri1);
037        assertEquals(Vector3.NEG_ONE, tri2.getA());
038        assertEquals(Vector3.UNIT_X, tri2.getB());
039        assertEquals(Vector3.UNIT_Z, tri2.getC());
040        assertTrue(tri2.getIndex() == 1);
041
042        final Triangle tri3 = new Triangle(Vector3.ONE, Vector3.UNIT_Y, Vector3.NEG_ONE);
043        assertEquals(Vector3.ONE, tri3.getA());
044        assertEquals(Vector3.UNIT_Y, tri3.getB());
045        assertEquals(Vector3.NEG_ONE, tri3.getC());
046        assertTrue(tri3.getIndex() == 0);
047
048        final Triangle tri4 = new Triangle(Vector3.ONE, Vector3.UNIT_Y, Vector3.NEG_ONE, 42);
049        assertEquals(Vector3.ONE, tri4.getA());
050        assertEquals(Vector3.UNIT_Y, tri4.getB());
051        assertEquals(Vector3.NEG_ONE, tri4.getC());
052        assertTrue(tri4.getIndex() == 42);
053
054        tri2.set(0, Vector3.UNIT_X);
055        tri2.set(1, Vector3.UNIT_Y);
056        tri2.set(2, Vector3.UNIT_Z);
057
058        // catch a few expected exceptions
059        try {
060            tri2.get(3);
061            fail("get(3) should have thrown IllegalArgumentException.");
062        } catch (final IllegalArgumentException e) {
063        }
064        try {
065            tri2.get(-1);
066            fail("get(-1) should have thrown IllegalArgumentException.");
067        } catch (final IllegalArgumentException e) {
068        }
069        try {
070            tri2.set(-1, Vector3.ZERO);
071            fail("set(-1, 0) should have thrown IllegalArgumentException.");
072        } catch (final IllegalArgumentException e) {
073        }
074        try {
075            tri2.set(3, Vector3.ZERO);
076            fail("set(3, 0) should have thrown IllegalArgumentException.");
077        } catch (final IllegalArgumentException e) {
078        }
079
080        // shouldn't have changed
081        assertEquals(Vector3.UNIT_X, tri2.get(0));
082        assertEquals(Vector3.UNIT_Y, tri2.get(1));
083        assertEquals(Vector3.UNIT_Z, tri2.get(2));
084    }
085
086    @Test
087    public void testEquals() {
088        // couple of equals validity tests
089        final Triangle tri1 = new Triangle();
090        assertEquals(tri1, tri1);
091        assertFalse(tri1.equals(null));
092        assertFalse(tri1.equals(new Vector2()));
093
094        // throw in a couple pool accesses for coverage
095        final Triangle tri2 = Triangle.fetchTempInstance();
096        tri2.set(tri1);
097        assertEquals(tri1, tri2);
098        assertNotSame(tri1, tri2);
099        Triangle.releaseTempInstance(tri2);
100
101        // cover more of equals
102        assertTrue(tri1.equals(new Triangle(Vector3.ZERO, Vector3.ZERO, Vector3.ZERO)));
103        assertFalse(tri1.equals(new Triangle(Vector3.ZERO, Vector3.ZERO, Vector3.UNIT_X)));
104        assertFalse(tri1.equals(new Triangle(Vector3.ZERO, Vector3.UNIT_X, Vector3.UNIT_X)));
105        assertFalse(tri1.equals(new Triangle(Vector3.ZERO, Vector3.UNIT_X, Vector3.ZERO)));
106        assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.ZERO, Vector3.ZERO)));
107        assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.ZERO, Vector3.UNIT_X)));
108        assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.UNIT_X, Vector3.ZERO)));
109        assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.UNIT_X, Vector3.UNIT_X)));
110    }
111
112    @Test
113    public void testValid() {
114        final Triangle vec1 = new Triangle();
115        final Triangle vec2 = new Triangle(new Vector3(0, 0, Double.NaN), Vector3.ZERO, Vector3.ZERO);
116        final Triangle vec3 = new Triangle(Vector3.ZERO, new Vector3(0, 0, Double.NaN), Vector3.ZERO);
117        final Triangle vec4 = new Triangle(Vector3.ZERO, Vector3.ZERO, new Vector3(0, 0, Double.NaN));
118
119        assertTrue(Triangle.isValid(vec1));
120        assertFalse(Triangle.isValid(vec2));
121        assertFalse(Triangle.isValid(vec3));
122        assertFalse(Triangle.isValid(vec4));
123
124        vec4.setC(Vector3.ZERO);
125        assertTrue(Triangle.isValid(vec4));
126
127        assertFalse(Triangle.isValid(null));
128    }
129
130    @Test
131    public void testSimpleHash() {
132        // Just a simple sanity check.
133        final Triangle tri1 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.NEG_ONE, 1);
134        final Triangle tri2 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.NEG_ONE, 1);
135        final Triangle tri3 = new Triangle(Vector3.ZERO, Vector3.UNIT_Z, Vector3.NEG_ONE, 2);
136
137        assertTrue(tri1.hashCode() == tri2.hashCode());
138        assertTrue(tri1.hashCode() != tri3.hashCode());
139    }
140
141    @Test
142    public void testClone() {
143        final Triangle tri1 = new Triangle();
144        final Triangle tri2 = tri1.clone();
145        assertEquals(tri1, tri2);
146        assertNotSame(tri1, tri2);
147    }
148
149    @Test
150    public void testCenter() {
151        final Triangle tri1 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.UNIT_X, 0);
152        assertEquals(new Vector3(1 / 3., 1 / 3., 0), tri1.getCenter()); // dirty
153        assertEquals(new Vector3(1 / 3., 1 / 3., 0), tri1.getCenter()); // clean
154        tri1.setA(Vector3.ONE);
155        assertEquals(new Vector3(2 / 3., 2 / 3., 1 / 3.), tri1.getCenter()); // dirty, but with existing center
156    }
157
158    @Test
159    public void testNormal() {
160        final Triangle tri1 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.UNIT_X, 0);
161        assertEquals(new Vector3(0, 0, -1), tri1.getNormal()); // dirty
162        assertEquals(new Vector3(0, 0, -1), tri1.getNormal()); // clean
163        tri1.setB(Vector3.UNIT_Z);
164        assertEquals(new Vector3(0, 1, 0), tri1.getNormal()); // dirty, but with existing normal
165    }
166}