{-# 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