-
Notifications
You must be signed in to change notification settings - Fork 610
/
or_spec.rb
85 lines (71 loc) · 1.22 KB
/
or_spec.rb
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
require File.expand_path('../../spec_helper', __FILE__)
describe "An Or node" do
relates "(a or b)" do
compile do |g|
g.push :self
g.send :a, 0, true
g.dup
lhs_true = g.new_label
g.git lhs_true
g.pop
g.push :self
g.send :b, 0, true
lhs_true.set!
end
end
or_complex = lambda do |g|
j1 = g.new_label
j2 = g.new_label
j3 = g.new_label
g.push :self
g.send :a, 0, true
g.dup
g.git j1
g.pop
g.push :self
g.send :b, 0, true
j1.set!
g.dup
g.git j3
g.pop
g.push :self
g.send :c, 0, true
g.dup
g.gif j2
g.pop
g.push :self
g.send :d, 0, true
j2.set!
j3.set!
end
relates "((a || b) || (c && d))" do
compile(&or_complex)
end
relates "((a or b) or (c and d))" do
compile(&or_complex)
end
relates "() or a" do
compile do |g|
t = g.new_label
g.push :nil
g.dup
g.git t
g.pop
g.push :self
g.send :a, 0, true
t.set!
end
end
relates "a or ()" do
compile do |g|
t = g.new_label
g.push :self
g.send :a, 0, true
g.dup
g.git t
g.pop
g.push :nil
t.set!
end
end
end