package reference

import (
	_ "crypto/sha256"
	"testing"
)

func TestParse(t *testing.T) {
	testCases := []struct {
		ref           string
		expectedName  string
		expectedTag   string
		expectedError bool
	}{
		{
			ref:           "",
			expectedName:  "",
			expectedTag:   "",
			expectedError: true,
		},
		{
			ref:           "repository",
			expectedName:  "repository",
			expectedTag:   "latest",
			expectedError: false,
		},
		{
			ref:           "repository:tag",
			expectedName:  "repository",
			expectedTag:   "tag",
			expectedError: false,
		},
		{
			ref:           "test.com/repository",
			expectedName:  "test.com/repository",
			expectedTag:   "latest",
			expectedError: false,
		},
		{
			ref:           "test.com:5000/test/repository",
			expectedName:  "test.com:5000/test/repository",
			expectedTag:   "latest",
			expectedError: false,
		},
		{
			ref:           "test.com:5000/repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
			expectedName:  "test.com:5000/repo",
			expectedTag:   "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
			expectedError: false,
		},
		{
			ref:           "test.com:5000/repo:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
			expectedName:  "test.com:5000/repo",
			expectedTag:   "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
			expectedError: false,
		},
	}

	for _, c := range testCases {
		name, tag, err := Parse(c.ref)
		if err != nil && c.expectedError {
			continue
		} else if err != nil {
			t.Fatalf("error with %s: %s", c.ref, err.Error())
		}
		if name != c.expectedName {
			t.Fatalf("expected name %s, got %s", c.expectedName, name)
		}
		if tag != c.expectedTag {
			t.Fatalf("expected tag %s, got %s", c.expectedTag, tag)
		}
	}
}