@@ -1,41 +1,41 @@
1−{-# LANGUAGE CPP #-}
1+{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DeriveGeneric #-}
2+{-# LANGUAGE DeriveGeneric #-}
3−{-# LANGUAGE PackageImports #-}
3+{-# LANGUAGE PackageImports #-}
4−{-# LANGUAGE RecordWildCards #-}
4+{-# LANGUAGE RecordWildCards #-}
5{-# LANGUAGE ScopedTypeVariables #-}
5{-# LANGUAGE ScopedTypeVariables #-}
6{-# OPTIONS_GHC -fno-warn-orphans #-}
6{-# OPTIONS_GHC -fno-warn-orphans #-}
7module Data.Swagger.Schema.ValidationSpec where
7module Data.Swagger.Schema.ValidationSpec where
9−import Control.Applicative
9+import Control.Applicative
10−import Control.Lens ((&), (.~), (?~))
10+import Control.Lens ((&), (.~), (?~))
11−import Data.Aeson
11+import Data.Aeson
12−import Data.Aeson.Types
12+import Data.Aeson.Types
13−import Data.Int
13+import Data.Hashable (Hashable)
14−import Data.IntMap (IntMap)
14+import Data.HashMap.Strict (HashMap)
15−import Data.Hashable (Hashable)
15+import qualified Data.HashMap.Strict as HashMap
16−import "unordered-containers" Data.HashSet (HashSet)
16+import "unordered-containers" Data.HashSet (HashSet)
17import qualified "unordered-containers" Data.HashSet as HashSet
17import qualified "unordered-containers" Data.HashSet as HashSet
18−import Data.HashMap.Strict (HashMap)
18+import Data.Int
19−import qualified Data.HashMap.Strict as HashMap
19+import Data.IntMap (IntMap)
20−import Data.List.NonEmpty.Compat (NonEmpty(..), nonEmpty)
20+import Data.List.NonEmpty.Compat (NonEmpty (..), nonEmpty)
21−import Data.Map (Map, fromList)
21+import Data.Map (Map, fromList)
22−import Data.Monoid (mempty)
22+import Data.Monoid (mempty)
23−import Data.Proxy
23+import Data.Proxy
24−import Data.Time
24+import Data.Set (Set)
25−import qualified Data.Text as T
25+import qualified Data.Text as T
26−import qualified Data.Text.Lazy as TL
26+import qualified Data.Text.Lazy as TL
27−import Data.Version (Version)
27+import Data.Time
28−import Data.Set (Set)
28+import Data.Version (Version)
29−import Data.Word
29+import Data.Word
30−import GHC.Generics
30+import GHC.Generics
32−import Data.Swagger
32+import Data.Swagger
33−import Data.Swagger.Declare
33+import Data.Swagger.Declare
35−import Test.Hspec
35+import Test.Hspec
36−import Test.Hspec.QuickCheck
36+import Test.Hspec.QuickCheck
37−import Test.QuickCheck
37+import Test.QuickCheck
38−import Test.QuickCheck.Instances ()
38+import Test.QuickCheck.Instances ()
40shouldValidate :: (ToJSON a, ToSchema a) => Proxy a -> a -> Bool
40shouldValidate :: (ToJSON a, ToSchema a) => Proxy a -> a -> Bool
41shouldValidate _ x = validateToJSON x == []
41shouldValidate _ x = validateToJSON x == []
@@ -83,6 +83,7 @@ spec = do
83 prop "(HashMap String Int)" $ shouldValidate (Proxy :: Proxy (HashMap String Int))
83 prop "(HashMap String Int)" $ shouldValidate (Proxy :: Proxy (HashMap String Int))
84 prop "(HashMap T.Text Int)" $ shouldValidate (Proxy :: Proxy (HashMap T.Text Int))
84 prop "(HashMap T.Text Int)" $ shouldValidate (Proxy :: Proxy (HashMap T.Text Int))
85 prop "(HashMap TL.Text Bool)" $ shouldValidate (Proxy :: Proxy (HashMap TL.Text Bool))
85 prop "(HashMap TL.Text Bool)" $ shouldValidate (Proxy :: Proxy (HashMap TL.Text Bool))
86+ prop "Object" $ shouldValidate (Proxy :: Proxy Object)
86 prop "(Int, String, Double)" $ shouldValidate (Proxy :: Proxy (Int, String, Double))
87 prop "(Int, String, Double)" $ shouldValidate (Proxy :: Proxy (Int, String, Double))
87 prop "(Int, String, Double, [Int])" $ shouldValidate (Proxy :: Proxy (Int, String, Double, [Int]))
88 prop "(Int, String, Double, [Int])" $ shouldValidate (Proxy :: Proxy (Int, String, Double, [Int]))
88 prop "(Int, String, Double, [Int], Int)" $ shouldValidate (Proxy :: Proxy (Int, String, Double, [Int], Int))
89 prop "(Int, String, Double, [Int], Int)" $ shouldValidate (Proxy :: Proxy (Int, String, Double, [Int], Int))
@@ -139,9 +140,9 @@ instance Arbitrary Color where
139 arbitrary = arbitraryBoundedEnum
140 arbitrary = arbitraryBoundedEnum
141invalidColorToJSON :: Color -> Value
142invalidColorToJSON :: Color -> Value
142−invalidColorToJSON Red = toJSON "red"
143+invalidColorToJSON Red = toJSON "red"
143−invalidColorToJSON Green = toJSON "green"
144+invalidColorToJSON Green = toJSON "green"
144−invalidColorToJSON Blue = toJSON "blue"
145+invalidColorToJSON Blue = toJSON "blue"
146-- ========================================================================
147-- ========================================================================
147-- Paint (record with bounded enum property)
148-- Paint (record with bounded enum property)
@@ -261,3 +262,17 @@ instance Arbitrary FreeForm where
261instance Eq ZonedTime where
262instance Eq ZonedTime where
262 ZonedTime t (TimeZone x _ _) == ZonedTime t' (TimeZone y _ _) = t == t' && x == y
263 ZonedTime t (TimeZone x _ _) == ZonedTime t' (TimeZone y _ _) = t == t' && x == y
265+-- ========================================================================
266+-- Arbitrary instance for Data.Aeson.Value
267+-- ========================================================================
269+instance Arbitrary Value where
270+ -- Weights are almost random
271+ -- Uniform oneof tends not to build complex objects cause of recursive call.
272+ arbitrary = resize 4 $ frequency
273+ [ (3, Object <$> arbitrary)
274+ , (3, Array <$> arbitrary)
275+ , (3, String <$> arbitrary)
276+ , (3, Number <$> arbitrary)
277+ , (3, Bool <$> arbitrary)
278+ , (1, return Null) ]