From c381eea3362cb02e40e12f3a35c179282a182249 Mon Sep 17 00:00:00 2001 From: manuel Date: Tue, 22 May 2012 12:30:30 +0200 Subject: implement missing quickcheck props + tests --- AufgabeFFP7.hs | 64 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 18 deletions(-) (limited to 'AufgabeFFP7.hs') diff --git a/AufgabeFFP7.hs b/AufgabeFFP7.hs index fc9d594..43e8014 100644 --- a/AufgabeFFP7.hs +++ b/AufgabeFFP7.hs @@ -2,7 +2,7 @@ module AufgabeFFP7 where import Data.Char -import Data.List hiding ((\\), insert) +import Data.List hiding ((\\), insert, delete) import Test.QuickCheck type Buffer = (Int, String) @@ -55,26 +55,29 @@ insertI :: Char -> BufferI -> BufferI insertI c (beforeC, afterC) = ([c] ++ beforeC, afterC) -- delete character before cursor ---TODO deleteI :: BufferI -> BufferI +deleteI :: BufferI -> BufferI +deleteI (beforeC, "") = (beforeC, "") +deleteI (beforeC, last:afterC) = (beforeC, afterC) -- move cursor left one character leftI :: BufferI -> BufferI -leftI ([], afterC) = ([], afterC) +leftI ("", afterC) = ("", afterC) leftI (last:beforeC, afterC) = (beforeC, [last] ++ afterC) -- move cursor right one character ---TODO rightI :: BufferI -> BufferI +rightI :: BufferI -> BufferI +rightI (beforeC, "") = (beforeC, "") +rightI (beforeC, last:afterC) = ([last] ++ beforeC, afterC) -- is cursor at left end? atLeftI :: BufferI -> Bool -atLeftI ([], _) = True -atLeftI (_, _) = False +atLeftI ("", _) = True +atLeftI (_, _) = False -- is cursor at right end? atRightI :: BufferI -> Bool -atRightI (_, []) = True -atRightI (_, _) = False - +atRightI (_, "") = True +atRightI (_, _) = False -------------------------------------------------------------------------------- @@ -88,25 +91,50 @@ retrieve (beforeC, afterC) = (length beforeC, (reverse beforeC) ++ afterC) bufEqual :: BufferI -> Buffer -> Bool bufEqual bi b = (retrieve bi) == b +(<==>) = bufEqual + -- generator for equal data genEqualBuf :: Gen(Buffer, BufferI) -genEqualBuf = do s <- arbitrary ; c <- choose (0, length s) ; return ( (c, s), revFst (splitAt c s) ) - where - revFst = \(a, b) -> (reverse a, b) +genEqualBuf = do + s <- arbitrary + c <- choose (0, length s) + return ((c, s), revFst (splitAt c s)) + where + revFst = \(a, b) -> (reverse a, b) instance Arbitrary Char where - arbitrary = elements $ ['a'..'z'] ++ ['A'..'Z'] + arbitrary = elements $ ['a'..'z'] ++ ['A'..'Z'] + +prop_empty :: Bool +prop_empty = emptyI <==> empty -- naive insert test, will exhaust -prop_insert :: BufferI -> Buffer -> Char -> Property -prop_insert bi b c = bufEqual bi b - ==> bufEqual (insertI c bi) (insert c b) +--prop_insert :: BufferI -> Buffer -> Char -> Property +--prop_insert bi b c = bi <==> b +-- ==> insertI c bi <==> insert c b + +prop_insert :: BufferI -> Char -> Bool +prop_insert bi c = insertI c bi <==> insert c (retrieve bi) -- use equal data generator prop_insert2 :: Char -> Property -prop_insert2 c = - forAll (genEqualBuf) $ \(b, bi) -> bufEqual (insertI c bi) (insert c b) +prop_insert2 c = forAll (genEqualBuf) $ \(b, bi) -> + insertI c bi <==> insert c b + +prop_delete :: BufferI -> Bool +prop_delete bi = deleteI bi <==> delete (retrieve bi) + +prop_left :: BufferI -> Bool +prop_left bi = leftI bi <==> left (retrieve bi) + +prop_right :: BufferI -> Bool +prop_right bi = rightI bi <==> right (retrieve bi) + +prop_atLeft :: BufferI -> Bool +prop_atLeft bi = atLeftI bi == atLeft (retrieve bi) +prop_atRight :: BufferI -> Bool +prop_atRight bi = atRightI bi == atRight (retrieve bi) -------------------------------------------------------------------------------- -- cgit v1.2.3