packages feed

relude-1.2.2.2: test/Test/Relude/Container/One.hs

module Test.Relude.Container.One
    ( oneProps
    ) where

import Relude

import Hedgehog (Gen, Group (..), Property, forAll, property, (===))

import Test.Relude.Gen (genInt, genUtf8Text)

import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Short as SBS
import qualified Data.IntSet as IntSet
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range


oneProps :: Group
oneProps = Group "'One' typeclass property tests"
    [ ( "length (one @[a] x)             ≡ 1", oneListProp)
    , ( "length (one @(NonEmpty a) x)    ≡ 1", oneNonEmptyProp)
    , ( "length (one @(Seq a) x)         ≡ 1", oneSeqProp)
    , ( "length (one @Text x)            ≡ 1", oneTextProp)
    , ( "length (one @LText x)           ≡ 1", oneLTextProp)
    , ( "length (one @ByteString x)      ≡ 1", oneByteStringProp)
    , ( "length (one @LByteString x)     ≡ 1", oneLByteStringProp)
    , ( "length (one @ShortByteString x) ≡ 1", oneShortByteStringProp)
    , ( "length (one @(Map k v) x)       ≡ 1", oneMapProp)
    , ( "length (one @(HashMap k v) x)   ≡ 1", oneHashMapProp)
    , ( "length (one @(IntMap v) x)      ≡ 1", oneIntMapProp)
    , ( "length (one @(Set a) x)         ≡ 1", oneSetProp)
    , ( "length (one @(HashSet a) x)     ≡ 1", oneHashSetProp)
    , ( "length (one @(IntSet x)         ≡ 1", oneIntSetProp)
    ]

oneListProp :: Property
oneListProp = property $ do
    x <- forAll genInt
    length (one @[Int] x) === 1

oneNonEmptyProp :: Property
oneNonEmptyProp = property $ do
    x <- forAll genInt
    length (one @(NonEmpty Int) x) === 1

oneSeqProp :: Property
oneSeqProp = property $ do
    x <- forAll genInt
    length (one @(Seq Int) x) === 1

oneTextProp :: Property
oneTextProp = property $ do
    x <- forAll Gen.unicode
    T.length (one @Text x) === 1

oneLTextProp :: Property
oneLTextProp = property $ do
    x <- forAll Gen.unicode
    TL.length (one @LText x) === 1

oneByteStringProp :: Property
oneByteStringProp = property $ do
    x <- forAll genWord8
    BS.length (one @ByteString x) === 1

oneLByteStringProp :: Property
oneLByteStringProp = property $ do
    x <- forAll genWord8
    LBS.length (one @LByteString x) === 1

oneShortByteStringProp :: Property
oneShortByteStringProp = property $ do
    x <- forAll genWord8
    SBS.length (one @ShortByteString x) === 1

oneMapProp :: Property
oneMapProp = property $ do
    k <- forAll genUtf8Text
    v <- forAll genInt
    length (one @(Map Text Int) (k, v)) === 1

oneHashMapProp :: Property
oneHashMapProp = property $ do
    k <- forAll genUtf8Text
    v <- forAll genInt
    length (one @(HashMap Text Int) (k, v)) === 1

oneIntMapProp :: Property
oneIntMapProp = property $ do
    k <- forAll genInt
    v <- forAll genUtf8Text
    length (one @(IntMap Text) (k, v)) === 1

oneSetProp :: Property
oneSetProp = property $ do
    v <- forAll genUtf8Text
    length (one @(Set Text) v) === 1

oneHashSetProp :: Property
oneHashSetProp = property $ do
    v <- forAll genUtf8Text
    length (one @(HashSet Text) v) === 1

oneIntSetProp :: Property
oneIntSetProp = property $ do
    v <- forAll genInt
    IntSet.size (one v) === 1


genWord8 :: Gen Word8
genWord8 = Gen.word8 Range.constantBounded