1 /*
2     SPDX-FileCopyrightText: 2016 Akarsh Simha <akarsh.simha@kdemail.net>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 /* Project Includes */
8 #include "test_poleaxis.h"
9 #include "ksnumbers.h"
10 #include "time/kstarsdatetime.h"
11 #include "auxiliary/dms.h"
12 #include "Options.h"
13 #include <libnova/libnova.h>
14 
TestPoleAxis()15 TestPoleAxis::TestPoleAxis() : QObject()
16 {
17 }
18 
~TestPoleAxis()19 TestPoleAxis::~TestPoleAxis()
20 {
21 }
22 
compare(Rotations::V3 v,double x,double y,double z)23 void TestPoleAxis::compare(Rotations::V3 v, double x, double y, double z)
24 {
25     QVERIFY2(std::fabs(v.x() - x) < 0.00001,
26              qPrintable(QString("dc.x %1, x %2 error %3").arg(v.x()).arg(x).arg(((v.x() - x) * 3600.0), 6, 'f', 1)));
27     QVERIFY2(std::fabs(v.y() - y) < 0.00001,
28              qPrintable(QString("dc.y %1, y %2 error %3").arg(v.y()).arg(y).arg(((v.y() - y) * 3600.0), 6, 'f', 1)));
29     QVERIFY2(std::fabs(v.z() - z) < 0.00001,
30              qPrintable(QString("dc.z %1, z %2 error %3").arg(v.z()).arg(z).arg(((v.z() - z) * 3600.0), 6, 'f', 1)));
31 }
32 
compare(double a,double e,QString msg)33 void TestPoleAxis::compare(double a, double e, QString msg)
34 {
35     QVERIFY2(std::fabs(a - e) < 0.0003,
36              qPrintable(QString("%1: actual %2, expected %3 error %4").arg(msg).arg(a).arg(e).arg(((a - e) * 3600.0), 6, 'f', 1)));
37 }
38 
39 
testDirCos_data()40 void TestPoleAxis::testDirCos_data()
41 {
42     QTest::addColumn<double>("Ha");
43     QTest::addColumn<double>("Dec");
44     QTest::addColumn<double>("X");
45     QTest::addColumn<double>("Y");
46     QTest::addColumn<double>("Z");
47 
48     QTest::newRow("HaDec0") << 0.0 << 0.0  << 1.0 << 0.0 << 0.0;
49     QTest::newRow("Ha0Dec45") << 0.0 << 45.0  << 0.707107 << 0.0 << 0.707107;
50     QTest::newRow("Ha6Dec45") << 6.0 << 45.0 << 0.0 << 0.707107 << 0.707107;
51     QTest::newRow("Ha-6Dec45") << -6.0 << 45.0 << 0.0 << -0.707107 << 0.707107;
52     QTest::newRow("at Pole") << 0.0 << 90.0 << 0.0 << 0.0 << 1.0;
53     QTest::newRow("near S Pole") << -3.0 << -85.0 << 0.0616284 << -0.0616284 << -0.996195;
54 }
55 
testDirCos()56 void TestPoleAxis::testDirCos()
57 {
58     dms h;
59     dms d;
60     QFETCH(double, Ha);
61     QFETCH(double, Dec);
62     h.setH(Ha);
63     d.setD(Dec);
64 
65 
66     Rotations::V3 dc;
67     dc = PoleAxis::dirCos(h, d);
68 
69 
70     QFETCH(double, X);
71     QFETCH(double, Y);
72     QFETCH(double, Z);
73 
74     compare(dc, X, Y, Z);
75 
76     SkyPoint sp(Ha, Dec);
77     dc = PoleAxis::dirCos(sp);
78     compare(dc.length(), 1.0, "length");
79     compare(dc, X, Y, Z);
80 }
81 
testPriSec_data()82 void TestPoleAxis::testPriSec_data()
83 {
84     testDirCos_data();
85 }
86 
testPriSec()87 void TestPoleAxis::testPriSec()
88 {
89     QFETCH(double, Ha);
90     QFETCH(double, Dec);
91     QFETCH(double, X);
92     QFETCH(double, Y);
93     QFETCH(double, Z);
94     Rotations::V3 dc(X, Y, Z);
95     dms p = PoleAxis::primary(dc);
96     compare(p.HoursHa(), Ha, "Ha");
97     compare(PoleAxis::secondary(dc).Degrees(), Dec, "Dec");
98 }
99 
100 
testPoleAxis_data()101 void TestPoleAxis::testPoleAxis_data()
102 {
103     QTest::addColumn<double>("Ha1");
104     QTest::addColumn<double>("Dec1");
105     QTest::addColumn<double>("Ha2");
106     QTest::addColumn<double>("Dec2");
107     QTest::addColumn<double>("Ha3");
108     QTest::addColumn<double>("Dec3");
109     QTest::addColumn<double>("X");
110     QTest::addColumn<double>("Y");
111     QTest::addColumn<double>("Z");
112 
113     QTest::newRow("Ha-606Dec0") << -6.0 << 0.0 << 0.0 << 0.0  << 6.0 << 0.0  << 0.0 << 0.0 << 1.0;
114     QTest::newRow("Ha20-2Dec89") << 2.0 << 89.0 << 0.0 << 89.0  << -2.0 << 89.0  << 0.0 << 0.0 << -1.0;
115     QTest::newRow("Ha0-22Dec89v") << 0.0 << 89.0 << -2.0 << 89.1  << 2.0 << 88.9  << -0.0006 << -0.003386 << -0.99999;
116     QTest::newRow("Ha2-20Dec-89") << 2.0 << -89.0  << -2.0 << -89.0 << 0.0 << -89.0  << 0.0 << 0.0 << 1.0;
117     QTest::newRow("Ha20-2Dec89") << 2.0 << 89.0  << 0.0 << 89.0 << -2.0 << 88.0  << 0.05633683 << 0.0150954 << 0.998298;
118     // failure cases, 2 or more points the same should ruturn a null matrix
119     QTest::newRow("Ha000Dec0") << 0.0 << 0.0 << 0.0 << 0.0  << 0.0 << 0.0  << 0.0 << 0.0 << 0.0;
120     QTest::newRow("Ha100Dec0") << 1.0 << 0.0 << 0.0 << 0.0  << 0.0 << 0.0  << 0.0 << 0.0 << 0.0;
121     QTest::newRow("Ha110Dec0") << 1.0 << 0.0 << 1.0 << 0.0  << 0.0 << 0.0  << 0.0 << 0.0 << 0.0;
122     QTest::newRow("Ha011Dec0") << 0.0 << 0.0 << 1.0 << 0.0  << 1.0 << 0.0  << 0.0 << 0.0 << 0.0;
123 }
124 
testPoleAxis()125 void TestPoleAxis::testPoleAxis()
126 {
127     QFETCH(double, Ha1);
128     QFETCH(double, Dec1);
129     QFETCH(double, Ha2);
130     QFETCH(double, Dec2);
131     QFETCH(double, Ha3);
132     QFETCH(double, Dec3);
133 
134     QFETCH(double, X);
135     QFETCH(double, Y);
136     QFETCH(double, Z);
137 
138     SkyPoint p1(Ha1, Dec1);
139     SkyPoint p2(Ha2, Dec2);
140     SkyPoint p3(Ha3, Dec3);
141 
142 
143     Rotations::V3 pa = PoleAxis::poleAxis(p1, p2, p3);
144 
145     compare(pa.x(), X, "X");
146     compare(pa.y(), Y, "Y");
147     compare(pa.z(), Z, "Z");
148 }
149 
150 QTEST_GUILESS_MAIN(TestPoleAxis)
151