packages feed

dumb-cas-0.2.0.0: test/tasty/test.hs

-- |
-- Module      : Main
-- Copyright   : (c) Justus SagemΓΌller 2017
-- License     : GPL v3
-- 
-- Maintainer  : (@) sagemueller $ geo.uni-koeln.de
-- Stability   : experimental
-- Portability : portable
-- 
{-# LANGUAGE FlexibleContexts        #-}
{-# LANGUAGE ConstraintKinds         #-}
{-# LANGUAGE TypeFamilies            #-}
{-# LANGUAGE LambdaCase              #-}
{-# LANGUAGE FunctionalDependencies  #-}
{-# LANGUAGE FlexibleInstances       #-}
{-# LANGUAGE CPP                     #-}

module Main where

import CAS.Dumb

import Test.Tasty
import Test.Tasty.HUnit



main = defaultMain tests

type Expr = Expression String


tests :: TestTree
tests = testGroup "Tests"
  [ testGroup "Explicit transformations"
     [ testCase "π‘Ž + 𝑏 * 𝑐  &~:  γ„–+γ„ˆ :=: γ„ˆ+γ„–" $
      (π‘Ž + 𝑏 * 𝑐 &~: γ„–+γ„ˆ :=: γ„ˆ+γ„–) %@?= (𝑏 * 𝑐 + π‘Ž :: Expr)
     , testCase "(π‘Ž+𝑏) * 𝑐  &~:  γ„–+γ„ˆ :=: γ„ˆ+γ„–" $
      ((π‘Ž+𝑏) * 𝑐 &~: γ„–+γ„ˆ :=: γ„ˆ+γ„–) %@?= ((𝑏+π‘Ž) * 𝑐 :: Expr)
     , testCase "π‘Ž*𝑏 - 𝑐*𝑑  &~:  γ„–*γ„ˆ :=: γ„ˆ*γ„–" $
      (π‘Ž*𝑏 - 𝑐*𝑑 &~: γ„–*γ„ˆ :=: γ„ˆ*γ„–) %@?= (𝑏*π‘Ž - 𝑑*𝑐 :: Expr)
     , testCase "π‘Ž*𝑏 - 𝑐*𝑑  &~?  γ„–*γ„ˆ :=: γ„ˆ*γ„–" $
      (π‘Ž*𝑏 - 𝑐*𝑑 &~? γ„–*γ„ˆ :=: γ„ˆ*γ„–) @?= [𝑏*π‘Ž - 𝑐*𝑑, π‘Ž*𝑏 - 𝑑*𝑐 :: Expr]
     , testCase "π‘Ž + 𝑏 + 𝑐 + 𝑑  &~:  γ„œ+γ„‘ :=: γ„‘+γ„œ" $
      (π‘Ž + 𝑏 + 𝑐 + 𝑑 &~: γ„œ+γ„‘ :=: γ„‘+γ„œ) %@?= (𝑏 + π‘Ž + 𝑑 + 𝑐 :: Expr)
     , testCase "π‘Ž + 𝑏 + 𝑐 + 𝑑  &~:  𝑏+𝑐 :=: 𝑐+𝑏" $
      (π‘Ž + 𝑏 + 𝑐 + 𝑑 &~: 𝑏+𝑐 :=: 𝑐+𝑏) %@?= (π‘Ž + 𝑐 + 𝑏 + 𝑑 :: Expr)
     , testCase "π‘Ž + 𝑏 + 𝑐 + 𝑑  &~?  γ„œ+γ„‘ :=: γ„‘+γ„œ" $
      (π‘Ž + 𝑏 + 𝑐 + 𝑑 &~? γ„œ+γ„‘ :=: γ„‘+γ„œ) @?= [ 𝑏 + π‘Ž + 𝑐 + 𝑑
                                              , π‘Ž + 𝑐 + 𝑏 + 𝑑
                                              , π‘Ž + 𝑏 + 𝑑 + 𝑐 :: Expr]
     , testCase "π‘Ž + 𝑐 + 𝑏  &~?  π‘Ž+𝑐 :=: ΞΎ" $
      (π‘Ž + 𝑐 + 𝑏 &~? π‘Ž+𝑐 :=: ΞΎ ) @?= [ ΞΎ + 𝑏 :: Expr]
     , testCase "π‘Ž + 𝑏 + 𝑐  &~?  𝑏+𝑐 :=: 𝑐+𝑏  &~? π‘Ž+𝑐 :=: ΞΎ" $
      ((π‘Ž + 𝑏 + 𝑐  &~? 𝑏+𝑐:=:𝑐+𝑏) >>= (&~? π‘Ž+𝑐:=:ΞΎ) )
               @?= [ ΞΎ+𝑏 :: Expr]
     , testCase "π‘Ž*π‘₯ + 𝑏*π‘₯ + 𝑐  &~: ㄏ*γ„˜+ㄐ*γ„˜ :=: (ㄏ+ㄐ)*γ„˜" $
      (π‘Ž*π‘₯ + 𝑏*π‘₯ + 𝑐 &~: ㄏ*γ„˜+ㄐ*γ„˜ :=: (ㄏ+ㄐ)*γ„˜) %@?= ((π‘Ž+𝑏)*π‘₯ + 𝑐 :: Expr)
     , testCase "(π‘Ž+𝑏)*π‘₯ + 𝑐  &~: (ㄏ+ㄐ)*γ„˜ :=: ㄏ*γ„˜+ㄐ*γ„˜" $
      ((π‘Ž+𝑏)*π‘₯ + 𝑐 &~: (ㄏ+ㄐ)*γ„˜ :=: ㄏ*γ„˜+ㄐ*γ„˜) %@?= (π‘Ž*π‘₯ + 𝑏*π‘₯ + 𝑐 :: Expr)
     , testCase "π‘Ž*𝑏*𝑐*𝑑 &~: π‘Ž*𝑏 :=: 𝑏*π‘Ž" $
      (π‘Ž*𝑏*𝑐*𝑑  &~: π‘Ž*𝑏 :=: 𝑏*π‘Ž) %@?= (𝑏*π‘Ž*𝑐*𝑑 :: Expr)
     , testCase "π‘Ž*𝑏*𝑐*𝑑 &~: 𝑏*𝑐 :=: 𝑐*𝑏" $
      (π‘Ž*𝑏*𝑐*𝑑  &~: 𝑏*𝑐 :=: 𝑐*𝑏) %@?= (π‘Ž*𝑐*𝑏*𝑑 :: Expr)
     , testCase "π‘Ž*𝑏*𝑐*𝑑 &~: 𝑐*𝑑 :=: 𝑑*𝑐" $
      (π‘Ž*𝑏*𝑐*𝑑  &~: 𝑐*𝑑 :=: 𝑑*𝑐) %@?= (π‘Ž*𝑏*𝑑*𝑐 :: Expr)
     , testCase "π‘Ž + 𝑏 - 𝑐 &~: 𝑏-𝑐 :=: (-𝑐)+𝑏" $
      (π‘Ž + 𝑏 - 𝑐 &~: 𝑏-𝑐 :=: (-𝑐)+𝑏) %@?= (π‘Ž + (-𝑐) + 𝑏 :: Expr)
     , testCase "Rename local symbols" $
      (map succ%$> π‘Ž+𝑝) * π‘₯  %@?=  ((𝑏+π‘ž) * π‘₯ :: Expr)
     ]
  , testGroup "Show instance"
     [ testCase "π‘Ž+𝑏+𝑐" $
      π‘Ž+𝑏+𝑐 %@?= "π‘Ž+𝑏+𝑐"
     , testCase "π‘Ž-𝑏+𝑐" $
      π‘Ž-𝑏+𝑐 %@?= "π‘Ž-𝑏+𝑐"
     , testCase "π‘Ž+(𝑏+𝑐)" $
      π‘Ž+(𝑏+𝑐) %@?= "π‘Ž+(𝑏+𝑐)"
     , testCase "π‘Ž+𝑏*𝑐" $
      π‘Ž+𝑏*𝑐 %@?= "π‘Ž+𝑏*𝑐"
     , testCase "3*𝑧-1" $
      3*𝑧-1 %@?= "3*𝑧-1"
     , testCase "(π‘Ž+𝑏)*𝑐" $
      (π‘Ž+𝑏)*𝑐 %@?= "(π‘Ž+𝑏)*𝑐"
     , testCase "abs (π‘Ž+𝑏)" $
      abs (π‘Ž+𝑏) %@?= "abs (π‘Ž+𝑏)"
     , testCase "abs 3" $
      abs 3 %@?= "abs 3"
     , testCase "π‘Ž + -3" $
      π‘Ž+(-3) %@?= "π‘Ž-3"
     , testCase "π‘Ž / signum Ο€" $
      π‘Ž/signum Ο€ %@?= "π‘Ž/signum Ο€"
     , testCase "logBase 2 32 ** atan pi" $
      logBase 2 32 ** atan pi %@?= "2`logBase`32**atan pi"
     , testCase "37.84" $
      37.84 %@?= "37.84"
     , testCase "5e-23" $
      5e-23 %@?= "5e-23"
     , testCase "-5.3e7" $
      -5.3e8 %@?= " -5.3e8"
     ]
  ]

infix 1 %@?=
class ComparableExpressions e f | f -> e where
  (%@?=) :: HasCallStack => e -> f -> Assertion
  

instance ComparableExpressions Expr Expr where
  e %@?= f
   | e==f       = return ()
   | otherwise  = assertFailure
                   $ "Expected "++show f++" γ€Žstructure: "++showStructure f++"』,"
                     ++ "\nbut got " ++show e++" γ€Žstructure: "++showStructure e++"』,"

instance ComparableExpressions Expr String where
  e %@?= f
   | show e==f  = return ()
   | otherwise  = assertFailure $ "Expected \""++f++"\""
                     ++ "\nbut got \"" ++show e++"\" γ€Žstructure: "++showStructure e++"』,"