module GRead (tests) where

{-

The following examples achieve branch coverage for the various
productions in the definition of gread. Also, negative test cases are
provided; see str2 and str3. Also, the potential of heading or
trailing spaces as well incomplete parsing of the input is exercised;
see str5.

-}

import Test.Tasty.HUnit

import Data.Generics

str1, str2, str3, str4, str4a, str5, str6, str7 :: String
str1  = "(True)"     -- reads fine as a Bool
str2  = "(Treu)"     -- invalid constructor
str3  = "True"       -- lacks parentheses
str4  = "(1)"        -- could be an Int
str4a = "(-1)"       -- negative literal
str5  = "( 2 ) ..."  -- could be an Int with some trailing left-over
str6  = "([])"       -- test empty list
str7  = "((:)" ++ " " ++ str4 ++ " " ++ str6 ++ ")"

expected ::
  ( [[(Bool,  String)]]
  , [[(Int,   String)]]
  , [[([Int], String)]]
  )
expected =
  ( [ gread str1,
      gread str2,
      gread str3
    ]
  , [ gread str4,
      gread str4a,
      gread str5
    ]
  , [ gread str6,
      gread str7
    ]
  )

tests :: Assertion
tests = show expected @=? show output

output ::
  ( [[(Bool,  String)]]
  , [[(Int,   String)]]
  , [[([Int], String)]]
  )
output =
  ([[(True,"")],[],[]],[[(1,"")],[(-1,"")],[(2,"...")]],[[([],"")],[([1],"")]])
