@@ -1,14 +1,10 @@
11{-# LANGUAGE OverloadedStrings #-}
22{-# LANGUAGE StandaloneDeriving #-}
3−{-# LANGUAGE StandaloneDeriving #-}
4−
5−{-# LANGUAGE DerivingVia #-}
3+{-# LANGUAGE RecordWildCards #-}
64{-# LANGUAGE DerivingVia #-}
7−
85{-# LANGUAGE TypeApplications #-}
96{-# LANGUAGE LambdaCase #-}
107{-# LANGUAGE DerivingVia #-}
11−{-# LANGUAGE StandaloneDeriving #-}
128
139{-# OPTIONS_GHC -fno-warn-orphans #-}
1410import qualified Foo
@@ -16,9 +12,11 @@ import qualified Seeded
1612import qualified Valid
1713import qualified Headers
1814import qualified Post
15+import qualified Product
16+
1917import Test.Hspec.Core.Spec
2018
21−import Data.Dynamic(toDyn)
19+import Data.Dynamic(toDyn,Typeable,Dynamic)
2220import qualified Roboservant as RS
2321import Test.Hspec
2422import Data.Void
@@ -72,12 +70,28 @@ spec = do
7270 describe "Foo" $ do
7371 it "finds an error in a basic app" $
7472 RS.fuzz @Foo.Api Foo.server defaultConfig noCheck
75− >>= (`shouldSatisfy` isJust)
73+ >>= (`shouldSatisfy` serverFailure)
7674
77− describe "headers" $ do
75+ describe "headers (and sum types)" $ do
7876 it "should find a failure that's dependent on using header info" $ do
7977 RS.fuzz @Headers.Api Headers.server defaultConfig noCheck
80− >>= (`shouldSatisfy` isJust)
78+ >>= (`shouldSatisfy` serverFailure)
79+
80+ describe "product types" $ do
81+ it "should find a failure that's dependent on creating a product" $ do
82+ RS.fuzz @Product.Api Product.server defaultConfig { RS.seed = [hashedDyn 'a', hashedDyn (1::Int)]} noCheck
83+ >>= (`shouldSatisfy` serverFailure)
84+ -- >>= (`shouldSatisfy` isJust)
85+
86+hashedDyn :: (Hashable a, Typeable a) => a -> (Dynamic, Int)
87+hashedDyn a = (toDyn a, hash a)
88+
89+serverFailure :: Maybe RS.Report -> Bool
90+serverFailure = \case
91+ Just RS.Report{..} ->
92+ let RS.RoboservantException{..} = rsException
93+ in failureReason /= RS.NoPossibleMoves
94+ _ -> False
8195
8296 -- describe "can build from pieces" $ do
8397 -- it "should find a failure that requires some assembly" $ do
@@ -118,6 +132,8 @@ deriving via (RS.Atom Void) instance RS.BuildFrom Void
118132deriving via (RS.Atom Post.FooPost) instance RS.BuildFrom Post.FooPost
119133deriving via (RS.Atom Post.FooPost) instance RS.Breakdown Post.FooPost
120134
135+deriving via (RS.Compound Product.Foo) instance RS.BuildFrom Product.Foo
136+
121137
122138--deriving via (Compound RS.BuildFrom.Wrapped) instance RS.BuildFrom RS.BuildFrom.Wrapped
123139--deriving via (Compound RS.BuildFrom.Wrapped) instance RS.Breakdown RS.BuildFrom.Wrapped