1 # frozen_string_literal: true
2
3 require "test_helper"
4
5
6 module Umu
7
8 module Test
9
10 module Grammar
11
12 module CoreLanguage
13
14 module Expression
15
16 module Entry
17
18 class LetExpressionTest < Minitest::Test
19 =begin
20 <let-expression> ::=
21 LET "{" { <declaration> } IN <expression> "}" ;
22 =end
23
24
25 def setup
26 @interp = Api.setup_interpreter
27 end
28
29
30 def test_with_empty_declaration
31 value = Api.eval_expr @interp, "let { in 1 }"
32 assert_instance_of VCAN::Int, value
33 assert_equal 1, value.val
34 end
35
36
37 def test_with_single_declaration
38 value = Api.eval_expr @interp, "let { val x = 1 in x }"
39 assert_instance_of VCAN::Int, value
40 assert_equal 1, value.val
41 end
42
43
44 def test_with_some_declarations
45 value = Api.eval_expr @interp, <<-EOS
46 let {
47 val x = 3
48 val y = 4
49 in
50 x + y
51 }
52 EOS
53 assert_instance_of VCAN::Int, value
54 assert_equal 7, value.val
55 end
56
57
58 def test_shadowing
59 value = Api.eval_expr @interp, <<-EOS
60 let {
61 val x = 3
62 val x = 4
63 in
64 x
65 }
66 EOS
67 assert_instance_of VCAN::Int, value
68 assert_equal 4, value.val
69 end
70
71
72 def test_nesting
73 value = Api.eval_expr @interp, <<-EOS
74 let {
75 val x = 3
76 in
77 let {
78 val y = 4
79 in
80 x + y
81 }
82 }
83 EOS
84 assert_instance_of VCAN::Int, value
85 assert_equal 7, value.val
86 end
87
88
89 def test_nesting_and_shadowing_1
90 value = Api.eval_expr @interp, <<-EOS
91 let {
92 val x = 3
93 in
94 let {
95 val x = 4
96 in
97 x
98 }
99 }
100 EOS
101 assert_instance_of VCAN::Int, value
102 assert_equal 4, value.val
103 end
104
105
106 def test_nesting_and_shadowing_2
107 value = Api.eval_expr @interp, <<-EOS
108 let {
109 val x = 3
110 in
111 let {
112 val y = x
113 val x = 4
114 in
115 x + y
116 }
117 }
118 EOS
119 assert_instance_of VCAN::Int, value
120 assert_equal 7, value.val
121 end
122 end
123
124 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
125
126 end # Umu::Test::Grammar::CoreLanguage::Expression
127
128 end # Umu::Test::Grammar::CoreLanguage
129
130 end # Umu::Test::Grammar
131
132 end # Umu::Test
133
134 end # Umu