// 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 strconv_test

import (
	. "strconv"
	"testing"
)

type shiftTest struct {
	i     uint64
	shift int
	out   string
}

var shifttests = []shiftTest{
	shiftTest{0, -100, "0"},
	shiftTest{0, 100, "0"},
	shiftTest{1, 100, "1267650600228229401496703205376"},
	shiftTest{1, -100,
		"0.00000000000000000000000000000078886090522101180541" +
			"17285652827862296732064351090230047702789306640625",
	},
	shiftTest{12345678, 8, "3160493568"},
	shiftTest{12345678, -8, "48225.3046875"},
	shiftTest{195312, 9, "99999744"},
	shiftTest{1953125, 9, "1000000000"},
}

func TestDecimalShift(t *testing.T) {
	for i := 0; i < len(shifttests); i++ {
		test := &shifttests[i]
		s := NewDecimal(test.i).Shift(test.shift).String()
		if s != test.out {
			t.Errorf("Decimal %v << %v = %v, want %v\n",
				test.i, test.shift, s, test.out)
		}
	}
}

type roundTest struct {
	i               uint64
	nd              int
	down, round, up string
	int             uint64
}

var roundtests = []roundTest{
	roundTest{0, 4, "0", "0", "0", 0},
	roundTest{12344999, 4, "12340000", "12340000", "12350000", 12340000},
	roundTest{12345000, 4, "12340000", "12340000", "12350000", 12340000},
	roundTest{12345001, 4, "12340000", "12350000", "12350000", 12350000},
	roundTest{23454999, 4, "23450000", "23450000", "23460000", 23450000},
	roundTest{23455000, 4, "23450000", "23460000", "23460000", 23460000},
	roundTest{23455001, 4, "23450000", "23460000", "23460000", 23460000},

	roundTest{99994999, 4, "99990000", "99990000", "100000000", 99990000},
	roundTest{99995000, 4, "99990000", "100000000", "100000000", 100000000},
	roundTest{99999999, 4, "99990000", "100000000", "100000000", 100000000},

	roundTest{12994999, 4, "12990000", "12990000", "13000000", 12990000},
	roundTest{12995000, 4, "12990000", "13000000", "13000000", 13000000},
	roundTest{12999999, 4, "12990000", "13000000", "13000000", 13000000},
}

func TestDecimalRound(t *testing.T) {
	for i := 0; i < len(roundtests); i++ {
		test := &roundtests[i]
		s := NewDecimal(test.i).RoundDown(test.nd).String()
		if s != test.down {
			t.Errorf("Decimal %v RoundDown %d = %v, want %v\n",
				test.i, test.nd, s, test.down)
		}
		s = NewDecimal(test.i).Round(test.nd).String()
		if s != test.round {
			t.Errorf("Decimal %v Round %d = %v, want %v\n",
				test.i, test.nd, s, test.down)
		}
		s = NewDecimal(test.i).RoundUp(test.nd).String()
		if s != test.up {
			t.Errorf("Decimal %v RoundUp %d = %v, want %v\n",
				test.i, test.nd, s, test.up)
		}
	}
}

type roundIntTest struct {
	i     uint64
	shift int
	int   uint64
}

var roundinttests = []roundIntTest{
	roundIntTest{0, 100, 0},
	roundIntTest{512, -8, 2},
	roundIntTest{513, -8, 2},
	roundIntTest{640, -8, 2},
	roundIntTest{641, -8, 3},
	roundIntTest{384, -8, 2},
	roundIntTest{385, -8, 2},
	roundIntTest{383, -8, 1},
	roundIntTest{1, 100, 1<<64 - 1},
	roundIntTest{1000, 0, 1000},
}

func TestDecimalRoundedInteger(t *testing.T) {
	for i := 0; i < len(roundinttests); i++ {
		test := roundinttests[i]
		int := NewDecimal(test.i).Shift(test.shift).RoundedInteger()
		if int != test.int {
			t.Errorf("Decimal %v >> %v RoundedInteger = %v, want %v\n",
				test.i, test.shift, int, test.int)
		}
	}
}
