content: -- Copyright 2020 United States Government as represented by the Administrator
  -- of the National Aeronautics and Space Administration. All Rights Reserved.
  --
  -- Disclaimers
  --
  -- Licensed under the Apache License, Version 2.0 (the "License"); you may
  -- not use this file except in compliance with the License. You may obtain a
  -- copy of the License at
  --
  --      https://www.apache.org/licenses/LICENSE-2.0
  --
  -- Unless required by applicable law or agreed to in writing, software
  -- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  -- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  -- License for the specific language governing permissions and limitations
  -- under the License.
  --
  -- | Test C language library.
  module Main where
  
  -- External imports
  import Data.Either                          ( isLeft, isRight )
  import Test.Framework                       ( Test, defaultMainWithOpts )
  import Test.Framework.Providers.QuickCheck2 ( testProperty )
  import Test.QuickCheck                      ( Property )
  import Test.QuickCheck.Monadic              ( assert, monadicIO, run )
  
  -- Internal imports
  import qualified Language.C.ParC as C ( myLexer, pTranslationUnit )
  
  -- | Run all unit tests for the C parser.
  main :: IO ()
  main =
    defaultMainWithOpts tests mempty
  
  -- | All unit tests for the C parser.
  tests :: [Test.Framework.Test]
  tests =
    [ testProperty "Parse C (correct header case)"   propParseCOk
    , testProperty "Parse C (incorrect header case)" propParseCFail
    ]
  
  -- | Test the C parser on a well-formed header file.
  propParseCOk :: Property
  propParseCOk = monadicIO $ do
    content <- run $ readFile "tests/reduced_geofence_msgs.h"
    let program = C.pTranslationUnit $ C.myLexer content
    assert (isRight program)
  
  -- | Test the C parser on an incorrect header file.
  propParseCFail :: Property
  propParseCFail = monadicIO $ do
    content <- run $ readFile "tests/reduced_geofence_msgs_bad.h"
    let program = C.pTranslationUnit $ C.myLexer content
    assert (isLeft program)
  