hercules-ci-agent-0.10.1: test/Hercules/Agent/ConduitSpec.hs
{-# LANGUAGE BlockArguments #-}
module Hercules.Agent.ConduitSpec where
import Data.Conduit
import Data.Conduit.Combinators (sinkList)
import Data.Conduit.List (sourceList)
import Hercules.Agent.Conduit (tailC, takeCWhileStopEarly, withMessageLimit)
import Protolude hiding (yield)
import Test.Hspec
spec :: Spec
spec = do
describe "tailC" do
it "can produce an empty output" do
l <- runConduit (pass .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` []
it "can produce a short output (1)" do
l <- runConduit (sourceList [1] .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` [1]
it "can produce a short output (2)" do
l <- runConduit (sourceList [1, 2] .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` [1, 2]
it "can produce a matching output (3)" do
l <- runConduit (sourceList [1 .. 3] .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` [1, 2, 3]
it "can produce a tail output (4)" do
l <- runConduit (sourceList [1 .. 4] .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` [2, 3, 4]
it "can produce a tail output (5)" do
l <- runConduit (sourceList [1 .. 5] .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` [3, 4, 5]
it "can produce a tail output (100)" do
l <- runConduit (sourceList [1 .. 100] .| tailC 3 .| sinkList)
(l :: [Int]) `shouldBe` [98, 99, 100]
describe "takeCWhileStopEarly" do
it "works for example" do
(i, l) <- runConduit (sourceList [1 .. 10] .| (takeCWhileStopEarly even 2 `fuseBoth` sinkList))
(l :: [Int]) `shouldBe` [1, 2, 3, 4]
i `shouldBe` (2, 4)
describe "withMessageLimit" do
let exampleConduit = do
withMessageLimit (const True) 20 10 (yield (-42)) (\between -> yield (-1 * between)) yield
it "works for input 0" do
r <- runConduit do
sourceList ([] :: [Int])
.| exampleConduit
.| sinkList
r `shouldBe` []
it "works for input 1" do
r <- runConduit do
sourceList [1 .. 12 :: Int]
.| exampleConduit
.| sinkList
r `shouldBe` [1 .. 12]
it "works for input 2" do
r <- runConduit do
sourceList [1 .. 21 :: Int]
.| exampleConduit
.| sinkList
r `shouldBe` [1 .. 20] <> [-42, 21]
it "works for input 3" do
r <- runConduit do
sourceList [1 .. 30 :: Int]
.| exampleConduit
.| sinkList
r `shouldBe` [1 .. 20] <> [-42] <> [21 .. 30]
it "works for input 4" do
r <- runConduit do
sourceList [1 .. 31 :: Int]
.| exampleConduit
.| sinkList
r `shouldBe` [1 .. 20] <> [-42, -1] <> [22 .. 31] <> [1]
it "works for input 5" do
r <- runConduit do
sourceList [1 .. 100 :: Int]
.| exampleConduit
.| sinkList
r `shouldBe` [1 .. 20] <> [-42, -70] <> [91 .. 100] <> [70]