module MatchStringsTest

/*	Test module MatchStrings
	Voor werken met Gast: 
		(*) gebruik Environment 'Gast'
		(*) zet Project Options op 'Basic Values Only'
*/

import StdEnv
import MatchStrings
import gast

Start
					= testn 1000
						(\s t -> 
							eigenschap_waar_voor_gelijke_argumenten is_gelijk     s   /\
							eigenschap_onwaar_voor_groter_argument  is_gelijk     s   /\
							eigenschap_onwaar_voor_groter_argument  is_deelstring s   /\
							eigenschap_waar_voor_gelijke_argumenten is_deelstring s   /\
							eigenschap_waar_voor_gelijk_begin       is_deelstring s t /\
							eigenschap_waar_voor_gelijk_midden      is_deelstring s t /\
							eigenschap_waar_voor_gelijk_eind        is_deelstring s t /\
							eigenschap_onwaar_voor_groter_argument  is_deel       s   /\
							eigenschap_waar_voor_gelijke_argumenten is_deel       s   /\
							eigenschap_waar_voor_gelijk_begin       is_deel       s t /\
							eigenschap_waar_voor_gelijk_midden      is_deel       s t /\
							eigenschap_waar_voor_gelijk_eind        is_deel       s t /\
							eigenschap_waar_voor_uitbreiding        is_deel       s t /\
							kleenes_matcht_altijd                                 s   /\
							dots_matcht_zelfde_lengte                             s   /\
							True
						)

eigenschap_onwaar_voor_groter_argument :: (String String -> Bool) String -> Property
eigenschap_onwaar_voor_groter_argument f a
					= name "eigenschap_onwaar_voor_groter_argument" (not (f (a +++ ".") a))

eigenschap_waar_voor_gelijke_argumenten :: (String String -> Bool) String -> Property
eigenschap_waar_voor_gelijke_argumenten f a
					= name "eigenschap_waar_voor_gelijke_argumenten" (f a a)

eigenschap_waar_voor_gelijk_begin :: (String String -> Bool) String String -> Property
eigenschap_waar_voor_gelijk_begin f a b
					= name "eigenschap_waar_voor_gelijk_begin" (f a (a +++ b))

eigenschap_waar_voor_gelijk_midden :: (String String -> Bool) String String -> Property
eigenschap_waar_voor_gelijk_midden f a b
					= name "eigenschap_waar_voor_gelijk_midden" (f a (b +++ a +++ b))

eigenschap_waar_voor_gelijk_eind :: (String String -> Bool) String String -> Property
eigenschap_waar_voor_gelijk_eind f a b
					= name "eigenschap_waar_voor_gelijk_eind" (f a (b +++ a))

eigenschap_waar_voor_uitbreiding :: (String String -> Bool) String String -> Property
eigenschap_waar_voor_uitbreiding f a extra
					= name "eigenschap_waar_voor_uitbreiding" 
					       ((extra <> "") ==> f a (breid_string_uit extra a))

breid_string_uit :: String String -> String
breid_string_uit extra string
					= toString (flatten [[c:cs] \\ c <-: string])
where
	cs				= fromString extra

kleenes_matcht_altijd :: String -> Property
kleenes_matcht_altijd s
					= name "kleenes_matcht_altijd"
					       (ForEach [{# '*' \\ _ <- [1..n]} \\ n <- [1..10]] (flip is_match s))

dots_matcht_zelfde_lengte :: String -> Property
dots_matcht_zelfde_lengte s
					= name "dots_matcht_zelfde_lengte"
					       (is_match dots s
					           &&
					        not (is_match ("."+++dots) s)
					           &&
					        not (is_match dots (s+++"."))
					       )
where
	dots			= {# '.' \\ _ <-: s}