package crypto

import "testing"

func TestPbdkf2Sha512Encrypt(t *testing.T) {
	var tests = []struct {
		rawPassword    string
		salt           string
		iterations     int
		expectedOutput string
	}{
		{
			"password", "salt", 20000,
			"pbkdf2-sha512$20000$salt$x8gTjcbKQ1WHR/IHCPJjfi5v/cr5VPkdesnvWXn5NETGWhhreyZgaon+D4XD8Y4n9PSJIfZ1TjVu6uh/EpWOPw",
		},
		{
			"gloas-331906fe17dbfc7a857b7f7181751d24ed15fc7161b1b12f74925b29e5a6d699",
			"",
			20000,
			"pbkdf2-sha512$20000$$JIB1lsw4KHpEBvmnqyrp49zCHM+JA166sq+3SfuJpBE55KJ9DaKpdCNk3QqyCIZBjfqTJZAJP6Yr28M5SBU+nA",
		},
		{
			"2d9baeda5e95095112cc9edb7c731ac9c4ba3af7d183030caa0961fe409f2d85",
			"",
			20000,
			"pbkdf2-sha512$20000$$pJ9agpYwX9YpyBQJ8PIb6FjsjfcDXfwhGWaESp8u17TsebnNOf/Uu81RpPsQNU73OnvE4m1AuMYwhG1SwrESpg",
		},
		{
			"KuUMNTVjZUIw9d7stUe3zWDrSi61v6jWl7SYtq91WojL0P7rYWJsNVQ3NMSdSDo3dgc04IpYotwMsx7QzNNvbGh95AvKbWrfBJDgXrvMAMU0hJtSOprwgzljHE01FmJr",
			"",
			20000,
			"pbkdf2-sha512$20000$$8cBdK62mWcr5+cYJs6hoLx6cePUkRYjOrxMNF9+WMvPj+SIjkOyWinjJF1jGTT/EZlK1hFEpDeiEmZr9GzHZPw",
		},
	}

	for _, test := range tests {
		actualOutput := NewPbdkf2Sha512Encryptor().Encrypt(test.rawPassword, test.salt, test.iterations)
		if actualOutput != test.expectedOutput {
			t.Errorf("Pbdkf2Sha512Encryptor.Encrypt(%s, %s, %d) = %s, expected %s", test.rawPassword, test.salt, test.iterations, actualOutput, test.expectedOutput)
		}
	}
}

func TestPbdkf2Sha512Compare(t *testing.T) {
	var tests = []struct {
		rawPassword    string
		encrypted      string
		expectedOutput bool
	}{
		{
			"password",
			"pbkdf2-sha512$20000$salt$x8gTjcbKQ1WHR/IHCPJjfi5v/cr5VPkdesnvWXn5NETGWhhreyZgaon+D4XD8Y4n9PSJIfZ1TjVu6uh/EpWOPw",
			true,
		},
		{
			"gloas-331906fe17dbfc7a857b7f7181751d24ed15fc7161b1b12f74925b29e5a6d699",
			"pbkdf2-sha512$20000$$JIB1lsw4KHpEBvmnqyrp49zCHM+JA166sq+3SfuJpBE55KJ9DaKpdCNk3QqyCIZBjfqTJZAJP6Yr28M5SBU+nA",
			true,
		},
		{
			"",
			"pbkdf2-sha512$20000$salt$x8gTjcbKQ1WHR/IHCPJjfi5v/cr5VPkdesnvWXn5NETGWhhreyZgaon+D4XD8Y4n9PSJIfZ1TjVu6uh/EpWOPw",
			false,
		},
		{
			"2d9baeda5e95095112cc9edb7c731ac9c4ba3af7d183030caa0961fe409f2d85",
			"pbkdf2-sha512$20000$$JIB1lsw4KHpEBvmnqyrp49zCHM+JA166sq+3SfuJpBE55KJ9DaKpdCNk3QqyCIZBjfqTJZAJP6Yr28M5SBU+nA",
			false,
		},
	}

	for _, test := range tests {
		actualOutput := NewPbdkf2Sha512Encryptor().Compare(test.rawPassword, test.encrypted)
		if actualOutput != test.expectedOutput {
			t.Errorf("Pbdkf2Sha512Encryptor.Compare(%s, %s) = %t, expected %t", test.rawPassword, test.encrypted, actualOutput, test.expectedOutput)
		}
	}
}
