// 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 (
	"os";
	"reflect";
	. "strconv";
	"testing";
)

type atofTest struct {
	in	string;
	out	string;
	err	os.Error;
}

var atoftests = []atofTest{
	atofTest{"", "0", os.EINVAL},
	atofTest{"1", "1", nil},
	atofTest{"+1", "1", nil},
	atofTest{"1x", "0", os.EINVAL},
	atofTest{"1.1.", "0", os.EINVAL},
	atofTest{"1e23", "1e+23", nil},
	atofTest{"100000000000000000000000", "1e+23", nil},
	atofTest{"1e-100", "1e-100", nil},
	atofTest{"123456700", "1.234567e+08", nil},
	atofTest{"99999999999999974834176", "9.999999999999997e+22", nil},
	atofTest{"100000000000000000000001", "1.0000000000000001e+23", nil},
	atofTest{"100000000000000008388608", "1.0000000000000001e+23", nil},
	atofTest{"100000000000000016777215", "1.0000000000000001e+23", nil},
	atofTest{"100000000000000016777216", "1.0000000000000003e+23", nil},
	atofTest{"-1", "-1", nil},
	atofTest{"-0", "-0", nil},
	atofTest{"1e-20", "1e-20", nil},
	atofTest{"625e-3", "0.625", nil},

	// largest float64
	atofTest{"1.7976931348623157e308", "1.7976931348623157e+308", nil},
	atofTest{"-1.7976931348623157e308", "-1.7976931348623157e+308", nil},
	// next float64 - too large
	atofTest{"1.7976931348623159e308", "+Inf", os.ERANGE},
	atofTest{"-1.7976931348623159e308", "-Inf", os.ERANGE},
	// the border is ...158079
	// borderline - okay
	atofTest{"1.7976931348623158e308", "1.7976931348623157e+308", nil},
	atofTest{"-1.7976931348623158e308", "-1.7976931348623157e+308", nil},
	// borderline - too large
	atofTest{"1.797693134862315808e308", "+Inf", os.ERANGE},
	atofTest{"-1.797693134862315808e308", "-Inf", os.ERANGE},

	// a little too large
	atofTest{"1e308", "1e+308", nil},
	atofTest{"2e308", "+Inf", os.ERANGE},
	atofTest{"1e309", "+Inf", os.ERANGE},

	// way too large
	atofTest{"1e310", "+Inf", os.ERANGE},
	atofTest{"-1e310", "-Inf", os.ERANGE},
	atofTest{"1e400", "+Inf", os.ERANGE},
	atofTest{"-1e400", "-Inf", os.ERANGE},
	atofTest{"1e400000", "+Inf", os.ERANGE},
	atofTest{"-1e400000", "-Inf", os.ERANGE},

	// denormalized
	atofTest{"1e-305", "1e-305", nil},
	atofTest{"1e-306", "1e-306", nil},
	atofTest{"1e-307", "1e-307", nil},
	atofTest{"1e-308", "1e-308", nil},
	atofTest{"1e-309", "1e-309", nil},
	atofTest{"1e-310", "1e-310", nil},
	atofTest{"1e-322", "1e-322", nil},
	// smallest denormal
	atofTest{"5e-324", "5e-324", nil},
	// too small
	atofTest{"4e-324", "0", nil},
	// way too small
	atofTest{"1e-350", "0", nil},
	atofTest{"1e-400000", "0", nil},

	// try to overflow exponent
	atofTest{"1e-4294967296", "0", nil},
	atofTest{"1e+4294967296", "+Inf", os.ERANGE},
	atofTest{"1e-18446744073709551616", "0", nil},
	atofTest{"1e+18446744073709551616", "+Inf", os.ERANGE},

	// Parse errors
	atofTest{"1e", "0", os.EINVAL},
	atofTest{"1e-", "0", os.EINVAL},
	atofTest{".e-1", "0", os.EINVAL},
}

func init() {
	// The atof routines return NumErrors wrapping
	// the error and the string.  Convert the table above.
	for i := range atoftests {
		test := &atoftests[i];
		if test.err != nil {
			test.err = &NumError{test.in, test.err}
		}
	}
}

func testAtof(t *testing.T, opt bool) {
	oldopt := SetOptimize(opt);
	for i := 0; i < len(atoftests); i++ {
		test := &atoftests[i];
		out, err := Atof64(test.in);
		outs := Ftoa64(out, 'g', -1);
		if outs != test.out || !reflect.DeepEqual(err, test.err) {
			t.Errorf("Atof64(%v) = %v, %v want %v, %v\n",
				test.in, out, err, test.out, test.err)
		}

		if float64(float32(out)) == out {
			out32, err := Atof32(test.in);
			outs := Ftoa32(out32, 'g', -1);
			if outs != test.out || !reflect.DeepEqual(err, test.err) {
				t.Errorf("Atof32(%v) = %v, %v want %v, %v  # %v\n",
					test.in, out32, err, test.out, test.err, out)
			}
		}

		if FloatSize == 64 || float64(float32(out)) == out {
			outf, err := Atof(test.in);
			outs := Ftoa(outf, 'g', -1);
			if outs != test.out || !reflect.DeepEqual(err, test.err) {
				t.Errorf("Ftoa(%v) = %v, %v want %v, %v  # %v\n",
					test.in, outf, err, test.out, test.err, out)
			}
		}
	}
	SetOptimize(oldopt);
}

func TestAtof(t *testing.T)	{ testAtof(t, true) }

func TestAtofSlow(t *testing.T)	{ testAtof(t, false) }
