package cql

import "testing"

func TestFrameBodyParserReadBytesNullUnset(t *testing.T) {
	tests := []struct {
		name string
		data []byte
	}{
		{"null", []byte{0xFF, 0xFF, 0xFF, 0xFF}},
		{"unset", []byte{0xFF, 0xFF, 0xFF, 0xFE}},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			parser := NewFrameBodyParser(tt.data)
			value, err := parser.ReadBytes()
			if err != nil {
				t.Fatalf("ReadBytes failed: %v", err)
			}
			if value != nil {
				t.Fatalf("expected nil value for %s, got %v", tt.name, value)
			}
			if parser.Pos() != 4 {
				t.Fatalf("expected parser position 4, got %d", parser.Pos())
			}
		})
	}
}

func TestFrameBodyParserReadValueNullUnset(t *testing.T) {
	tests := []struct {
		name    string
		data    []byte
		isNull  bool
		isUnset bool
	}{
		{"null", []byte{0xFF, 0xFF, 0xFF, 0xFF}, true, false},
		{"unset", []byte{0xFF, 0xFF, 0xFF, 0xFE}, false, true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			parser := NewFrameBodyParser(tt.data)
			value, isNull, isUnset, err := parser.ReadValue()
			if err != nil {
				t.Fatalf("ReadValue failed: %v", err)
			}
			if value != nil {
				t.Fatalf("expected nil value for %s, got %v", tt.name, value)
			}
			if isNull != tt.isNull || isUnset != tt.isUnset {
				t.Fatalf("expected isNull=%v isUnset=%v, got isNull=%v isUnset=%v", tt.isNull, tt.isUnset, isNull, isUnset)
			}
			if parser.Pos() != 4 {
				t.Fatalf("expected parser position 4, got %d", parser.Pos())
			}
		})
	}
}

func TestReadBytesNullUnset(t *testing.T) {
	tests := []struct {
		name string
		data []byte
	}{
		{"null", []byte{0xFF, 0xFF, 0xFF, 0xFF}},
		{"unset", []byte{0xFF, 0xFF, 0xFF, 0xFE}},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			value, n, err := readBytes(tt.data)
			if err != nil {
				t.Fatalf("readBytes failed: %v", err)
			}
			if value != nil {
				t.Fatalf("expected nil value for %s, got %v", tt.name, value)
			}
			if n != 4 {
				t.Fatalf("expected bytes read 4, got %d", n)
			}
		})
	}
}
