package componentbehavior

import (
	"bytes"
	"errors"
	"strings"
	"testing"
)

func TestCanonicalJSONV1IsDeterministicAndFailClosed(t *testing.T) {
	first, err := CanonicalJSONV1([]byte("{\n  \"large\": 9007199254740993, \"a\": true\n}\n"))
	if err != nil {
		t.Fatal(err)
	}
	second, err := CanonicalJSONV1([]byte(`{"a":true,"large":9007199254740993}`))
	if err != nil {
		t.Fatal(err)
	}
	if !bytes.Equal(first, second) || string(first) != `{"a":true,"large":9007199254740993}` {
		t.Fatalf("canonical JSON differs: %q != %q", first, second)
	}
	if _, err := CanonicalJSONV1([]byte(`{"a":1,"a":2}`)); err == nil || !strings.Contains(err.Error(), "duplicate") {
		t.Fatalf("duplicate key error = %v", err)
	}
	if _, err := CanonicalJSONV1([]byte(`{"a":"\ud800"}`)); err == nil || !strings.Contains(err.Error(), "unpaired") {
		t.Fatalf("unpaired surrogate error = %v", err)
	}
	if _, err := CanonicalJSONV1([]byte{'{', '"', 'a', '"', ':', '"', 0xff, '"', '}'}); err == nil || !strings.Contains(err.Error(), "UTF-8") {
		t.Fatalf("invalid UTF-8 error = %v", err)
	}
	if _, err := CanonicalJSONV1([]byte("not json")); !errors.Is(err, ErrNotJSON) {
		t.Fatalf("non-JSON error = %v", err)
	}
}
