module Main where import Approx import Data.Complex import Math.EllipticIntegrals import Test.Tasty (defaultMain, testGroup) import Test.Tasty.HUnit (assertEqual, testCase) i :: Complex Double i = 0.0 :+ 1.0 main :: IO () main = defaultMain $ testGroup "Tests" [ testCase "RF value 1" $ assertEqual "" (approx 12 (carlsonRF 1 2 0)) (approx 12 1.3110287771461), testCase "RF value 2" $ assertEqual "" (approx 12 (carlsonRF i (-i) 0)) (approx 12 1.8540746773014), testCase "RF value 3" $ assertEqual "" (approx 12 (carlsonRF 0.5 1 0)) (approx 12 1.8540746773014), testCase "RF value 4" $ assertEqual "" (approx 13 (carlsonRF (i-1) i 0)) (approx 13 (0.79612586584234 :+ (-1.2138566698365))), testCase "RF value 5" $ assertEqual "" (approx 13 (carlsonRF 2 3 4)) (approx 13 0.58408284167715), testCase "RF value 6" $ assertEqual "" (approx 12 (carlsonRF i (-i) 2)) (approx 12 1.0441445654064), testCase "RF value 7" $ assertEqual "" (approx 13 (carlsonRF (i-1) i (1-i))) (approx 13 (0.93912050218619 :+ (-0.53296252018635))), testCase "RC value 1" $ assertEqual "" (approx 14 (carlsonRC 0 0.25)) (approx 14 pi), testCase "RC value 2" $ assertEqual "" (approx 14 (carlsonRC 2.25 2)) (approx 14 (log 2)), testCase "RC value 3" $ assertEqual "" (approx 12 (carlsonRC 0 i)) (approx 12 ((1-i)*1.1107207345396)), testCase "RC value 4" $ assertEqual "" (approx 13 (carlsonRC (-i) i)) (approx 13 (1.2260849569072 :+ (-0.34471136988768))), testCase "RC value 5" $ assertEqual "" (approx 14 (carlsonRC 0.25 (-2))) (approx 14 ((log 2 :+ (-pi))/ 3)), testCase "RC x y = RF x y y" $ do let x = 5 :+ 6 y = 2 :+ (-9) assertEqual "" (approx 14 (carlsonRC x y)) (approx 14 (carlsonRF x y y)), testCase "RJ x y y p" $ do let x = 1 :+ 1 y = (-2) :+ 3 p = 0 :+ 4 assertEqual "" (approx 14 (carlsonRJ x y y p)) (approx 14 (3*(carlsonRC x y - carlsonRC x p) / (p-y))), testCase "RJ homogeneity" $ do let x = 1 :+ 1 y = (-2) :+ 3 z = -3 p = 0 :+ 4 kappa = 2 :+ 0 assertEqual "" (approx 14 (carlsonRJ x y z p / kappa / sqrt kappa)) (approx 14 (carlsonRJ (kappa*x) (kappa*y) (kappa*z) (kappa*p))), testCase "Complete elliptic integral K" $ do let m = 2 :+ (-3) assertEqual "" (approx 14 (ellipticF (pi/2) m)) (approx 14 (carlsonRF 0 (1-m) 1)), testCase "Complete ellipticE - RG" $ do let m = 2 :+ (-3) assertEqual "" (approx 14 (ellipticE (pi/2) m)) (approx 14 (2 * carlsonRG 0 (1-m) 1)), testCase "Complete ellipticE - RD" $ do let m = 2 :+ (-3) assertEqual "" (approx 14 (ellipticE (pi/2) m)) (approx 14 ((1-m) * (carlsonRD 0 (1-m) 1 + carlsonRD 0 1 (1-m)) / 3)), testCase "jacobiZeta m=1" $ do let z = (-1) :+ 8 assertEqual "" (approx 14 (jacobiZeta z 1)) (approx 14 (sin z)) ]