// Copyright 2009 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 big

import "testing"

type cmpTest struct {
	x, y nat
	r    int
}


var cmpTests = []cmpTest{
	cmpTest{nil, nil, 0},
	cmpTest{nil, nat{}, 0},
	cmpTest{nat{}, nil, 0},
	cmpTest{nat{}, nat{}, 0},
	cmpTest{nat{0}, nat{0}, 0},
	cmpTest{nat{0}, nat{1}, -1},
	cmpTest{nat{1}, nat{0}, 1},
	cmpTest{nat{1}, nat{1}, 0},
	cmpTest{nat{0, _M}, nat{1}, 1},
	cmpTest{nat{1}, nat{0, _M}, -1},
	cmpTest{nat{1, _M}, nat{0, _M}, 1},
	cmpTest{nat{0, _M}, nat{1, _M}, -1},
	cmpTest{nat{16, 571956, 8794, 68}, nat{837, 9146, 1, 754489}, -1},
	cmpTest{nat{34986, 41, 105, 1957}, nat{56, 7458, 104, 1957}, 1},
}


func TestCmp(t *testing.T) {
	for i, a := range cmpTests {
		r := a.x.cmp(a.y)
		if r != a.r {
			t.Errorf("#%d got r = %v; want %v", i, r, a.r)
		}
	}
}


type funNN func(z, x, y nat) nat
type argNN struct {
	z, x, y nat
}


var sumNN = []argNN{
	argNN{},
	argNN{nat{1}, nil, nat{1}},
	argNN{nat{1111111110}, nat{123456789}, nat{987654321}},
	argNN{nat{0, 0, 0, 1}, nil, nat{0, 0, 0, 1}},
	argNN{nat{0, 0, 0, 1111111110}, nat{0, 0, 0, 123456789}, nat{0, 0, 0, 987654321}},
	argNN{nat{0, 0, 0, 1}, nat{0, 0, _M}, nat{0, 0, 1}},
}


var prodNN = []argNN{
	argNN{},
	argNN{nil, nil, nil},
	argNN{nil, nat{991}, nil},
	argNN{nat{991}, nat{991}, nat{1}},
	argNN{nat{991 * 991}, nat{991}, nat{991}},
	argNN{nat{0, 0, 991 * 991}, nat{0, 991}, nat{0, 991}},
	argNN{nat{1 * 991, 2 * 991, 3 * 991, 4 * 991}, nat{1, 2, 3, 4}, nat{991}},
	argNN{nat{4, 11, 20, 30, 20, 11, 4}, nat{1, 2, 3, 4}, nat{4, 3, 2, 1}},
}


func TestSet(t *testing.T) {
	for _, a := range sumNN {
		z := nat(nil).set(a.z)
		if z.cmp(a.z) != 0 {
			t.Errorf("got z = %v; want %v", z, a.z)
		}
	}
}


func testFunNN(t *testing.T, msg string, f funNN, a argNN) {
	z := f(nil, a.x, a.y)
	if z.cmp(a.z) != 0 {
		t.Errorf("%s%+v\n\tgot z = %v; want %v", msg, a, z, a.z)
	}
}


func TestFunNN(t *testing.T) {
	for _, a := range sumNN {
		arg := a
		testFunNN(t, "add", nat.add, arg)

		arg = argNN{a.z, a.y, a.x}
		testFunNN(t, "add symmetric", nat.add, arg)

		arg = argNN{a.x, a.z, a.y}
		testFunNN(t, "sub", nat.sub, arg)

		arg = argNN{a.y, a.z, a.x}
		testFunNN(t, "sub symmetric", nat.sub, arg)
	}

	for _, a := range prodNN {
		arg := a
		testFunNN(t, "mul", nat.mul, arg)

		arg = argNN{a.z, a.y, a.x}
		testFunNN(t, "mul symmetric", nat.mul, arg)
	}
}


type mulRangeN struct {
	a, b uint64
	prod string
}


var mulRangesN = []mulRangeN{
	mulRangeN{0, 0, "0"},
	mulRangeN{1, 1, "1"},
	mulRangeN{1, 2, "2"},
	mulRangeN{1, 3, "6"},
	mulRangeN{10, 10, "10"},
	mulRangeN{0, 100, "0"},
	mulRangeN{0, 1e9, "0"},
	mulRangeN{1, 0, "1"},                    // empty range
	mulRangeN{100, 1, "1"},                  // empty range
	mulRangeN{1, 10, "3628800"},             // 10!
	mulRangeN{1, 20, "2432902008176640000"}, // 20!
	mulRangeN{1, 100,
		"933262154439441526816992388562667004907159682643816214685929" +
			"638952175999932299156089414639761565182862536979208272237582" +
			"51185210916864000000000000000000000000", // 100!
	},
}


func TestMulRangeN(t *testing.T) {
	for i, r := range mulRangesN {
		prod := nat(nil).mulRange(r.a, r.b).string(10)
		if prod != r.prod {
			t.Errorf("#%d: got %s; want %s", i, prod, r.prod)
		}
	}
}


var mulArg, mulTmp nat

func init() {
	const n = 1000
	mulArg = make(nat, n)
	for i := 0; i < n; i++ {
		mulArg[i] = _M
	}
}


func benchmarkMulLoad() {
	for j := 1; j <= 10; j++ {
		x := mulArg[0 : j*100]
		mulTmp.mul(x, x)
	}
}


func BenchmarkMul(b *testing.B) {
	for i := 0; i < b.N; i++ {
		benchmarkMulLoad()
	}
}


type str struct {
	x nat
	b int
	s string
}


