// 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",
				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",
				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",
				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",
				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",
				test.i, test.shift, int, test.int)
		}
	}
}
