| package ctrace2 |
| |
| import ( |
| "math" |
| "testing" |
| |
| "go.skia.org/infra/go/testutils" |
| "go.skia.org/infra/go/vec32" |
| "go.skia.org/infra/perf/go/config" |
| "go.skia.org/infra/perf/go/kmeans" |
| ) |
| |
| const ( |
| e = vec32.MISSING_DATA_SENTINEL |
| ) |
| |
| func near(a, b float64) bool { |
| return math.Abs(a-b) < 0.001 |
| } |
| |
| func TestDistance(t *testing.T) { |
| testutils.SmallTest(t) |
| a := &ClusterableTrace{Values: []float32{3, 0}} |
| b := &ClusterableTrace{Values: []float32{0, 4}} |
| if got, want := a.Distance(b), 5.0; !near(got, want) { |
| t.Errorf("Distance mismatch: Got %f Want %f", got, want) |
| } |
| if got, want := a.Distance(a), 0.0; !near(got, want) { |
| t.Errorf("Distance mismatch: Got %f Want %f", got, want) |
| } |
| } |
| |
| func TestNewFullTraceKey(t *testing.T) { |
| testutils.SmallTest(t) |
| ct := NewFullTrace("foo", []float32{1, -1}, config.MIN_STDDEV) |
| if got, want := ct.Key, "foo"; got != want { |
| t.Errorf("Key not set: Got %s Want %s", got, want) |
| } |
| } |
| |
| func TestNewFullTrace(t *testing.T) { |
| testutils.SmallTest(t) |
| // All positive (Near=true) testcases should end up with a normalized array |
| // of values with 1.0 in the first spot and a standard deviation of 1.0. |
| testcases := []struct { |
| Values []float32 |
| Near bool |
| }{ |
| { |
| Values: []float32{1.0, -1.0}, |
| Near: true, |
| }, |
| { |
| Values: []float32{e, 1.0, -1.0, -1.0}, |
| Near: true, |
| }, |
| { |
| Values: []float32{e, 1.0, -1.0, e}, |
| Near: true, |
| }, |
| { |
| Values: []float32{e, 2.0, -2.0, e}, |
| Near: true, |
| }, |
| { |
| // There's a limit to how small of a stddev we will normalize. |
| Values: []float32{e, config.MIN_STDDEV, -config.MIN_STDDEV, e}, |
| Near: false, |
| }, |
| } |
| for _, tc := range testcases { |
| ct := NewFullTrace("foo", tc.Values, config.MIN_STDDEV) |
| if got, want := float64(ct.Values[0]), 1.0; near(got, want) != tc.Near { |
| t.Errorf("Normalization failed for values %#v: near(Got %f, Want %f) != %t", tc.Values, got, want, tc.Near) |
| } |
| } |
| } |
| |
| func TestCalculateCentroid(t *testing.T) { |
| testutils.SmallTest(t) |
| members := []kmeans.Clusterable{ |
| &ClusterableTrace{Values: []float32{4, 0}}, |
| &ClusterableTrace{Values: []float32{0, 8}}, |
| } |
| c := CalculateCentroid(members).(*ClusterableTrace) |
| if got, want := float64(c.Values[0]), 2.0; !near(got, want) { |
| t.Errorf("Failed calculating centroid: !near(Got %f, Want %f)", got, want) |
| } |
| if got, want := float64(c.Values[1]), 4.0; !near(got, want) { |
| t.Errorf("Failed calculating centroid: !near(Got %f, Want %f)", got, want) |
| } |
| |
| } |