packages feed

cleveland-0.1.1: lorentz-test/Test/Lorentz/Expr.hs

-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

{-# LANGUAGE NoApplicativeDo, RebindableSyntax #-}
{-# OPTIONS_GHC -Wno-unused-do-bind #-}

-- | Tests (and examples) on Lorentz' expressions.
module Test.Lorentz.Expr
  ( test_Basic
  ) where

import Lorentz

import Test.HUnit ((@?=))
import Test.Tasty (TestTree)
import Test.Tasty.HUnit (testCase)

test_Basic :: [TestTree]
test_Basic =
  [ testCase "Can compare two values" $
      push [mt|a|] |<| push [mt|b|] -$ ()
        @?= True

  , testCase "Unary operation" $
      unaryExpr neg take -$ (5 :: Natural)
        @?= (-5)

  , testCase "Unary operation operator" $
      neg $: neg $: take -$ (5 :: Natural)
        @?= 5

  , testCase "Can read from stack several times" $
      (take |*| push @Integer 5 |+| take) -$ (5 :: Integer, 10 :: Integer)
        @?= 35

  , testCase "Can access deep elements of the stack" $
      () &- do
        push @Integer 5; toNamed #a
        push @Natural 2; toNamed #b
        push [mt|x|]; toNamed #c
        push (); toNamed #d
        push @Natural 5 |*| dupL #a |+| push @Natural 8 |*| dupL #b
        dip $ do drop; drop; drop; drop; drop
      @?= 41
  ]