aboutsummaryrefslogtreecommitdiffstats
path: root/tests/body.scm
blob: 99bfa70f20ff003b18333fd60ea32451f70aa38c (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
(test-group "dup"
  (test-equal "'x dup"
              '(x x)
              (RPSlist->list (interpret '(x)
                                        (list->RPSlist inline-dup))))
  (test-equal "'y 'x dup"
              '(y y x)
              (RPSlist->list (interpret '(y x)
                                        (list->RPSlist inline-dup)))))
(test-group "drop"
  (test-equal "'x drop"
              '()
              (RPSlist->list (interpret '(x) (list->RPSlist inline-drop))))
  (test-equal "'x 'y drop"
              '(y)
              (RPSlist->list
               (interpret '(x y)
                          (list->RPSlist inline-drop)))))

(test-group "dropn"
  (test-equal "'x {dropn 0}"
              '()
              (RPSlist->list (interpret '(x) (list->RPSlist
                                              (inline-dropn 0)))))
  (test-equal "'y 'x {dropn 0}"
              '(y)
              (RPSlist->list (interpret '(x y) (list->RPSlist
                                                (inline-dropn 0)))))
  (test-equal "'y 'x {dropn 1}"
              '(x)
              (RPSlist->list (interpret '(x y) (list->RPSlist
                                                (inline-dropn 1)))))
  (test-equal "'z 'y 'x {dropn 1}"
              '(x z)
              (RPSlist->list (interpret '(x y z)
                                        (list->RPSlist
                                         (inline-dropn 1)))))
  (test-equal "'z 'y 'x {dropn 2}"
              '(x y)
              (RPSlist->list (interpret '(x y z)
                                        (list->RPSlist
                                         (inline-dropn 2))))))

(test-group "pick"
  (test-equal "'x {pick 0}"
              '(x x)
              (RPSlist->list (interpret '(x) (list->RPSlist
                                              (inline-pick 0)))))
  (test-equal "'y 'x {pick 0}"
              '(x x y)
              (RPSlist->list (interpret '(x y) (list->RPSlist
                                                (inline-pick 0)))))
  (test-equal "'y 'x {pick 1}"
              '(y x y)
              (RPSlist->list (interpret '(x y) (list->RPSlist
                                                (inline-pick 1)))))
  (test-equal "'z 'y 'x {pick 1}"
              '(y x y z)
              (RPSlist->list (interpret '(x y z) (list->RPSlist
                                                  (inline-pick 1)))))
  (test-equal "'z 'y 'x {pick 2}"
              '(z x y z)
              (RPSlist->list (interpret '(x y z) (list->RPSlist
                                                  (inline-pick 2))))))

(test-group "roll"
  (test-equal "'x {roll 0}"
              '(x)
              (RPSlist->list (interpret '(x) (list->RPSlist
                                              (inline-roll 0)))))
  (test-equal "'y 'x {roll 0}"
              '(x y)
              (RPSlist->list (interpret '(x y) (list->RPSlist
                                                (inline-roll 0)))))
  (test-equal "'y 'x {roll 1}"
              '(y x)
              (RPSlist->list (interpret '(x y) (list->RPSlist
                                                (inline-roll 1)))))
  (test-equal "'z 'y 'x {roll 1}"
              '(y x z)
              (RPSlist->list (interpret '(x y z) (list->RPSlist
                                                  (inline-roll 1)))))
  (test-equal "'z 'y 'x {roll 2}"
              '(z x y)
              (RPSlist->list (interpret '(x y z) (list->RPSlist
                                                  (inline-roll 2))))))

(test-group "stack-closure"
  (let* ((push-values
          `(#f                          ; [returnK N self values ...]
            ,@(inline-dropn 1) ,@(inline-dropn 1)
            #f ,@(inline-roll 1) jump))
         (program
          `(0 ,@(stack-closure push-values 0 #f) ; [proc 0]
              (#f                      ; [K proc 0]
               0 ,@(inline-roll 1)     ; [K 0 proc 0]
               ,@(inline-pick 2)       ; [proc K 0 proc 0]
               jump)
              #f 1 call/cc)))
    (test-equal "0 {stack-closure 0 #f} jump"
                '(0 0)
                (RPSlist->list
                 (interpret '() (list->RPSlist program))))))