packages feed

noether-0.0.1: test-suite/Main.hs

import           Hedgehog
import qualified Hedgehog.Gen   as Gen
import qualified Hedgehog.Range as Range

-- import           Algebra
-- import           EllipticCurve
import           Lemmata        hiding (negate, one, zero, (*), (+), (-), (/))

import Noether.Test.Algebra

main :: IO ()
main = tests

-- genInt :: (Monad m, Num a) => Gen m a
-- genInt = map fromIntegral $ Gen.integral (Range.linearFrom 0 (-100) 100)

-- genIntNonzero :: (Monad m, Eq a, Num a) => Gen m a
-- genIntNonzero = Gen.filter (/=0) genInt

-- genRational :: (Monad m) => Gen m Rational
-- genRational = (/) <$> genInt <*> genIntNonzero

-- genNonzero :: (Monad m) => Gen m Rational
-- genNonzero = (/) <$> genIntNonzero <*> genIntNonzero

-- testNonzero :: (Monad m) => Test m Rational
-- testNonzero = forAll genNonzero

-- genP1 :: Monad m => Gen m (P1 Rational)
-- genP1 = Gen.filter nonsingular $ P1 <$> genRational <*> genRational
--   where
--     nonsingular (P1 a b) = a /= 0 && b /= 0

-- testP1 :: Monad m => Test m (P1 Rational)
-- testP1 = forAll genP1

-- scale :: Rg r => r -> P1 r -> P1 r
-- scale lambda (P1 a b) = P1 (lambda * a) (lambda * b)

-- genP2 :: Monad m => Gen m (P2 Rational)
-- genP2 = Gen.filter nonsingular $ P2 <$> genRational <*> genRational <*> genRational
--   where
--     nonsingular (P2 a b c) = a /= 0 || b /= 0 || c /= 0

-- testP2 :: Monad m => Test m (P2 Rational)
-- testP2 = forAll genP2

-- genEC :: Monad m => WM Rational -> Gen m (P2 Rational)
-- genEC wm =
--   Gen.filter (\p -> nonsingular p && onCurve wm p) $
--   P2 <$> genRational <*> genRational <*> genRational
--   where
--     nonsingular (P2 a b c) = (a /= 0 && c /= 0) || (a == 0 && c == 0 && b /= 0)

-- testEC :: Monad m => WM Rational -> Test m (P2 Rational)
-- testEC wm = forAll (genEC wm)

-- -- genCurvePt
-- --   :: (Typeable s, Monad m)
-- --   => Gen m (CurvePt Rational s)
-- -- genCurvePt = pt <$> genNonzero <*> genNonzero <*> genNonzero

-- -- testCurvePt
-- --   :: (Typeable s, Monad m)
-- --   => Test m (CurvePt Rational s)
-- -- testCurvePt = forAll genCurvePt

-- genCurve :: Monad m => Gen m (WM Rational)
-- genCurve = Gen.filter ((/= 0) . discriminant) (WM <$> genNonzero <*> genNonzero)

-- testCurve :: Monad m => Test m (WM Rational)
-- testCurve = forAll genCurve

-- prop_rp1_eq_refl :: Property
-- prop_rp1_eq_refl =
--   property $ do
--     a <- testP1
--     a === a

-- prop_rp1_eq_1 :: Property
-- prop_rp1_eq_1 =
--   property $ do
--     p <- testP1
--     lambda <- testNonzero
--     p === scale lambda p

-- prop_rp1_eq_2 :: Property
-- prop_rp1_eq_2 =
--   property $ do
--     a <- testNonzero
--     b <- testNonzero
--     P1 a 0 === P1 b 0

-- prop_rp1_eq_3 :: Property
-- prop_rp1_eq_3 =
--   property $ do
--     a <- testNonzero
--     b <- testNonzero
--     P1 0 a === P1 0 b

-- prop_rp1_eq_4 :: Property
-- prop_rp1_eq_4 =
--   property $ do
--     a <- testNonzero
--     b <- testNonzero
--     c <- testNonzero
--     assert $ P1 a c /= P1 b 0

-- prop_rp2_eq_1 :: Property
-- prop_rp2_eq_1 =
--   property $ do
--     a <- testNonzero
--     b <- testNonzero
--     lambda <- testNonzero
--     P2 a b 0 === P2 (lambda * a) (lambda * b) 0

-- prop_rp2_eq_2 :: Property
-- prop_rp2_eq_2 =
--   property $ do
--     a <- testNonzero
--     b <- testNonzero
--     lambda <- testNonzero
--     P2 0 a b === P2 0 (lambda * a) (lambda * b)

-- prop_rp2_eq_3 :: Property
-- prop_rp2_eq_3 =
--   property $ do
--     a <- testNonzero
--     b <- testNonzero
--     lambda <- testNonzero
--     P2 a 0 b === P2 (lambda * a) 0 (lambda * b)

-- ellipticCurveProperty :: Test IO () -> Property
-- ellipticCurveProperty = withTests 20 . withDiscards 10000 . property

