package sqlite

import (
	"math/big"
	"testing"
)

func strToPtr(s string) *string {
	res := new(string)
	*res = s
	return res
}

func TestBigIntToPadded128BitsStr(t *testing.T) {
	testCases := []struct {
		name     string
		input    *big.Int
		expected *string
	}{
		{
			name:     "case small",
			input:    big.NewInt(123456),
			expected: strToPtr("0000000000000000000000000001e240"),
		},
		{
			name:     "case zero",
			input:    big.NewInt(0),
			expected: strToPtr("00000000000000000000000000000000"),
		},
		{
			name:     "case very large",
			input:    new(big.Int).Exp(big.NewInt(10), big.NewInt(26), nil),
			expected: strToPtr("000000000052b7d2dcc80cd2e4000000"),
		},
		{
			name:     "case max",
			input:    new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 128), big.NewInt(1)),
			expected: strToPtr("ffffffffffffffffffffffffffffffff"),
		},
		{
			name:     "case 3",
			input:    nil,
			expected: nil,
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			result := BigIntToPadded128BitsStr(tc.input)
			if result != nil && tc.expected != nil {
				if *result != *tc.expected {
					t.Errorf("expected %s, got %s", *tc.expected, *result)
				}
			} else if result != nil || tc.expected != nil {
				t.Errorf("expected %v, got %v", tc.expected, result)
			}
		})
	}
}

func TestInt64ToPadded128BitsStr(t *testing.T) {
	testCases := []struct {
		name     string
		input    int64
		expected *string
	}{
		{
			name:     "case nonzero",
			input:    123456,
			expected: strToPtr("0000000000000000000000000001e240"),
		},
		{
			name:     "case zero",
			input:    0,
			expected: strToPtr("00000000000000000000000000000000"),
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			result := Int64ToPadded128BitsStr(tc.input)
			if result != nil && tc.expected != nil {
				if *result != *tc.expected {
					t.Errorf("expected %s, got %s", *tc.expected, *result)
				}
			} else if result != nil || tc.expected != nil {
				t.Errorf("expected %v, got %v", tc.expected, result)
			}
		})
	}
}