37#include "irplib_wcs.h"
43static void irplib_wcs_all_test(
int);
45static void irplib_wcs_mjd_test(
void);
47static void irplib_wcs_great_circle_dist_test(
void);
55 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
57 irplib_wcs_all_test(-1);
58 irplib_wcs_all_test(0);
59 irplib_wcs_all_test(1);
61 irplib_wcs_mjd_test();
63 irplib_wcs_great_circle_dist_test();
65 return cpl_test_end(0);
76static void irplib_wcs_all_test(
int naxismode)
78 const double xorig = 1.0;
79 const double yorig = 2.0;
82 cpl_propertylist * prop_wcs;
88 prop_wcs = cpl_propertylist_new();
89 cpl_test_nonnull(prop_wcs);
92 cpl_propertylist_append_int(prop_wcs,
"NAXIS", 1);
93 cpl_propertylist_append_int(prop_wcs,
"NAXIS1", 42);
95 else if (naxismode > 0) {
96 cpl_propertylist_append_int(prop_wcs,
"NAXIS", 2);
97 cpl_propertylist_append_int(prop_wcs,
"NAXIS1", 42);
98 cpl_propertylist_append_int(prop_wcs,
"NAXIS2", 42);
100 cpl_propertylist_append_double(prop_wcs,
"CRVAL1", 10.);
101 cpl_propertylist_append_double(prop_wcs,
"CRVAL2", 20.);
102 cpl_propertylist_append_int(prop_wcs,
"CRPIX1", 1);
103 cpl_propertylist_append_int(prop_wcs,
"CRPIX2", 2);
104 cpl_propertylist_append_double(prop_wcs,
"CD1_1", 10.);
105 cpl_propertylist_append_double(prop_wcs,
"CD1_2", 11.);
106 cpl_propertylist_append_double(prop_wcs,
"CD2_1", 13.);
107 cpl_propertylist_append_double(prop_wcs,
"CD2_2", 14.);
109 cpl_test_error(CPL_ERROR_NONE);
111 wcs = cpl_wcs_new_from_propertylist(prop_wcs);
112 cpl_propertylist_delete(prop_wcs);
114 if (cpl_error_get_code() == CPL_ERROR_NO_WCS) {
116 cpl_msg_warning(cpl_func,
"No WCS present. Tests disabled");
117 cpl_test_error(CPL_ERROR_NO_WCS);
122 cpl_test_nonnull(wcs);
125 error = irplib_wcs_xytoradec(wcs, xorig, yorig, &ra, &dec);
126 cpl_test_eq_error(error, CPL_ERROR_NONE);
129 error = irplib_wcs_radectoxy(wcs, ra, dec, &xnew, &ynew);
130 cpl_test_eq_error(error, CPL_ERROR_NONE);
132 cpl_test_abs(xnew, xorig, 2.0 * DBL_EPSILON);
133 cpl_test_abs(ynew, yorig, 2.0 * DBL_EPSILON);
137 error = irplib_wcs_xytoradec(wcs, xorig, yorig, NULL, &dec);
138 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
140 error = irplib_wcs_radectoxy(wcs, ra, dec, NULL, &ynew);
141 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
143 error = irplib_wcs_xytoradec(wcs, xorig, yorig, &ra, NULL);
144 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
146 error = irplib_wcs_radectoxy(wcs, ra, dec, &xnew, NULL);
147 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
155 error = irplib_wcs_xytoradec(NULL, xorig, yorig, &ra, &dec);
156 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
158 error = irplib_wcs_radectoxy(NULL, ra, dec, &xnew, &ynew);
159 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
172static void irplib_wcs_mjd_test(
void)
176 const char * iso8601 =
"2010-07-13T23:24:39.284";
177 const double mjd = 55390.97545467;
180 const char * iso8601a =
"2010-07-13T24:00:00";
181 const char * iso8601b =
"2010-07-14T00:00:00.000";
183 const double mstol = 1e-3/86400.0;
184 int year, day, month, hour, minute;
187 cpl_error_code error;
191 error = irplib_wcs_iso8601_from_mjd(&year, &month, &day, &hour,
192 &minute, &second, 0.0);
193 cpl_test_eq_error(error, CPL_ERROR_NONE);
195 cpl_test_eq(year, 1858);
196 cpl_test_eq(month, 11);
197 cpl_test_eq(day, 17);
198 cpl_test_eq(hour, 0);
199 cpl_test_eq(minute, 0);
200 cpl_test_abs(second, 0.0, 2.0 * DBL_EPSILON);
203 error = irplib_wcs_mjd_from_iso8601(&tmjd, year, month, day, hour, minute,
205 cpl_test_eq_error(error, CPL_ERROR_NONE);
207 cpl_test_abs(tmjd, 0.0, 2.0 * DBL_EPSILON);
210 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
211 &minute, &second, iso8601);
212 cpl_test_eq_error(error, CPL_ERROR_NONE);
214 error = irplib_wcs_mjd_from_iso8601(&tmjd, year, month, day, hour, minute,
216 cpl_test_eq_error(error, CPL_ERROR_NONE);
218 cpl_test_abs(mjd, tmjd, mstol);
220 error = irplib_wcs_mjd_from_string(&tmjd, iso8601);
221 cpl_test_eq_error(error, CPL_ERROR_NONE);
223 cpl_test_abs(mjd, tmjd, mstol);
225 error = irplib_wcs_iso8601_from_mjd(&year, &month, &day, &hour,
226 &minute, &second, mjd);
227 cpl_test_eq_error(error, CPL_ERROR_NONE);
229 error = irplib_wcs_mjd_from_iso8601(&tmjd, year, month, day, hour, minute,
231 cpl_test_eq_error(error, CPL_ERROR_NONE);
233 cpl_test_abs(mjd, tmjd, 2.0 * DBL_EPSILON);
236 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
237 &minute, &second, iso8601a);
238 cpl_test_eq_error(error, CPL_ERROR_NONE);
240 error = irplib_wcs_mjd_from_iso8601(&tmjd, year, month, day, hour, minute,
242 cpl_test_eq_error(error, CPL_ERROR_NONE);
244 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
245 &minute, &second, iso8601b);
246 cpl_test_eq_error(error, CPL_ERROR_NONE);
248 error = irplib_wcs_mjd_from_iso8601(&tmjd2, year, month, day, hour, minute,
250 cpl_test_eq_error(error, CPL_ERROR_NONE);
252 cpl_test_abs(tmjd, tmjd2, 2.0 * DBL_EPSILON);
255 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
257 "10000-07-13T23:24:39.284");
258 cpl_test_eq_error(error, CPL_ERROR_ILLEGAL_INPUT);
261 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
263 "2010-02-29T23:24:39.284");
264 cpl_test_eq_error(error, CPL_ERROR_ILLEGAL_INPUT);
267 error = irplib_wcs_mjd_from_iso8601(NULL, year, month, day, hour, minute,
269 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
271 error = irplib_wcs_iso8601_from_string(NULL, &month, &day, &hour,
272 &minute, &second, iso8601);
273 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
275 error = irplib_wcs_iso8601_from_string(&year, NULL, &day, &hour,
276 &minute, &second, iso8601);
277 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
279 error = irplib_wcs_iso8601_from_string(&year, &month, NULL, &hour,
280 &minute, &second, iso8601);
281 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
283 error = irplib_wcs_iso8601_from_string(&year, &month, &day, NULL,
284 &minute, &second, iso8601);
285 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
287 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
288 NULL, &second, iso8601);
289 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
291 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
292 &minute, NULL, iso8601);
293 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
295 error = irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
296 &minute, &second, NULL);
297 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
299 error = irplib_wcs_iso8601_from_mjd(NULL, &month, &day, &hour,
300 &minute, &second, mjd);
301 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
303 error = irplib_wcs_iso8601_from_mjd(&year, NULL, &day, &hour,
304 &minute, &second, mjd);
305 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
307 error = irplib_wcs_iso8601_from_mjd(&year, &month, NULL, &hour,
308 &minute, &second, mjd);
309 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
311 error = irplib_wcs_iso8601_from_mjd(&year, &month, &day, NULL,
312 &minute, &second, mjd);
313 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
315 error = irplib_wcs_iso8601_from_mjd(&year, &month, &day, &hour,
317 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
319 error = irplib_wcs_iso8601_from_mjd(&year, &month, &day, &hour,
321 cpl_test_eq_error(error, CPL_ERROR_NULL_INPUT);
332static void irplib_wcs_great_circle_dist_test(
void)
338 dist1 = irplib_wcs_great_circle_dist(12.0, 34.0, 56.0, 78.0);
339 dist2 = irplib_wcs_great_circle_dist(56.0, 78.0, 12.0, 34.0);
340 cpl_test_abs(dist1, dist2, 0.0);
342 for (j = 0; j <= 360; j += 4) {
343 const double ra2 = CPL_MATH_E + (double)j;
345 for (i = 0; i < 180; i++) {
346 const double ra1 = (double)i;
347 const double dec1 = (double)i;
350 dist1 = irplib_wcs_great_circle_dist(ra2, 90.0, ra2 + ra1, -90.0);
351 cpl_test_abs(dist1, 180.0, 0.0);
354 dist1 = irplib_wcs_great_circle_dist(ra2, 0.0, ra2 + ra1, 0.0);
355 cpl_test_abs(dist1, ra1, 2560.0 * DBL_EPSILON);
358 dist1 = irplib_wcs_great_circle_dist(ra2, dec1, ra2 + 180.0, -dec1);
359 cpl_test_abs(dist1, 180.0, 30.0 * FLT_EPSILON);
363 for (i = -90; i <= 90; i += 3) {
364 const double dec1 = (double)i;
365 for (k = 0; k <= 90; k += 3) {
366 const double dec2 = (double)k;
368 dist1 = irplib_wcs_great_circle_dist(ra2, dec1, ra2, dec2);
369 cpl_test_abs(dist1, fabs(dec1 - dec2), 1024.0 * DBL_EPSILON);
372 dist1 = irplib_wcs_great_circle_dist(ra2, dec1, ra2 + 180.0,
374 cpl_test_abs(dist1, 90.0, 512.0 * DBL_EPSILON);