packages feed

katydid-0.3.0.0: test/DeriveSpec.hs

{-# LANGUAGE FlexibleInstances #-}

-- | 
-- This module DeriveSpec tests the Derive module.
module DeriveSpec (
    tests
) where

import qualified Test.Tasty as T
import qualified Test.Tasty.HUnit as HUnit

import Data.Tree
import qualified Derive
import qualified Parser
import qualified Smart
import qualified Parsers

import Data.List.Index (imap)

instance Parsers.Tree (Tree Parsers.Label) where
    getLabel (Node l _) = l
    getChildren (Node _ cs) = cs

tests = T.testGroup "Derive" [
    T.testGroup "derive" [
        HUnit.testCase "two ors" $
            either HUnit.assertFailure (\(want,got) -> HUnit.assertEqual "(want,got)" want got) $ do {
                input <- Parser.parseGrammar "(== 1 | !(== 2))" >>= Smart.compile;
                want <- Parser.parseGrammar "*" >>= Smart.compile;
                got <- Derive.derive input [Node (Parsers.Int 1) []];
                return (Smart.lookupMain want, got)
            }
        , HUnit.testCase "two interleaves" $
            either HUnit.assertFailure (\(want,got) -> HUnit.assertEqual "(want,got)" want got) $ do {
                input <- Parser.parseGrammar "{== 1 ; !(== 2)}" >>= Smart.compile;
                want <- Parser.parseGrammar "({<empty>;!(==2)}|{==1;*})" >>= Smart.compile;
                got <- Derive.derive input [Node (Parsers.Int 1) []];
                return (Smart.lookupMain want, got)
            }
    ]
    , T.testGroup "removeOneForEach" [
        HUnit.testCase "[1,2]" $
            HUnit.assertEqual "1,2" [[2],[1]] $ Derive.removeOneForEach [1,2]
        , HUnit.testCase "[1,2,3]" $
            HUnit.assertEqual "1,2,3" [[2,3],[1,3],[1,2]] $ Derive.removeOneForEach [1,2,3]
        , HUnit.testCase "[1]" $
            HUnit.assertEqual "1" [[]] $ Derive.removeOneForEach [1]
    ]]