summaryrefslogtreecommitdiff
path: root/files/practicum/StdSortListTest.icl
blob: 411f7ca0ebb0d8f5275454078e546e68f7c45d3d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
module StdSortListTest

/*	Test module StdSortList
	Voor werken met Gast: 
		(*) gebruik Environment 'Gast'
		(*) zet Project Options op 'Basic Values Only' en '16M' Maximum Heap Size.
*/

import gast
import GenLexOrd
import StdSortList

Start = testn 10000 
		(\n` n2` m -> let	n  = lst2slst (cast [A,B,C] n` )
							n2 = lst2slst (cast [A,B,C] n2`) 
			           in 
							leeg_is_leeg                   /\
							count_matches_elems     n      /\
							is_sorted_elems         n      /\
							member_is_member        n m    /\
							member_na_insert        n m    /\
							member_na_remove        n m    /\
							insert_remove_invariant n m    /\
							minimum_property        n      /\
							maximum_property        n      /\
							merge_additive          n n2   /\
							merge_member            n n2 m /\
							True
		)

:: Enum = A | B | C 

derive bimap []
derive ggen Enum
derive genShow Enum
derive gEq Enum
derive gLexOrd Enum
instance == Enum where (==) x y = gEq{|*|} x y
instance <  Enum where  (<) x y = gEq{|*|} (gLexOrd{|*|} x y) LT

// clean should have something like this!
cast :: a a -> a
cast _ x = x

leeg_is_leeg :: Property
leeg_is_leeg 
 = name "leeg_is_leeg"
    (count newSortList == 0)

count_matches_elems :: (SortList a) -> Property | Eq, Ord a
count_matches_elems n 
 = name "count_matches_elems" 
    (length (elements n) == count n)

is_sorted_elems :: (SortList a) -> Property | Eq, Ord a
is_sorted_elems n
 = name "is_sorted_elems"
    (isSorted (elements n))
    where isSorted lst = and [ x<=y \\ x<-lst & y<-tl lst ]

member_is_member :: (SortList a) a -> Property | Eq, Ord a
member_is_member lst e
 = name "member_is_member"
    ((isMember e (elements lst)) <==> (memberSort e lst))

member_na_insert :: (SortList a) a -> Property | Eq, Ord a
member_na_insert lst e
 = name "member_na_insert"
    (memberSort e (insertSort e lst))

member_na_remove :: (SortList a) a -> Property | Eq, Ord a
member_na_remove lst e
 = name "member_na_remove"
    (not (memberSort e (removeAll e lst)))

insert_remove_invariant :: (SortList a) a -> Property | Eq, Ord a
insert_remove_invariant lst e
 = name "insert_remove_invariant"
    (memberSort e lst <==> memberSort e lst`)
    where lst` = removeFirst e (insertSort e lst)

minimum_property :: (SortList a) -> Property | Eq,Ord a
minimum_property n
 = name "minimum_property"
    (count n > 0 ==> (memberSort min n /\ all ((<=) min) (elements n)))
    where min = minimum n

maximum_property :: (SortList a) -> Property | Eq,Ord a
maximum_property n
 = name "maximum_property"
    (count n > 0 ==> (memberSort max n /\ all ((>=) max) (elements n)))
    where max = maximum n

merge_member :: (SortList a) (SortList a) a -> Property | Eq,Ord a
merge_member n m e
 = name "merge_member"
	(memberSort e nm <==> (memberSort e n \/ memberSort e m))
	where nm = mergeSortList n m

merge_additive :: (SortList a) (SortList a) -> Property | Eq,Ord a
merge_additive n m 
 = name "merge_additive"
	(count n + count m == count nm)
	where nm = mergeSortList n m

lst2slst :: [a] -> SortList a | Eq,Ord a
lst2slst xs = seq (map insertSort xs) newSortList