content: 
  -- |
  -- Module      : Streamly.Test.Data.Array.Generic
  -- Copyright   : (c) 2019 Composewell Technologies
  -- License     : BSD-3-Clause
  -- Maintainer  : streamly@composewell.com
  -- Stability   : experimental
  -- Portability : GHC
  
  module Streamly.Test.Data.Array.Generic (main) where
  
  #include "Streamly/Test/Data/Array/CommonImports.hs"
  
  import qualified Streamly.Internal.Data.Array.Generic as A
  
  type Array = A.Array
  
  moduleName :: String
  moduleName = "Data.Array"
  
  #include "Streamly/Test/Data/Array/Common.hs"
  
  testFromStreamToStream :: Property
  testFromStreamToStream =
      genericTestFromTo (const A.fromStream) A.read (==)
  
  testFoldUnfold :: Property
  testFoldUnfold =
      genericTestFromTo (const (S.fold A.create)) (S.unfold A.reader) (==)
  
  testFromList :: Property
  testFromList =
      forAll (choose (0, maxArrLen)) $ \len ->
              forAll (vectorOf len (arbitrary :: Gen Int)) $ \list ->
                  monadicIO $ do
                      let arr = A.fromList list
                      xs <- run $ S.fold Fold.toList $ S.unfold A.reader arr
                      assert (xs == list)
  
  testLengthFromStream :: Property
  testLengthFromStream = genericTestFrom (const A.fromStream)
  
  testReadShowInstance :: Property
  testReadShowInstance =
      forAll (choose (0, maxArrLen)) $ \len ->
              forAll (vectorOf len (arbitrary :: Gen Int)) $ \list ->
                  monadicIO $ do
                      let arr = A.fromList list
                      assert (A.toList (read (show arr)) == list)
  
  
  main :: IO ()
  main =
      hspec $
      H.parallel $
      modifyMaxSuccess (const maxTestCount) $ do
        describe moduleName $ do
          commonMain
          describe "Construction" $ do
              prop "length . fromStream === n" testLengthFromStream
              prop "toStream . fromStream === id" testFromStreamToStream
              prop "read . write === id" testFoldUnfold
              prop "fromList" testFromList
              prop "testReadShowInstance" testReadShowInstance
  