packages feed

csg-0.1: tests/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

import Data.ByteString.Char8 as B
import Test.Tasty
import Test.Tasty.QuickCheck
import Test.Tasty.HUnit

import Data.CSG
import Data.CSG.Parser

tests :: [TestTree]
tests =
  [ testCase "Parsing cube.geo" $ do
      f <- B.readFile "examples/cube.geo"
      let box = cuboid (fromXYZ (-150, -150, -150)) (fromXYZ (150, 150, 150))
          rounded = sphere origin 200 `intersect` box
          cyl1 = cylinderFrustum
            (fromXYZ (-160, 0, 0)) (fromXYZ (160, 0, 0)) 100
          cyl2 = cylinderFrustum
            (fromXYZ (0, -160, 0)) (fromXYZ (0, 160, 0)) 100
          cyl3 = cylinderFrustum
            (fromXYZ (0, 0, -160)) (fromXYZ (0, 0, 160)) 100
          cross = cyl1 `unite` (cyl2 `unite` cyl3)
          cutout = complement cross
          top = rounded `intersect` cutout
      parseGeometry f @=? Right top
  , testProperty "CSG complement membership"
    (\(b :: Solid) (p :: Point) ->
       p `inside` b == not (p `inside` complement b))
  ]

main :: IO ()
main = defaultMain $ testGroup "Tests" tests