// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package parse

import (
	"testing"
)

var numericTests = []struct {
	in       string
	outToken string
	outKind  NumberKind
}{
	{"47", "47", Decimal},
	{"47u", "47u", Decimal},
	{"0x47u", "0x47u", Hexadecimal},
	{".47", ".47", Floating},
	{"42.47", "42.47", Floating},
	{"47.", "47.", Floating},
	{"0.47", "0.47", Floating},
	{"0", "0", Octal},
	{"047", "047", Octal},
	{"047u", "047u", Octal},
	{"47.e42", "47.e42", Scientific},
	{"4.7e4", "4.7e4", Scientific},
	{"4.7e-4", "4.7e-4", Scientific},
	{".", "", NotNumeric},
	{"47e", "", NotNumeric},
	{"47e+", "", NotNumeric},
}

func TestNumeric(t *testing.T) {
	for _, test := range numericTests {
		r := NewReader(test.in)
		gotKind := r.Numeric()
		gotTok := r.Token()

		if gotKind != test.outKind {
			t.Errorf("For %q git number kind %s, but expected %s.", test.in, gotKind,
				test.outKind)
		}
		if gotTok.String() != test.outToken {
			t.Errorf("For %q git token %q, but expected %q.", test.in, gotTok,
				test.outToken)
		}
	}
}
