]> gitweb.michael.orlitzky.com - spline3.git/blob - test/TestSuite.hs
Add doctests to the test suite.
[spline3.git] / test / TestSuite.hs
1 module TestSuite
2 where
3
4 import Test.Framework (defaultMain, testGroup, Test, TestName, TestOptions(..))
5 import Test.Framework.Providers.API (TestName)
6 import Test.Framework.Providers.DocTest
7 import Test.Framework.Providers.HUnit (testCase)
8 import Test.Framework.Providers.QuickCheck2 (testProperty)
9 import Test.HUnit
10 import Test.QuickCheck (Testable ())
11
12 import Tests.Cardinal
13 import Tests.Cube as TC
14 import Tests.FunctionValues
15 import Tests.Grid
16 import Tests.Misc
17 import Tests.Tetrahedron as TT
18
19 main :: IO ()
20 main = do
21 dt <- docTest ["src/Everything.hs"] ["-isrc"]
22 defaultMain $ [dt] -- ++ tests
23
24 -- | Defined so that my test names fit on one line.
25 tc :: Test.Framework.Providers.API.TestName -> Test.HUnit.Assertion -> Test.Framework.Test
26 tc = testCase
27
28 cardinal_tests :: Test.Framework.Test
29 cardinal_tests =
30 testGroup "Cardinal Tests" [
31 tc "c-tilde_2100 rotation correct" test_c_tilde_2100_rotation_correct ]
32
33 function_values_tests :: Test.Framework.Test
34 function_values_tests =
35 testGroup "FunctionValues Tests" [ tc "test directions" test_directions ]
36
37 grid_tests :: Test.Framework.Test
38 grid_tests =
39 testGroup "Grid Tests" [
40 tc "trilinear c0030" test_trilinear_c0030,
41 tc "trilinear c0003" test_trilinear_c0003,
42 tc "trilinear c0021" test_trilinear_c0021,
43 tc "trilinear c0012" test_trilinear_c0012,
44 tc "trilinear c0120" test_trilinear_c0120,
45 tc "trilinear c0102" test_trilinear_c0102,
46 tc "trilinear c0111" test_trilinear_c0111,
47 tc "trilinear c0210" test_trilinear_c0210,
48 tc "trilinear c0201" test_trilinear_c0201,
49 tc "trilinear c0300" test_trilinear_c0300,
50 tc "trilinear c1020" test_trilinear_c1020,
51 tc "trilinear c1002" test_trilinear_c1002,
52 tc "trilinear c1011" test_trilinear_c1011,
53 tc "trilinear c1110" test_trilinear_c1110,
54 tc "trilinear c1101" test_trilinear_c1101,
55 tc "trilinear c1200" test_trilinear_c1200,
56 tc "trilinear c2010" test_trilinear_c2010,
57 tc "trilinear c2001" test_trilinear_c2001,
58 tc "trilinear c2100" test_trilinear_c2100,
59 tc "trilinear c3000" test_trilinear_c3000,
60 tc "trilinear f0_t0_v0" test_trilinear_f0_t0_v0,
61 tc "trilinear f0_t0_v1" test_trilinear_f0_t0_v1,
62 tc "trilinear f0_t0_v2" test_trilinear_f0_t0_v2,
63 tc "trilinear f0_t0_v3" test_trilinear_f0_t0_v3,
64 tc "trilinear reproduced" test_trilinear_reproduced,
65 tc "zeros reproduced" test_zeros_reproduced ]
66
67
68 misc_tests :: Test.Framework.Test
69 misc_tests =
70 testGroup "Misc Tests" [
71 tc "flatten (1)" test_flatten1 ]
72
73 tetrahedron_tests :: Test.Framework.Test
74 tetrahedron_tests =
75 testGroup "Tetrahedron Tests" [
76 tc "volume (1)" test_volume1,
77 tc "volume (2)" test_volume2,
78 tc "contains point (1)" test_contains_point1,
79 tc "doesn't contain point (1)" test_doesnt_contain_point1,
80 tc "doesn't contain point (2)" test_doesnt_contain_point2,
81 tc "doesn't contain point (3)" test_doesnt_contain_point3,
82 tc "doesn't contain point (4)" test_doesnt_contain_point4,
83 tc "doesn't contain point (5)" test_doesnt_contain_point5 ]
84
85 -- | Defined so that my test names fit on one line.
86 tp :: Test.QuickCheck.Testable a => Test.Framework.TestName -> a -> Test.Framework.Test
87 tp = testProperty
88
89 misc_properties :: Test.Framework.Test
90 misc_properties =
91 testGroup "Misc Properties" [
92 tp "factorial greater" prop_factorial_greater ]
93
94 cardinal_properties :: Test.Framework.Test
95 cardinal_properties =
96 testGroup "Cardinal Properties" [
97 tp "ccwx rotation changes direction" prop_ccwx_rotation_changes_direction,
98 tp "cwx rotation changes direction" prop_cwx_rotation_changes_direction,
99 tp "ccwy rotation changes direction" prop_ccwy_rotation_changes_direction,
100 tp "cwy rotation changes direction" prop_cwy_rotation_changes_direction,
101 tp "ccwz rotation changes direction" prop_ccwz_rotation_changes_direction,
102 tp "cwz rotation changes direction" prop_cwz_rotation_changes_direction,
103 tp "ccwx rotation result unique" prop_ccwx_rotation_result_unique,
104 tp "cwx rotation result unique" prop_cwx_rotation_result_unique,
105 tp "ccwy rotation result unique" prop_ccwy_rotation_result_unique,
106 tp "cwy rotation result unique" prop_cwy_rotation_result_unique,
107 tp "ccwz rotation result unique" prop_ccwz_rotation_result_unique,
108 tp "cwz rotation result unique" prop_cwz_rotation_result_unique,
109 tp "four cwx is identity" prop_four_cwx_is_identity,
110 tp "four ccwx is identity" prop_four_ccwx_is_identity,
111 tp "four cwy is identity" prop_four_cwy_is_identity,
112 tp "four ccwy is identity" prop_four_ccwy_is_identity,
113 tp "four cwz is identity" prop_four_cwz_is_identity,
114 tp "four ccwz is identity" prop_four_ccwz_is_identity]
115
116
117 p78_24_properties :: Test.Framework.Test
118 p78_24_properties =
119 testGroup "p. 78, Section (2.4) Properties" [
120 tp "c3000 identity" TT.prop_c3000_identity,
121 tp "c2100 identity" TT.prop_c2100_identity,
122 tp "c1110 _identity" TT.prop_c1110_identity]
123
124 p78_25_properties :: Test.Framework.Test
125 p78_25_properties =
126 testGroup "p. 78, Section (2.5) Properties" [
127 tp "c_ijk1 identity" prop_cijk1_identity ]
128
129 edge_incidence_tests :: Test.Framework.Test
130 edge_incidence_tests =
131 testGroup "Edge Incidence Tests" [
132 tp "t0 shares edge with t6" prop_t0_shares_edge_with_t6,
133 tp "t0 shares edge with t1" prop_t0_shares_edge_with_t1,
134 tp "t0 shares edge with t3" prop_t0_shares_edge_with_t3,
135 tp "t1 shares edge with t2" prop_t1_shares_edge_with_t2,
136 tp "t1 shares edge with t19" prop_t1_shares_edge_with_t19,
137 tp "t2 shares edge with t3" prop_t2_shares_edge_with_t3,
138 tp "t2 shares edge with t12" prop_t2_shares_edge_with_t12,
139 tp "t3 shares edge with t21" prop_t3_shares_edge_with_t21,
140 tp "t4 shares edge with t5" prop_t4_shares_edge_with_t5,
141 tp "t4 shares edge with t7" prop_t4_shares_edge_with_t7,
142 tp "t4 shares edge with t10" prop_t4_shares_edge_with_t10,
143 tp "t5 shares edge with t6" prop_t5_shares_edge_with_t6,
144 tp "t5 shares edge with t16" prop_t5_shares_edge_with_t16,
145 tp "t6 shares edge with t7" prop_t6_shares_edge_with_t7,
146 tp "t7 shares edge with t20" prop_t7_shares_edge_with_t20 ]
147
148
149 p79_26_properties :: Test.Framework.Test
150 p79_26_properties =
151 testGroup "p. 79, Section (2.6) Properties" [
152 tp "c0120 identity1" TC.prop_c0120_identity1,
153 tp "c0120 identity2" TC.prop_c0120_identity2,
154 tp "c0120 identity3" TC.prop_c0120_identity3,
155 --
156 -- These repeats of the previous test are failing at the moment.
157 --
158 -- tp "c0120 identity4" TC.prop_c0120_identity4,
159 -- tp "c0120 identity5" TC.prop_c0120_identity5,
160 -- tp "c0120 identity6" TC.prop_c0120_identity6,
161 tp "c0210 identity1" TC.prop_c0210_identity1,
162 tp "c0300 identity1" TC.prop_c0300_identity1,
163 tp "c1110 identity" TC.prop_c1110_identity,
164 tp "c1200 identity1" TC.prop_c1200_identity1,
165 tp "c2100 identity1" TC.prop_c2100_identity1]
166
167 p79_27_properties :: Test.Framework.Test
168 p79_27_properties =
169 testGroup "p. 79, Section (2.7) Properties" [
170 tp "c0102 identity1" TC.prop_c0102_identity1,
171 tp "c0201 identity1" TC.prop_c0201_identity1,
172 tp "c0300 identity2" TC.prop_c0300_identity2,
173 tp "c1101 identity" TC.prop_c1101_identity,
174 tp "c1200 identity2" TC.prop_c1200_identity2,
175 tp "c2100 identity2" TC.prop_c2100_identity2 ]
176
177
178 p79_28_properties :: Test.Framework.Test
179 p79_28_properties =
180 testGroup "p. 79, Section (2.8) Properties" [
181 tp "c3000 identity" TC.prop_c3000_identity,
182 tp "c2010 identity" TC.prop_c2010_identity,
183 tp "c2001 identity" TC.prop_c2001_identity,
184 tp "c1020 identity" TC.prop_c1020_identity,
185 tp "c1002 identity" TC.prop_c1002_identity,
186 tp "c1011 identity" TC.prop_c1011_identity ]
187
188
189 cube_properties :: Test.Framework.Test
190 cube_properties =
191 testGroup "Cube Properties" [
192 tp "all volumes positive" prop_all_volumes_positive,
193 tp "tetrahedron0 volumes exact" prop_tetrahedron0_volumes_exact,
194 tp "tetrahedron1 volumes exact" prop_tetrahedron1_volumes_exact,
195 tp "tetrahedron2 volumes exact" prop_tetrahedron2_volumes_exact,
196 tp "tetrahedron3 volumes exact" prop_tetrahedron3_volumes_exact,
197 tp "tetrahedron4 volumes exact" prop_tetrahedron4_volumes_exact,
198 tp "tetrahedron5 volumes exact" prop_tetrahedron5_volumes_exact,
199 tp "tetrahedron6 volumes exact" prop_tetrahedron6_volumes_exact,
200 tp "tetrahedron7 volumes exact" prop_tetrahedron7_volumes_exact,
201 tp "tetrahedron8 volumes exact" prop_tetrahedron8_volumes_exact,
202 tp "tetrahedron9 volumes exact" prop_tetrahedron9_volumes_exact,
203 tp "tetrahedron10 volumes exact" prop_tetrahedron10_volumes_exact,
204 tp "tetrahedron11 volumes exact" prop_tetrahedron11_volumes_exact,
205 tp "tetrahedron12 volumes exact" prop_tetrahedron12_volumes_exact,
206 tp "tetrahedron13 volumes exact" prop_tetrahedron13_volumes_exact,
207 tp "tetrahedron14 volumes exact" prop_tetrahedron14_volumes_exact,
208 tp "tetrahedron15 volumes exact" prop_tetrahedron15_volumes_exact,
209 tp "tetrahedron16 volumes exact" prop_tetrahedron16_volumes_exact,
210 tp "tetrahedron17 volumes exact" prop_tetrahedron17_volumes_exact,
211 tp "tetrahedron18 volumes exact" prop_tetrahedron18_volumes_exact,
212 tp "tetrahedron19 volumes exact" prop_tetrahedron19_volumes_exact,
213 tp "tetrahedron20 volumes exact" prop_tetrahedron20_volumes_exact,
214 tp "tetrahedron21 volumes exact" prop_tetrahedron21_volumes_exact,
215 tp "tetrahedron22 volumes exact" prop_tetrahedron22_volumes_exact,
216 tp "tetrahedron23 volumes exact" prop_tetrahedron23_volumes_exact,
217 tp "tetrahedron0 volumes positive" prop_tetrahedron0_volumes_positive,
218 tp "tetrahedron1 volumes positive" prop_tetrahedron1_volumes_positive,
219 tp "tetrahedron2 volumes positive" prop_tetrahedron2_volumes_positive,
220 tp "tetrahedron3 volumes positive" prop_tetrahedron3_volumes_positive,
221 tp "tetrahedron4 volumes positive" prop_tetrahedron4_volumes_positive,
222 tp "tetrahedron5 volumes positive" prop_tetrahedron5_volumes_positive,
223 tp "tetrahedron6 volumes positive" prop_tetrahedron6_volumes_positive,
224 tp "tetrahedron7 volumes positive" prop_tetrahedron7_volumes_positive,
225 tp "tetrahedron8 volumes positive" prop_tetrahedron8_volumes_positive,
226 tp "tetrahedron9 volumes positive" prop_tetrahedron9_volumes_positive,
227 tp "tetrahedron10 volumes positive" prop_tetrahedron10_volumes_positive,
228 tp "tetrahedron11 volumes positive" prop_tetrahedron11_volumes_positive,
229 tp "tetrahedron12 volumes positive" prop_tetrahedron12_volumes_positive,
230 tp "tetrahedron13 volumes positive" prop_tetrahedron13_volumes_positive,
231 tp "tetrahedron14 volumes positive" prop_tetrahedron14_volumes_positive,
232 tp "tetrahedron15 volumes positive" prop_tetrahedron15_volumes_positive,
233 tp "tetrahedron16 volumes positive" prop_tetrahedron16_volumes_positive,
234 tp "tetrahedron17 volumes positive" prop_tetrahedron17_volumes_positive,
235 tp "tetrahedron18 volumes positive" prop_tetrahedron18_volumes_positive,
236 tp "tetrahedron19 volumes positive" prop_tetrahedron19_volumes_positive,
237 tp "tetrahedron20 volumes positive" prop_tetrahedron20_volumes_positive,
238 tp "tetrahedron21 volumes positive" prop_tetrahedron21_volumes_positive,
239 tp "tetrahedron22 volumes positive" prop_tetrahedron22_volumes_positive,
240 tp "tetrahedron23 volumes positive" prop_tetrahedron23_volumes_positive,
241 tp "v0 all equal" prop_v0_all_equal,
242 tp "interior values all identical" prop_interior_values_all_identical,
243 tp "c-tilde_2100 rotation correct" prop_c_tilde_2100_rotation_correct,
244 tp "c-tilde_2100 correct" prop_c_tilde_2100_correct ]
245
246
247 tetrahedron_properties :: Test.Framework.Test
248 tetrahedron_properties =
249 testGroup "Tetrahedron Properties" [
250 tp "b0_v0_always_unity" prop_b0_v0_always_unity,
251 tp "b0_v1_always_zero" prop_b0_v1_always_zero,
252 tp "b0_v2_always_zero" prop_b0_v2_always_zero,
253 tp "b0_v3_always_zero" prop_b0_v3_always_zero,
254 tp "b1_v1_always_unity" prop_b1_v1_always_unity,
255 tp "b1_v0_always_zero" prop_b1_v0_always_zero,
256 tp "b1_v2_always_zero" prop_b1_v2_always_zero,
257 tp "b1_v3_always_zero" prop_b1_v3_always_zero,
258 tp "b2_v2_always_unity" prop_b2_v2_always_unity,
259 tp "b2_v0_always_zero" prop_b2_v0_always_zero,
260 tp "b2_v1_always_zero" prop_b2_v1_always_zero,
261 tp "b2_v3_always_zero" prop_b2_v3_always_zero,
262 tp "b3_v3_always_unity" prop_b3_v3_always_unity,
263 tp "b3_v0_always_zero" prop_b3_v0_always_zero,
264 tp "b3_v1_always_zero" prop_b3_v1_always_zero,
265 tp "b3_v2_always_zero" prop_b3_v2_always_zero,
266 tp "swapping_vertices_doesnt_affect_coefficients1"
267 $ prop_swapping_vertices_doesnt_affect_coefficients1,
268 tp "swapping_vertices_doesnt_affect_coefficients2"
269 $ prop_swapping_vertices_doesnt_affect_coefficients2,
270 tp "swapping_vertices_doesnt_affect_coefficients3"
271 $ prop_swapping_vertices_doesnt_affect_coefficients3,
272 tp "swapping_vertices_doesnt_affect_coefficients4"
273 $ prop_swapping_vertices_doesnt_affect_coefficients4,
274 tp "x rotation doesn't affect front" prop_x_rotation_doesnt_affect_front,
275 tp "x rotation doesn't affect back" prop_x_rotation_doesnt_affect_back,
276 tp "y rotation doesn't affect left" prop_y_rotation_doesnt_affect_left,
277 tp "y rotation doesn't affect right" prop_y_rotation_doesnt_affect_right,
278 tp "z rotation doesn't affect top" prop_z_rotation_doesnt_affect_top,
279 tp "z rotation doesn't affect down" prop_z_rotation_doesnt_affect_down ]
280
281 tests :: [Test.Framework.Test]
282 tests = [ cardinal_tests,
283 function_values_tests,
284 grid_tests,
285 misc_tests,
286 tetrahedron_tests,
287 cube_properties,
288 tetrahedron_properties,
289 misc_properties,
290 cardinal_properties,
291 edge_incidence_tests,
292 p78_24_properties,
293 -- p78_25_properties,
294 p79_26_properties,
295 p79_27_properties,
296 p79_28_properties ]