// 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{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"},
}

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)
				}
			}
		}
	}
}
