package entranceserver

import (
	"bytes"
	"encoding/hex"
	"fmt"
	"testing"
)

var tests = []struct {
	data          []byte
	sum           uint32
	encryptedData []byte
	encryptionKey byte
}{
	{
		[]byte{0x4C, 0x6F, 0x72, 0x65, 0x6D, 0x20},
		0xAE6CA2C,
		[]byte{0x7E, 0x4C, 0x1D, 0x16, 0x9D, 0x46},
		0x55,
	},
	{
		[]byte{0x69, 0x70, 0x73, 0x75, 0x6D, 0x20, 0x64, 0x6F, 0x6C, 0x6F, 0x72, 0x20, 0x73, 0x69, 0x74, 0x20, 0x61, 0x6D, 0x65, 0x74, 0x2C, 0x20},
		0xCE5F1E96,
		[]byte{0x41, 0x65, 0xFF, 0x74, 0x64, 0x45, 0xB8, 0xB1, 0x18, 0xB0, 0x94, 0xA3, 0xF8, 0xD, 0xBF, 0x3C, 0xC8, 0x24, 0xE2, 0xEC, 0x3B, 0xCE},
		0x7A,
	},
	{
		[]byte{0x63, 0x6F, 0x6E, 0x73, 0x65, 0x63, 0x74, 0x65, 0x74, 0x75, 0x72, 0x20, 0x61, 0x64, 0x69, 0x70, 0x69, 0x73, 0x63, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6C, 0x69, 0x74, 0x2C, 0x20},
		0xF3EECEBB,
		[]byte{0xE, 0xBB, 0x19, 0xA5, 0xB9, 0x34, 0xFE, 0x51, 0x0, 0x61, 0x2D, 0x38, 0xB2, 0x98, 0xC2, 0xE0, 0x17, 0xDE, 0x6E, 0xE3, 0x6C, 0x1E, 0x19, 0xB6, 0x8C, 0x57, 0x32, 0x32, 0xD8},
		0xF8,
	},
}

func TestSum32(t *testing.T) {
	for k, test := range tests {
		testname := fmt.Sprintf("sum32_test_%d", k)
		t.Run(testname, func(t *testing.T) {
			gotSum := CalcSum32(test.data)

			if gotSum != test.sum {
				t.Errorf("got sum32 0x%X, want 0x%X", gotSum, test.sum)
			}
		})
	}
}

func TestEncryptBin8(t *testing.T) {
	for k, test := range tests {
		testname := fmt.Sprintf("encrypt_bin8_test_%d", k)
		t.Run(testname, func(t *testing.T) {
			gotEncData := EncryptBin8(test.data, test.encryptionKey)

			if !bytes.Equal(gotEncData, test.encryptedData) {
				t.Errorf("got\n\t%s\nwant\n\t%s", hex.Dump(gotEncData), hex.Dump(test.encryptedData))
			}
		})
	}
}

func TestDecryptBin8(t *testing.T) {
	for k, test := range tests {
		testname := fmt.Sprintf("decrypt_bin8_test_%d", k)
		t.Run(testname, func(t *testing.T) {
			gotDecData := DecryptBin8(test.encryptedData, test.encryptionKey)

			if !bytes.Equal(gotDecData, test.data) {
				t.Errorf("got\n\t%s\nwant\n\t%s", hex.Dump(gotDecData), hex.Dump(test.data))
			}
		})
	}
}
