1 module tests.matrix_3x2d_test;
2 
3 import std.stdio;
4 import tests.dunit_tests;
5 import Math = math;
6 import matrix_3x2d;
7 import vector_2d;
8 
9 /*
10  * The MIT License
11  *
12  * Copyright (c) 2017-2021 JOML.
13  #$%^ Translated by jordan4ibanez
14  *
15  * Permission is hereby granted, free of charge, to any person obtaining a copy
16  * of this software and associated documentation files (the "Software"), to deal
17  * in the Software without restriction, including without limitation the rights
18  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19  * copies of the Software, and to permit persons to whom the Software is
20  * furnished to do so, subject to the following conditions:
21  *
22  * The above copyright notice and this permission notice shall be included in
23  * all copies or substantial portions of the Software.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
31  * THE SOFTWARE.
32  */
33 
34 /**
35  * Tests for the {@link Matrix3x2d} class.
36  * 
37  * @author Kai Burjack
38  */
39 unittest {
40 
41     writeln("\nBEGINNING MATRIX3X2D TESTS\n");
42 
43     
44     // testInvert
45     {
46         Matrix3x2d m = Matrix3x2d(1, 2, 4, 5, -0.5, -2.0);
47         Vector2d v = Vector2d(4, 0.5);
48         m.transformPosition(v);
49         Vector2d v2 = Vector2d(v);
50         m.invert();
51         m.transformPosition(v2);
52         assertVector2dEquals(Vector2d(4, 0.5), v2, MANY_OPS_AROUND_ZERO_PRECISION_DOUBLE);
53     }
54 
55     // testView
56     {
57         Matrix3x2d m = Matrix3x2d().view(-4, 0.5, -2, 3);
58         Vector2d v = Vector2d(-4, -2);
59         m.transformPosition(v);
60         assertVector2dEquals(Vector2d(-1, -1), v, MANY_OPS_AROUND_ZERO_PRECISION_DOUBLE);
61         v.set(0.5f, 3);
62         m.transformPosition(v);
63         assertVector2dEquals(Vector2d(1, 1), v, MANY_OPS_AROUND_ZERO_PRECISION_DOUBLE);
64     }
65 
66     // testUnproject
67     {
68 
69         // Another test where the blank value was inline as an object
70         // This fixes it
71         Vector2d blank = Vector2d();
72         Matrix3x2d m = Matrix3x2d().view(-3, 2, -4, 1);
73         assertVector2dEquals(Vector2d(-3, -4), m.unproject(0, 0, [0, 0, 800, 600], blank), MANY_OPS_AROUND_ZERO_PRECISION_DOUBLE);
74         // Needs to zero out as the next function was using the same thing
75         blank.zero();
76         assertVector2dEquals(Vector2d(2, 1), m.unproject(800, 600, [0, 0, 800, 600], blank), MANY_OPS_AROUND_ZERO_PRECISION_DOUBLE);
77     }
78 
79     // testTestPoint
80     {
81         Matrix3x2d m = Matrix3x2d().view(-4, 2, -3, 10);
82         assertTrue(m.testPoint(0, 0));
83         assertTrue(m.testPoint(-4, -2.9));
84         assertFalse(m.testPoint(-4.01, -2.9));
85         assertFalse(m.testPoint(-3.9, -3.01));
86         assertTrue(m.testPoint(0, 9.99));
87         assertFalse(m.testPoint(0, 10.01));
88 
89         // rotated
90         m.setView(-2, 2, -2, 2).rotate(Math.toRadians(45));
91         double[] area = m.viewArea(new double[4]);
92         assertTrue(m.testPoint(area[0], 0));
93         assertFalse(m.testPoint(area[0]-0.01, 0));
94         assertTrue(m.testPoint(area[2]-0.1, 0));
95         assertFalse(m.testPoint(area[2]+0.01, 0));
96     }
97 
98     writeln("PASSED!");
99 
100 }