-- prop_ec_plus_id_left :: Property
-- prop_ec_plus_id_left =
--   ellipticCurveProperty $ do
--     k <- testCurve
--     a' <- testEC k
--     let a, z :: CurvePt Rational s
--         a = liftEC a'
--         z = liftEC inf
--         lhs = computeOver k $ a + z
--         rhs = computeOver k a
--     lhs === rhs

-- prop_ec_plus_id_right :: Property
-- prop_ec_plus_id_right =
--   ellipticCurveProperty $ do
--     k <- testCurve
--     a' <- testEC k
--     let a, z :: CurvePt Rational s
--         a = liftEC a'
--         z = liftEC inf
--         lhs = computeOver k $ z + a
--         rhs = computeOver k a
--     lhs === rhs

-- prop_ec_plus_inverses :: Property
-- prop_ec_plus_inverses =
--   ellipticCurveProperty $ do
--     k <- testCurve
--     p <- testEC k
--     let a, z :: CurvePt Rational s
--         a = liftEC p
--         z = liftEC inf
--         lhs = computeOver k $ a + (negate a)
--         rhs = computeOver k z
--     lhs === rhs

-- prop_ec_plus_sym :: Property
-- prop_ec_plus_sym =
--   ellipticCurveProperty $ do
--     k <- testCurve
--     a' <- testEC k
--     b' <- testEC k
--     let a, b :: CurvePt Rational s
--         a = liftEC a'
--         b = liftEC b'
--         lhs = computeOver k $ a + b
--         rhs = computeOver k $ b + a
--     lhs === rhs

-- prop_ec_plus_regression_1 :: Property
-- prop_ec_plus_regression_1 =
--   ellipticCurveProperty $ do
--     k <- testCurve
--     a' <- testEC k
--     b' <- testEC k
--     let a, b :: CurvePt Rational s
--         a = liftEC a'
--         b = liftEC b'
--         lhs = computeOver k $ a + (b - a)
--         rhs = computeOver k $ (a + b) - a
--     lhs === rhs

-- prop_ec_plus_assoc :: Property
-- prop_ec_plus_assoc =
--   ellipticCurveProperty $ do
--     k <- testCurve
--     a' <- testEC k
--     b' <- testEC k
--     c' <- testEC k
--     let a, b, c :: CurvePt Rational s
--         a = liftEC a'
--         b = liftEC b'
--         c = liftEC c'
--         lhs = computeOver k $ a + (b + c)
--         rhs = computeOver k $ (a + b) + c
--     lhs === rhs

-- tests :: IO ()
-- tests = do
--   putText "\n -> Projective spaces\n"

--   checkParallel' $
--     Group
--       "Real projective space : order 2 : equality"
--       [ ("[x : y] == [ x :  y]", prop_rp1_eq_refl)
--       , ("[x : y] == [ax : ay]", prop_rp1_eq_1)
--       , ("[a : 0] == [ b :  0]", prop_rp1_eq_2)
--       , ("[0 : a] == [ 0 :  b]", prop_rp1_eq_3)
--       , ("[a : b] /= [ c :  0]", prop_rp1_eq_4)
--       ]
--   checkParallel' $
--     Group
--       "Real projective space : order 3 : equality"
--       [ ("[x : y : 0] == [ax : ay :  0]", prop_rp2_eq_1)
--       , ("[0 : y : z] == [ 0 : ay : az]", prop_rp2_eq_2)
--       , ("[x : 0 : z] == [ax :  0 : az]", prop_rp2_eq_3)
--       ]

--   putText "\n -> Elliptic curves\n"

--   checkParallel' $
--     Group
--       "Elliptic curves : group law : axioms"
--       [ ("P + 0 = P", prop_ec_plus_id_right)
--       , ("0 + P = P", prop_ec_plus_id_left)
--       , ("P + (-P)    =  0         ", prop_ec_plus_inverses)
--       , ("P +  Q      =  Q + P     ", prop_ec_plus_sym)
--       , ("P + (Q + R) = (P + Q) + R", prop_ec_plus_assoc)
--       ]
--   checkParallel' $
--     Group
--       "Elliptic curves : group law : regression tests"
--       [("(P + Q) - P = P + (Q - P)", prop_ec_plus_regression_1)]

--   where
--     checkParallel' = void . checkParallel

-- -- Tasty makes it easy to test your code. It is a test framework that can
-- -- combine many different types of tests into one suite. See its website for
-- -- help: <http://documentup.com/feuerbach/tasty>.
-- import qualified Test.Tasty
-- -- Hspec is one of the providers for Tasty. It provides a nice syntax for
-- -- writing tests. Its website has more info: <https://hspec.github.io>.
-- import Test.Tasty.Hspec

-- main :: IO ()
-- main = do
--     test <- testSpec "noether" spec
--     Test.Tasty.defaultMain test

-- spec :: Spec
-- spec = parallel $ do
--     it "is trivially true" $ do
--         True `shouldBe` True