{- - Copyright : (c) 2007 Magnus Therning - License : BSD3 -} module DataencUT where import Test.HUnit import Control.Monad import System.Exit import Data.Maybe import qualified Test.Framework.Providers.API as TFAPI import Test.Framework.Providers.HUnit import Codec.Binary.DataEncoding import qualified Codec.Binary.Yenc as Yenc -- {{{1 buildTestList -- builds a list of successful tests based on a tuple (suite, description, -- encoded data, decoded data, codec) buildTestList td = TestList $ concat [ [ TestLabel (suite ++ " encode " ++ desc) (enc ~=? encode codec dec) , TestLabel (suite ++ " decode " ++ desc) (dec ~=? fromJust (decode codec enc)) ] | (suite, desc, enc, dec, codec) <- td ] -- {{{1 unitTest2TFTest unitTest2TFTest :: Test -> [TFAPI.Test] unitTest2TFTest t = let unitTest2TFTest' desc (TestCase a) = [testCase desc a] unitTest2TFTest' desc (TestLabel s t) = unitTest2TFTest' (desc ++ ":" ++ s) t unitTest2TFTest' desc (TestList ts) = concatMap (unitTest2TFTest' desc) ts in unitTest2TFTest' "" t -- {{{1 uuencode tests uuTestData = [ ("uu", "empty", "", [], uu) , ("uu", "\\0", "``", [0], uu) , ("uu", "\\255", "_P", [255], uu) , ("uu", "AA", "04$", [65, 65], uu) , ("uu", "AAA", "04%!", [65, 65, 65], uu) , ("uu", "AAAA", "04%!00", [65, 65, 65, 65], uu) , ("uu", "Example", "17AA;7!L90", [69,120,97,109,112,108,101], uu) ] uuTests = buildTestList uuTestData uuTests2 = test [ "uu unchop.chop" ~: "EI2" ~=? unchop uu (chop uu 1 "EI2") , "uu unchop.chop" ~: "EI3-" ~=? unchop uu (chop uu 1 "EI3-") , "uu unchop.chop" ~: "EI3-EE" ~=? unchop uu (chop uu 1 "EI3-EE") , "uu full circle" ~: [0..255] ~=? fromJust (decode uu $ unchop uu $ chop uu 1 $ encode uu [0..255]) , "uu full circle" ~: [0..255] ~=? fromJust (decode uu $ unchop uu $ chop uu 61 $ encode uu [0..255]) , "uu full circle" ~: [0..255] ~=? fromJust (decode uu $ unchop uu $ chop uu 100 $ encode uu [0..255]) ] uuTestsFail = test [ "uu decode short" ~: Nothing ~=? decode uu "A" , "uu decode' short" ~: [Nothing] ~=? decode' uu "A" , "uu decode illegal" ~: Nothing ~=? decode uu "aa" , "uu decode' illegal" ~: [Nothing] ~=? decode' uu "aa" ] -- {{{1 xxencode tests xxTestData = [ ("xx", "empty", "", [], xx) , ("xx", "\\0", "++", [0], xx) , ("xx", "\\255", "zk", [255], xx) , ("xx", "AA", "EI2", [65, 65], xx) , ("xx", "AAA", "EI3-", [65, 65, 65], xx) , ("xx", "AAAA", "EI3-EE", [65, 65, 65, 65], xx) , ("xx", "Example", "FLVVPL-gNE", [69,120,97,109,112,108,101], xx) ] xxTests = buildTestList xxTestData xxTests2 = test [ "xx unchop.chop" ~: "EI2" ~=? unchop xx (chop xx 1 "EI2") , "xx unchop.chop" ~: "EI3-" ~=? unchop xx (chop xx 1 "EI3-") , "xx unchop.chop" ~: "EI3-EE" ~=? unchop xx (chop xx 1 "EI3-EE") , "xx full circle" ~: [0..255] ~=? fromJust (decode xx $ unchop xx $ chop xx 1 $ encode xx [0..255]) , "xx full circle" ~: [0..255] ~=? fromJust (decode xx $ unchop xx $ chop xx 61 $ encode xx [0..255]) , "xx full circle" ~: [0..255] ~=? fromJust (decode xx $ unchop xx $ chop xx 100 $ encode xx [0..255]) ] xxTestsFail = test [ "xx decode short" ~: Nothing ~=? decode xx "A" , "xx decode' short" ~: [Nothing] ~=? decode' xx "A" , "xx decode illegal" ~: Nothing ~=? decode xx "''" , "xx decode' illegal" ~: [Nothing] ~=? decode' xx "''" ] -- {{{1 base85 tests base85TestData = [ ("base85", "empty", "", [], base85) , ("base85", "f", "Ac", [102], base85) , ("base85", "fo", "Ao@", [102,111], base85) , ("base85", "foo", "AoDS", [102,111,111], base85) , ("base85", "foob", "AoDTs", [102,111,111,98], base85) , ("base85", "fooba", "AoDTs@/", [102,111,111,98,97], base85) , ("base85", "foobar", "AoDTs@<)", [102,111,111,98,97,114], base85) , ("base85", "\0", "!!", [0], base85) , ("base85", "foob\0\0\0\0ar", "AoDTszEW", [102,111,111,98,0,0,0,0,114], base85) , ("base85", "Example", "7<0x1f><0x20><0x7e><0x7f><0xff>", "\\x00\\x1F ~\\x7F\\xFF", [0x00, 0x1f, 0x20, 0x7e, 0x7f, 0xff], py) , ("py", "\"\'\\", "\\\"\\'\\\\", [34, 39, 92], py) ] pyTests = buildTestList pyTestData pyTestsFail = test [ "py decode bad char after \\" ~: Nothing ~=? decode py "\\z" , "py decode' bad char after \\" ~: [Nothing] ~=? decode' py "\\z" ] -- {{{1 url encoding urlTestData = [ ("url", "empty", "", [], url) , ("url", "aA", "aA", [97, 65], url) , ("url", "~ ", "~%20", [126, 0x20], url) ] urlTests = buildTestList urlTestData urlTestsFail = test [ "url decode bad char after %" ~: Nothing ~=? decode url "%ga" , "url decode' bad char after %" ~: [Nothing] ~=? decode' url "%ga" , "url decode bad char after %" ~: Nothing ~=? decode url "%%" , "url decode' bad char after %" ~: [Nothing] ~=? decode' url "%%" ] -- {{{1 all the tests allTests = concat [ unitTest2TFTest uuTests , unitTest2TFTest uuTests2 , unitTest2TFTest uuTestsFail , unitTest2TFTest xxTests , unitTest2TFTest xxTests2 , unitTest2TFTest xxTestsFail , unitTest2TFTest base85Tests , unitTest2TFTest base85TestsFail , unitTest2TFTest base64Tests , unitTest2TFTest base64TestsFail , unitTest2TFTest base64UrlTests , unitTest2TFTest base32Tests , unitTest2TFTest base32TestsFail , unitTest2TFTest base32HexTests , unitTest2TFTest base32HexTestsFail , unitTest2TFTest base16Tests , unitTest2TFTest base16TestsFail , unitTest2TFTest yencTests , unitTest2TFTest qpTests , unitTest2TFTest qpTestsSucc , unitTest2TFTest qpTestsFail , unitTest2TFTest pyTests , unitTest2TFTest pyTestsFail , unitTest2TFTest urlTests , unitTest2TFTest urlTestsFail ]