packages feed

combinat-0.2.10.1: test/Tests/Partitions/Ribbon.hs

-- | Tests for ribbons (border strip skew partitions).
--

{-# LANGUAGE CPP, BangPatterns #-}
module Tests.Partitions.Ribbon where

--------------------------------------------------------------------------------

import Test.Framework
import Test.Framework.Providers.QuickCheck2
import Test.QuickCheck

import Tests.Common
import Tests.Partitions.Integer ( Part(..) , fromPart20 , fromPart30 )     -- Arbitrary instances

import Math.Combinat.Partitions.Integer
import Math.Combinat.Partitions.Skew
import Math.Combinat.Partitions.Skew.Ribbon

import Data.List

import Math.Combinat.Classes

--------------------------------------------------------------------------------
-- * instances

data Inner = Inner Partition Int deriving (Eq,Show)

data Outer = Outer Partition Int deriving (Eq,Show)

instance Arbitrary Inner where
  arbitrary = do
    p <- arbitrary
    let (w,h) = (partitionWidth p, partitionHeight p)
        n = w+h-1
    d <- choose (1,n)
    return $ Inner p d

instance Arbitrary Outer where
  arbitrary = do
    pp <- arbitrary
    let p = fromPart30 pp    -- smaller partitions
    let (w,h) = (partitionWidth p, partitionHeight p)
        n = w+h+10   
    d <- choose (1,n)
    return $ Outer p d

--------------------------------------------------------------------------------
-- * test group

testgroup_Ribbon :: Test
testgroup_Ribbon = testGroup "Ribbons and Corners" 
  [ testGroup "Ribbons"  
      [ testProperty "all inner ribbons vs. naive"        prop_inner_all
      , testProperty "inner ribbons of length vs. naive"  prop_inner_length
      , testProperty "outer ribbons of length vs. naive"  prop_outer_length
      ]
  , testGroup "Corners"
      [ testProperty "inner corner boxes vs. naive" prop_innerCornerBoxes
      , testProperty "outer corner boxes vs. naive" prop_outerCornerBoxes 
      ]
  ]

--------------------------------------------------------------------------------
-- * ribbon properties

prop_inner_all :: Partition -> Bool
prop_inner_all p = sort (innerRibbons p) == sort (innerRibbonsNaive p)

prop_inner_length :: Inner -> Bool
prop_inner_length (Inner p n) = sort (innerRibbonsOfLength p n) == sort (innerRibbonsOfLengthNaive p n)

prop_outer_length :: Outer -> Bool
prop_outer_length (Outer p n) = sort (outerRibbonsOfLength p n) == sort (outerRibbonsOfLengthNaive p n)

--------------------------------------------------------------------------------
-- * corner properties

prop_innerCornerBoxes :: Partition -> Bool
prop_innerCornerBoxes p  =  (innerCornerBoxes p == innerCornerBoxesNaive p)

prop_outerCornerBoxes :: Partition -> Bool
prop_outerCornerBoxes p  =  (outerCornerBoxes p == outerCornerBoxesNaive p)

--------------------------------------------------------------------------------