var tab = []str{
	str{nil, 10, "0"},
	str{nat{1}, 10, "1"},
	str{nat{10}, 10, "10"},
	str{nat{1234567890}, 10, "1234567890"},
}


func TestString(t *testing.T) {
	for _, a := range tab {
		s := a.x.string(a.b)
		if s != a.s {
			t.Errorf("string%+v\n\tgot s = %s; want %s", a, s, a.s)
		}

		x, b, n := nat(nil).scan(a.s, a.b)
		if x.cmp(a.x) != 0 {
			t.Errorf("scan%+v\n\tgot z = %v; want %v", a, x, a.x)
		}
		if b != a.b {
			t.Errorf("scan%+v\n\tgot b = %d; want %d", a, b, a.b)
		}
		if n != len(a.s) {
			t.Errorf("scan%+v\n\tgot n = %d; want %d", a, n, len(a.s))
		}
	}
}


func TestLeadingZeros(t *testing.T) {
	var x Word = _B >> 1
	for i := 0; i <= _W; i++ {
		if int(leadingZeros(x)) != i {
			t.Errorf("failed at %x: got %d want %d", x, leadingZeros(x), i)
		}
		x >>= 1
	}
}


type shiftTest struct {
	in    nat
	shift uint
	out   nat
}


var leftShiftTests = []shiftTest{
	shiftTest{nil, 0, nil},
	shiftTest{nil, 1, nil},
	shiftTest{natOne, 0, natOne},
	shiftTest{natOne, 1, natTwo},
	shiftTest{nat{1 << (_W - 1)}, 1, nat{0}},
	shiftTest{nat{1 << (_W - 1), 0}, 1, nat{0, 1}},
}


func TestShiftLeft(t *testing.T) {
	for i, test := range leftShiftTests {
		var z nat
		z = z.shl(test.in, test.shift)
		for j, d := range test.out {
			if j >= len(z) || z[j] != d {
				t.Errorf("#%d: got: %v want: %v", i, z, test.out)
				break
			}
		}
	}
}


var rightShiftTests = []shiftTest{
	shiftTest{nil, 0, nil},
	shiftTest{nil, 1, nil},
	shiftTest{natOne, 0, natOne},
	shiftTest{natOne, 1, nil},
	shiftTest{natTwo, 1, natOne},
	shiftTest{nat{0, 1}, 1, nat{1 << (_W - 1)}},
	shiftTest{nat{2, 1, 1}, 1, nat{1<<(_W-1) + 1, 1 << (_W - 1)}},
}


func TestShiftRight(t *testing.T) {
	for i, test := range rightShiftTests {
		var z nat
		z = z.shr(test.in, test.shift)
		for j, d := range test.out {
			if j >= len(z) || z[j] != d {
				t.Errorf("#%d: got: %v want: %v", i, z, test.out)
				break
			}
		}
	}
}


type modWTest struct {
	in       string
	dividend string
	out      string
}


var modWTests32 = []modWTest{
	modWTest{"23492635982634928349238759823742", "252341", "220170"},
}


var modWTests64 = []modWTest{
	modWTest{"6527895462947293856291561095690465243862946", "524326975699234", "375066989628668"},
}


func runModWTests(t *testing.T, tests []modWTest) {
	for i, test := range tests {
		in, _ := new(Int).SetString(test.in, 10)
		d, _ := new(Int).SetString(test.dividend, 10)
		out, _ := new(Int).SetString(test.out, 10)

		r := in.abs.modW(d.abs[0])
		if r != out.abs[0] {
			t.Errorf("#%d failed: got %s want %s", i, r, out)
		}
	}
}


func TestModW(t *testing.T) {
	if _W >= 32 {
		runModWTests(t, modWTests32)
	}
	if _W >= 64 {
		runModWTests(t, modWTests64)
	}
}


func TestTrailingZeroBits(t *testing.T) {
	var x Word
	x--
	for i := 0; i < _W; i++ {
		if trailingZeroBits(x) != i {
			t.Errorf("Failed at step %d: x: %x got: %d", i, x, trailingZeroBits(x))
		}
		x <<= 1
	}
}


type expNNTest struct {
	x, y, m string
	out     string
}


var expNNTests = []expNNTest{
	expNNTest{"0x8000000000000000", "2", "", "0x40000000000000000000000000000000"},
	expNNTest{"0x8000000000000000", "2", "6719", "4944"},
	expNNTest{"0x8000000000000000", "3", "6719", "5447"},
	expNNTest{"0x8000000000000000", "1000", "6719", "1603"},
	expNNTest{"0x8000000000000000", "1000000", "6719", "3199"},
	expNNTest{
		"2938462938472983472983659726349017249287491026512746239764525612965293865296239471239874193284792387498274256129746192347",
		"298472983472983471903246121093472394872319615612417471234712061",
		"29834729834729834729347290846729561262544958723956495615629569234729836259263598127342374289365912465901365498236492183464",
		"23537740700184054162508175125554701713153216681790245129157191391322321508055833908509185839069455749219131480588829346291",
	},
}


func TestExpNN(t *testing.T) {
	for i, test := range expNNTests {
		x, _, _ := nat(nil).scan(test.x, 0)
		y, _, _ := nat(nil).scan(test.y, 0)
		out, _, _ := nat(nil).scan(test.out, 0)

		var m nat

		if len(test.m) > 0 {
			m, _, _ = nat(nil).scan(test.m, 0)
		}

		z := nat(nil).expNN(x, y, m)
		if z.cmp(out) != 0 {
			t.Errorf("#%d got %v want %v", i, z, out)
		}
	}
}
