module Main where

import Data.Ini.Config.Raw
import Data.List
import Data.Sequence (Seq)
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import System.Directory
import System.Exit

dir :: FilePath
dir = "test/prewritten/cases"

main :: IO ()
main = do
  files <- getDirectoryContents dir
  let inis =
        [ f | f <- files, ".ini" `isSuffixOf` f
        ]
  mapM_ runTest inis

type IniSeq = Seq (Text, Seq (Text, Text))

toMaps :: RawIni -> IniSeq
toMaps (RawIni m) = fmap sectionToPair m
  where
    sectionToPair (name, section) =
      (normalizedText name, fmap valueToPair (isVals section))
    valueToPair (name, value) =
      (normalizedText name, T.strip (vValue value))

runTest :: FilePath -> IO ()
runTest iniF = do
  let hsF = take (length iniF - 4) iniF ++ ".hs"
  ini <- T.readFile (dir ++ "/" ++ iniF)
  hs <- readFile (dir ++ "/" ++ hsF)
  case parseRawIni ini of
    Left err -> do
      putStrLn ("Error parsing " ++ iniF)
      putStrLn err
      exitFailure
    Right x
      | toMaps x == read hs -> do
        putStrLn ("Passed: " ++ iniF)
      | otherwise -> do
        putStrLn ("Parses do not match for " ++ iniF)
        putStrLn ("Expected: " ++ hs)
        putStrLn ("Actual: " ++ show (toMaps x))
        exitFailure
