-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpaxl_test.rb
105 lines (91 loc) · 2.52 KB
/
paxl_test.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
require 'test/unit'
require 'paxl'
class TestPaxl < Test::Unit::TestCase
# all tests run using the same global scope
def initialize(arg)
super(arg)
@paxl = Paxl::Parser.new
@paxl_scope = Paxl::Scope.new(nil)
end
def assert_returns(value, code)
assert_equal(value, @paxl.parse(code).eval(@paxl_scope))
end
def test_y_combinator
assert_returns 120, "
y = { |g|
f = { |x|
{ |arg|
gx = g(x(x));
gx(arg)
}
};
f(g)
};
fg = { |cb|
{ |arg|
if (arg == 0) { 1 }
else { arg * (cb(arg - 1)) }
}
};
factorial = y(fg);
factorial(5)"
end
def test_this_keyword
assert_returns 120, "
factorial = { |x|
if (x == 0) { 1 }
else { x * (this(x - 1)) }
};
factorial(5)"
end
def test_for_loops
assert_returns 45, "a = 0; for (i = 0; i < 10; i = i + 1) { a = a + i }; a"
end
def test_if_statements
assert_returns 10, "a = 5; if (a < 10) { 10 } else { a }"
assert_returns 15, "a = 15; if (a < 10) { 10 } else { a }"
assert_returns 10, "a = 10; if (a == 10) { 10 }"
end
def test_blocks
assert_returns 200, "a = { |b, c| b * c }; a(10; 20)"
assert_returns 250, "n = 50; a = { |b, c| b * c + n }; a(10; 20)"
assert_returns 10, "a = { 10 }; a();"
assert_returns 10, "a = { |x, y, z| (x * y) - z }; a(5; 4; 10)"
end
def test_variable_assignment
assert_returns 10, "a = 10"
assert_returns 10, "a = 10"
assert_returns 5, "b = 5"
assert_returns 10, "a"
assert_returns 5, "b"
assert_returns 50, "a * b"
end
def test_basic_math
assert_returns 10, "5 + 5"
assert_returns 10, "15 - 5"
assert_returns 10, "100 / 10"
assert_returns 10, "5 * 2"
end
def test_logical_expressions
assert_returns true, "true"
assert_returns false, "false"
assert_returns true, "true and true"
assert_returns false, "true and false"
assert_returns true, "false or true"
assert_returns true, "not false"
end
def test_comparisons
assert_returns true, "10 == 10"
assert_returns false, "1 == 2"
assert_returns true, "1 != 2"
assert_returns true, "1 < 2"
assert_returns true, "1 <= 2"
assert_returns false, "1 >= 2"
assert_returns false, "1 > 2"
end
def test_nested_expressions
assert_returns true, "(true or false) and (true and true)"
assert_returns true, "(10 < 20) and (20 >= 10)"
assert_returns true, "a = ( (true or false) and (true and true) )"
end
end