package crypto

import "testing"

func TestPasswordHashString(t *testing.T) {
	var tests = []struct {
		input          *PasswordHash
		expectedOutput string
	}{
		{&PasswordHash{"pbkdf2-sha512", 20000, "<salt>", "<hash>"}, "pbkdf2-sha512$20000$<salt>$<hash>"},
		{&PasswordHash{"pbkdf2-sha512", 20000, "", "<hash>"}, "pbkdf2-sha512$20000$$<hash>"},
	}

	for _, test := range tests {
		actualOutput := test.input.String()
		if actualOutput != test.expectedOutput {
			t.Errorf("PasswordHash.String() = %s, expected %s", actualOutput, test.expectedOutput)
		}
	}
}

func TestParsePasswordHash(t *testing.T) {
	var tests = []struct {
		input          string
		expectedOutput *PasswordHash
		expectedError  bool
	}{
		{"pbkdf2-sha512$20000$<salt>$<hash>", &PasswordHash{"pbkdf2-sha512", 20000, "<salt>", "<hash>"}, false},
		{"pbkdf2-sha512$20000$<salt>$<hash>$", nil, true},
		{"pbkdf2-sha512$20000$<salt>", nil, true},
		{"pbkdf2-sha512$20000", nil, true},
	}

	for _, test := range tests {
		actualOutput, actualError := ParsePasswordHash(test.input)
		if actualError != nil && !test.expectedError {
			t.Errorf("ParsePasswordHash(%s) error: %s", test.input, actualError)
		}
		if actualError == nil && test.expectedError {
			t.Errorf("ParsePasswordHash(%s) expected error but got nil", test.input)
		}
		if actualOutput != nil && actualOutput.String() != test.expectedOutput.String() {
			t.Errorf("ParsePasswordHash(%s) = %s, expected %s", test.input, actualOutput, test.expectedOutput)
		}
	}
}
