// 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
import (
	"fmt";
	"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 := strconv.optimize;
	strconv.optimize = opt;
	for i := 0; i < len(atoftests); i++ {
		test := &atoftests[i];
		out, err := strconv.Atof64(test.in);
		outs := strconv.Ftoa64(out, 'g', -1);
		if outs != test.out || !reflect.DeepEqual(err, test.err) {
			t.Errorf("strconv.Atof64(%v) = %v, %v want %v, %v\n",
				test.in, out, err, test.out, test.err);
		}

		if float64(float32(out)) == out {
			out32, err := strconv.Atof32(test.in);
			outs := strconv.Ftoa32(out32, 'g', -1);
			if outs != test.out || !reflect.DeepEqual(err, test.err) {
				t.Errorf("strconv.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 := strconv.Atof(test.in);
			outs := strconv.Ftoa(outf, 'g', -1);
			if outs != test.out || !reflect.DeepEqual(err, test.err) {
				t.Errorf("strconv.Ftoa(%v) = %v, %v want %v, %v  # %v\n",
					test.in, outf, err, test.out, test.err, out);
			}
		}
	}
	strconv.optimize = oldopt;
}

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

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