packages feed

linear-base-0.8.0: test/Test/Data/List.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wno-x-partial #-}

module Test.Data.List (listTests) where

import qualified Data.List.Linear as List
import qualified Data.Num.Linear as Num
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Prelude.Linear
import Test.Tasty
import Test.Tasty.Hedgehog (testPropertyNamed)
import qualified Prelude

listTests :: TestTree
listTests =
  testGroup
    "List tests"
    [ testPropertyNamed "take n ++ drop n = id" "take_drop" take_drop,
      testPropertyNamed "length . take n = const n" "take_length" take_length,
      testPropertyNamed "zipWith is lazy" "zipWith_lazy" zipWith_lazy,
      testPropertyNamed "zipWith3 is lazy" "zipWith3_lazy" zipWith3_lazy
    ]

take_drop :: Property
take_drop = property $ do
  n <- forAll $ Gen.int (Range.linear 0 50)
  classify "0" $ n == 0
  xs <- forAll $ Gen.list (Range.linear 0 1000) (Gen.int (Range.linear 0 40))
  classify "length > n" $ Prelude.length xs > n
  List.take n xs ++ List.drop n xs === xs

take_length :: Property
take_length = property $ do
  n <- forAll $ Gen.int (Range.linear 0 50)
  classify "0" $ n == 0
  xs <- forAll $ Gen.list (Range.linear 0 1000) (Gen.int (Range.linear 0 40))
  classify "length > n" $ Prelude.length xs > n
  case Prelude.length xs > n of
    True -> do
      annotate "Prelude.length xs > n"
      Prelude.length (List.take n xs) === n
    False -> do
      annotate "Prelude.length xs < n"
      Prelude.length (List.take n xs) === Prelude.length xs

zipWith_lazy :: Property
zipWith_lazy = property $ do
  lgth <- forAll $ Gen.word (Range.linear 0 50)
  _ <- eval $ Prelude.head (xs lgth)
  Prelude.return ()
  where
    xs :: Word -> [Word]
    xs lgth = List.zipWith (Num.+) (0 : error "bottom") [0 .. lgth]

zipWith3_lazy :: Property
zipWith3_lazy = property $ do
  lgth1 <- forAll $ Gen.word (Range.linear 0 50)
  lgth2 <- forAll $ Gen.word (Range.linear 0 50)
  _ <- eval $ Prelude.head (xs lgth1 lgth2)
  Prelude.return ()
  where
    xs :: Word -> Word -> [Word]
    xs lgth1 lgth2 = List.zipWith3 (\x y z -> x Num.+ y Num.+ z) (0 : error "bottom") [0 .. lgth1] [0 .. lgth2]