packages feed

grid-7.6.9: test/Math/Geometry/Grid/Hexagonal2QC.hs

------------------------------------------------------------------------
-- |
-- Module      :  Math.Geometry.Grid.Hexagonal2QC
-- Copyright   :  (c) Amy de Buitléir 2012-2014
-- License     :  BSD-style
-- Maintainer  :  amy@nualeargais.ie
-- Stability   :  experimental
-- Portability :  portable
--
-- QuickCheck tests.
--
------------------------------------------------------------------------
{-# LANGUAGE FlexibleContexts, ExistentialQuantification,
    TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Math.Geometry.Grid.Hexagonal2QC
  (
    test
  ) where

import Math.Geometry.Grid.HexagonalInternal2
import Math.Geometry.GridInternal 
import Math.Geometry.GridQC

import Prelude hiding (null)
import Test.Framework as TF (Test, testGroup)
import Test.QuickCheck 
  (Gen, Arbitrary, arbitrary, sized, elements, choose, Property, vectorOf)

instance Arbitrary HexDirection where
  arbitrary =
    elements [Northwest, North, Northeast, Southeast, South, Southwest]

--
-- Unbounded grids with hexagonal tiles
--

data UnboundedHexGridTD = 
  UnboundedHexGridTD [(Int,Int)] ((Int,Int),(Int,Int)) HexDirection
  deriving Show

instance TestData UnboundedHexGridTD where
  type BaseGrid UnboundedHexGridTD = UnboundedHexGrid
  grid _ = UnboundedHexGrid
  points (UnboundedHexGridTD ps _ _) = ps
  twoClosePoints (UnboundedHexGridTD _ qs _) = qs
  neighbourCountBounds _ = (6, 6)
  direction (UnboundedHexGridTD _ _ d) = d

sizedUnboundedHexGridTD :: Int -> Gen UnboundedHexGridTD
sizedUnboundedHexGridTD n = do
  k <- choose (0,n)
  ps <- vectorOf (k+2) arbitrary :: Gen [(Int,Int)]
  qs <- chooseClosePointsUnbounded
  d <- arbitrary
  return $ UnboundedHexGridTD ps qs d

instance Arbitrary UnboundedHexGridTD where
  arbitrary = sized sizedUnboundedHexGridTD

unboundedHexGridProperties :: [(String, UnboundedHexGridTD -> Property)]
unboundedHexGridProperties = gridProperties "UnboundedHexGrid"

unboundedHexGridTests :: [Test]
unboundedHexGridTests = makeTests unboundedHexGridProperties

--
-- Hegagonal grids with hexagonal tiles
--

data HexHexGridTD = 
  HexHexGridTD HexHexGrid [(Int,Int)] ((Int,Int),(Int,Int)) HexDirection
  deriving Show

instance TestData HexHexGridTD where
  type BaseGrid HexHexGridTD = HexHexGrid
  grid (HexHexGridTD g _ _ _) = g
  points (HexHexGridTD _ ps _ _) = ps
  twoClosePoints (HexHexGridTD _ _ qs _) = qs
  neighbourCountBounds _ = (0, 6)
  direction (HexHexGridTD _ _ _ d) = d

instance TestDataF HexHexGridTD where
  maxDistance (HexHexGridTD g _ _ _) = 2*s - 2
    where s = size g
  expectedTileCount (HexHexGridTD g _ _ _) = 3*s*(s-1) + 1
    where s = size g

instance TestDataB HexHexGridTD where
  expectedBoundaryCount (HexHexGridTD g _ _ _) = (f . size) g
    where f 0 = 0
          f 1 = 1
          f s = 6*(s-1)

-- We want the number of tiles in a test grid to be O(n)
sizedHexHexGridTD :: Int -> Gen HexHexGridTD
sizedHexHexGridTD n = do
  let s = isqrt (n `div` 3)
  let g = hexHexGrid s
  ps <- chooseIndices g n
  qs <- chooseClosePoints g
  d <- arbitrary
  return $ HexHexGridTD g ps qs d

instance Arbitrary HexHexGridTD where
  arbitrary = sized sizedHexHexGridTD

hexHexGridProperties :: [(String, HexHexGridTD -> Property)]
hexHexGridProperties = gridProperties "HexHexGrid"
  ++ finiteGridProperties "HexHexGrid"
  ++ boundedGridProperties "HexHexGrid"
  ++ boundedGridProperties2 "HexHexGrid"

hexHexGridTests :: [Test]
hexHexGridTests = makeTests hexHexGridProperties

--
-- Rectangular hexagonal grids   
--

data RectHexGridTD = 
  RectHexGridTD RectHexGrid [(Int,Int)] ((Int,Int),(Int,Int)) HexDirection
  deriving Show

instance TestData RectHexGridTD where
  type BaseGrid RectHexGridTD = RectHexGrid
  grid (RectHexGridTD g _ _ _) = g
  points (RectHexGridTD _ ps _ _) = ps 
  twoClosePoints (RectHexGridTD _ _ qs _) = qs
  neighbourCountBounds _ = (0, 6)
  direction (RectHexGridTD _ _ _ d) = d

instance TestDataF RectHexGridTD where
  maxDistance (RectHexGridTD g _ _ _) = r+c-2
    where (r, c) = size g
  expectedTileCount (RectHexGridTD g _ _ _) = r*c
    where (r,c) = size g

instance TestDataB RectHexGridTD where
  expectedBoundaryCount (RectHexGridTD g _ _ _) = 
    (cartesianBoundaryCount . size) g

-- We want the number of tiles in a test grid to be O(n)
sizedRectHexGridTD :: Int -> Gen RectHexGridTD
sizedRectHexGridTD n = do
  r <- choose (0,n)
  let c0 = n `div` (r+1)
  let c = 2*(c0 `div` 2) -- force it to be even
  let g = rectHexGrid r c
  ps <- chooseIndices g n
  qs <- chooseClosePoints g
  d <- arbitrary
  return $ RectHexGridTD g ps qs d

instance Arbitrary RectHexGridTD where
  arbitrary = sized sizedRectHexGridTD

rectHexGridProperties :: [(String, RectHexGridTD -> Property)]
rectHexGridProperties = gridProperties "RectHexGrid"
  ++ finiteGridProperties "RectHexGrid"
  ++ boundedGridProperties "RectHexGrid"
  ++ boundedGridProperties2 "RectHexGrid"

rectHexGridTests :: [Test]
rectHexGridTests = makeTests rectHexGridProperties

test :: Test
test = testGroup "Math.Geometry.Grid.Hexagonal2QC"
  (unboundedHexGridTests ++ hexHexGridTests ++ rectHexGridTests)