diff options
Diffstat (limited to 'test-src/DataencUT.hs')
-rw-r--r-- | test-src/DataencUT.hs | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/test-src/DataencUT.hs b/test-src/DataencUT.hs new file mode 100644 index 0000000..af91a0f --- /dev/null +++ b/test-src/DataencUT.hs | |||
@@ -0,0 +1,225 @@ | |||
1 | {-# OPTIONS_GHC -XTemplateHaskell #-} | ||
2 | {- | ||
3 | - Copyright : (c) 2007 Magnus Therning | ||
4 | - License : BSD3 | ||
5 | -} | ||
6 | |||
7 | module DataencUT | ||
8 | where | ||
9 | |||
10 | import Test.HUnit | ||
11 | import Control.Monad | ||
12 | import System.Exit | ||
13 | import Data.Maybe | ||
14 | import qualified Test.Framework.Providers.API as TFAPI | ||
15 | import Test.Framework.TH | ||
16 | import Test.Framework.Providers.HUnit | ||
17 | |||
18 | import Codec.Binary.DataEncoding | ||
19 | import qualified Codec.Binary.Yenc as Yenc | ||
20 | |||
21 | -- {{{1 checkAssertions | ||
22 | checkAssertions (suite, desc, enc, dec, codec) = do | ||
23 | enc @=? encode codec dec | ||
24 | dec @=? fromJust (decode codec enc) | ||
25 | |||
26 | -- {{{1 uuencode tests | ||
27 | uuTestData = | ||
28 | [ ("uu", "empty", "", [], uu) | ||
29 | , ("uu", "\\0", "``", [0], uu) | ||
30 | , ("uu", "\\255", "_P", [255], uu) | ||
31 | , ("uu", "AA", "04$", [65, 65], uu) | ||
32 | , ("uu", "AAA", "04%!", [65, 65, 65], uu) | ||
33 | , ("uu", "AAAA", "04%!00", [65, 65, 65, 65], uu) | ||
34 | , ("uu", "Example", "17AA;7!L90", [69,120,97,109,112,108,101], uu) | ||
35 | ] | ||
36 | case_uuTests = mapM_ checkAssertions uuTestData | ||
37 | |||
38 | case_uuTests2 = do | ||
39 | "EI2" @=? unchop uu (chop uu 1 "EI2") | ||
40 | "EI3-" @=? unchop uu (chop uu 1 "EI3-") | ||
41 | "EI3-EE" @=? unchop uu (chop uu 1 "EI3-EE") | ||
42 | [0..255] @=? fromJust (decode uu $ unchop uu $ chop uu 1 $ encode uu [0..255]) | ||
43 | [0..255] @=? fromJust (decode uu $ unchop uu $ chop uu 61 $ encode uu [0..255]) | ||
44 | [0..255] @=? fromJust (decode uu $ unchop uu $ chop uu 100 $ encode uu [0..255]) | ||
45 | |||
46 | case_uuTestsFail = do | ||
47 | Nothing @=? decode uu "A" | ||
48 | Nothing @=? decode uu "aa" | ||
49 | |||
50 | -- {{{1 xxencode tests | ||
51 | xxTestData = | ||
52 | [ ("xx", "empty", "", [], xx) | ||
53 | , ("xx", "\\0", "++", [0], xx) | ||
54 | , ("xx", "\\255", "zk", [255], xx) | ||
55 | , ("xx", "AA", "EI2", [65, 65], xx) | ||
56 | , ("xx", "AAA", "EI3-", [65, 65, 65], xx) | ||
57 | , ("xx", "AAAA", "EI3-EE", [65, 65, 65, 65], xx) | ||
58 | , ("xx", "Example", "FLVVPL-gNE", [69,120,97,109,112,108,101], xx) | ||
59 | ] | ||
60 | case_xxTest = mapM_ checkAssertions xxTestData | ||
61 | |||
62 | case_xxTests2 = do | ||
63 | "EI2" @=? unchop xx (chop xx 1 "EI2") | ||
64 | "EI3-" @=? unchop xx (chop xx 1 "EI3-") | ||
65 | "EI3-EE" @=? unchop xx (chop xx 1 "EI3-EE") | ||
66 | [0..255] @=? fromJust (decode xx $ unchop xx $ chop xx 1 $ encode xx [0..255]) | ||
67 | [0..255] @=? fromJust (decode xx $ unchop xx $ chop xx 61 $ encode xx [0..255]) | ||
68 | [0..255] @=? fromJust (decode xx $ unchop xx $ chop xx 100 $ encode xx [0..255]) | ||
69 | |||
70 | case_xxTestsFail = do | ||
71 | Nothing @=? decode xx "A" | ||
72 | Nothing @=? decode xx "''" | ||
73 | |||
74 | -- {{{1 base85 tests | ||
75 | base85TestData = | ||
76 | [ ("base85", "empty", "", [], base85) | ||
77 | , ("base85", "f", "Ac", [102], base85) | ||
78 | , ("base85", "fo", "Ao@", [102,111], base85) | ||
79 | , ("base85", "foo", "AoDS", [102,111,111], base85) | ||
80 | , ("base85", "foob", "AoDTs", [102,111,111,98], base85) | ||
81 | , ("base85", "fooba", "AoDTs@/", [102,111,111,98,97], base85) | ||
82 | , ("base85", "foobar", "AoDTs@<)", [102,111,111,98,97,114], base85) | ||
83 | , ("base85", "\0", "!!", [0], base85) | ||
84 | , ("base85", "foob\0\0\0\0ar", "AoDTszEW", [102,111,111,98,0,0,0,0,114], base85) | ||
85 | , ("base85", "Example", "7<i6XE,9(", [69,120,97,109,112,108,101], base85) | ||
86 | , ("base85", "zeros", "z", [0, 0, 0, 0], base85) | ||
87 | , ("base85", "spaces", "y", [0x20, 0x20, 0x20, 0x20], base85) | ||
88 | ] | ||
89 | case_base85Tests = mapM_ checkAssertions base85TestData | ||
90 | |||
91 | case_base85TestsFail = do | ||
92 | Nothing @=? decode base85 "A" | ||
93 | Nothing @=? decode base85 "!z" | ||
94 | Nothing @=? decode base85 "!z!" | ||
95 | Nothing @=? decode base85 "!z!z" | ||
96 | |||
97 | -- {{{1 base64 tests | ||
98 | base64TestData = | ||
99 | [ ("base64", "empty", "", [], base64) | ||
100 | , ("base64", "f", "Zg==", [102], base64) | ||
101 | , ("base64", "fo", "Zm8=", [102,111], base64) | ||
102 | , ("base64", "foo", "Zm9v", [102,111,111], base64) | ||
103 | , ("base64", "foob", "Zm9vYg==", [102,111,111,98], base64) | ||
104 | , ("base64", "fooba", "Zm9vYmE=", [102,111,111,98,97], base64) | ||
105 | , ("base64", "foobar", "Zm9vYmFy", [102,111,111,98,97,114], base64) | ||
106 | , ("base64", "\0", "AA==", [0], base64) | ||
107 | , ("base64", "\255", "/w==", [255], base64) | ||
108 | , ("base64", "Example", "RXhhbXBsZQ==", [69,120,97,109,112,108,101], base64) | ||
109 | ] | ||
110 | case_base64Tests = mapM_ checkAssertions base64TestData | ||
111 | |||
112 | case_base64TestsFail = do | ||
113 | Nothing @=? decode base64 "A" | ||
114 | Nothing @=? decode base64 "!!" | ||
115 | |||
116 | -- {{{1 base64url tests | ||
117 | base64UrlTestData = | ||
118 | [ ("base64url", "empty", "", [], base64Url) | ||
119 | , ("base64url", "\0", "AA==", [0], base64Url) | ||
120 | , ("base64url", "\255", "_w==", [255], base64Url) | ||
121 | , ("base64url", "Example", "RXhhbXBsZQ==", [69,120,97,109,112,108,101], base64Url) | ||
122 | ] | ||
123 | case_base64UrlTests = mapM_ checkAssertions base64UrlTestData | ||
124 | |||
125 | -- {{{1 base32 tests | ||
126 | base32TestData = | ||
127 | [ ("base32", "empty", "", [], base32) | ||
128 | , ("base32", "f", "MY======", [102], base32) | ||
129 | , ("base32", "fo", "MZXQ====", [102,111], base32) | ||
130 | , ("base32", "foo", "MZXW6===", [102,111,111], base32) | ||
131 | , ("base32", "foob", "MZXW6YQ=", [102,111,111,98], base32) | ||
132 | , ("base32", "fooba", "MZXW6YTB", [102,111,111,98,97], base32) | ||
133 | , ("base32", "foobar", "MZXW6YTBOI======", [102,111,111,98,97,114], base32) | ||
134 | ] | ||
135 | case_base32Tests = mapM_ checkAssertions base32TestData | ||
136 | |||
137 | case_base32TestsFail = do | ||
138 | Nothing @=? decode base32 "A" | ||
139 | Nothing @=? decode base32 "gh" | ||
140 | |||
141 | -- {{{1 base32hex tests | ||
142 | base32HexTestData = | ||
143 | [ ("base32hex", "empty", "", [], base32Hex) | ||
144 | , ("base32hex", "f", "CO======", [102], base32Hex) | ||
145 | , ("base32hex", "fo", "CPNG====", [102,111], base32Hex) | ||
146 | , ("base32hex", "foo", "CPNMU===", [102,111,111], base32Hex) | ||
147 | , ("base32hex", "foob", "CPNMUOG=", [102,111,111,98], base32Hex) | ||
148 | , ("base32hex", "fooba", "CPNMUOJ1", [102,111,111,98,97], base32Hex) | ||
149 | , ("base32hex", "foobar", "CPNMUOJ1E8======", [102,111,111,98,97,114], base32Hex) | ||
150 | ] | ||
151 | case_base32HexTests = mapM_ checkAssertions base32HexTestData | ||
152 | |||
153 | case_base32HexTestsFail = do | ||
154 | Nothing @=? decode base32Hex "A" | ||
155 | Nothing @=? decode base32Hex "gh" | ||
156 | |||
157 | -- {{{1 base16 (hex) | ||
158 | base16TestData = | ||
159 | [ ("base16", "empty", "", [], base16) | ||
160 | , ("base16", "f", "66", [102], base16) | ||
161 | , ("base16", "fo", "666F", [102,111], base16) | ||
162 | , ("base16", "foo", "666F6F", [102,111,111], base16) | ||
163 | , ("base16", "foob", "666F6F62", [102,111,111,98], base16) | ||
164 | , ("base16", "fooba", "666F6F6261", [102,111,111,98,97], base16) | ||
165 | , ("base16", "foobar", "666F6F626172", [102,111,111,98,97,114], base16) | ||
166 | ] | ||
167 | case_base16Tests = mapM_ checkAssertions base16TestData | ||
168 | |||
169 | case_base16TestsFail = do | ||
170 | Nothing @=? decode base16 "A" | ||
171 | Nothing @=? decode base16 "GH" | ||
172 | |||
173 | -- {{{1 yEncoding | ||
174 | case_yencTests = do | ||
175 | [] @=? Yenc.encode [] | ||
176 | Just [] @=? Yenc.decode [] | ||
177 | [0x90] @=? Yenc.encode [0x66] | ||
178 | Just [0x66] @=? Yenc.decode [0x90] | ||
179 | [0x90, 0x99, 0x99, 0x8c, 0x8b, 0x9c] @=? Yenc.encode [0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72] | ||
180 | Just [0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72] @=? Yenc.decode [0x90, 0x99, 0x99, 0x8c, 0x8b, 0x9c] | ||
181 | [0x3d, 0x40, 0x01] @=? Yenc.encode [0xd6, 0xd7] | ||
182 | Just [0xd6, 0xd7] @=? Yenc.decode [0x3d, 0x40, 0x01] | ||
183 | [0x3d, 0x40, 0x3d, 0x4a, 0x3d, 0x4d, 0x3d, 0x7d] @=? Yenc.encode [0xd6, 0xe0, 0xe3, 0x13] | ||
184 | Just [0xd6, 0xe0, 0xe3, 0x13] @=? Yenc.decode [0x3d, 0x40, 0x3d, 0x4a, 0x3d, 0x4d, 0x3d, 0x7d] | ||
185 | [[0x3d, 0x40], [0x01, 0x3d, 0x4a]] @=? Yenc.chop 2 [0x3d, 0x40, 0x01, 0x3d, 0x4a] | ||
186 | |||
187 | -- {{{1 quoted-printable | ||
188 | qpTestData = | ||
189 | [ ("qp", "empty", "", [], qp) | ||
190 | , ("qp", "foo=bar", "foo=3Dbar", [102,111,111,61,98,97,114], qp) | ||
191 | ] | ||
192 | case_qpTests = mapM_ checkAssertions qpTestData | ||
193 | |||
194 | case_qpTestsSucc = do | ||
195 | ["foo=","=3D=","bar"] @=? chop qp 4 "foo=3Dbar" | ||
196 | |||
197 | case_qpTestsFail = do | ||
198 | Nothing @=? decode qp "=4" | ||
199 | Nothing @=? decode qp "=G" | ||
200 | |||
201 | -- {{{1 python string | ||
202 | pyTestData = | ||
203 | [ ("py", "empty", "", [], py) | ||
204 | , ("py", "<0x00><0x1f><0x20><0x7e><0x7f><0xff>", "\\x00\\x1F ~\\x7F\\xFF", [0x00, 0x1f, 0x20, 0x7e, 0x7f, 0xff], py) | ||
205 | , ("py", "\"\'\\", "\\\"\\'\\\\", [34, 39, 92], py) | ||
206 | ] | ||
207 | case_pyTests = mapM_ checkAssertions pyTestData | ||
208 | |||
209 | case_pyTestsFail = do | ||
210 | Nothing @=? decode py "\\z" | ||
211 | |||
212 | -- {{{1 url encoding | ||
213 | urlTestData = | ||
214 | [ ("url", "empty", "", [], url) | ||
215 | , ("url", "aA", "aA", [97, 65], url) | ||
216 | , ("url", "~ ", "~%20", [126, 0x20], url) | ||
217 | ] | ||
218 | case_urlTests = mapM_ checkAssertions urlTestData | ||
219 | |||
220 | case_urlTestsFail = do | ||
221 | Nothing @=? decode url "%ga" | ||
222 | Nothing @=? decode url "%%" | ||
223 | |||
224 | -- {{{1 all the tests | ||
225 | allTests = $(testGroupGenerator) | ||