package power

import "testing"

var testCases = []struct {
	name     string
	base     uint
	power    uint
	expected uint
}{
	{"0^2", 0, 2, 0},
	{"2^0", 2, 0, 1},
	{"2^3", 2, 3, 8},
	{"8^3", 8, 3, 512},
	{"10^5", 10, 5, 100000},
}

func TestIterativePower(t *testing.T) {
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			actual := IterativePower(tc.base, tc.power)
			if actual != tc.expected {
				t.Errorf("Expected %d to the power of %d to be: %d, but got: %d", tc.base, tc.power, tc.expected, actual)
			}
		})
	}
}

func TestRecursivePower(t *testing.T) {
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			actual := RecursivePower(tc.base, tc.power)
			if actual != tc.expected {
				t.Errorf("Expected %d to the power of %d to be: %d, but got: %d", tc.base, tc.power, tc.expected, actual)
			}
		})
	}
}

func TestRecursivePower1(t *testing.T) {
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			actual := RecursivePower1(tc.base, tc.power)
			if actual != tc.expected {
				t.Errorf("Expected %d to the power of %d to be: %d, but got: %d", tc.base, tc.power, tc.expected, actual)
			}
		})
	}
}

func BenchmarkIterativePower(b *testing.B) {
	for i := 0; i < b.N; i++ {
		IterativePower(10, 5)
	}
}

func BenchmarkRecursivePower(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RecursivePower(10, 5)
	}
}

func BenchmarkRecursivePower1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RecursivePower1(10, 5)
	}
}

Fastexponent Test