packages feed

strict-mutable-base-2.0.0.0: tests/ChanTests.hs

module ChanTests (chanTests) where

import Control.Concurrent.Chan.Strict
import Test.Tasty
import Test.Tasty.HUnit

import Utils

chanTests :: TestTree
chanTests = testGroup "Chan"
  [ testCase "basic operations" test_basicOperations
  , testCase "values are forced" test_valuesAreForced
  , testCase "values are forced only to WHNF" test_valuesAreForcedOnlyToWHNF
  ]

test_basicOperations :: Assertion
test_basicOperations = do
  chan <- newChan @Int
  writeChan chan 1
  writeList2Chan chan [2, 3]
  readChan chan >>= assertEqual "first value" 1
  dup <- dupChan chan
  writeChan chan 4
  readChan dup >>= assertEqual "value seen by the duplicate" 4
  contents <- getChanContents chan
  assertEqual "contents of the original" [2, 3, 4] (take 3 contents)

test_valuesAreForced :: Assertion
test_valuesAreForced = do
  chan <- newChan @Int
  assertForced "writeChan" $ writeChan chan bomb
  assertForced "writeList2Chan" $ writeList2Chan chan [1, bomb]
  readChan chan >>= assertEqual "only the first value was written" 1

test_valuesAreForcedOnlyToWHNF :: Assertion
test_valuesAreForcedOnlyToWHNF = do
  chan <- newChan
  assertNotForced "writeChan" $ writeChan chan (Just (bomb :: Int))
  assertNotForced "writeList2Chan" $ writeList2Chan chan [Just bomb]