package main

import (
	"fmt"
	"testing"
)

func TestShouldReduceExpression(t *testing.T) {
	tests := []string{
		"1+2*3+4*5+6",
		"2*3+(4*5)",
		"1+(2*3)+(4*(5+6))",
		"(2*3)+(4*5)",
		"5+(8*3+9+3*4*3)",
		"5*9*(7*3*3+9*3+(8+6*4))",
		"((2+4*9)*(6+9*8+6)+6)+2+4*2",
	}
	expected := []int{
		71,
		26,
		51,
		26,
		437,
		12240,
		13632,
	}

	for i, test := range tests {
		result := reduce(prepareInput(test, false), true)
		fmt.Printf("[[%s => %d]]\n", test, result)
		fmt.Println()
		if result != expected[i] {
			t.Errorf("%d: got %d, expected %d", i, result, expected[i])
		}
	}
}

func TestShouldReduceExpression2(t *testing.T) {
	tests := []string{
		"1+2*3+4*5+6",
		"2*3+(4+5)",
		"2*3+(4*5)",
		"(2*3)+(4*5)",
		"(2*3)*(4*5)",
		"1+(2+1)",
		"1+(2*3)+(4*(5+6))",
		"2*3+(4*5)",
		"5+(8*3+9+3*4*3)",
		"5*9*(7*3*3+9*3+(8+6*4))",
		"((2+4*9)*(6+9*8+6)+6)+2+4*2",
	}
	expected := []int{
		231,
		24,
		46,
		26,
		120,
		4,
		51,
		46,
		1445,
		669060,
		23340,
	}

	for i, test := range tests {
		tst := prepareInput(test, true)
		in := make([]int, len(tst))
		for i, j := range tst {
			in[i] = int(j)
		}
		result := reduce2(in, true)
		fmt.Printf("[[%s => %d]]\n", test, result)
		fmt.Println()
		if result != expected[i] {
			t.Errorf("%d: got %d, expected %d", i, result, expected[i])
		}
	}
}