module Main where
import Format.RGB565 (toHex, to4Hex, toRGB565, toRGB565Hex)
import Format.Converter (pictureToRaw)
import Test.Hspec
import System.Directory (getCurrentDirectory, doesDirectoryExist,
createDirectory, getDirectoryContents,
removeDirectoryRecursive)
import System.FilePath.Posix ((</>))
import Data.List (foldl')
main :: IO ()
main = do
dir <- getCurrentDirectory
exist <- doesDirectoryExist "tmp"
if exist
then removeDirectoryRecursive "tmp"
else return ()
hspec $ do
describe "UTFTConverter Library" $ do
describe "Format.RGB565" $ do
describe "toHex" $ do
it "toHex should be 0" $ do
toHex 0 `shouldBe` "0"
it "toHex should be C" $ do
toHex 12 `shouldBe` "C"
it "toHex should be C6" $ do
toHex 198 `shouldBe` "C6"
it "toHex should be 7A" $ do
toHex 122 `shouldBe` "7A"
it "toHex should be FF" $ do
toHex 255 `shouldBe` "FF"
it "toHex should be 10000" $ do
toHex 65536 `shouldBe` "10000"
describe "to4Hex" $ do
it "to4Hex 0 should be 0000" $ do
to4Hex 0 `shouldBe` "0000"
it "to4Hex 12 should be 000C" $ do
to4Hex 12 `shouldBe` "000C"
it "to4Hex 198 should be 00C6" $ do
to4Hex 198 `shouldBe` "00C6"
it "to4Hex 122 should be 007A" $ do
to4Hex 122 `shouldBe` "007A"
it "to4Hex 255 should be 00FF" $ do
to4Hex 255 `shouldBe` "00FF"
it "to4Hex 65535 should be FFFF" $ do
to4Hex 65535 `shouldBe` "FFFF"
describe "toRGB565" $ do
it "toRGB565 (255, 255, 255) should be 65535" $ do
toRGB565 (255, 255, 255) `shouldBe` 65535
it "toRGB565 (123, 123, 123) should be 31695" $ do
toRGB565 (123, 123, 123) `shouldBe` 31695
it "toRGB565 (90, 255, 0) should be 24544" $ do
toRGB565 ( 90, 255, 0) `shouldBe` 24544
it "toRGB565 (0, 0, 0) should be 0" $ do
toRGB565 ( 0, 0, 0) `shouldBe` 0
describe "toRGB565Hex" $ do
it "toRGB565Hex (255, 255, 255) should be FFFF" $ do
toRGB565Hex (255, 255, 255) `shouldBe` "FFFF"
it "toRGB565Hex (123, 123, 123) should be 7BCF" $ do
toRGB565Hex (123, 123, 123) `shouldBe` "7BCF"
it "toRGB565Hex (90, 255, 0) should be 5FE0" $ do
toRGB565Hex ( 90, 255, 0) `shouldBe` "5FE0"
it "toRGB565Hex (0, 0, 0) should be 0" $ do
toRGB565Hex ( 0, 0, 0) `shouldBe` "0000"
describe "Format.Converter" $ do
it "tests/examples/cat_01 exists" $ do
exists <- doesDirectoryExist (dir </> "tests" </> "examples" </> "cat_01")
exists `shouldBe` True
it "tests/examples/cat_02 exists" $ do
exists <- doesDirectoryExist (dir </> "tests" </> "examples" </> "cat_02")
exists `shouldBe` True
it "tests/examples/cat_03 exists" $ do
exists <- doesDirectoryExist (dir </> "tests" </> "examples" </> "cat_03")
exists `shouldBe` True
it "15 example files should be in tests/examples/cat_0?" $ do
dir1 <- getExamplePicsPath dir ("tests" </> "examples" </> "cat_01")
dir2 <- getExamplePicsPath dir ("tests" </> "examples" </> "cat_02")
dir3 <- getExamplePicsPath dir ("tests" </> "examples" </> "cat_03")
length (dir1 ++ dir2 ++ dir3) `shouldBe` 15
it "cat_01 pics should be all converted to almost the same .raw-files (>99% similarity)" $ do
createDirectory "tmp"
pics <- getExamplePicsPath dir ("tests" </> "examples" </> "cat_01")
mapM_ (pictureToRaw (dir </> "tmp")) pics
rawfps <- getExamplePicsPath dir "tmp"
[p1, p2, p3, p4, p5] <- mapM readFile rawfps
let r1 = picSimilarity p1 p2
r2 = picSimilarity p1 p3
r3 = picSimilarity p1 p4
r4 = picSimilarity p1 p5
putStrLn $ "Pic similarity for p1 ~ p2: " ++ show r1
putStrLn $ "Pic similarity for p1 ~ p3: " ++ show r2
putStrLn $ "Pic similarity for p1 ~ p4: " ++ show r3
putStrLn $ "Pic similarity for p1 ~ p5: " ++ show r4
removeDirectoryRecursive (dir </> "tmp")
((r1 + r2 + r3 + r4) / 4) > 98 `shouldBe` True
it "cat_02 pics should be all converted to almost the same .raw-files (>99% similarity)" $ do
createDirectory "tmp"
pics <- getExamplePicsPath dir ("tests" </> "examples" </> "cat_02")
mapM_ (pictureToRaw (dir </> "tmp")) pics
rawfps <- getExamplePicsPath dir "tmp"
[p1, p2, p3, p4, p5] <- mapM readFile rawfps
let r1 = picSimilarity p1 p2
r2 = picSimilarity p1 p3
r3 = picSimilarity p1 p4
r4 = picSimilarity p1 p5
putStrLn $ "Pic similarity for p1 ~ p2: " ++ show r1
putStrLn $ "Pic similarity for p1 ~ p3: " ++ show r2
putStrLn $ "Pic similarity for p1 ~ p4: " ++ show r3
putStrLn $ "Pic similarity for p1 ~ p5: " ++ show r4
removeDirectoryRecursive (dir </> "tmp")
((r1 + r2 + r3 + r4) / 4) > 98 `shouldBe` True
it "cat_03 pics should be all converted to almost the same .raw-files (>99% similarity)" $ do
createDirectory "tmp"
pics <- getExamplePicsPath dir ("tests" </> "examples" </> "cat_03")
mapM_ (pictureToRaw (dir </> "tmp")) pics
rawfps <- getExamplePicsPath dir "tmp"
[p1, p2, p3, p4, p5] <- mapM readFile rawfps
let r1 = picSimilarity p1 p2
r2 = picSimilarity p1 p3
r3 = picSimilarity p1 p4
r4 = picSimilarity p1 p5
putStrLn $ "Pic similarity for p1 ~ p2: " ++ show r1
putStrLn $ "Pic similarity for p1 ~ p3: " ++ show r2
putStrLn $ "Pic similarity for p1 ~ p4: " ++ show r3
putStrLn $ "Pic similarity for p1 ~ p5: " ++ show r4
removeDirectoryRecursive (dir </> "tmp")
((r1 + r2 + r3 + r4) / 4) > 98 `shouldBe` True
getExamplePicsPath :: FilePath -> FilePath -> IO [FilePath]
getExamplePicsPath curdir picdir = do
content <- getDirectoryContents (curdir </> picdir)
let picnames = filter (`notElem` [".", ".."]) content
return $ map (\x -> curdir </> picdir </> x) picnames
picSimilarity :: String -> String -> Double
picSimilarity p1 p2 =
let f1 = words p1
f2 = words p2
(fcount, count) = foldl' (\(fc, c) (a, b) -> if a == b
then (fc , c + 1)
else (fc + 1, c + 1)) (0,0) (zip f1 f2)
in (100 - (fcount / count))