{-# LANGUAGE OverloadedStrings #-}
import Control.Monad (forM_)
import Data.List (sortBy)
import Data.Monoid ((<>))
import qualified Data.ByteString.UTF8 as U
import qualified Data.Text as T
import Test.HUnit
import Text.NaturalComp
import Text.NaturalComp.Stringy
testData1 :: [(U.ByteString, U.ByteString, Ordering)]
testData1 =
[("AAA", "AAA", EQ)
,("AAA", "AAa", LT)
,("aaa", "AAA", GT)
,("aaa", "aaaa", LT)
,("aaaa", "aab", LT)
,("aaa1", "aaa2", LT)
,("aaa9", "aaa10", LT)
,("aaa9a", "aaa10a", LT)
,("aaa01", "aaa1", LT)
,("aaa10", "aaa10", EQ)
,("aaa10", "aaa10a", LT)
,("aaa10", "aaa20", LT)
,("aaa99", "aaa100", LT)
,("aaa100", "aaa101", LT)
,("aaa999", "aaa1000", LT)
,("aaa99a", "aaa99a", EQ)
,("aaa99a1", "aaa99a2", LT)
,("aaa99a", "aaa99b", LT)
,("aaa99aa", "aaa99b", LT)
,("aaa99a9", "aaa99a10", LT)]
testData2 :: [(T.Text, T.Text, Ordering)]
testData2 =
[("AAA", "AAA", EQ)
,("AAA", "AAa", EQ)
,("aaa", "AAA", EQ)
,("aaa", "aaaa", LT)
,("aaaa", "aab", LT)
,("aaa1", "aaa2", LT)
,("aaa9", "aaa10", LT)
,("aaa9a", "aaa10a", LT)
,("aaa01", "aaa1", LT)
,("aaa10", "aaa10", EQ)
,("aaa10", "aaa10a", LT)
,("aaa10", "aaa20", LT)
,("aaa99", "aaa100", LT)
,("aaa100", "aaa101", LT)
,("aaa999", "aaa1000", LT)
,("aaa99a", "aaa99a", EQ)
,("aaa99a", "aaa99b", LT)
,("aaa99aa", "aaa99b", LT)
,("aaa99a9", "aaa99a10", LT)]
testData3 :: ([String], [String])
testData3 =
(["28627986_p3.jpg"
,"28627986_p0.jpg"
,"28627986_p8.jpg"
,"28627986_p20.jpg"
,"28627986_p4.jpg"
,"28627986_p12.jpg"
,"28627986_p5.jpg"
,"28627986_p10.jpg"
,"28627986_p6.jpg"
,"28627986_p7.jpg"
,"28627986_p11.jpg"
,"28627986_p1.jpg"
,"28627986_p9.jpg"
,"28627986_p2.jpg"]
,["28627986_p0.jpg"
,"28627986_p1.jpg"
,"28627986_p2.jpg"
,"28627986_p3.jpg"
,"28627986_p4.jpg"
,"28627986_p5.jpg"
,"28627986_p6.jpg"
,"28627986_p7.jpg"
,"28627986_p8.jpg"
,"28627986_p9.jpg"
,"28627986_p10.jpg"
,"28627986_p11.jpg"
,"28627986_p12.jpg"
,"28627986_p20.jpg"])
testData4 :: ([T.Text], [T.Text])
testData4 =
(["test1.999.c"
,"test1.99.c"
,"test1.11111.c"
,"test1.0001.c"
,"test1.2000.c"
,"test1.0009.c"]
,["test1.0001.c"
,"test1.0009.c"
,"test1.99.c"
,"test1.999.c"
,"test1.2000.c"
,"test1.11111.c"])
testData5 :: ([U.ByteString], [U.ByteString])
testData5 = -- from strverscmp(3) man page
(["10"
,"9"
,"1"
,"0"
,"09"
,"010"
,"01"
,"00"
,"000"]
,["000"
,"00"
,"01"
,"010"
,"09"
,"0"
,"1"
,"9"
,"10"])
testData6 :: [(String, String, Ordering)]
testData6 =
[("000", "00", LT)
,("00", "01", LT)
,("01", "010", LT)
,("010", "09", LT)
,("09", "0", LT)
,("0", "1", LT)
,("1", "9", LT)
,("9", "10", LT)
,("000a", "00a", LT)
,("00a", "01a", LT)
,("01a", "010a", GT) -- Why? But glibc says GT.
,("010a", "09a", LT)
,("09a", "0a", LT)
,("0a", "1a", LT)
,("1a", "9a", LT)
,("9a", "10a", LT)]
compTest f xyz =
TestCase $ forM_ xyz
$ \(x, y, z) ->
assertEqual (toString $ x <> " : " <> y) z (f x y)
sortTest f (x, y) =
let sorted = sortBy f x
in TestCase $ assertEqual "" y sorted
tests =
TestList [TestLabel "test1" $ compTest naturalComp testData1
,TestLabel "test2" $ compTest naturalCaseComp testData2
,TestLabel "test3" $ sortTest naturalComp testData3
,TestLabel "test4" $ sortTest naturalComp testData4
,TestLabel "test5" $ sortTest naturalComp testData5
,TestLabel "test6" $ compTest naturalComp testData6]
main = runTestTT tests