/*
 * SPDX-FileCopyrightText: 2023 jordi fita mas <jfita@peritasoft.com>
 * SPDX-License-Identifier: AGPL-3.0-only
 */

package uuid

import (
	"strings"
	"testing"
)

type test struct {
	in     string
	isUuid bool
	bytes  [16]byte
}

var tests = []test{
	{"f47ac10b-58cc-0372-8567-0e02b2c3d479", true, [16]byte{0xf4, 0x7a, 0xc1, 0x0b, 0x58, 0xcc, 0x03, 0x72, 0x85, 0x67, 0x0e, 0x02, 0xb2, 0xc3, 0xd4, 0x79}},
	{"2bc1be74-169d-4300-a239-49a1196a045d", true, [16]byte{0x2b, 0xc1, 0xbe, 0x74, 0x16, 0x9d, 0x43, 0x00, 0xa2, 0x39, 0x49, 0xa1, 0x19, 0x6a, 0x04, 0x5d}},
	{"12bc1be74-169d-4300-a239-49a1196a045d", false, [16]byte{}},
	{"2bc1be74-169d-4300-a239-49a1196a045", false, [16]byte{}},
	{"2bc1be74-1x9d-4300-a239-49a1196a045d", false, [16]byte{}},
	{"2bc1be74-169d-4300-a239-49a1196ag45d", false, [16]byte{}},
}

func testValid(t *testing.T, in string, isUuid bool) {
	if ok := Valid(in); ok != isUuid {
		t.Errorf("Valid(%s) got %v expected %v", in, ok, isUuid)
	}
}

func testParse(t *testing.T, in string, expected [16]byte, isUuid bool) {
	actual, err := Parse(in)
	if isUuid && err != nil {
		t.Errorf("Parse(%s) unexpected error %v", in, err)
	} else if !isUuid && err == nil {
		t.Errorf("Parse(%s) expected to fail but got %v", in, actual)
	} else if actual != expected {
		t.Errorf("Parse(%s) got %v expected %v", in, actual, expected)
	}
}

func TestUUID(t *testing.T) {
	for _, tt := range tests {
		testValid(t, tt.in, tt.isUuid)
		testValid(t, strings.ToUpper(tt.in), tt.isUuid)
		testParse(t, tt.in, tt.bytes, tt.isUuid)
		testParse(t, strings.ToUpper(tt.in), tt.bytes, tt.isUuid)
	}
}