packages feed

config-ini-0.1.2.1: test/ini-compat/Main.hs

{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Main where

import           Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HM
import qualified Data.Ini as I1
import qualified Data.Ini.Config.Raw as I2
import           Data.Monoid
import           Data.Text (Text)
import qualified Data.Text as T

import           Test.QuickCheck

iniEquiv :: ArbIni -> Bool
iniEquiv (ArbIni raw) = case (i1, i2) of
   (Right i1', Right i2') ->
     let i1'' = lower i1'
         i2'' = toMaps i2'
     in i1'' == i2''
   _ -> False
  where pr = I1.printIniWith I1.defaultWriteIniSettings raw
        i2 = I2.parseIni pr
        i1 = I1.parseIni pr

lower :: I1.Ini -> HashMap Text (HashMap Text Text)
lower (I1.Ini hm) =
  HM.fromList [ (T.toLower k, v) | (k, v) <- HM.toList hm ]

toMaps :: I2.Ini -> HashMap Text (HashMap Text Text)
toMaps (I2.Ini m) = fmap (fmap I2.vValue . I2.isVals) m

type AlphaNumText = T.Text
instance Arbitrary AlphaNumText where
    arbitrary = T.pack <$> (listOf1 $ elements $
                            ['a'..'z'] <> ['A'..'Z'] <> ['0'..'9'] <> [' '])

newtype ArbIni = ArbIni I1.Ini deriving (Show)

instance Arbitrary ArbIni where
  arbitrary = (ArbIni . I1.Ini . HM.fromList) `fmap` listOf sections
    where sections = do
            name <- arbitrary :: Gen AlphaNumText
            sec  <- section
            return (name, sec)
          section = HM.fromList `fmap` listOf kv
          kv = do
            name <- arbitrary :: Gen AlphaNumText
            val  <- arbitrary :: Gen AlphaNumText
            return (name, val)

main :: IO ()
main = quickCheck iniEquiv