#!/usr/bin/runhugs +l module Main where import Test.HUnit import Control.Monad import System import AufgabeFFP7 import Test.QuickCheck import System.IO.Unsafe cases1 = TestLabel "buffer" $ TestList [ TestCase $ assertEqual "empty" (0, "") (empty), TestCase $ assertEqual "insert1" (1, "a") (insert 'a' empty), TestCase $ assertEqual "insert2" (2, "ab") (insert 'b' (insert 'a' empty)), TestCase $ assertEqual "insert3" (1, "ba") (insert 'b' (-100, "a")), TestCase $ assertEqual "insert4" (2, "ab") (insert 'b' (100, "a")), TestCase $ assertEqual "delete1" (0, "bc") (delete (0, "bc")), TestCase $ assertEqual "delete2" (1, "ac") (delete (2, "abc")), TestCase $ assertEqual "delete3" (0, "abc") (delete (-100, "abc")), TestCase $ assertEqual "delete4" (3, "abc") (delete (100, "abc")), TestCase $ assertEqual "left1" (0, "abc") (left (0, "abc")), TestCase $ assertEqual "left2" (0, "abc") (left (-100, "abc")), TestCase $ assertEqual "left3" (1, "abc") (left (2, "abc")), TestCase $ assertEqual "left4" (3, "abc") (left (4, "abc")), TestCase $ assertEqual "left5" (3, "abc") (left (100, "abc")), TestCase $ assertEqual "right1" (1, "abc") (right (0, "abc")), TestCase $ assertEqual "right2" (0, "abc") (right (-100, "abc")), TestCase $ assertEqual "right3" (2, "abc") (right (1, "abc")), TestCase $ assertEqual "right4" (3, "abc") (right (3, "abc")), TestCase $ assertEqual "right5" (3, "abc") (right (100, "abc")), TestCase $ assertEqual "atLeft1" (True) (atLeft (0, "abc")), TestCase $ assertEqual "atLeft2" (False) (atLeft (1, "abc")), TestCase $ assertEqual "atLeft3" (True) (atLeft (-100, "abc")), TestCase $ assertEqual "atRight1" (True) (atRight (3, "abc")), TestCase $ assertEqual "atRight2" (False) (atRight (1, "abc")), TestCase $ assertEqual "atRight3" (True) (atRight (100, "abc")) ] -------------------------------------------------------------------------------- cases2 = TestLabel "bufferI" $ TestList [ TestCase $ assertEqual "emptyI" ("", "") (emptyI), TestCase $ assertEqual "insertI1" ("a", "") (insertI 'a' emptyI), TestCase $ assertEqual "insertI2" ("ba", "") (insertI 'b' (insertI 'a' emptyI)), TestCase $ assertEqual "insertI3" ("ba", "c") (insertI 'b' ("a", "c")), TestCase $ assertEqual "deleteI1" ("", "bc") (deleteI ("", "bc")), TestCase $ assertEqual "deleteI2" ("ba", "") (deleteI ("cba", "")), TestCase $ assertEqual "deleteI3" ("", "") (deleteI ("", "")), TestCase $ assertEqual "leftI1" ("", "abc") (leftI ("", "abc")), TestCase $ assertEqual "leftI2" ("a", "bc") (leftI ("ba", "c")), TestCase $ assertEqual "leftI3" ("ba", "c") (leftI ("cba", "")), TestCase $ assertEqual "rightI1" ("a", "bc") (rightI ("", "abc")), TestCase $ assertEqual "rightI2" ("ba", "c") (rightI ("a", "bc")), TestCase $ assertEqual "rightI3" ("cba", "") (rightI ("cba", "")), TestCase $ assertEqual "atLeftI1" (True) (atLeftI ("", "abc")), TestCase $ assertEqual "atLeftI2" (False) (atLeftI ("a", "bc")), TestCase $ assertEqual "atRightI1" (True) (atRightI ("cba", "")), TestCase $ assertEqual "atRightI2" (False) (atRightI ("a", "bc")) ] -------------------------------------------------------------------------------- cases3 = TestLabel "buffer/I_quickCheck" $ TestList [ TestCase $ assertEqual "empty" () (unsafePerformIO (quickCheck prop_empty)), TestCase $ assertEqual "insert" () (unsafePerformIO (quickCheck prop_insert)), TestCase $ assertEqual "delete" () (unsafePerformIO (quickCheck prop_delete)), TestCase $ assertEqual "left" () (unsafePerformIO (quickCheck prop_left)), TestCase $ assertEqual "right" () (unsafePerformIO (quickCheck prop_right)), TestCase $ assertEqual "atLeft" () (unsafePerformIO (quickCheck prop_atLeft)), TestCase $ assertEqual "atRight" () (unsafePerformIO (quickCheck prop_atRight)) ] -------------------------------------------------------------------------------- cases4 = TestLabel "ssfn/minfree" $ TestList [ TestCase $ assertEqual "ssfn1" (5) (ssfn [0,1,2,3,4,6,7,8,9]), TestCase $ assertEqual "minfree1" (5) (minfree [0,1,2,3,4,6,7,8,9]), TestCase $ assertEqual "ssfn2" (0) (ssfn [1,2,3,4,5,6,7,8,9]), TestCase $ assertEqual "minfree2" (0) (minfree [1,2,3,4,5,6,7,8,9]), TestCase $ assertEqual "ssfn/minfree" (ssfn (filter (/=499) [0..520])) (minfree (filter (/=499) [0..520])), TestCase $ assertEqual "quickCheck1" () (unsafePerformIO (quickCheck prop_ssfn_eq_minfree_a)), TestCase $ assertEqual "quickCheck2" () (unsafePerformIO (quickCheck prop_ssfn_eq_minfree_b)) ] -------------------------------------------------------------------------------- tests :: [Test] tests = [cases1, cases2, cases3, cases4] isSuccess :: Counts -> Bool isSuccess Counts{ cases = _, tried = _, errors = 0, failures = 0 } = True isSuccess Counts{ cases = _, tried = _, errors = _, failures = _ } = False runTest :: Test -> IO () runTest test = do result <- runTestTT test unless (isSuccess result) exitFailure main = do forM tests $ (\test -> runTest test)