1package basex
2
3import (
4	h "encoding/hex"
5	"testing"
6)
7
8var testCases = []struct {
9	alphabet string
10	dec      string
11	enc      string
12}{
13	{"01", "000f", "01111"},
14	{"01", "00ff", "011111111"},
15	{"01", "0fff", "111111111111"},
16	{"01", "ff00ff00", "11111111000000001111111100000000"},
17	{"01", "fb6f9ac3", "11111011011011111001101011000011"},
18	{"01", "179eea7a", "10111100111101110101001111010"},
19	{"01", "6db825db", "1101101101110000010010111011011"},
20	{"01", "93976aa7", "10010011100101110110101010100111"},
21	{"0123456789abcdef", "0000000f", "000f"},
22	{"0123456789abcdef", "000fff", "0fff"},
23	{"0123456789abcdef", "ffff", "ffff"},
24	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "", ""},
25	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "61", "2g"},
26	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "626262", "a3gV"},
27	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "636363", "aPEr"},
28	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "73696d706c792061206c6f6e6720737472696e67", "2cFupjhnEsSn59qHXstmK2ffpLv2"},
29	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "00eb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"},
30	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "516b6fcd0f", "ABnLTmg"},
31	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "bf4f89001e670274dd", "3SEo3LWLoPntC"},
32	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "572e4794", "3EFU7m"},
33	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ecac89cad93923c02321", "EJDM8drfXA6uyA"},
34	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "10c8511e", "Rt5zm"},
35	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "00000000000000000000", "1111111111"},
36	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "801184cd2cdd640ca42cfc3a091c51d549b2f016d454b2774019c2b2d2e08529fd206ec97e", "5Hx15HFGyep2CfPxsJKe2fXJsCVn5DEiyoeGGF6JZjGbTRnqfiD"},
37	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "003c176e659bea0f29a3e9bf7880c112b1b31b4dc826268187", "16UjcYNBG9GTK4uq2f7yYEbuifqCzoLMGS"},
38	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ffffffffffffffffffff", "FPBt6CHo3fovdL"},
39	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ffffffffffffffffffffffffff", "NKioeUVktgzXLJ1B3t"},
40	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ffffffffffffffffffffffffffffffff", "YcVfxkQb6JRzqk5kF2tNLv"},
41	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ef41b9ce7e830af7", "h26E62FyLQN"},
42	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "606cbc791036d2e9", "H8Sa62HVULG"},
43	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "bdcb0ea69c2c8ec8", "YkESUPpnfoD"},
44	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "1a2358ba67fb71d5", "5NaBN89ajtQ"},
45	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "e6173f0f4d5fb5d7", "fVAoezT1ZkS"},
46	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "91c81cbfdd58bbd2", "RPGNSU3bqTX"},
47	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "329e0bf0e388dbfe", "9U41ZkwwysT"},
48	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "30b10393210fa65b", "99NMW3WHjjY"},
49	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ab3bdd18e3623654", "VeBbqBb4rCT"},
50	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "fe29d1751ec4af8a", "jWhmYLN9dUm"},
51	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "c1273ab5488769807d", "3Tbh4kL3WKW6g"},
52	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6c7907904de934f852", "2P5jNYhfpTJxy"},
53	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "05f0be055db47a0dc9", "5PN768Kr5oEp"},
54	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "3511e6206829b35b12", "gBREojGaJ6DF"},
55	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "d1c7c2ddc4a459d503", "3fsekq5Esq2KC"},
56	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "1f88efd17ab073e9a1", "QHJbmW9ZY7jn"},
57	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "0f45dadf4e64c5d5c2", "CGyVUMmCKLRf"},
58	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "de1e5c5f718bb7fafa", "3pyy8U7w3KUa5"},
59	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "123190b93e9a49a46c", "ES3DeFrG1zbd"},
60	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "8bee94a543e7242e5a", "2nJnuWyLpGf6y"},
61	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "9fd5f2285362f5cfd834", "9yqFhqeewcW3pF"},
62	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6987bac63ad23828bb31", "6vskE5Y1LhS3U4"},
63	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "19d4a0f9d459cc2a08b0", "2TAsHPuaLhh5Aw"},
64	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "a1e47ffdbea5a807ab26", "A6XzPgSUJDf1W5"},
65	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "35c231e5b3a86a9b83db", "42B8reRwPAAoAa"},
66	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "b2351012a48b8347c351", "B1hPyomGx4Vhqa"},
67	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "71d402694dd9517ea653", "7Pv2SyAQx2Upu8"},
68	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "55227c0ec7955c2bd6e8", "5nR64BkskyjHMq"},
69	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "17b3d8ee7907c1be34df", "2LEg7TxosoxTGS"},
70	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "7e7bba7b68bb8e95827f", "879o2ATGnmYyAW"},
71	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "db9c13f5ba7654b01407fb", "wTYfxjDVbiks874"},
72	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6186449d20f5fd1e6c4393", "RBeiWhzZNL6VtMG"},
73	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "5248751cebf4ad1c1a83c3", "MQSVNnc8ehFCqtW"},
74	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "32090ef18cd479fc376a74", "DQdu351ExDaeYeX"},
75	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "7cfa5d6ed1e467d986c426", "XzW67T5qfEnFcaZ"},
76	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "9d8707723c7ede51103b6d", "g4eTCg6QJnB1UU4"},
77	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6f4d1e392d6a9b4ed8b223", "Ubo7kZY5aDpAJp2"},
78	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "38057d98797cd39f80a0c9", "EtjQ2feamJvuqse"},
79	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "de7e59903177e20880e915", "xB2N7yRBnDYEoT2"},
80	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "b2ea24a28bc4a60b5c4b8d", "mNFMpJ2P3TGYqhv"},
81	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "cf84938958589b6ffba6114d", "4v8ZbsGh2ePz5sipt"},
82	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "dee13be7b8d8a08c94a3c02a", "5CwmE9jQqwtHkTF45"},
83	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "14cb9c6b3f8cd2e02710f569", "Pm85JHVAAdeUdxtp"},
84	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ca3f2d558266bdcc44c79cb5", "4pMwomBAQHuUnoLUC"},
85	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "c031215be44cbad745f38982", "4dMeTrcxiVw9RWvj3"},
86	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "1435ab1dbc403111946270a5", "P7wX3sCWNrbqhBEC"},
87	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "d8c6e4d775e7a66a0d0f9f41", "56GLoRDGWGuGJJwPN"},
88	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "dcee35e74f0fd74176fce2f4", "5Ap1zyuYiJJFwWcMR"},
89	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "bfcc0ca4b4855d1cf8993fc0", "4cvafQW4PEhARKv9D"},
90	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "e02a3ac25ece7b54584b670a", "5EMM28xkpxZ1kkVUM"},
91	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "fe4d938fc3719f064cabb4bfff", "NBXKkbHwrAsiWTLAk6"},
92	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "9289cb4f6b15c57e6086b87ea5", "DCvDpjEXEbHjZqskKv"},
93	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "fc266f35626b3612bfe978537b", "N186PVoBWrNre35BGE"},
94	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "33ff08c06d92502bf258c07166", "5LC4SoW6jmTtbkbePw"},
95	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6a81cac1f3666bc59dc67b1c3c", "9sXgUySUzwiqDU5WHy"},
96	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "9dfb8e7e744c544c0f323ea729", "EACsmGmkgcwsrPFzLg"},
97	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "1e7a1e284f70838b38442b682b", "3YEVk9bE7rw5qExMkv"},
98	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "2a862ad57901a8235f5dc74eaf", "4YS259nuTLfeXa5Wuc"},
99	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "74c82096baef21f9d3089e5462", "AjAcKEhUfrqm8smvM7"},
100	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "7a3edbc23d7b600263920261cc", "BBZXyRgey5S5DDZkcK"},
101	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "20435664c357d25a9c8df751cf4f", "CrwNL6Fbv4pbRx1zd9g"},
102	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "51a7aa87cf5cb1c12d045ec3422d", "X27NHGgKXmGzzQvDtpC"},
103	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "344d2e116aa26f1062a2cb6ebbef", "LEDLDvL1Hg4qt1efVXt"},
104	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6941add7be4c0b5c7163e4928f8e", "fhMyN6gwoxE3uYraVzV"},
105	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "10938fcbb7c4ab991649734a14bf", "76TPrSDxzGQfSzMu974"},
106	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "eafe04d944ba504e9af9117b07de", "2VPgov563ryfe4L2Bj6M"},
107	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "58d0aeed4d35da20b6f052127edf", "ZenZhXF9YwP8nQvNtNz"},
108	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "d734984e2f5aecf25f7a3e353f8a", "2N7n3jFsTdyN49Faoq6h"},
109	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "57d873fdb405b7daf4bafa62068a", "ZJ7NwoP4wHvwyZg3Wjs"},
110	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "bda4ec7b40d0d65ca95dec4c4d3b", "2CijxjsNyvqTwPCfDcpA"},
111	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "826c4abdceb1b91f0d4ad665f86d2e", "4edfvuDQu9KzVxLuXHfMo"},
112	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "e7ecb35d07e65b960cb10574a4f51a", "7VLRYdB4cToipp2J2p3v9"},
113	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "4f2d72ead87b31d6869fba39eac6dc", "3DUjqJRcfdWhpsrLrGcQs"},
114	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "8b4f5788d60030950d5dfbf94c585d", "4u44JSRH5jP5X39YhPsmE"},
115	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "ee4c0a0025d1a74ace9fe349355cc5", "7fgACjABRQUGUEpN6VBBA"},
116	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "58ac05b9a0b4b66083ff1d489b8d84", "3UtJPyTwGXapcxHx8Rom5"},
117	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "1aa35c05e1132e8e049aafaef035d8", "kE2eSU7gM2619pT82iGP"},
118	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "771b0c28608484562a292e5d5d2b30", "4LGYeWhyfrjUByibUqdVR"},
119	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "78ff9a0e56f9e88dc1cd654b40d019", "4PLggs66qAdbmZgkaPihe"},
120	{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "6d691bdd736346aa5a0a95b373b2ab", "44Y6qTgSvRMkdqpQ5ufkN"},
121}
122
123func Test_AmbiguousAlphabet(t *testing.T) {
124	_, err := NewEncoding("01gh1")
125	expect(err.Error(), "Ambiguous alphabet.", t)
126}
127
128func Test_Encode(t *testing.T) {
129	for _, cs := range testCases {
130		enc, _ := NewEncoding(cs.alphabet)
131		expect(enc.Encode(hex(cs.dec)), cs.enc, t)
132	}
133}
134
135func Test_Decode(t *testing.T) {
136	for _, cs := range testCases {
137		enc, _ := NewEncoding(cs.alphabet)
138		dec, err := enc.Decode(cs.enc)
139		if err != nil {
140			t.Fatal(err)
141		}
142		expect(h.EncodeToString(dec), cs.dec, t)
143	}
144}
145
146func Test_NonDecodable(t *testing.T) {
147	enc, _ := NewEncoding("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
148	_, err := enc.Decode("invalid")
149	expect(err.Error(), "Non Base Character", t)
150	_, err = enc.Decode("c2F0b3NoaQo=")
151	expect(err.Error(), "Non Base Character", t)
152	_, err = enc.Decode(" 1111111111")
153	expect(err.Error(), "Non Base Character", t)
154	_, err = enc.Decode("1111111111 ")
155	expect(err.Error(), "Non Base Character", t)
156	_, err = enc.Decode(" \t\n\u000b\f\r skip \r\f\u000b\n\t a")
157	expect(err.Error(), "Non Base Character", t)
158}
159
160func hex(in string) []byte {
161	dec, err := h.DecodeString(in)
162	if err != nil {
163		panic(err)
164	}
165	return dec
166}
167
168func expect(cur, expected string, t *testing.T) {
169	if cur != expected {
170		t.Fatalf("Expected {%s} got {%s}.", expected, cur)
171	}
172}
173