@@ -1,6 +1,6 @@
1{-# LANGUAGE TemplateHaskell #-}
1{-# LANGUAGE TemplateHaskell #-}
3−module Main where
3+module Lib where
5import Control.Applicative
5import Control.Applicative
6import Control.Monad
6import Control.Monad
@@ -10,22 +10,15 @@ import qualified Data.ByteString.Lazy as LBS
10import Data.Char (toLower)
10import Data.Char (toLower)
11import qualified Data.HashMap.Strict as H
11import qualified Data.HashMap.Strict as H
12import Data.JsonSchema
12import Data.JsonSchema
13−import Data.List (isSuffixOf)
14import Data.Monoid
13import Data.Monoid
15import Data.Text (Text)
14import Data.Text (Text)
16import qualified Data.Text as T
15import qualified Data.Text as T
17import qualified Data.Vector as V
16import qualified Data.Vector as V
18−import System.Directory (getDirectoryContents)
19import System.FilePath ((</>))
17import System.FilePath ((</>))
20import Test.Framework
18import Test.Framework
21import Test.Framework.Providers.HUnit
19import Test.Framework.Providers.HUnit
22import qualified Test.HUnit as HU
20import qualified Test.HUnit as HU
26− ts <- readSchemaTests
27− defaultMain (toTest <$> ts)
29data SchemaTest = SchemaTest
22data SchemaTest = SchemaTest
30 { _stDescription :: Text
23 { _stDescription :: Text
31 , _stSchema :: RawSchema
24 , _stSchema :: RawSchema
@@ -48,22 +41,31 @@ instance FromJSON SchemaTest where
48 <*> o .: "schema"
41 <*> o .: "schema"
49 <*> o .: "tests" -- I wish this were "cases"
42 <*> o .: "tests" -- I wish this were "cases"
44+isLocal :: String -> Bool
45+isLocal file = (file /= "definitions.json")
46+ && (file /= "ref.json")
47+ && (file /= "refRemote.json")
51−readSchemaTests :: IO [SchemaTest]
49+readSchemaTests :: String -> [String] -> IO [SchemaTest]
52−readSchemaTests = do
50+readSchemaTests dir jsonFiles = concatMapM fileToCases jsonFiles
53− jsonFiles <- filter (".json" `isSuffixOf`) <$> getDirectoryContents dir
54− fmap concat $ forM jsonFiles $ \file -> do
55− let fullPath = dir </> file
56− jsonBS <- LBS.readFile fullPath
57− case eitherDecode jsonBS of
58− Left err -> fail $ "couldn't parse file '" <> fullPath <> "': " <> err
59− Right schemas -> return $ prependFileName file <$> schemas
61− dir = "JSON-Schema-Test-Suite/tests/draft4"
52+ -- Each file contains an array of SchemaTests, not just one.
53+ fileToCases :: String -> IO [SchemaTest]
54+ fileToCases name = do
55+ let fullPath = dir </> name
56+ jsonBS <- LBS.readFile fullPath
57+ case eitherDecode jsonBS of
58+ Left e -> fail $ "couldn't parse file '" <> fullPath <> "': " <> e
59+ Right schemaTests -> return $ prependFileName name <$> schemaTests
62 prependFileName :: String -> SchemaTest -> SchemaTest
61 prependFileName :: String -> SchemaTest -> SchemaTest
63 prependFileName fileName s = s
62 prependFileName fileName s = s
64 { _stDescription = T.pack fileName <> ": " <> _stDescription s
63 { _stDescription = T.pack fileName <> ": " <> _stDescription s
66+ concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]
67+ concatMapM f xs = liftM concat (mapM f xs)
67toTest :: SchemaTest -> Test
69toTest :: SchemaTest -> Test
68toTest st = testGroup groupName (mkCase <$> _stCases st)
70toTest st = testGroup groupName (mkCase <$> _stCases st)