module Main where import Prelude import Test.QuickCheck.Instances import Test.Tasty import Test.Tasty.Runners import Test.Tasty.HUnit import Test.Tasty.QuickCheck import qualified Test.QuickCheck as QuickCheck import qualified Test.QuickCheck.Property as QuickCheck import qualified DeferredFolds.Unfoldr as Unfoldr import qualified Data.Text as Text main = defaultMain $ testGroup "All" $ [ testProperty "List roundtrip" $ \ (list :: [Int]) -> list === toList (Unfoldr.foldable list) , testProperty "take" $ \ (list :: [Int], amount) -> take amount list === toList (Unfoldr.take amount (Unfoldr.foldable list)) , testProperty "takeWhile odd" $ \ (list :: [Int]) -> takeWhile odd list === toList (Unfoldr.takeWhile odd (Unfoldr.foldable list)) , testProperty "intersperse" $ \ (list :: [Char]) -> intersperse ',' list === toList (Unfoldr.intersperse ',' (Unfoldr.foldable list)) , testProperty "textChars" $ \ (text :: Text) -> Text.unpack text === toList (Unfoldr.textChars text) , testProperty "textWords" $ \ (text :: Text) -> Text.words text === toList (Unfoldr.textWords text) , testProperty "trimWhitespace 1" $ \ (text :: Text) -> let words = Text.words text run = fromString . toList . Unfoldr.trimWhitespace . Unfoldr.textChars spacedInput = Text.map (\ c -> if isSpace c then ' ' else c) text newlinedInput = Text.map (\ c -> if isSpace c then '\n' else c) text in Text.unwords words === run spacedInput .&&. Text.intercalate "\n" words === run newlinedInput , testProperty "trimWhitespace 2" $ \ (text :: Text) -> let isNewline c = c == '\n' || c == '\r' isSpaceButNotNewline c = isSpace c && not (isNewline c) normalize separator condition = Text.split condition >>> filter (not . Text.null) >>> Text.intercalate separator expected = text & Text.split isNewline & fmap Text.strip & filter (not . Text.null) & Text.intercalate "\n" & Text.split isSpaceButNotNewline & filter (not . Text.null) & Text.intercalate " " run = fromString . toList . Unfoldr.trimWhitespace . Unfoldr.textChars in expected === run text ]