content: module Data.Aeson.Schema.Validator.Tests
    ( tests
    ) where
  
  import           Test.Framework
  import           Test.Framework.Providers.HUnit
  import qualified Test.HUnit                     as HU
  
  import           Data.Aeson                     (Value)
  import qualified Data.Map                       as M
  import           Data.Text                      (Text, unpack)
  
  import           Data.Aeson.Schema.Types
  import           Data.Aeson.Schema.Validator
  
  import           Data.Aeson.Schema.Examples     (examples)
  import           TestSuite.Types                (SchemaTest (..),
                                                   SchemaTestCase (..))
  
  assertValid, assertInvalid :: Graph Schema Text
                             -> Schema Text
                             -> Value
                             -> HU.Assertion
  assertValid graph schema value = case validate graph schema value of
    [] -> return ()
    es -> HU.assertFailure $ unlines es
  assertInvalid graph schema value = case validate graph schema value of
    [] -> HU.assertFailure "expected a validation error"
    _  -> return ()
  
  tests :: [SchemaTest] -> [Test]
  tests schemaTests = examples testCase assertValid assertInvalid ++ map buildSchemaTest schemaTests
    where
      buildSchemaTest :: SchemaTest -> Test
      buildSchemaTest schemaTest = testGroup testName cases
        where
          testName = unpack $ schemaTestDescription schemaTest
          cases = map (buildSchemaTestCase $ schemaTestSchema schemaTest) $ schemaTestCases schemaTest
      buildSchemaTestCase :: Schema Text -> SchemaTestCase -> Test
      buildSchemaTestCase schema schemaTestCase = testCase testName assertion
        where
          testName = unpack $ schemaTestCaseDescription schemaTestCase
          testData = schemaTestCaseData schemaTestCase
          graph = M.empty
          assertion = if schemaTestCaseValid schemaTestCase
            then assertValid graph schema testData
            else assertInvalid graph schema testData
  
  