package math

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestParseFraction(t *testing.T) {
	testCases := []struct {
		f   string
		exp Fraction
		err bool
	}{
		{
			f:   "2/3",
			exp: Fraction{2, 3},
			err: false,
		},
		{
			f:   "15/5",
			exp: Fraction{15, 5},
			err: false,
		},
		// test divide by zero error
		{
			f:   "2/0",
			exp: Fraction{},
			err: true,
		},
		// test negative
		{
			f:   "-1/2",
			exp: Fraction{},
			err: true,
		},
		{
			f:   "1/-2",
			exp: Fraction{},
			err: true,
		},
		// test overflow
		{
			f:   "9223372036854775808/2",
			exp: Fraction{},
			err: true,
		},
		{
			f:   "2/9223372036854775808",
			exp: Fraction{},
			err: true,
		},
		{
			f:   "2/3/4",
			exp: Fraction{},
			err: true,
		},
		{
			f:   "123",
			exp: Fraction{},
			err: true,
		},
		{
			f:   "1a2/4",
			exp: Fraction{},
			err: true,
		},
		{
			f:   "1/3bc4",
			exp: Fraction{},
			err: true,
		},
	}

	for idx, tc := range testCases {
		output, err := ParseFraction(tc.f)
		if tc.err {
			assert.Error(t, err, idx)
		} else {
			assert.NoError(t, err, idx)
		}
		assert.Equal(t, tc.exp, output, idx)
	}
}
