| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package mathtest |
| |
| import ( |
| "fmt" |
| "math" |
| "sort" |
| "strings" |
| "testing" |
| ) |
| |
| var ( |
| aeqDigits int |
| aeqFactor float64 |
| ) |
| |
| func SetAeqDigits(digits int) int { |
| old := aeqDigits |
| aeqDigits = digits |
| aeqFactor = 1 - math.Pow(10, float64(-digits+1)) |
| return old |
| } |
| |
| func init() { |
| SetAeqDigits(8) |
| } |
| |
| // Aeq returns true if expect and got are equal up to the current |
| // number of aeq digits set by SetAeqDigits. By default, this is 8 |
| // significant figures (1 part in 100 million). |
| func Aeq(expect, got float64) bool { |
| if expect < 0 && got < 0 { |
| expect, got = -expect, -got |
| } |
| return expect*aeqFactor <= got && got*aeqFactor <= expect |
| } |
| |
| func WantFunc(t *testing.T, name string, f func(float64) float64, vals map[float64]float64) { |
| xs := make([]float64, 0, len(vals)) |
| for x := range vals { |
| xs = append(xs, x) |
| } |
| sort.Float64s(xs) |
| |
| for _, x := range xs { |
| want, got := vals[x], f(x) |
| if math.IsNaN(want) && math.IsNaN(got) || Aeq(want, got) { |
| continue |
| } |
| var label string |
| if strings.Contains(name, "%v") { |
| label = fmt.Sprintf(name, x) |
| } else { |
| label = fmt.Sprintf("%s(%v)", name, x) |
| } |
| t.Errorf("want %s=%v, got %v", label, want, got) |
| } |
| } |