package executor

import (
	"context"
	"testing"
)

func TestDecodeParamsPassesUnset(t *testing.T) {
	exec := &Executor{}
	params := []interface{}{UnsetValue, []byte{0, 0, 0, 1}}
	decoded, err := exec.DecodeParams(context.Background(), "", "", params, []string{"int", "int"})
	if err != nil {
		t.Fatalf("DecodeParams failed: %v", err)
	}
	if len(decoded) != 2 {
		t.Fatalf("expected 2 decoded params, got %d", len(decoded))
	}
	if decoded[0] != UnsetValue {
		t.Fatalf("expected first param unset sentinel, got %#v", decoded[0])
	}
	if v, ok := decoded[1].(int32); !ok || v != 1 {
		t.Fatalf("expected second param int32(1), got %#v", decoded[1])
	}
}

func TestDecodePreparedParamsPassesUnset(t *testing.T) {
	exec := &Executor{}
	prepared := &PreparedStatement{Parameters: []ColumnInfo{{Type: "int"}, {Type: "int"}}}
	params := []interface{}{UnsetValue, []byte{0, 0, 0, 2}}
	decoded, err := exec.decodePreparedParams(prepared, params)
	if err != nil {
		t.Fatalf("decodePreparedParams failed: %v", err)
	}
	if len(decoded) != 2 {
		t.Fatalf("expected 2 decoded params, got %d", len(decoded))
	}
	if decoded[0] != UnsetValue {
		t.Fatalf("expected first param unset sentinel, got %#v", decoded[0])
	}
	if v, ok := decoded[1].(int32); !ok || v != 2 {
		t.Fatalf("expected second param int32(2), got %#v", decoded[1])
	}
}
