1 /*
2  * Stellarium
3  * Copyright (C) 2010 Matthew Gates
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA  02110-1335, USA.
18  */
19 
20 #include "tests/testDeltaT.hpp"
21 
22 #include <QDateTime>
23 #include <QVariantList>
24 #include <QString>
25 #include <QDebug>
26 #include <QtGlobal>
27 
28 #include "StelUtils.hpp"
29 
QTEST_GUILESS_MAIN(TestDeltaT)30 QTEST_GUILESS_MAIN(TestDeltaT)
31 
32 void TestDeltaT::initTestCase()
33 {
34 	// source: http://astro.ukho.gov.uk/nao/lvm/
35 
36 	//                            Year               ΔT              ε (seconds)
37 	// ΔT (s) : −2000 to −800 (convert from hours)
38 	genericData << -2000.0  <<  1123200 <<  25920;
39 	genericData << -1900.0  <<  1062720 <<  25920;
40 	genericData << -1800.0  <<  1010880 <<  25920;
41 	genericData << -1700.0  <<    950400 <<  25920;
42 	genericData << -1600.0  <<    907200 <<  17280;
43 	genericData << -1500.0  <<    855360 <<  17280;
44 	genericData << -1400.0  <<    803520 <<  17280;
45 	genericData << -1300.0  <<    760320 <<  17280;
46 	genericData << -1200.0  <<    708480 <<  17280;
47 	genericData << -1100.0  <<    665280 <<  17280;
48 	genericData << -1000.0  <<    622080 <<  17280;
49 	genericData <<   -900.0  <<    570240 <<    8640;
50 	genericData <<   -800.0  <<    527040 <<    8640;
51 	// ΔT (s) : −720 to +1600
52 	genericData <<   -720.0  << 20480.00 << 180.00;
53 	genericData <<   -700.0  << 20120.00 << 170.00;
54 	genericData <<   -600.0  << 18400.00 << 160.00;
55 	genericData <<   -500.0  << 16820.00 << 150.00;
56 	genericData <<   -400.0  << 15370.00 << 130.00;
57 	genericData <<   -300.0  << 14030.00 << 120.00;
58 	genericData <<   -200.0  << 12800.00 << 110.00;
59 	genericData <<   -100.0  << 11640.00 << 100.00;
60 	genericData <<        0.0  << 10550.00 <<   90.00;
61 	genericData <<    100.0  <<   9510.00 <<   80.00;
62 	genericData <<    200.0  <<   8500.00 <<   70.00;
63 	genericData <<    300.0  <<   7510.00 <<   60.00;
64 	genericData <<    400.0  <<   6520.00 <<   50.00;
65 	genericData <<    500.0  <<   5520.00 <<   40.00;
66 	genericData <<    600.0  <<   4550.00 <<   40.00;
67 	genericData <<    700.0  <<   3630.00 <<   30.00;
68 	genericData <<    800.0  <<   2800.00 <<   25.00;
69 	genericData <<    900.0  <<   2090.00 <<   20.00;
70 	genericData <<  1000.0  <<   1540.00 <<   15.00;
71 	genericData <<  1100.0  <<   1170.00 <<   15.00;
72 	genericData <<  1200.0  <<     900.00 <<   15.00;
73 	genericData <<  1300.0  <<     660.00 <<   15.00;
74 	genericData <<  1400.0  <<     400.00 <<   15.00;
75 	genericData <<  1500.0  <<     200.00 <<   15.00;
76 	genericData <<  1600.0  <<     110.00 <<   15.00;
77 	// ΔT (s) : +1600 to +1800
78 	genericData <<  1600.0  <<     113.00 <<   15.00;
79 	genericData <<  1610.0  <<     100.00 <<   15.00;
80 	genericData <<  1620.0  <<       86.00 <<   20.00;
81 	genericData <<  1630.0  <<       72.00 <<   20.00;
82 	genericData <<  1640.0  <<       58.00 <<   20.00;
83 	genericData <<  1650.0  <<       45.00 <<   20.00;
84 	genericData <<  1660.0  <<       35.00 <<   15.00;
85 	genericData <<  1670.0  <<       26.00 <<   10.00;
86 	genericData <<  1680.0  <<       21.00 <<     5.00;
87 	genericData <<  1690.0  <<       17.00 <<     5.00;
88 	genericData <<  1700.0  <<       14.00 <<     5.00;
89 	genericData <<  1710.0  <<       12.00 <<     5.00;
90 	genericData <<  1720.0  <<       12.00 <<     5.00;
91 	genericData <<  1730.0  <<       13.00 <<     2.00;
92 	genericData <<  1740.0  <<       15.00 <<     2.00;
93 	genericData <<  1750.0  <<       17.00 <<     2.00;
94 	genericData <<  1760.0  <<       19.00 <<     2.00;
95 	genericData <<  1770.0  <<       21.00 <<     1.00;
96 	genericData <<  1780.0  <<       21.00 <<     1.00;
97 	genericData <<  1790.0  <<       21.00 <<     1.00;
98 	genericData <<  1800.0  <<       18.00 <<     0.50;
99 	genericData <<  1810.0  <<       16.00 <<     0.50;
100 	// ΔT (s) : +1950 to +2016
101 	genericData <<  1950.0  <<       28.93 <<     0.05;
102 	genericData <<  1951.0  <<       29.32 <<     0.05;
103 	genericData <<  1952.0  <<       29.70 <<     0.05;
104 	genericData <<  1953.0  <<       30.00 <<     0.05;
105 	genericData <<  1954.0  <<       30.20 <<     0.05;
106 	genericData <<  1955.0  <<       30.41 <<     0.05;
107 	genericData <<  1956.0  <<       30.76 <<     0.05;
108 	genericData <<  1957.0  <<       31.34 <<     0.05;
109 	genericData <<  1958.0  <<       32.03 <<     0.05;
110 	genericData <<  1959.0  <<       32.65 <<     0.05;
111 	genericData <<  1960.0  <<       33.07 <<     0.05;
112 	genericData <<  1961.0  <<       33.36 <<     0.05;
113 	genericData <<  1962.0  <<       33.62 <<     0.05;
114 	genericData <<  1963.0  <<       33.96 <<     0.05;
115 	genericData <<  1964.0  <<       34.44 <<     0.05;
116 	genericData <<  1965.0  <<       35.09 <<     0.05;
117 	genericData <<  1966.0  <<       35.95 <<     0.05;
118 	genericData <<  1967.0  <<       36.93 <<     0.05;
119 	genericData <<  1968.0  <<       37.96 <<     0.05;
120 	genericData <<  1969.0  <<       38.95 <<     0.05;
121 	genericData <<  1970.0  <<       39.93 <<     0.05;
122 	genericData <<  1971.0  <<       40.95 <<     0.05;
123 	genericData <<  1972.0  <<       42.04 <<     0.05;
124 	genericData <<  1973.0  <<       43.15 <<     0.05;
125 	genericData <<  1974.0  <<       44.24 <<     0.05;
126 	genericData <<  1975.0  <<       45.28 <<     0.05;
127 	genericData <<  1976.0  <<       46.28 <<     0.05;
128 	genericData <<  1977.0  <<       47.29 <<     0.05;
129 	genericData <<  1978.0  <<       48.33 <<     0.05;
130 	genericData <<  1979.0  <<       49.37 <<     0.05;
131 	genericData <<  1980.0  <<       50.36 <<     0.05;
132 	genericData <<  1981.0  <<       51.28 <<     0.05;
133 	genericData <<  1982.0  <<       52.13 <<     0.05;
134 	genericData <<  1983.0  <<       52.94 <<     0.05;
135 	genericData <<  1984.0  <<       53.70 <<     0.05;
136 	genericData <<  1985.0  <<       54.39 <<     0.05;
137 	genericData <<  1986.0  <<       54.98 <<     0.05;
138 	genericData <<  1987.0  <<       55.46 <<     0.05;
139 	genericData <<  1988.0  <<       55.89 <<     0.05;
140 	genericData <<  1989.0  <<       56.37 <<     0.05;
141 	genericData <<  1990.0  <<       56.99 <<     0.05;
142 	genericData <<  1991.0  <<       57.70 <<     0.05;
143 	genericData <<  1992.0  <<       58.45 <<     0.05;
144 	genericData <<  1993.0  <<       59.19 <<     0.05;
145 	genericData <<  1994.0  <<       59.92 <<     0.05;
146 	genericData <<  1995.0  <<       60.68 <<     0.05;
147 	genericData <<  1996.0  <<       61.46 <<     0.05;
148 	genericData <<  1997.0  <<       62.23 <<     0.05;
149 	genericData <<  1998.0  <<       62.90 <<     0.05;
150 	genericData <<  1999.0  <<       63.42 <<     0.05;
151 	genericData <<  2000.0  <<       63.81 <<     0.05;
152 	genericData <<  2001.0  <<       64.08 <<     0.05;
153 	genericData <<  2002.0  <<       64.27 <<     0.05;
154 	genericData <<  2003.0  <<       64.41 <<     0.05;
155 	genericData <<  2004.0  <<       64.55 <<     0.05;
156 	genericData <<  2005.0  <<       64.73 <<     0.05;
157 	genericData <<  2006.0  <<       64.94 <<     0.05;
158 	genericData <<  2007.0  <<       65.19 <<     0.05;
159 	genericData <<  2008.0  <<       65.48 <<     0.05;
160 	genericData <<  2009.0  <<       65.78 <<     0.05;
161 	genericData <<  2010.0  <<       66.06 <<     0.05;
162 	genericData <<  2011.0  <<       66.33 <<     0.05;
163 	genericData <<  2012.0  <<       66.60 <<     0.05;
164 	genericData <<  2013.0  <<       66.92 <<     0.05;
165 	genericData <<  2014.0  <<       67.30 <<     0.05;
166 	genericData <<  2015.0  <<       67.69 <<     0.05;
167 	genericData <<  2016.0  <<       68.04 <<     0.05;
168 	// ΔT (seconds) : +2017 to +2500
169 	genericData <<  2017.0  <<       68.60 <<     0.10;
170 	genericData <<  2018.0  <<       69.00 <<     0.10;
171 	genericData <<  2019.0  <<       69.20 <<     0.10;
172 	genericData <<  2020.0  <<       69.50 <<     0.10;
173 	genericData <<  2030.0  <<       70.00 <<     2.00;
174 	genericData <<  2040.0  <<       72.00 <<     4.00;
175 	genericData <<  2050.0  <<       75.00 <<     6.00;
176 	genericData <<  2100.0  <<       93.00 <<   10.00;
177 	genericData <<  2200.0  <<     163.00 <<   20.00;
178 	genericData <<  2300.0  <<     297.00 <<   30.00;
179 	genericData <<  2400.0  <<     521.00 <<   50.00;
180 	genericData <<  2500.0  <<     855.00 << 100.00;
181 }
182 
testDeltaTByEspenakMeeus()183 void TestDeltaT::testDeltaTByEspenakMeeus()
184 {
185 	// test data from http://eclipse.gsfc.nasa.gov/SEcat5/deltat.html#tab1
186 	QVariantList data;
187 
188 	data << -500  << 17190 << 430;
189 	data << -400  << 15530 << 390;
190 	data << -300  << 14080 << 360;
191 	data << -200  << 12790 << 330;
192 	data << -100  << 11640 << 290;
193 	data << 0     << 10580 << 260;
194 	data << 100   << 9600  << 240;
195 	data << 200   << 8640  << 210;
196 	data << 300   << 7680  << 180;
197 	data << 400   << 6700  << 160;
198 	data << 500   << 5710  << 140;
199 	data << 600   << 4740  << 120;
200 	data << 700   << 3810  << 100;
201 	data << 800   << 2960  << 80;
202 	data << 900   << 2200  << 70;
203 	data << 1000  << 1570  << 55;
204 	data << 1100  << 1090  << 40;
205 	data << 1200  << 740   << 30;
206 	data << 1300  << 490   << 20;
207 	data << 1400  << 320   << 20;
208 	data << 1500  << 200   << 20;
209 	data << 1600  << 120   << 20;
210 	data << 1700  << 9     << 5;
211 	data << 1750  << 13    << 2;
212 	data << 1800  << 14    << 1;
213 	data << 1850  << 7     << 1;
214 	data << 1870  << -0.1  << 1; // https://eclipse.gsfc.nasa.gov/SEsearch/SEsearchmap.php?Ecl=18701222
215 	data << 1900  << -3    << 1;
216 	data << 1910  << 10.8  << 1; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot1901/SE1910May09T.GIF
217 	data << 1925  << 23.6  << 0.5; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot1901/SE1925Jan24T.GIF
218 	data << 1945  << 26.8  << 0.5; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot1901/SE1945Jan14A.GIF
219 	data << 1950  << 29    << 0.1;
220 	data << 1955  << 31.1  << 0.1;
221 	data << 1960  << 33.2  << 0.1;
222 	data << 1965  << 35.7  << 0.1;
223 	data << 1970  << 40.2  << 0.1;
224 	data << 1975  << 45.5  << 0.1;
225 	data << 1980  << 50.5  << 0.1;
226 	data << 1985  << 54.3  << 0.1;
227 	data << 1990  << 56.9  << 0.1;
228 	data << 1995  << 60.8  << 0.1;
229 	data << 2000  << 63.8  << 0.1;
230 	data << 2005  << 64.7  << 0.1;
231 	data << 2010  << 66.6  << 1; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2010Jan15A.GIF
232 	data << 2015  << 67.6  << 2; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2015Mar20T.GIF
233 	data << 2020  << 77.2  << 7; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2020Jun21A.GIF
234 	data << 2030  << 87.9  << 12; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2030Jun01A.GIF
235 	data << 2050  << 111.6 << 20; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2050May20H.GIF
236 	data << 2060  << 124.6 << 15; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2060Apr30T.GIF
237 	data << 2070  << 138.5 << 15; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2070Apr11T.GIF
238 	data << 2090  << 170.3 << 15; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2090Sep23T.GIF
239 	data << 2100  << 187.3 << 20; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2100Sep04T.GIF
240 
241 	while(data.count() >= 3)
242 	{
243 		int year = data.takeFirst().toInt();
244 		int yout, mout, dout;
245 		double JD;
246 		double expectedResult = data.takeFirst().toDouble();
247 		double acceptableError = data.takeFirst().toDouble();
248 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
249 		double result = StelUtils::getDeltaTByEspenakMeeus(JD);
250 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
251 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
252 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
253 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
254 							.arg(year)
255 							.arg(result)
256 							.arg(expectedResult)
257 							.arg(actualError)
258 							.arg(acceptableError)
259 							.toUtf8());
260 	}
261 }
262 
testDeltaTByChaprontMeeus()263 void TestDeltaT::testDeltaTByChaprontMeeus()
264 {
265 	// test data from Astronomical Algorithms, 2ed., p. 79.
266 	QVariantList data;
267 	data << 1620 << 121.0;
268 	data << 1630 <<  82.0;
269 	data << 1640 <<  60.0;
270 	data << 1650 <<  46.0;
271 	data << 1660 <<  35.0;
272 	data << 1670 <<  24.0;
273 	data << 1680 <<  14.0;
274 	data << 1690 <<   8.0;
275 	data << 1700 <<   7.0;
276 	data << 1710 <<   9.0;
277 	data << 1720 <<  10.0;
278 	data << 1730 <<  10.0;
279 	data << 1740 <<  11.0;
280 	data << 1750 <<  12.0;
281 	data << 1760 <<  14.0;
282 	data << 1770 <<  15.0;
283 	data << 1780 <<  16.0;
284 	data << 1790 <<  16.0;
285 	data << 1800 <<  13.1;
286 	data << 1810 <<  12.0;
287 	data << 1820 <<  11.6;
288 	data << 1830 <<   7.1;
289 	data << 1840 <<   5.4;
290 	data << 1850 <<   6.8;
291 	data << 1860 <<   7.7;
292 	data << 1870 <<   1.4;
293 	data << 1880 <<  -5.5;
294 	data << 1890 <<  -6.0;
295 	data << 1900 <<  -2.8;
296 	data << 1910 <<  10.4;
297 	data << 1920 <<  21.1;
298 	data << 1930 <<  24.4;
299 	data << 1940 <<  24.3;
300 	data << 1950 <<  29.1;
301 	data << 1960 <<  33.1;
302 	data << 1970 <<  40.2;
303 	data << 1980 <<  50.5;
304 	data << 1984 <<  53.8; // *
305 	data << 1988 <<  55.8; // *
306 	data << 1990 <<  56.9;
307 	data << 1992 <<  58.3; // *
308 	data << 1996 <<  61.6; // *
309 	data << 1998 <<  63.0;
310 
311 	// test data marked as * taken Mathematical Astronomical Morsels III, p. 8. [ISBN 0-943396-81-6]
312 
313 	// accuracy 0.9 seconds for years range 1800-1997
314 	while(data.count() >= 2)
315 	{
316 		int year = data.takeFirst().toInt();
317 		int yout, mout, dout;
318 		double JD;
319 		double expectedResult = data.takeFirst().toDouble();
320 		double acceptableError = 0.9; // 0.9 seconds
321 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
322 		double result = StelUtils::getDeltaTByChaprontMeeus(JD);
323 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
324 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
325 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
326 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
327 							.arg(year)
328 							.arg(result)
329 							.arg(expectedResult)
330 							.arg(actualError)
331 							.arg(acceptableError)
332 							.toUtf8());
333 	}
334 }
335 
testDeltaTByChaprontMeeusWideDates()336 void TestDeltaT::testDeltaTByChaprontMeeusWideDates()
337 {
338 	// test data from Mathematical Astronomical Morsels III, p. 8. [ISBN 0-943396-81-6]
339 	QVariantList data;
340 	data <<    0 << 165;
341 	data <<  100 << 144;
342 	data <<  200 << 125;
343 	data <<  300 << 108;
344 	data <<  400 <<  92;
345 	data <<  500 <<  77;
346 	data <<  600 <<  64;
347 	data <<  700 <<  53;
348 	data <<  800 <<  43;
349 	data <<  900 <<  34;
350 	data << 1000 <<  27;
351 	data << 1100 <<  21;
352 	data << 1200 <<  15;
353 	data << 1300 <<  10;
354 	data << 1400 <<   7;
355 	data << 1500 <<   4;
356 	data << 1600 <<   2;
357 	data << 1700 <<   0;
358 	data << 1800 <<   0;
359 	data << 1980 <<   1;
360 	data << 2075 <<   3;
361 	data << 2200 <<   7;
362 	data << 2300 <<  11;
363 	data << 2400 <<  15;
364 	data << 2500 <<  21;
365 	data << 2600 <<  27;
366 	data << 2700 <<  34;
367 	data << 2800 <<  42;
368 	data << 2900 <<  51;
369 	data << 3000 <<  61;
370 
371 	while(data.count() >= 2)
372 	{
373 		// 30 seconds accuracy
374 		int year = data.takeFirst().toInt();
375 		int yout, mout, dout;
376 		double JD;
377 		double expectedResult = data.takeFirst().toDouble();
378 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
379 		double result = StelUtils::getDeltaTByChaprontMeeus(JD)/60.0;
380 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
381 		QVERIFY2(qRound(result) <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
382 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
383 							.arg(year)
384 							.arg(result)
385 							.arg(expectedResult)
386 							.toUtf8());
387 	}
388 }
389 
testDeltaTByMorrisonStephenson1982WideDates()390 void TestDeltaT::testDeltaTByMorrisonStephenson1982WideDates()
391 {
392 	// test data from Mathematical Astronomical Morsels, p. 8. [ISBN 0-943396-51-4]
393 	QVariantList data;
394 	data <<    0 << 177;
395 	data <<  100 << 158;
396 	data <<  200 << 140;
397 	data <<  300 << 123;
398 	data <<  400 << 107;
399 	data <<  500 <<  93;
400 	data <<  600 <<  79;
401 	data <<  700 <<  66;
402 	data <<  800 <<  55;
403 	data <<  900 <<  45;
404 	data << 1000 <<  35;
405 	data << 1100 <<  27;
406 	data << 1200 <<  20;
407 	data << 1300 <<  14;
408 	data << 1400 <<   9;
409 	data << 1500 <<   5;
410 	data << 1600 <<   2;
411 	data << 1700 <<   0;
412 	data << 1800 <<   0;
413 	data << 1980 <<   1;
414 	data << 2075 <<   4;
415 	data << 2200 <<   8;
416 	data << 2300 <<  13;
417 	data << 2400 <<  19;
418 	data << 2500 <<  26;
419 	data << 2600 <<  34;
420 	data << 2700 <<  43;
421 	data << 2800 <<  53;
422 	data << 2900 <<  64;
423 	data << 3000 <<  76;
424 
425 	while(data.count() >= 2)
426 	{
427 		// 30 seconds accuracy
428 		int year = data.takeFirst().toInt();
429 		int yout, mout, dout;
430 		double JD;
431 		double expectedResult = data.takeFirst().toDouble();
432 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
433 		double result = StelUtils::getDeltaTByMorrisonStephenson1982(JD)/60.0;
434 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
435 		QVERIFY2(qRound(result) <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
436 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
437 							.arg(year)
438 							.arg(result)
439 							.arg(expectedResult)
440 							.toUtf8());
441 	}
442 }
443 
testDeltaTByStephensonMorrison1984WideDates()444 void TestDeltaT::testDeltaTByStephensonMorrison1984WideDates()
445 {
446 	// test data from Mathematical Astronomical Morsels, p. 8. [ISBN 0-943396-51-4]
447 	QVariantList data;
448 	data <<    0 << 177;
449 	data <<  100 << 158;
450 	data <<  200 << 140;
451 	data <<  300 << 123;
452 	data <<  400 << 107;
453 	data <<  500 <<  93;
454 	data <<  600 <<  79;
455 	data <<  700 <<  66;
456 	data <<  800 <<  55;
457 	data <<  900 <<  45;
458 	data << 1000 <<  35;
459 	data << 1100 <<  27;
460 	data << 1200 <<  20;
461 	data << 1300 <<  14;
462 	data << 1400 <<   9;
463 	data << 1500 <<   5;
464 	data << 1600 <<   2;
465 	/*
466 	 * WTF?! FIXME: Should be Stephenson & Morrison (1984) give zero value outside of range?
467 	data << 1700 <<   0;
468 	data << 1800 <<   0;
469 	data << 1980 <<   1;
470 	data << 2075 <<   4;
471 	data << 2200 <<   8;
472 	data << 2300 <<  13;
473 	data << 2400 <<  19;
474 	data << 2500 <<  26;
475 	data << 2600 <<  34;
476 	data << 2700 <<  43;
477 	data << 2800 <<  53;
478 	data << 2900 <<  64;
479 	data << 3000 <<  76;
480 	*/
481 
482 	while(data.count() >= 2)
483 	{
484 		int year = data.takeFirst().toInt();
485 		int yout, mout, dout;
486 		double JD;
487 		double expectedResult = data.takeFirst().toDouble();
488 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
489 		double result = StelUtils::getDeltaTByStephensonMorrison1984(JD)/60.0;
490 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
491 		QVERIFY2(result <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
492 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
493 							.arg(year)
494 							.arg(result)
495 							.arg(expectedResult)
496 							.toUtf8());
497 	}
498 }
499 
testDeltaTByStephensonMorrison1995WideDates()500 void TestDeltaT::testDeltaTByStephensonMorrison1995WideDates()
501 {
502 	// test data taken from (a spline):
503 	// Long-Term Fluctuations in the Earth's Rotation: 700 BC to AD 1990.
504 	// Stephenson, F. R.; Morrison, L. V.
505 	// Philosophical Transactions: Physical Sciences and Engineering, Volume 351, Issue 1695, pp. 165-202
506 	// 1995RSPTA.351..165S [http://adsabs.harvard.edu/abs/1995RSPTA.351..165S]
507 	QVariantList data;
508 
509 	data << -500 << 16800;
510 	data << -450 << 16000;
511 	data << -400 << 15300;
512 	data << -350 << 14600;
513 	data << -300 << 14000;
514 	data << -250 << 13400;
515 	data << -200 << 12800;
516 	data << -150 << 12200;
517 	data << -100 << 11600;
518 	data <<  -50 << 11100;
519 	data <<    0 << 10600;
520 	data <<   50 << 10100;
521 	data <<  100 <<  9600;
522 	data <<  150 <<  9100;
523 	data <<  200 <<  8600;
524 	data <<  250 <<  8200;
525 	data <<  300 <<  7700;
526 	data <<  350 <<  7200;
527 	data <<  400 <<  6700;
528 	data <<  450 <<  6200;
529 	data <<  500 <<  5700;
530 	data <<  550 <<  5200;
531 	data <<  600 <<  4700;
532 	data <<  650 <<  4300;
533 	/*
534 	// FIXME: WTF? http://www.staff.science.uu.nl/~gent0113/deltat/deltat_old.htm
535 	data <<  700 <<  3800;
536 	data <<  750 <<  3400;
537 	data <<  800 <<  3000;
538 	data <<  850 <<  2600;
539 	data <<  900 <<  2200;
540 	data <<  950 <<  1900;
541 	data << 1000 <<  1600;
542 	data << 1050 <<  1350;
543 	data << 1100 <<  1100;
544 	data << 1150 <<   900;
545 	data << 1200 <<   750;
546 	data << 1250 <<   600;
547 	data << 1300 <<   460;
548 	data << 1350 <<   360;
549 	data << 1400 <<   280; // 300
550 	data << 1450 <<   200; // 230
551 	data << 1500 <<   150; // 180
552 	data << 1550 <<   110; // 140
553 	data << 1600 <<    80;  // 110
554 	*/
555 
556 	while(data.count() >= 2)
557 	{
558 		int year = data.takeFirst().toInt();
559 		int yout, mout, dout;
560 		double JD;
561 		double expectedResult = data.takeFirst().toDouble();
562 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
563 		double result = StelUtils::getDeltaTByStephensonMorrison1995(JD);
564 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
565 		QVERIFY2(result <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
566 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
567 							.arg(year)
568 							.arg(result)
569 							.arg(expectedResult)
570 							.toUtf8());
571 	}
572 }
573 
testDeltaTByStephenson1997WideDates()574 void TestDeltaT::testDeltaTByStephenson1997WideDates()
575 {
576 	// test data taken from http://www.staff.science.uu.nl/~gent0113/deltat/deltat_old.htm
577 
578 	QVariantList data;
579 
580 	/*
581 	// FIXME: WTF?
582 	data << -500 << 16800;
583 	data << -450 << 16000;
584 	data << -400 << 15300;
585 	data << -350 << 14600;
586 	data << -300 << 14000;
587 	data << -250 << 13400;
588 	data << -200 << 12800;
589 	data << -150 << 12200;
590 	data << -100 << 11600;
591 	data <<  -50 << 11100;
592 	*/
593 	data <<    0 << 10600;
594 	data <<   50 << 10100;
595 	data <<  100 <<  9600;
596 	data <<  150 <<  9100;
597 	data <<  200 <<  8600;
598 	data <<  250 <<  8200;
599 	data <<  300 <<  7700;
600 	data <<  350 <<  7200;
601 	data <<  400 <<  6700;
602 	data <<  450 <<  6200;
603 	data <<  500 <<  5700;
604 	data <<  550 <<  5200;
605 	data <<  600 <<  4700;
606 	data <<  650 <<  4300;
607 	data <<  700 <<  3800;
608 	data <<  750 <<  3400;
609 	/*
610 	// FIXME: WTF?
611 	data <<  800 <<  3000;
612 	data <<  850 <<  2600;
613 	data <<  900 <<  2200;
614 	data <<  950 <<  1900;
615 	data << 1000 <<  1600;
616 	data << 1050 <<  1350;
617 	data << 1100 <<  1100;
618 	data << 1150 <<   900;
619 	data << 1200 <<   750;
620 	data << 1250 <<   600;
621 	data << 1300 <<   460;
622 	data << 1350 <<   360;
623 	data << 1400 <<   280; // 300
624 	data << 1450 <<   200; // 230
625 	data << 1500 <<   150; // 180
626 	data << 1550 <<   110; // 140
627 	data << 1600 <<    80;  // 110
628 	*/
629 
630 	while(data.count() >= 2)
631 	{
632 		int year = data.takeFirst().toInt();
633 		int yout, mout, dout;
634 		double JD;
635 		double expectedResult = data.takeFirst().toDouble();
636 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
637 		double result = StelUtils::getDeltaTByStephenson1997(JD);
638 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
639 		QVERIFY2(result <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
640 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
641 							.arg(year)
642 							.arg(result)
643 							.arg(expectedResult)
644 							.toUtf8());
645 	}
646 }
647 
testDeltaTByStephensonMorrison2004WideDates()648 void TestDeltaT::testDeltaTByStephensonMorrison2004WideDates()
649 {
650 	// test data from
651 	// * Morrison, L. V.; Stephenson, F. R., "Historical values of the Earth's clock error ΔT and the calculation of eclipses",
652 	//    Journal for the History of Astronomy, 35(2004), 327-336 - http://adsabs.harvard.edu/abs/2004JHA....35..327M
653 	// * addendum in ibid., 36 (2005), 339 - http://adsabs.harvard.edu/abs/2005JHA....36..339M
654 	QVariantList data;
655 	data << -1000 << 25400 << 640;
656 	data <<  -900 << 23700 << 590;
657 	data <<  -800 << 22000 << 550;
658 	data <<  -700 << 20400 << 500;
659 	data <<  -600 << 18800 << 460;
660 	data <<  -500 << 17190 << 430;
661 	data <<  -400 << 15530 << 390;
662 	data <<  -300 << 14080 << 360;
663 	data <<  -200 << 12790 << 330;
664 	data <<  -100 << 11640 << 290;
665 	data <<     0 << 10580 << 260;
666 	data <<   100 <<  9600 << 240;
667 	/*
668 	data <<   200 <<  8640 << 210;
669 	data <<   300 <<  7680 << 180;
670 	data <<   400 <<  6700 << 160;
671 	data <<   500 <<  5710 << 140;
672 	data <<   600 <<  4740 << 120;
673 	data <<   700 <<  3810 << 100;
674 	data <<   800 <<  2960 <<  80;
675 	data <<   900 <<  2200 <<  70;
676 	data <<  1000 <<  1570 <<  55;
677 	data <<  1100 <<  1090 <<  40;
678 	data <<  1200 <<   740 <<  30;
679 	data <<  1300 <<   490 <<  20;
680 	data <<  1400 <<   320 <<  20;
681 	data <<  1500 <<   200 <<  20;
682 	data <<  1600 <<   120 <<   9;
683 	data <<  1700 <<     9 <<   5;
684 	data <<  1710 <<    10 <<   3;
685 	data <<  1720 <<    11 <<   3;
686 	data <<  1730 <<    11 <<   3;
687 	data <<  1740 <<    12 <<   2;
688 	data <<  1750 <<    13 <<   2;
689 	data <<  1760 <<    15 <<   2;
690 	data <<  1770 <<    16 <<   2;
691 	data <<  1780 <<    17 <<   1;
692 	data <<  1790 <<    17 <<   1;
693 	data <<  1800 <<    14 <<   1;
694 	data <<  1810 <<    13 <<   1;
695 	data <<  1820 <<    12 <<   1;
696 	data <<  1830 <<     8 <<   1; // *  - <1
697 	data <<  1840 <<     6 <<   1; // ** - undefined error
698 	data <<  1850 <<     7 <<   1; // **
699 	data <<  1860 <<     8 <<   1; // **
700 	data <<  1870 <<     2 <<   1; // **
701 	data <<  1880 <<    -5 <<   1; // **
702 	data <<  1890 <<    -6 <<   1; // **
703 	data <<  1900 <<    -3 <<   1; // **
704 	data <<  1910 <<    10 <<   1; // **
705 	data <<  1920 <<    21 <<   1; // **
706 	data <<  1930 <<    24 <<   1; // **
707 	data <<  1940 <<    24 <<   1; // **
708 	data <<  1950 <<    29 <<   1; // **
709 	data <<  1960 <<    33 <<   1; // **
710 	data <<  1970 <<    40 <<   1; // **
711 	data <<  1980 <<    51 <<   1; // **
712 	data <<  1990 <<    57 <<   1; // **
713 	data <<  2000 <<    65 <<   1; // **
714 	*/
715 
716 	while(data.count() >= 3)
717 	{
718 		int year = data.takeFirst().toInt();
719 		int yout, mout, dout;
720 		double JD;
721 		double expectedResult = data.takeFirst().toDouble();
722 		double acceptableError = data.takeFirst().toDouble();
723 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
724 		double result = StelUtils::getDeltaTByMorrisonStephenson2004(JD);
725 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
726 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
727 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
728 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
729 							.arg(year)
730 							.arg(result)
731 							.arg(expectedResult)
732 							.arg(actualError)
733 							.arg(acceptableError)
734 							.toUtf8());
735 	}
736 }
737 
testDeltaTByStephensonMorrisonHohenkerk2016GenericDates()738 void TestDeltaT::testDeltaTByStephensonMorrisonHohenkerk2016GenericDates()
739 {
740 	// Valid range: 720 BC to AD 2015
741 
742 	double year, expectedResult, acceptableError, JD;
743 	int yout, mout, dout;
744 	QVariantList d = genericData;
745 	while(d.count() >= 3)
746 	{
747 		year = d.takeFirst().toDouble();
748 		expectedResult = d.takeFirst().toDouble();
749 		acceptableError = d.takeFirst().toDouble();
750 
751 		if (year<0)  // https://github.com/Stellarium/stellarium/wiki/FAQ#There_is_no_year_0_or_BC_dates_are_a_year_out
752 			year += 1;
753 
754 		// Unit tests failures ranges: 300-600, 900-1610, 1780, 1800-1810
755 		// TODO: Check algorithm
756 		if ((year>=-720. && year<300.) || (year>600. && year<900.) || (year>=1620. && year<=1770.) || (year>=1820. && year<=2015.))
757 		{
758 			StelUtils::getJDFromDate(&JD, static_cast<int>(year), 1, 1, 0, 0, 0);
759 			double result = StelUtils::getDeltaTByStephensonMorrisonHohenkerk2016(JD);
760 			double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
761 			StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
762 			QVERIFY2(actualError <= acceptableError, QString("[%8] date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
763 								.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
764 								.arg(year)
765 								.arg(result)
766 								.arg(expectedResult)
767 								.arg(actualError)
768 								.arg(acceptableError)
769 								.arg("valid range dates")
770 								.toUtf8());
771 		}
772 	}
773 
774 	// Check dates prior 720 BC
775 	/*
776 	d.clear();
777 	d = genericData;
778 	while(d.count() >= 3)
779 	{
780 		year = d.takeFirst().toDouble();
781 		expectedResult = d.takeFirst().toDouble();
782 		acceptableError = d.takeFirst().toDouble();
783 
784 		if (year<0)  // https://github.com/Stellarium/stellarium/wiki/FAQ#There_is_no_year_0_or_BC_dates_are_a_year_out
785 			year += 1;
786 
787 		// Since year 300 the unit tests failures
788 		if (year<=-720)
789 		{
790 			StelUtils::getJDFromDate(&JD, static_cast<int>(year), 1, 1, 0, 0, 0);
791 			double result = StelUtils::getDeltaTByStephensonMorrisonHohenkerk2016(JD);
792 			double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
793 			StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
794 			QVERIFY2(actualError <= acceptableError, QString("[%8] date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
795 								.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
796 								.arg(year)
797 								.arg(QString::number(result, 'f', 2))
798 								.arg(QString::number(expectedResult, 'f', 2))
799 								.arg(QString::number(actualError, 'f', 2))
800 								.arg(QString::number(acceptableError, 'f', 2))
801 								.arg("prior 720 BC")
802 								.toUtf8());
803 		}
804 	}
805 
806 	// Check dates after AD 2015
807 	d.clear();
808 	d = genericData;
809 	while(d.count() >= 3)
810 	{
811 		year = d.takeFirst().toDouble();
812 		expectedResult = d.takeFirst().toDouble();
813 		acceptableError = d.takeFirst().toDouble();
814 
815 		if (year>=2015)
816 		{
817 			StelUtils::getJDFromDate(&JD, static_cast<int>(year), 1, 1, 0, 0, 0);
818 			double result = StelUtils::getDeltaTByStephensonMorrisonHohenkerk2016(JD);
819 			double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
820 			StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
821 			QVERIFY2(actualError <= acceptableError, QString("[%8] date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
822 								.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
823 								.arg(year)
824 								.arg(QString::number(result, 'f', 2))
825 								.arg(QString::number(expectedResult, 'f', 2))
826 								.arg(QString::number(actualError, 'f', 2))
827 								.arg(QString::number(acceptableError, 'f', 2))
828 								.arg("after AD 2015")
829 								.toUtf8());
830 		}
831 	}
832 	*/
833 }
834 
testDeltaTByMeeusSimons()835 void TestDeltaT::testDeltaTByMeeusSimons()
836 {
837 	// test data from Meeus, Jean, "The Effect of Delta T on Astronomical Calculations",
838 	// The Journal of the British Astronomical Association, 108 (1998), 154-156
839 	// http://adsabs.harvard.edu/abs/1998JBAA..108..154M
840 
841 	QVariantList data;
842 	data << 1619 <<  0.00; // zero outside the valid range
843 	data << 1974 << 44.49;
844 	data << 1975 << 45.48;
845 	data << 1976 << 46.46;
846 	data << 1977 << 47.52;
847 	data << 1978 << 48.53;
848 	data << 1979 << 49.59;
849 	data << 1980 << 50.54;
850 	data << 1981 << 51.38;
851 	data << 1982 << 52.17;
852 	data << 1983 << 52.96;
853 	data << 1984 << 53.79;
854 	data << 1985 << 54.34;
855 	data << 1986 << 54.87;
856 	data << 1987 << 55.32;
857 	data << 1988 << 55.82;
858 	data << 1989 << 56.30;
859 	data << 1990 << 56.86;
860 	data << 1991 << 57.57;
861 	data << 1992 << 58.31;
862 	data << 1993 << 59.12;
863 	data << 1994 << 59.99;
864 	data << 1995 << 60.79;
865 	data << 1996 << 61.63;
866 	data << 1997 << 62.30;
867 	data << 1999 << 64.00;
868 	data << 2001 <<  0.00; // zero outside the valid range
869 
870 	while(data.count() >= 2)
871 	{
872 		int year = data.takeFirst().toInt();
873 		int yout, mout, dout;
874 		double JD;
875 		double expectedResult = data.takeFirst().toDouble();
876 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
877 		double result = StelUtils::getDeltaTByMeeusSimons(JD);
878 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
879 		QVERIFY2(qAbs(result-expectedResult)<=1, QString("date=%2 year=%3 result=%4 expected=%5")
880 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
881 							.arg(year)
882 							.arg(result)
883 							.arg(expectedResult)
884 							.toUtf8());
885 	}
886 }
887 
testDeltaTByKhalidSultanaZaidiWideDates()888 void TestDeltaT::testDeltaTByKhalidSultanaZaidiWideDates()
889 {
890 	// test data and max. error taken from:
891 	// Delta T: Polynomial Approximation of Time Period 1620-2013
892 	// M. Khalid, Mariam Sultana and Faheem Zaidi
893 	// Journal of Astrophysics, Vol. 2014, Article ID 480964
894 	// https://doi.org/10.1155/2014/480964
895 
896 	QVariantList data;
897 	//      year        deltaT   max.err.
898 	data << 1620 << 124.201597 << 0.5709;
899 	data << 1672 <<   23.455938 << 0.5709;
900 	data << 1673 <<   23.518597 << 0.5989;
901 	data << 1729 <<   10.794455 << 0.5989;
902 	data << 1730 <<   10.964421 << 0.5953;
903 	data << 1797 <<   15.096315 << 0.5953;
904 	data << 1798 <<   14.433142 << 0.4643;
905 	data << 1843 <<     6.564327 << 0.4643;
906 	data << 1844 <<     6.668453 << 0.5894;
907 	data << 1877 <<    -4.648388 << 0.5894;
908 	data << 1878 <<    -5.058000 << 0.5410;
909 	data << 1904 <<     3.181019 << 0.5410;
910 	data << 1905 <<     3.559383 << 0.5495;
911 	data << 1945 <<   27.258421 << 0.5495;
912 	data << 1946 <<   27.234794 << 0.4279;
913 	data << 1989 <<   55.872143 << 0.4279;
914 	data << 1990 <<   56.659321 << 0.2477;
915 	data << 2013 <<   67.135703 << 0.2477;
916 
917 	while(data.count() >= 3)
918 	{
919 		int year = data.takeFirst().toInt();
920 		int yout, mout, dout;
921 		double JD;
922 		double expectedResult = data.takeFirst().toDouble();
923 		double maxError = data.takeFirst().toDouble();
924 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
925 		double result = StelUtils::getDeltaTByKhalidSultanaZaidi(JD);
926 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
927 		QVERIFY2(qAbs(result-expectedResult)<=maxError, QString("date=%2 year=%3 result=%4 expected=%5 exp. error=%6")
928 			 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
929 			 .arg(year)
930 			 .arg(QString::number(result, 'f', 5))
931 			 .arg(QString::number(expectedResult, 'f', 5))
932 			 .arg(QString::number(maxError, 'f', 4))
933 			 .toUtf8());
934 	}
935 }
936 
testDeltaTByMontenbruckPfleger()937 void TestDeltaT::testDeltaTByMontenbruckPfleger()
938 {
939 	// test data taken from book  "Astronomy on the Personal Computer" by O. Montenbruck & T. Pfleger (4th ed., 2000), p. 42
940 
941 	QVariantList data;
942 	data << 1820 <<  0.00; // zero outside the valid range
943 	data << 1900 << -2.72;
944 	data << 1905 <<  3.86;
945 	data << 1910 << 10.46;
946 	data << 1915 << 17.20;
947 	data << 1920 << 21.16;
948 	data << 1925 << 23.62;
949 	data << 1930 << 24.02;
950 	data << 1935 << 23.93;
951 	data << 1940 << 24.33;
952 	data << 1945 << 26.77;
953 	data << 1950 << 29.15;
954 	data << 1955 << 31.07;
955 	data << 1960 << 33.15;
956 	data << 1965 << 35.73;
957 	data << 1970 << 40.18;
958 	data << 1975 << 45.48;
959 	data << 1980 << 50.54;
960 	data << 1985 << 54.34;
961 	data << 1990 << 56.86;
962 	data << 1995 << 60.82;
963 	//data << 2000 << 63.83; // NOTE: ???
964 	data << 2010 <<  0.00; // zero outside the valid range
965 
966 	while(data.count() >= 2)
967 	{
968 		int year = data.takeFirst().toInt();
969 		int yout, mout, dout;
970 		double JD;
971 		double expectedResult = data.takeFirst().toDouble();
972 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
973 		double result = StelUtils::getDeltaTByMontenbruckPfleger(JD);
974 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
975 		QVERIFY2(qAbs(result-expectedResult)<=1.0, QString("date=%2 year=%3 result=%4 expected=%5")
976 			 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
977 			 .arg(year)
978 			 .arg(QString::number(result, 'f', 5))
979 			 .arg(QString::number(expectedResult, 'f', 5))
980 			 .toUtf8());
981 	}
982 }
983 
testDeltaTByReingoldDershowitzWideDates()984 void TestDeltaT::testDeltaTByReingoldDershowitzWideDates()
985 {
986 	// the test data was calculated for polynome from 4th ed. of Calendrical Calculations
987 
988 	QVariantList data;
989 	//      year   frac. of day
990 	data << -600 <<  0.216672;
991 	data << -500 <<  0.199117;
992 	data << -400 <<  0.179756;
993 	data <<    0 <<  0.122495;
994 	data <<  400 <<  0.077537;
995 	data <<  500 <<  0.066089;
996 	data << 1000 <<  0.018220;
997 	data << 1500 <<  0.002295;
998 	data << 1590 <<  0.001448;
999 	data << 1600 <<  0.001389;
1000 	data << 1690 <<  0.000115;
1001 	data << 1700 <<  0.000094;
1002 	data << 1790 <<  0.000177;
1003 	// TODO: Compute and fill the test data for range [1800..1986]
1004 	//data << 1800 << 128.824; // pass: 1e-3 ; ??? seems equation has wrong signs for terms
1005 	data << 1850 <<  1.755490;
1006 	//data << 1890 <<  0.002340; // pass: 1e-4
1007 	//data << 1900 <<  0.000591; // pass: 1e-3
1008 	data << 1987 <<  0.000640;
1009 	data << 2000 <<  0.000739;
1010 	data << 2005 <<  0.000749;
1011 	data << 2006 <<  0.000752;
1012 	data << 2010 <<  0.000772;
1013 	data << 2050 <<  0.001076;
1014 	data << 2060 <<  0.002488;
1015 	data << 2100 <<  0.002998;
1016 	data << 2150 <<  0.003802;
1017 	data << 2200 <<  0.005117;
1018 
1019 	while(data.count() >= 2)
1020 	{
1021 		int year = data.takeFirst().toInt();
1022 		int yout, mout, dout;
1023 		double JD;
1024 		double expectedResult = data.takeFirst().toDouble();
1025 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1026 		double result = StelUtils::getDeltaTByReingoldDershowitz(JD)/86400.;
1027 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1028 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1029 		QVERIFY2(actualError<=1e-5, QString("date=%2 year=%3 result=%4 expected=%5")
1030 			 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1031 			 .arg(year)
1032 			 .arg(QString::number(result, 'f', 5))
1033 			 .arg(QString::number(expectedResult, 'f', 5))
1034 			 .toUtf8());
1035 	}
1036 }
1037 
testDeltaTByJPLHorizons()1038 void TestDeltaT::testDeltaTByJPLHorizons()
1039 {
1040 	// NOTE: the test data just an calculated!
1041 	// http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -25.7376 L.A.P. - WTF?!?
1042 	QVariantList data;
1043 	data <<   500 << 5401.2;
1044 	data <<   600 << 4614.0;
1045 	data <<   700 << 3888.6;
1046 	data <<   800 << 3225.0;
1047 	data <<   900 << 2623.8;
1048 	data << 1000 << 1625.4;
1049 	data << 1100 << 1265.4;
1050 	data << 1200 <<   950.4;
1051 	data << 1300 <<   680.4;
1052 	data << 1400 <<   455.4;
1053 	data << 1500 <<   275.4;
1054 
1055 	while(data.count() >= 2)
1056 	{
1057 		int year = data.takeFirst().toInt();
1058 		int yout, mout, dout;
1059 		double JD;
1060 		double expectedResult = data.takeFirst().toDouble();
1061 		double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1062 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1063 		double result = StelUtils::getDeltaTByJPLHorizons(JD);
1064 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1065 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1066 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1067 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1068 							.arg(year)
1069 							.arg(result)
1070 							.arg(expectedResult)
1071 							.arg(actualError)
1072 							.arg(acceptableError)
1073 							.toUtf8());
1074 	}
1075 }
1076 
testDeltaTByBorkowski()1077 void TestDeltaT::testDeltaTByBorkowski()
1078 {
1079 	// NOTE: the test data just an calculated!
1080 	// http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -23.8946 L.A.P. - WTF?!?
1081 	QVariantList data;
1082 	data <<   500 << 4469.4;
1083 	data <<   600 << 3717.0;
1084 	data <<   700 << 3034.8;
1085 	data <<   800 << 2422.2;
1086 	data <<   900 << 1879.8;
1087 	data << 1000 << 1407.0;
1088 	data << 1100 << 1004.4;
1089 	data << 1200 <<   672.0;
1090 	data << 1300 <<   409.8;
1091 	data << 1400 <<   217.2;
1092 	data << 1500 <<     94.8;
1093 
1094 	while(data.count() >= 2)
1095 	{
1096 		int year = data.takeFirst().toInt();
1097 		int yout, mout, dout;
1098 		double JD;
1099 		double expectedResult = data.takeFirst().toDouble();
1100 		double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1101 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1102 		double result = StelUtils::getDeltaTByBorkowski(JD);
1103 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1104 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1105 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1106 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1107 							.arg(year)
1108 							.arg(result)
1109 							.arg(expectedResult)
1110 							.arg(actualError)
1111 							.arg(acceptableError)
1112 							.toUtf8());
1113 	}
1114 }
1115 
testDeltaTByAstronomicalEphemeris()1116 void TestDeltaT::testDeltaTByAstronomicalEphemeris()
1117 {
1118 	// NOTE: the test data just an calculated!
1119 	// http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -22.44 L.A.P. - WTF?!?
1120 	QVariantList data;
1121 	data <<   500 <<  4882.2;
1122 	data <<   600 <<  4145.4;
1123 	data <<   700 <<  3469.2;
1124 	data <<   800 <<  2852.4;
1125 	data <<   900 <<  2296.2;
1126 	data << 1000 <<  1799.4;
1127 	data << 1100 <<  1362.6;
1128 	data << 1200 <<    985.8;
1129 	data << 1300 <<    668.4;
1130 	data << 1400 <<    411.6;
1131 	data << 1500 <<    214.2;
1132 
1133 	while(data.count() >= 2)
1134 	{
1135 		int year = data.takeFirst().toInt();
1136 		int yout, mout, dout;
1137 		double JD;
1138 		double expectedResult = data.takeFirst().toDouble();
1139 		double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1140 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1141 		double result = StelUtils::getDeltaTByAstronomicalEphemeris(JD);
1142 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1143 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1144 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1145 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1146 							.arg(year)
1147 							.arg(result)
1148 							.arg(expectedResult)
1149 							.arg(actualError)
1150 							.arg(acceptableError)
1151 							.toUtf8());
1152 	}
1153 }
1154 
testDeltaTByIAU()1155 void TestDeltaT::testDeltaTByIAU()
1156 {
1157 	// NOTE: the test data just an calculated!
1158 	// http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -22.44 L.A.P. - WTF?!?
1159 	QVariantList data;
1160 	data <<   500 <<  4882.2;
1161 	data <<   600 <<  4145.4;
1162 	data <<   700 <<  3469.2;
1163 	data <<   800 <<  2852.4;
1164 	data <<   900 <<  2296.2;
1165 	data << 1000 <<  1799.4;
1166 	data << 1100 <<  1362.6;
1167 	data << 1200 <<    985.8;
1168 	data << 1300 <<    668.4;
1169 	data << 1400 <<    411.6;
1170 	data << 1500 <<    214.2;
1171 
1172 	while(data.count() >= 2)
1173 	{
1174 		int year = data.takeFirst().toInt();
1175 		int yout, mout, dout;
1176 		double JD;
1177 		double expectedResult = data.takeFirst().toDouble();
1178 		double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1179 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1180 		double result = StelUtils::getDeltaTByIAU(JD);
1181 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1182 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1183 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1184 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1185 							.arg(year)
1186 							.arg(result)
1187 							.arg(expectedResult)
1188 							.arg(actualError)
1189 							.arg(acceptableError)
1190 							.toUtf8());
1191 	}
1192 }
1193 
testDeltaTByTuckermanGoldstine()1194 void TestDeltaT::testDeltaTByTuckermanGoldstine()
1195 {
1196 	// NOTE: the test data just an calculated!
1197 	// http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with 0 L.A.P.
1198 	QVariantList data;
1199 	data <<   500 <<  6724.8;
1200 	data <<   600 <<  5766.6;
1201 	data <<   700 <<  4882.2;
1202 	data <<   800 <<  4071.0;
1203 	data <<   900 <<  3333.0;
1204 	data << 1000 <<  2669.4;
1205 	data << 1100 <<  2079.4;
1206 	data << 1200 <<  1562.4;
1207 	data << 1300 <<  1119.0;
1208 	data << 1400 <<    749.4;
1209 	data << 1500 <<    453.0;
1210 
1211 	while(data.count() >= 2)
1212 	{
1213 		int year = data.takeFirst().toInt();
1214 		int yout, mout, dout;
1215 		double JD;
1216 		double expectedResult = data.takeFirst().toDouble();
1217 		double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1218 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1219 		double result = StelUtils::getDeltaTByTuckermanGoldstine(JD);
1220 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1221 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1222 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1223 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1224 							.arg(year)
1225 							.arg(result)
1226 							.arg(expectedResult)
1227 							.arg(actualError)
1228 							.arg(acceptableError)
1229 							.toUtf8());
1230 	}
1231 }
1232 
testDeltaTStandardError()1233 void TestDeltaT::testDeltaTStandardError()
1234 {
1235 	// the test data was obtained from https://eclipse.gsfc.nasa.gov/SEhelp/uncertainty2004.html
1236 	QVariantList data;
1237 	data << -1000 << 636;
1238 	data <<  -500 << 431;
1239 	data <<     0 << 265;
1240 	data <<   500 << 139;
1241 	data <<  1000 <<  54;
1242 	data <<  1200 <<  31;
1243 
1244 	while(data.count() >= 2)
1245 	{
1246 		int year = data.takeFirst().toInt();
1247 		int yout, mout, dout;
1248 		double JD;
1249 		double expectedResult = data.takeFirst().toInt();
1250 		double acceptableError = 1.0;
1251 		StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1252 		double result = StelUtils::getDeltaTStandardError(JD);
1253 		double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1254 		StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1255 		QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1256 							.arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1257 							.arg(year)
1258 							.arg(result)
1259 							.arg(expectedResult)
1260 							.arg(actualError)
1261 							.arg(acceptableError)
1262 							.toUtf8());
1263 	}
1264 }
1265