| // 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 app |
| |
| import ( |
| "math/rand" |
| "testing" |
| ) |
| |
| // Aeq returns true if expect and got are equal to 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*0.99999999 <= got && got*0.99999999 <= expect |
| } |
| |
| func TestMovingAverage(t *testing.T) { |
| // Test MovingAverage against the obvious (but slow) |
| // implementation. |
| xs := make([]float64, 100) |
| for iter := 0; iter < 10; iter++ { |
| for i := range xs { |
| xs[i] = rand.Float64() |
| } |
| m := 1 + 2*rand.Intn(100) |
| ys1, ys2 := MovingAverage(xs, m), slowMovingAverage(xs, m) |
| |
| // TODO: Use stuff from mathtest. |
| for i, y1 := range ys1 { |
| if !Aeq(y1, ys2[i]) { |
| t.Fatalf("want %v, got %v", ys2, ys1) |
| } |
| } |
| } |
| } |
| |
| func slowMovingAverage(xs []float64, m int) []float64 { |
| ys := make([]float64, len(xs)) |
| for i := range ys { |
| psum, n := 0.0, 0 |
| for j := i - (m-1)/2; j <= i+(m-1)/2; j++ { |
| if 0 <= j && j < len(xs) { |
| psum += xs[j] |
| n++ |
| } |
| } |
| ys[i] = psum / float64(n) |
| } |
| return ys |
| } |