import Datatypes
|
|
import VM
|
|
|
|
import Data.Hashable (hash, Hashable(..))
|
|
import Data.Set (Set)
|
|
import qualified Data.Set as Set
|
|
import Test.QuickCheck
|
|
|
|
test :: (Cell -> Cell) -> [Bool]
|
|
test f = [f (0,3) == (2,5), f (1,3) == (3, 6), f (2,3) == (3,7), f (3, 3) == (4,8), f (2, 4) == (2,7)]
|
|
|
|
test2 :: (Cell -> Cell) -> [Bool]
|
|
test2 f = [f (2,5) == (3,6), f (3,6) == (2, 7), f (2,7) == (1,7), f (1, 7) == (1,6), f (1, 6) == (1,5), f (1, 5) == (2, 5)]
|
|
|
|
deepCheck p = quickCheckWith (stdArgs { maxSuccess = 10000 }) p
|
|
|
|
testTutto = do
|
|
deepCheck (\pivot cell -> let r2 = rotateCell pivot in (r2 . r2 . r2 . r2 . r2 . r2) cell == cell)
|
|
deepCheck (\pivot cell -> cell == counterRotateCell pivot (rotateCell pivot cell))
|
|
deepCheck (\pivot cell -> cell == counterRotateCell2 pivot (rotateCell pivot cell))
|
|
|
|
|
|
checkForNothing::[Maybe(Cell, Fallimento)] -> Maybe(Cell, Fallimento)
|
|
checkForNothing (Nothing:xs) = checkForNothing xs
|
|
checkForNothing ((Just v):xs) = Just v
|
|
checkForNothing [] = Nothing
|
|
|
|
testTutteRotazioni = checkForNothing [
|
|
testDoppieRotazioni (2,3) [(2,0), (4,1), (5,4), (3,6), (0,5), (0,2), (2,0)],
|
|
testDoppieRotazioni (2,4) [(2,1), (4,3), (4,6), (1,7), (-1,5), (0,2), (2,1)],
|
|
testDoppieRotazioni (1,5) [(1,3), (3,4), (3,6), (1,7), (0,6), (0,4), (1,3)]
|
|
]
|
|
|
|
testCentering = deepCheck (\up um um1 -> let b = Board 5 10 (Set.fromList [])
|
|
u = Unit (Set.fromList (um1:um)) up
|
|
c = centerUnit u b
|
|
bw = 5
|
|
xCoords = Set.map (\(x, y) -> x) (unitMembers c)
|
|
yCoords = Set.map (\(x, y) -> y) (unitMembers c)
|
|
unitLeft = Set.findMin xCoords
|
|
unitRight = Set.findMax xCoords
|
|
unitTop = Set.findMin yCoords
|
|
deltaLeft = unitLeft
|
|
deltaRight = bw - unitRight - 1
|
|
in (deltaLeft == deltaRight || (deltaRight - deltaLeft) == 1) && unitTop == 0)
|
|
|
|
testGame = let board = Board 5 10 (Set.fromList [])
|
|
unit = Unit (Set.fromList [(2, 8)]) (2, 8)
|
|
game = Game board [unit] (Set.fromList [hash unit])
|
|
in game
|
|
|
|
data Fallimento = Rotazione | ControRotazione deriving Show
|
|
|
|
testDoppieRotazioni :: Cell -> [Cell] -> Maybe (Cell, Fallimento)
|
|
testDoppieRotazioni pivot cells =
|
|
case testRotazioni pivot cells of
|
|
Just v -> Just (v, Rotazione)
|
|
Nothing -> case testControRotazioni pivot (reverse cells) of
|
|
Just w -> Just (w, ControRotazione)
|
|
Nothing -> Nothing
|
|
|
|
-- restituisce eventualmente il primo valore per cui fallisce
|
|
testRotazioni :: Cell -> [Cell] -> Maybe Cell
|
|
testRotazioni _ [] = Nothing
|
|
testRotazioni _ [x] = Nothing
|
|
testRotazioni pivot (x:y:xs) = if rotateCell pivot x == y
|
|
then testRotazioni pivot (y:xs)
|
|
else Just x
|
|
|
|
-- restituisce eventualmente il primo valore per cui fallisce
|
|
testControRotazioni :: Cell -> [Cell] -> Maybe Cell
|
|
testControRotazioni _ [] = Nothing
|
|
testControRotazioni _ [x] = Nothing
|
|
testControRotazioni pivot (x:y:xs) = if counterRotateCell pivot x == y
|
|
then testControRotazioni pivot (y:xs)
|
|
else Just x
|