{-# LANGUAGE OverloadedStrings #-}
module TIRParser where

import System.IO.Unsafe (unsafePerformIO)
import Test.HUnit

import LogicIR.Expr
import LogicIR.Parser

parserTests =
  [ "1 + 1" @?= n 1 .+ n 1
  , "(1 == 1 ? 1 : 2)" @?=
      LIf (n 1 .== n 1) (n 1) (n 2)
  , "true \\/ (1 == 1 ? 1 : 2)" @?=
      b True .|| LIf (n 1 .== n 1) (n 1) (n 2)
  , "true \\/ (1 == 1 ? 1 : 2)" @?=
      b True .|| LIf (n 1 .== n 1) (n 1) (n 2)
  , "(forall x:int :: x:int >= 1 -> x:int + 1 > 1)" @?=
      forall x (v x .>= n 1) (x' .+ n 1 .> n 1)
  , "(exists x:int :: x:int >= 1 -> x:int + 1 > 1)" @?=
      exists x (v x .>= n 1) (x' .+ n 1 .> n 1)
  , "(exists x:[int] :: true -> x:[int][5] > 1)" @?=
      exists xArr (b True) ((xArr .! n 5) .> n 1)
  , "len(x:[int]) > 1 + 1" @?=
      LLen xArr .> n 1 .+ n 1
  , "len(x:[int]) == 0 /\\ ! x:[int] == null" @?=
      LLen xArr .== n 0 .&& lnot (LIsnull xArr)
  , "len(x:[real]) == 0 /\\ ! x:[real] == null" @?=
      LLen xArr' .== n 0 .&& lnot (LIsnull xArr')
  , "len(x:[[real]]) == 0 /\\ ! x:[[real]] == null" @?=
      LLen xArr'' .== n 0 .&& lnot (LIsnull xArr'')
  ]
  where x = var "x" "int"
        x' = v x
        xArr = var "x" "[int]"
        xArr' = var "x" "[real]"
        xArr'' = var "x" "[[real]]"