78 lines
2.6 KiB
Go
78 lines
2.6 KiB
Go
|
|
package basic
|
||
|
|
|
||
|
|
import (
|
||
|
|
"math"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestOrbitalNodesDescendingOpposesAscending(t *testing.T) {
|
||
|
|
jde := 2461157.5
|
||
|
|
testCases := []struct {
|
||
|
|
name string
|
||
|
|
ascending func(float64) float64
|
||
|
|
descending func(float64) float64
|
||
|
|
}{
|
||
|
|
{name: "moon", ascending: MoonAscendingNode, descending: MoonDescendingNode},
|
||
|
|
{name: "mercury", ascending: MercuryAscendingNode, descending: MercuryDescendingNode},
|
||
|
|
{name: "venus", ascending: VenusAscendingNode, descending: VenusDescendingNode},
|
||
|
|
{name: "mars", ascending: MarsAscendingNode, descending: MarsDescendingNode},
|
||
|
|
{name: "jupiter", ascending: JupiterAscendingNode, descending: JupiterDescendingNode},
|
||
|
|
{name: "saturn", ascending: SaturnAscendingNode, descending: SaturnDescendingNode},
|
||
|
|
{name: "uranus", ascending: UranusAscendingNode, descending: UranusDescendingNode},
|
||
|
|
{name: "neptune", ascending: NeptuneAscendingNode, descending: NeptuneDescendingNode},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tc := range testCases {
|
||
|
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
|
ascending := tc.ascending(jde)
|
||
|
|
descending := tc.descending(jde)
|
||
|
|
want := ascending + 180
|
||
|
|
if want >= 360 {
|
||
|
|
want -= 360
|
||
|
|
}
|
||
|
|
if diff := angularDifference(descending, ascending+180); diff > 1e-10 {
|
||
|
|
t.Fatalf("descending node mismatch: got %.12f want %.12f diff=%.12g", descending, want, diff)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestOrbitalNodesNFullMatchesDefault(t *testing.T) {
|
||
|
|
jde := 2461157.5
|
||
|
|
testCases := []struct {
|
||
|
|
name string
|
||
|
|
defaultFn func(float64) float64
|
||
|
|
truncatedN func(float64, int) float64
|
||
|
|
}{
|
||
|
|
{name: "moon", defaultFn: MoonAscendingNode, truncatedN: MoonAscendingNodeN},
|
||
|
|
{name: "mercury", defaultFn: MercuryAscendingNode, truncatedN: MercuryAscendingNodeN},
|
||
|
|
{name: "venus", defaultFn: VenusAscendingNode, truncatedN: VenusAscendingNodeN},
|
||
|
|
{name: "mars", defaultFn: MarsAscendingNode, truncatedN: MarsAscendingNodeN},
|
||
|
|
{name: "jupiter", defaultFn: JupiterAscendingNode, truncatedN: JupiterAscendingNodeN},
|
||
|
|
{name: "saturn", defaultFn: SaturnAscendingNode, truncatedN: SaturnAscendingNodeN},
|
||
|
|
{name: "uranus", defaultFn: UranusAscendingNode, truncatedN: UranusAscendingNodeN},
|
||
|
|
{name: "neptune", defaultFn: NeptuneAscendingNode, truncatedN: NeptuneAscendingNodeN},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tc := range testCases {
|
||
|
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
|
got := tc.defaultFn(jde)
|
||
|
|
gotN := tc.truncatedN(jde, -1)
|
||
|
|
if diff := angularDifference(got, gotN); diff > 1e-10 {
|
||
|
|
t.Fatalf("full-series N mismatch: got %.12f want %.12f diff=%.12g", gotN, got, diff)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func angularDifference(a, b float64) float64 {
|
||
|
|
diff := math.Mod(a-b, 360)
|
||
|
|
if diff < -180 {
|
||
|
|
diff += 360
|
||
|
|
}
|
||
|
|
if diff > 180 {
|
||
|
|
diff -= 360
|
||
|
|
}
|
||
|
|
return math.Abs(diff)
|
||
|
|
}
|