1 module dsurf.tests.cartesian;
2 
3 import std.math;
4 import std.exception;
5 import dsurf.cartesian;
6 
7 /**
8 Defaul constructor tests
9 */
10 unittest {
11     auto surface = new CartesianSurface;
12     surface.setHeader(2, 2, 0, 0, 500, 500);
13     surface.assignConstant(50);
14     foreach(i; 0 .. surface.nx)
15         foreach(j; 0 .. surface.ny)
16             assert(surface.z[i][j] == 50);
17 }
18 
19 /**
20 Checks for an attempt to set zero or negative surface size
21 */
22 unittest {
23     auto surface = new CartesianSurface;
24     assertThrown!Exception(surface.setHeader(0, 5, 0, 0, 25, 25));
25     assertThrown!Exception(surface.setHeader(5, 0, 0, 0, 25, 25));
26     assertThrown!Exception(surface.setHeader(5, -5, 0, 0, 25, 25));
27     assertThrown!Exception(surface.setHeader(-5, 5, 0, 0, 25, 25));
28     assertThrown!Exception(surface.setHeader(-5, -5, 0, 0, 25, 25));
29 }
30 
31 /**
32 Unittest for copy construction and assignConstant.
33 Creates a surface, creates its copy, 
34 assigns other height values to the copy 
35 and checks if an original one remains unchanged
36 */
37 unittest {
38     auto surface = new CartesianSurface;
39     surface.setHeader(2, 2, 0, 0, 500, 500);
40     foreach(i; 0 .. surface.nx)
41         foreach(j; 0 .. surface.ny)
42             surface.z[i][j] = 50;
43 
44     auto s2 = new CartesianSurface(surface);
45     foreach(i; 0 .. surface.nx)
46         foreach(j; 0 .. surface.ny)
47             assert(s2.z[i][j] == 50);
48 
49     foreach(i; 0 .. surface.nx)
50         foreach(j; 0 .. surface.ny)
51             s2.z[i][j] = 10;
52 
53     foreach(i; 0 .. surface.nx)
54         foreach(j; 0 .. surface.ny)
55             assert(s2.z[i][j] == 10);
56 
57     foreach(i; 0 .. surface.nx)
58         foreach(j; 0 .. surface.ny)
59             assert(surface.z[i][j] == 50);
60 }
61 
62 /**
63 Tests for cellXIndex and cellYIndex methods
64 */
65 unittest {
66     auto surface = new CartesianSurface;
67     surface.setHeader(10, 10, 0, 1000, 500, 500);
68     assert(surface.cellXIndex(-1000) == -1);
69     assert(surface.cellYIndex(-1000) == -1);
70     assert(surface.cellXIndex(0) == 0);
71     assert(surface.cellYIndex(1000) == 0);
72     assert(surface.cellXIndex(550) == 1);
73     assert(surface.cellYIndex(1550) == 1);
74     assert(surface.cellXIndex(5000) == -1);
75     assert(surface.cellYIndex(6000) == -1);
76 }
77 
78 /**
79 Tests for getZ method
80 */
81 unittest {
82     import dsurf.io.cpsloader: Cps3Loader;
83     
84     auto loader = new Cps3Loader;
85     auto surface = loader.load("./test/test_pet_rect_blank.cps");
86     
87     assert(isNaN(surface.getZ(5600, 250)));
88     assert(!isNaN(surface.getZ(5600, 800)));
89     assert(isNaN(surface.getZ(5700, 600)));
90     assert(isNaN(surface.getZ(5600, 250)));
91     assert(isNaN(surface.getZ(5850, 250)));
92 }
93 
94 unittest {
95     import dsurf.io.cpsloader: Cps3Loader;
96     
97     auto loader = new Cps3Loader;
98     auto surface = loader.load("./test/test_pet_sq.cps");
99 
100     assert(surface.nx == 3);
101     assert(surface.ny == 3);
102     surface.z[1][1] = double.nan;
103     assert(isNaN(surface.getZ(5320.00, 700.00)));
104     assert(isNaN(surface.getZ(5650.00, 715.00)));
105     assert(isNaN(surface.getZ(5650.00, 300.00)));
106     assert(isNaN(surface.getZ(5315.00, 300.00)));
107 
108     assert(isClose(surface.getZ(5120.00, 850.00), 2.42));
109     assert(isClose(surface.getZ(5815.00, 850.00), 6.59));
110     assert(isClose(surface.getZ(5800.00, 200.00), 5.20));
111     assert(isClose(surface.getZ(5200.00, 200.00), 1.60));
112 }
113 
114 /**
115 Tests for assignment operators
116 */
117 unittest {
118     auto s1 = new CartesianSurface;
119     s1.setHeader(2, 2, 0, 0, 500, 500);
120     s1.assignConstant(50);
121 
122     auto s2 = new CartesianSurface(s1);
123     s2.assignConstant(10);
124 
125     s1 /= s2;
126     assert(s1.min() == 5);
127     assert(s1.max() == 5);
128 
129     s1 += s2;
130     assert(s1.min() == 15);
131     assert(s1.max() == 15);
132 
133     s1 *= s2;
134     assert(s1.min() == 150);
135     assert(s1.max() == 150);
136     
137     s1 -= s2;
138     assert(s1.min() == 140);
139     assert(s1.max() == 140);
140 }
141 
142 unittest {
143     auto surface = new CartesianSurface;
144     surface.setHeader(2, 2, 0, 0, 500, 500);
145     surface.assignConstant(50);
146     auto result = surface + surface;
147 
148     assert(surface.min() == 50);
149     assert(surface.max() == 50);
150     assert(result.min() == 100);
151     assert(result.max() == 100);
152 
153     result = surface * surface;
154     assert(surface.min() == 50);    // make sure that the original surface
155     assert(surface.max() == 50);    // didn't change
156     assert(result.min() == 2500);
157     assert(result.max() == 2500);
158     
159     result = surface - surface;
160     assert(surface.min() == 50);
161     assert(surface.max() == 50);
162     assert(result.min() == 0);
163     assert(result.max() == 0);
164     
165     result = surface / surface;
166     assert(surface.min() == 50);
167     assert(surface.max() == 50);
168     assert(result.min() == 1);
169     assert(result.max() == 1);
170 }
171 
172  unittest {
173     auto surface = new CartesianSurface;
174     surface.setHeader(2, 2, 0, 0, 500, 500);
175     surface.assignConstant(50);
176     auto result = surface + 10;
177     foreach (i; 0 .. surface.nx)
178         foreach (j; 0 .. surface.ny) {
179             assert(surface.z[i][j] == 50);
180             assert(result.z[i][j] == 60);
181         }
182     
183     result = surface - 20;
184     foreach (i; 0 .. surface.nx)
185         foreach (j; 0 .. surface.ny) {
186             assert(surface.z[i][j] == 50);
187             assert(result.z[i][j] == 30);
188         }
189 
190     result = surface * 2.5;
191     foreach (i; 0 .. surface.nx)
192         foreach (j; 0 .. surface.ny) {
193             assert(surface.z[i][j] == 50);
194             assert(result.z[i][j] == 125);
195         }
196 
197     result = surface / 5;
198     foreach (i; 0 .. surface.nx)
199         foreach (j; 0 .. surface.ny) {
200             assert(surface.z[i][j] == 50);
201             assert(result.z[i][j] == 10);
202         }
203 }