jvm-streaming-0.2.1: tests/Language/Java/StreamingSpec.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# OPTIONS_GHC -fplugin=Language.Java.Inline.Plugin #-}
module Language.Java.StreamingSpec where
import Data.Int
import Data.IORef
import Language.Java
import Language.Java.Inline
import Language.Java.Streaming ()
import Test.Hspec
import Streaming (Stream, Of)
import qualified Streaming.Prelude as Streaming
spec :: Spec
spec = do
describe "iteration" $ do
it "succeeds on empty lists" $ do
vals <- reflect [1..0 :: Int32]
iterator <- [java| java.util.Arrays.asList($vals).iterator() |]
stream <- reify iterator
Streaming.toList_ stream `shouldReturn` [1..0 :: Int32]
it "succeeds on singleton lists" $ do
vals <- reflect [1 :: Int32]
iterator <- [java| java.util.Arrays.asList($vals).iterator() |]
stream <- reify iterator
Streaming.toList_ stream `shouldReturn` [1 :: Int32]
it "succeeds on non-trivial lists" $ do
vals <- reflect [1..10000 :: Int32]
iterator <- [java| java.util.Arrays.asList($vals).iterator() |]
stream <- reify iterator
Streaming.toList_ stream `shouldReturn` [1..10000 :: Int32]
describe "streams" $ do
it "have the property that reify . reflect == id" $ do
iterator <- reflect (Streaming.each [1..10000] :: Stream (Of Int32) IO ())
stream <- reify iterator
Streaming.toList_ stream `shouldReturn` [1..10000 :: Int32]
it "don't redo effects" $ do
ref <- newIORef (1 :: Int32)
iterator <- reflect $
Streaming.replicateM 10 $ atomicModifyIORef ref (\i -> (i + 1, i))
stream <- reify iterator
Streaming.toList_ stream `shouldReturn` [1..10 :: Int32]