Skip to content

Commit 74218ce

Browse files
author
Michael S
committed
The new interface implemented + tests
1 parent e5276da commit 74218ce

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

igrf/igrf.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ import (
1010
"github.com/proway2/go-igrf/coeffs"
1111
)
1212

13+
type IGRFdata struct {
14+
shc *coeffs.IGRFcoeffs
15+
}
16+
17+
// New returns an initialized IGRF structure that could be used to compute .
18+
func New() *IGRFdata {
19+
shc, err := coeffs.NewCoeffsData()
20+
if err != nil {
21+
log.Fatal(err.Error())
22+
}
23+
return &IGRFdata{shc: shc}
24+
}
25+
1326
// IGRF computes values for the geomagnetic field and secular variation for a given set of coordinates and date
1427
// and returns a populated `IGRFresults` structure.
1528
//
@@ -19,15 +32,14 @@ import (
1932
// alt - geodetic altitude above mean sea level in km (-1.00 to 600.00).
2033
//
2134
// date - decimal date (1900.00 to 2025).
22-
func IGRF(lat, lon, alt, date float64) (IGRFresults, error) {
35+
func (igd *IGRFdata) IGRF(lat, lon, alt, date float64) (IGRFresults, error) {
36+
if igd.shc == nil {
37+
return IGRFresults{}, errors.New("IGRFdata structure is not initialized.")
38+
}
2339
if err := checkInitialConditions(lat, lon, alt); err != nil {
2440
return IGRFresults{}, err
2541
}
26-
shc, err := coeffs.NewCoeffsData()
27-
if err != nil {
28-
log.Fatal(err.Error())
29-
}
30-
start_coeffs, end_coeffs, nmax, err := shc.Coeffs(date)
42+
start_coeffs, end_coeffs, nmax, err := igd.shc.Coeffs(date)
3143
if err != nil {
3244
return IGRFresults{}, err
3345
}

igrf/igrf_edge_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ func TestIGRFEdgeCases(t *testing.T) {
6161
// wantErr: false,
6262
// },
6363
}
64+
igrf_data := New()
6465
for _, tt := range tests {
6566
t.Run(tt.name, func(t *testing.T) {
66-
got, err := IGRF(tt.args.lat, tt.args.lon, tt.args.alt, tt.args.date)
67+
got, err := igrf_data.IGRF(tt.args.lat, tt.args.lon, tt.args.alt, tt.args.date)
6768
if (err != nil) != tt.wantErr {
6869
t.Errorf("IGRF() error = %v, wantErr %v", err, tt.wantErr)
6970
return

igrf/igrf_test.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import (
66
"math"
77
"os"
88
"path/filepath"
9+
"reflect"
910
"regexp"
1011
"strconv"
1112
"strings"
1213
"testing"
14+
15+
"github.com/proway2/go-igrf/coeffs"
1316
)
1417

1518
type args struct {
@@ -37,19 +40,41 @@ const (
3740

3841
const near_pole_tolerance = 0.001
3942

43+
func TestNew(t *testing.T) {
44+
shc, _ := coeffs.NewCoeffsData()
45+
tests := []struct {
46+
name string
47+
want *IGRFdata
48+
}{
49+
{
50+
name: "Creating a IGRF data structure",
51+
want: &IGRFdata{shc: shc},
52+
},
53+
}
54+
for _, tt := range tests {
55+
t.Run(tt.name, func(t *testing.T) {
56+
got := New()
57+
if !reflect.DeepEqual(got, tt.want) {
58+
t.Errorf("New() = %v, want %v", got, tt.want)
59+
}
60+
})
61+
}
62+
}
63+
4064
// SV fields are just integers in FORTRAN, so there might be situations where:
4165
// calculated value 16.47, reference 17
4266
// calculated value 2.52, reference 3
4367
// ...
4468
// const max_sv_error = 50 // %
4569

46-
func TestIGRFDataCases(t *testing.T) {
70+
func TestIGRFdata_IGRF(t *testing.T) {
4771
tests := getTestData()
72+
igrf_data := New()
4873
for _, tt := range tests {
4974
t.Run(tt.name, func(t *testing.T) {
50-
got, err := IGRF(tt.args.lat, tt.args.lon, tt.args.alt, tt.args.date)
75+
got, err := igrf_data.IGRF(tt.args.lat, tt.args.lon, tt.args.alt, tt.args.date)
5176
if (err != nil) != tt.wantErr {
52-
t.Errorf("IGRF() error = %v, wantErr %v", err, tt.wantErr)
77+
t.Errorf("IGRFdata.IGRF() error = %v, wantErr %v", err, tt.wantErr)
5378
return
5479
}
5580
allowed_relative_error := getMaxAllowedRelativeError(tt.args.lat)

0 commit comments

Comments
 (0)