packages feed

deferred-folds-0.9.18.1: test/Main.hs

module Main where

import qualified Data.Text as Text
import qualified DeferredFolds.Unfoldr as Unfoldr
import qualified Test.QuickCheck as QuickCheck
import Test.QuickCheck.Instances
import qualified Test.QuickCheck.Property as QuickCheck
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.Tasty.Runners
import Prelude

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
      ]