package utils

import (
	"fmt"
	"math"
	"testing"
)

func Test_fastSqrt(t *testing.T) {
	// 测试用例
	testCases := []float64{2, 4, 10, 16, 25, 100, 1000, 0.5, 0.01, 1e-20}

	fmt.Println("测试卡马克快速平方根算法与标准库的对比：")
	fmt.Println("数值\t快速算法结果\t标准库结果\t绝对误差")
	fmt.Println("--------------------------------------------------------------")

	for _, x := range testCases {
		fastResult := fastSqrt(x)
		stdResult := math.Sqrt(x)
		error := math.Abs(fastResult - stdResult)

		fmt.Printf("%.10g\t%.10g\t\t%.10g\t\t%.2e\n",
			x, fastResult, stdResult, error)
	}

	// 测试整数版本
	fmt.Println("\n测试整数快速平方根算法：")
	fmt.Println("数值\t快速算法结果\t标准库转换结果")
	fmt.Println("--------------------------------------")

	for _, x := range []int{2, 4, 10, 16, 25, 100, 1000} {
		fastResult := fastSqrtInt(x)
		stdResult := int(math.Sqrt(float64(x)))

		fmt.Printf("%d\t%d\t\t%d\n", x, fastResult, stdResult)
	}
}
func BenchmarkMathSqrt(b *testing.B) {
	testValues := []float64{2, 4, 10, 16, 25, 100, 1000, 0.5, 0.01, 1e-20}
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		for _, x := range testValues {
			_ = math.Sqrt(x)
		}
	}
}

func BenchmarkFastSqrt(b *testing.B) {
	testValues := []float64{2, 4, 10, 16, 25, 100, 1000, 0.5, 0.01, 1e-20}
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		for _, x := range testValues {
			_ = fastSqrt(x)
		}
	}
}

func BenchmarkFastSqrtCarmack(b *testing.B) {
	testValues := []float64{2, 4, 10, 16, 25, 100, 1000, 0.5, 0.01, 1e-20}
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		for _, x := range testValues {
			_ = fastSqrtCarmack(x)
		}
	}
}

func BenchmarkMathSqrtInt(b *testing.B) {
	testValues := []int{2, 4, 10, 16, 25, 100, 1000, 10000, 100000}
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		for _, x := range testValues {
			_ = int(math.Sqrt(float64(x)))
		}
	}
}

func BenchmarkFastSqrtInt(b *testing.B) {
	testValues := []int{2, 4, 10, 16, 25, 100, 1000, 10000, 100000}
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		for _, x := range testValues {
			_ = fastSqrtInt(x)
		}
	}
}
