// Copyright ©2016 The gonum 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 integrate

import (
	"math"
	"testing"

	"gonum.org/v1/gonum/floats"
)

func TestTrapezoidal(t *testing.T) {
	const N = 1e6
	x := floats.Span(make([]float64, N), 0, 1)
	for i, test := range []struct {
		x    []float64
		f    func(x float64) float64
		want float64
	}{
		{
			x:    x,
			f:    func(x float64) float64 { return x },
			want: 0.5,
		},
		{
			x:    floats.Span(make([]float64, N), -1, 1),
			f:    func(x float64) float64 { return x },
			want: 0,
		},
		{
			x:    x,
			f:    func(x float64) float64 { return x + 10 },
			want: 10.5,
		},
		{
			x:    x,
			f:    func(x float64) float64 { return 3*x*x + 10 },
			want: 11,
		},
		{
			x:    x,
			f:    func(x float64) float64 { return math.Exp(x) },
			want: 1.7182818284591876,
		},
		{
			x:    floats.Span(make([]float64, N), 0, math.Pi),
			f:    func(x float64) float64 { return math.Cos(x) },
			want: 0,
		},
		{
			x:    floats.Span(make([]float64, N), 0, 2*math.Pi),
			f:    func(x float64) float64 { return math.Cos(x) },
			want: 0,
		},
		{
			x:    floats.Span(make([]float64, N*10), 0, math.Pi),
			f:    func(x float64) float64 { return math.Sin(x) },
			want: 2,
		},
		{
			x:    floats.Span(make([]float64, N*10), 0, 0.5*math.Pi),
			f:    func(x float64) float64 { return math.Sin(x) },
			want: 1,
		},
		{
			x:    floats.Span(make([]float64, N), 0, 2*math.Pi),
			f:    func(x float64) float64 { return math.Sin(x) },
			want: 0,
		},
	} {
		y := make([]float64, len(test.x))
		for i, v := range test.x {
			y[i] = test.f(v)
		}
		v := Trapezoidal(test.x, y)
		if !floats.EqualWithinAbs(v, test.want, 1e-12) {
			t.Errorf("test #%d: got=%v want=%v\n", i, v, test.want)
		}
	}
}
