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 module CaseExpression
19
20 class AtomTest < Minitest::Test
21 =begin
22 <case-rule-head-atom> ::= INT | FLOAT | STRING | SYMBOL ;
23 =end
24
25 def setup
26 @interp = Api.setup_interpreter
27 end
28
29
30 def test_int
31 script = <<-EOS
32 case x of {
33 | 0 -> @Z
34 | 1 -> @O
35 }
36 EOS
37
38 value = Api.eval_expr(
39 @interp, script, x:VC.make_integer(0)
40 )
41 assert_instance_of VCA::Symbol, value
42 assert_equal :Z, value.val
43
44 value = Api.eval_expr(
45 @interp, script, x:VC.make_integer(1)
46 )
47 assert_instance_of VCA::Symbol, value
48 assert_equal :O, value.val
49 end
50
51
52 def test_float
53 script = <<-EOS
54 case x of {
55 | 0.0 -> @Z
56 | 0.1 -> @O
57 }
58 EOS
59
60 value = Api.eval_expr(
61 @interp, script, x:VC.make_float(0.0)
62 )
63 assert_instance_of VCA::Symbol, value
64 assert_equal :Z, value.val
65
66 value = Api.eval_expr(
67 @interp, script, x:VC.make_float(0.1)
68 )
69 assert_instance_of VCA::Symbol, value
70 assert_equal :O, value.val
71 end
72
73
74 def test_string
75 script = <<-EOS
76 case x of {
77 | "Apple" -> @A
78 | "Banana" -> @B
79 }
80 EOS
81
82 value = Api.eval_expr(
83 @interp, script, x:VC.make_string("Apple")
84 )
85 assert_instance_of VCA::Symbol, value
86 assert_equal :A, value.val
87
88 value = Api.eval_expr(
89 @interp, script, x:VC.make_string("Banana")
90 )
91 assert_instance_of VCA::Symbol, value
92 assert_equal :B, value.val
93 end
94
95
96 def test_symbol
97 script = <<-EOS
98 case x of {
99 | @Apple -> @A
100 | @Banana -> @B
101 }
102 EOS
103
104 value = Api.eval_expr(
105 @interp, script, x:VC.make_symbol(:Apple)
106 )
107 assert_instance_of VCA::Symbol, value
108 assert_equal :A, value.val
109
110 value = Api.eval_expr(
111 @interp, script, x:VC.make_symbol(:Banana)
112 )
113 assert_instance_of VCA::Symbol, value
114 assert_equal :B, value.val
115 end
116
117
118 def test_should_be_consistent_rule_category
119 script = <<-EOS
120 case x of {
121 | "Apple" -> @A
122 | Banana -> @B
123 }
124 EOS
125
126 assert_raises(X::SyntaxError) do
127 Api.eval_expr(
128 @interp, script, x:VC.make_string("Apple")
129 )
130 end
131 end
132
133
134 def test_should_be_consistent_rule_type
135 script = <<-EOS
136 case x of {
137 | "Apple" -> @A
138 | @Banana -> @B
139 }
140 EOS
141
142 assert_raises(X::SyntaxError) do
143 Api.eval_expr(
144 @interp, script, x:VC.make_string("Apple")
145 )
146 end
147 end
148
149
150 def test_should_not_be_duplicated_rule
151 script = <<-EOS
152 case x of {
153 | "Apple" -> @A
154 | "Apple" -> @B
155 }
156 EOS
157
158 assert_raises(X::SyntaxError) do
159 Api.eval_expr(
160 @interp, script, x:VC.make_string("Apple")
161 )
162 end
163 end
164 end
165
166 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry::CaseExpression
167
168 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
169
170 end # Umu::Test::Grammar::CoreLanguage::Expression
171
172 end # Umu::Test::Grammar::CoreLanguage
173
174 end # Umu::Test::Grammar
175
176 end # Umu::Test
177
178 end # Umu