packages feed

symtegration-0.6.1: test/Symtegration/Integration/TrigonometricSpec.hs

-- |
-- Description: Tests basic integration of trigonometric functions.
-- Copyright: Copyright 2024 Yoo Chung
-- License: Apache-2.0
-- Maintainer: dev@chungyc.org
module Symtegration.Integration.TrigonometricSpec (spec) where

import Data.Map qualified as Map
import Data.Text (Text)
import Symtegration.Integration.Properties
import Symtegration.Integration.Trigonometric
import Symtegration.Symbolic
import Symtegration.Symbolic.Arbitrary
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck

spec :: Spec
spec = parallel $ do
  modifyMaxSuccess (* 10) $
    prop "consistent with derivative of integral" $ \(Trig e) x ->
      antiderivativeProperty integrate (Map.singleton var x) e x

  prop "ignores constant symbols" $ \(Trig e) ->
    forAll (arbitrarySymbol `suchThat` (/= Symbol var)) $ \c ->
      integrate var (substitute e (\x -> if x == var then Just c else Nothing)) `shouldBe` Nothing

newtype Trig = Trig Expression deriving (Eq, Show)

instance Arbitrary Trig where
  arbitrary = Trig <$> elements [f (Symbol var) | f <- candidates]
    where
      candidates =
        [ Sin',
          Cos',
          Tan',
          Asin',
          Acos',
          Atan',
          Sinh',
          Cosh',
          Tanh',
          Asinh',
          Acosh',
          Atanh'
        ]

var :: Text
var = "x"