{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.QuickCheck.HGeometryInstances where
import Control.Lens
import Data.BinaryTree
import Data.Ext
import Data.Geometry hiding (vector)
import Data.Geometry.Box
import Data.PlanarGraph
import qualified Data.PlanarGraph as PlanarGraph
import Data.Geometry.SubLine
import Data.OrdSeq (OrdSeq, fromListByOrd)
import Data.Proxy
import qualified Data.LSeq as LSeq
import GHC.TypeLits
import Test.QuickCheck
instance (Arbitrary a, Ord a) => Arbitrary (OrdSeq a) where
arbitrary = fromListByOrd <$> arbitrary
instance Arbitrary a => Arbitrary (BinaryTree a) where
arbitrary = sized f
where f n | n <= 0 = pure Nil
| otherwise = do
l <- choose (0,n-1)
Internal <$> f l <*> arbitrary <*> f (n-l-1)
instance (Arbitrary a, Arbitrary v) => Arbitrary (BinLeafTree v a) where
arbitrary = sized f
where f n | n <= 0 = Leaf <$> arbitrary
| otherwise = do
l <- choose (0,n-1)
Node <$> f l <*> arbitrary <*> f (n-l-1)
instance (KnownNat n, Arbitrary a) => Arbitrary (LSeq.LSeq n a) where
arbitrary = (\s s' -> LSeq.promise . LSeq.fromList $ s <> s')
<$> vector (fromInteger . natVal $ (Proxy :: Proxy n))
<*> arbitrary
instance (Arbitrary r, Arity d) => Arbitrary (Vector d r) where
arbitrary = vectorFromListUnsafe <$> infiniteList
instance (Arbitrary r, Arity d) => Arbitrary (Point d r) where
arbitrary = Point <$> arbitrary
instance (Arbitrary r, Arity d, Num r, Eq r) => Arbitrary (Line d r) where
arbitrary = do p <- arbitrary
q <- suchThat arbitrary (/= p)
return $ lineThrough p q
instance (Arbitrary r, Arity d, Ord r) => Arbitrary (Box d () r) where
arbitrary = (\p (q :: Point d r) -> boundingBoxList' [p,q]) <$> arbitrary <*> arbitrary
instance Arbitrary r => Arbitrary (EndPoint r) where
arbitrary = frequency [ (1, Open <$> arbitrary)
, (9, Closed <$> arbitrary)
]
instance (Arbitrary r, Ord r) => Arbitrary (Range r) where
arbitrary = do
l <- arbitrary
r <- suchThat arbitrary (p l)
return $ Range l r
where
p (Open l) r = l < r^.unEndPoint
p (Closed l) r = l <= r^.unEndPoint
instance (Arbitrary c, Arbitrary e) => Arbitrary (c :+ e) where
arbitrary = (:+) <$> arbitrary <*> arbitrary
instance (Arbitrary r, Arbitrary p, Ord r, Ord p) => Arbitrary (Interval p r) where
arbitrary = GInterval <$> arbitrary
instance (Arbitrary r, Arbitrary p, Arbitrary s, Arity d, Ord r, Ord s, Ord p, Num r)
=> Arbitrary (SubLine d p s r) where
arbitrary = SubLine <$> arbitrary <*> arbitrary
instance (Arbitrary r, Arbitrary p, Arity d) => Arbitrary (LineSegment d p r) where
arbitrary = LineSegment <$> arbitrary <*> arbitrary
instance Arbitrary (Arc s) where
arbitrary = Arc <$> (arbitrary `suchThat` (>= 0))
instance Arbitrary Direction where
arbitrary = (\b -> if b then PlanarGraph.Positive else Negative) <$> arbitrary
instance Arbitrary (Dart s) where
arbitrary = Dart <$> arbitrary <*> arbitrary