packages feed

remarks-0.1.7: test/PointsCheckerTests.hs

{-# LANGUAGE DeriveGeneric #-}

module PointsCheckerTests ( allTests ) where

import Ast
import Parser
import PointsChecker

import Test.Tasty
import Test.Tasty.HUnit
-- import Test.Tasty.QuickCheck
import Test.Tasty.Golden

import Text.PrettyPrint.GenericPretty

checkPointsStr :: String -> [Either Invalid Judgement]
checkPointsStr s =
  case parseString s of
    Right js -> map checkPoints js
    Left e -> []

posUnitTests :: TestTree
posUnitTests = testGroup "Positive Unit Tests"
  [ testCase "Lone header line" $
      checkPointsStr "# A: 0/0\n" @?=
        [ Right $
          Judgement (Header ("A", 0.0, 0.0), [], [])]
  , testCase "A couple same-depth header lines" $
      checkPointsStr "# A: 0/0\n# B: 0/0\n" @?=
        [ Right $
          Judgement (Header ("A", 0.0, 0.0), [], [])
        , Right $
          Judgement (Header ("B", 0.0, 0.0), [], [])
        ]
  , testCase "A simple hierarchy of headers" $
      checkPointsStr "# A: 0/0\n## B: 0/0\n" @?=
        [ Right $
          Judgement (Header ("A", 0.0, 0.0), [],
            [Judgement (Header ("B", 0.0, 0.0), [], [])])]
  , testCase "A couple simple hierarchies" $
      checkPointsStr "# A: 0/0\n## B: 0/0\n# C: 0/0\n" @?=
        [ Right $
          Judgement (Header ("A", 0.0, 0.0), [],
            [Judgement (Header ("B", 0.0, 0.0), [], [])])
        , Right $
          Judgement (Header ("C", 0.0, 0.0), [], [])
        ]
  ]

negUnitTests :: TestTree
negUnitTests = testGroup "Positive Unit Tests"
  [ testCase "Points exceed max points" $
      checkPointsStr "# A: 1/0\n" @?=
        [Left $ PointsExceedMaxPoints (Header ("A", 1.0, 0.0))]
  , testCase "Sub-judgement points don't sum up to points" $
      checkPointsStr "# A: 0/0\n## B: 1/0\n" @?=
        [Left $ BadSubJudgementPointsSum
          (Judgement (Header ("A", 0.0, 0.0), [],
            [Judgement (Header ("B", 1.0, 0.0), [], [])]))]
  , testCase "Sub-judgement max-points don't sum up to max-points" $
      checkPointsStr "# A: 0/0\n## B: 0/1\n" @?=
        [Left $ BadSubJudgementMaxPointsSum
          (Judgement (Header ("A", 0.0, 0.0), [],
            [Judgement (Header ("B", 0.0, 1.0), [], [])]))]
  , testCase "Single judgement with no points" $
      checkPointsStr "# A: /0\n" @?=
        [Left $ NoPointsInBottomJudgement
          (Judgement (Header ("A", 1/0, 0.0), [], []))]
  ]

qcTests :: TestTree
qcTests = testGroup "QuickCheck tests" []

goldenTests :: TestTree
goldenTests = testGroup "Golden tests" []

allTests :: TestTree
allTests = testGroup "PointsChecker tests"
  [ posUnitTests, negUnitTests, qcTests, goldenTests ]