62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
// 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)
|
|
}
|
|
}
|