| package compare |
| |
| import ( |
| "fmt" |
| "math" |
| "testing" |
| ) |
| |
| func TestKolmogorovSmirnov(t *testing.T) { |
| for i, test := range []struct { |
| name string |
| xdata []float64 |
| ydata []float64 |
| expected float64 |
| // if True, use almostEquals criteria, which is numerical difference |
| // rounded to the 7th difference |
| // https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertAlmostEqual |
| // else, use exact equals |
| almostEquals bool |
| }{ |
| { |
| name: "small samples", |
| xdata: []float64{0}, |
| ydata: []float64{1}, |
| expected: 0.2890414283708268, |
| almostEquals: false, |
| }, |
| { |
| name: "basic test 1", |
| xdata: []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, |
| ydata: []float64{20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, |
| expected: 1.8879793657162556e-05, |
| almostEquals: true, |
| }, |
| { |
| name: "basic test 2", |
| xdata: []float64{0, 1, 2, 3, 4}, |
| ydata: []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, |
| expected: 0.26680230985258474, |
| almostEquals: true, |
| }, |
| { |
| name: "duplicate values", |
| xdata: []float64{0, 0, 0, 0, 0}, |
| ydata: []float64{1, 1, 1, 1, 1}, |
| expected: 0.0037813540593701006, |
| almostEquals: true, |
| }, |
| { |
| name: "identical values", |
| xdata: []float64{0, 0, 0, 0, 0}, |
| ydata: []float64{0, 0, 0, 0, 0}, |
| expected: 1.0, |
| almostEquals: false, |
| }, |
| } { |
| t.Run(fmt.Sprintf("[%d] %s", i, test.name), func(t *testing.T) { |
| result, _ := KolmogorovSmirnov(test.xdata, test.ydata) |
| if test.almostEquals { |
| if math.Abs(result-test.expected) > 1e-7 { |
| t.Errorf("Expected %v, but got %v", test.expected, result) |
| } |
| } else { |
| if result != test.expected { |
| t.Errorf("Expected %v, but got %v", test.expected, result) |
| } |
| } |
| }) |
| } |
| // test no data case |
| _, err := KolmogorovSmirnov([]float64{}, []float64{}) |
| if err == nil { |
| t.Errorf("Expected error but got nil") |
| } |
| } |