// Copyright 2017 The goimagehash 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 transforms

import (
	"testing"
)

const (
	EPSILON float64 = 0.00000001
)

func TestDCT1D(t *testing.T) {
	for _, tt := range []struct {
		input  []float64
		output []float64
	}{
		{[]float64{1.0, 1.0, 1.0, 1.0}, []float64{2.0, 0, 0, 0}},
	} {

		out := DCT1D(tt.input)
		pass := true

		if len(tt.output) != len(out) {
			t.Errorf("DCT1D(%v) is expected %v but got %v.", tt.input, tt.output, out)
		}

		for i := range out {
			if (out[i]-tt.output[i]) > EPSILON || (tt.output[i]-out[i]) > EPSILON {
				pass = false
			}
		}

		if !pass || len(tt.output) != len(out) {
			t.Errorf("DCT1D(%v) is expected %v but got %v.", tt.input, tt.output, out)
		}
	}
}

func TestDCT2D(t *testing.T) {
	for _, tt := range []struct {
		input  [][]float64
		output [][]float64
		w      int
		h      int
	}{
		{[][]float64{{1.0, 2.0, 3.0, 4.0},
			{5.0, 6.0, 7.0, 8.0},
			{9.0, 10.0, 11.0, 12.0},
			{13.0, 14.0, 15.0, 16.0}},
			[][]float64{{34.0, -4.46088499, 0.0, -0.31702534},
				{-17.84353998, 0.0, 0.0, 0.0},
				{0.0, 0.0, 0.0, 0.0},
				{-1.26810134, 0.0, 0.0, 0.0}},
			4, 4},
	} {
		out := DCT2D(tt.input, tt.w, tt.h)
		pass := true

		for i := 0; i < tt.h; i++ {
			for j := 0; j < tt.w; j++ {
				if (out[i][j]-tt.output[i][j]) > EPSILON || (tt.output[i][j]-out[i][j]) > EPSILON {
					pass = false
				}
			}
		}

		if !pass {
			t.Errorf("DCT2D(%v) is expected %v but got %v.", tt.input, tt.output, out)
		}
	}
}
