// 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 itob64Test struct {
	in   int64
	base uint
	out  string
}

var itob64tests = []itob64Test{
	itob64Test{0, 10, "0"},
	itob64Test{1, 10, "1"},
	itob64Test{-1, 10, "-1"},
	itob64Test{12345678, 10, "12345678"},
	itob64Test{-987654321, 10, "-987654321"},
	itob64Test{1<<31 - 1, 10, "2147483647"},
	itob64Test{-1<<31 + 1, 10, "-2147483647"},
	itob64Test{1 << 31, 10, "2147483648"},
	itob64Test{-1 << 31, 10, "-2147483648"},
	itob64Test{1<<31 + 1, 10, "2147483649"},
	itob64Test{-1<<31 - 1, 10, "-2147483649"},
	itob64Test{1<<32 - 1, 10, "4294967295"},
	itob64Test{-1<<32 + 1, 10, "-4294967295"},
	itob64Test{1 << 32, 10, "4294967296"},
	itob64Test{-1 << 32, 10, "-4294967296"},
	itob64Test{1<<32 + 1, 10, "4294967297"},
	itob64Test{-1<<32 - 1, 10, "-4294967297"},
	itob64Test{1 << 50, 10, "1125899906842624"},
	itob64Test{1<<63 - 1, 10, "9223372036854775807"},
	itob64Test{-1<<63 + 1, 10, "-9223372036854775807"},
	itob64Test{-1 << 63, 10, "-9223372036854775808"},

	itob64Test{0, 2, "0"},
	itob64Test{10, 2, "1010"},
	itob64Test{-1, 2, "-1"},
	itob64Test{1 << 15, 2, "1000000000000000"},

	itob64Test{-8, 8, "-10"},
	itob64Test{057635436545, 8, "57635436545"},
	itob64Test{1 << 24, 8, "100000000"},

	itob64Test{16, 16, "10"},
	itob64Test{-0x123456789abcdef, 16, "-123456789abcdef"},
	itob64Test{1<<63 - 1, 16, "7fffffffffffffff"},
	itob64Test{1<<63 - 1, 2, "111111111111111111111111111111111111111111111111111111111111111"},

	itob64Test{16, 17, "g"},
	itob64Test{25, 25, "10"},
	itob64Test{(((((17*35+24)*35+21)*35+34)*35+12)*35+24)*35 + 32, 35, "holycow"},
	itob64Test{(((((17*36+24)*36+21)*36+34)*36+12)*36+24)*36 + 32, 36, "holycow"},
}

func TestItoa(t *testing.T) {
	for _, test := range itob64tests {
		s := Itob64(test.in, test.base)
		if s != test.out {
			t.Errorf("Itob64(%v, %v) = %v want %v\n",
				test.in, test.base, s, test.out)
		}

		if test.in >= 0 {
			s := Uitob64(uint64(test.in), test.base)
			if s != test.out {
				t.Errorf("Uitob64(%v, %v) = %v want %v\n",
					test.in, test.base, s, test.out)
			}
		}

		if int64(int(test.in)) == test.in {
			s := Itob(int(test.in), test.base)
			if s != test.out {
				t.Errorf("Itob(%v, %v) = %v want %v\n",
					test.in, test.base, s, test.out)
			}

			if test.in >= 0 {
				s := Uitob(uint(test.in), test.base)
				if s != test.out {
					t.Errorf("Uitob(%v, %v) = %v want %v\n",
						test.in, test.base, s, test.out)
				}
			}
		}

		if test.base == 10 {
			s := Itoa64(test.in)
			if s != test.out {
				t.Errorf("Itoa64(%v) = %v want %v\n",
					test.in, s, test.out)
			}

			if test.in >= 0 {
				s := Uitob64(uint64(test.in), test.base)
				if s != test.out {
					t.Errorf("Uitob64(%v, %v) = %v want %v\n",
						test.in, test.base, s, test.out)
				}
			}

			if int64(int(test.in)) == test.in {
				s := Itoa(int(test.in))
				if s != test.out {
					t.Errorf("Itoa(%v) = %v want %v\n",
						test.in, s, test.out)
				}

				if test.in >= 0 {
					s := Uitoa(uint(test.in))
					if s != test.out {
						t.Errorf("Uitoa(%v) = %v want %v\n",
							test.in, s, test.out)
					}
				}
			}
		}
	}
}

type uitob64Test struct {
	in   uint64
	base uint
	out  string
}

var uitob64tests = []uitob64Test{
	uitob64Test{1<<63 - 1, 10, "9223372036854775807"},
	uitob64Test{1 << 63, 10, "9223372036854775808"},
	uitob64Test{1<<63 + 1, 10, "9223372036854775809"},
	uitob64Test{1<<64 - 2, 10, "18446744073709551614"},
	uitob64Test{1<<64 - 1, 10, "18446744073709551615"},
	uitob64Test{1<<64 - 1, 2, "1111111111111111111111111111111111111111111111111111111111111111"},
}

func TestUitoa(t *testing.T) {
	for _, test := range uitob64tests {
		s := Uitob64(test.in, test.base)
		if s != test.out {
			t.Errorf("Uitob64(%v, %v) = %v want %v\n",
				test.in, test.base, s, test.out)
		}

		if uint64(uint(test.in)) == test.in {
			s := Uitob(uint(test.in), test.base)
			if s != test.out {
				t.Errorf("Uitob(%v, %v) = %v want %v\n",
					test.in, test.base, s, test.out)
			}
		}

		if test.base == 10 {
			s := Uitoa64(test.in)
			if s != test.out {
				t.Errorf("Uitoa64(%v) = %v want %v\n",
					test.in, s, test.out)
			}

			if uint64(uint(test.in)) == test.in {
				s := Uitoa(uint(test.in))
				if s != test.out {
					t.Errorf("Uitoa(%v) = %v want %v\n",
						test.in, s, test.out)
				}
			}
		}
	}
}
