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 PolyTest < Minitest::Test
21 =begin
22 <case-rule-head-poly> ::=
23 "&[" "]"
24 | "&[" <var-pattern> "|" <var-pattern> "]"
25 :
26 =end
27
28 def setup
29 @interp = Api.setup_interpreter
30
31 @nil_value = VC.make_nil
32 @cons_value = VC.make_cons(
33 VC.make_integer(3),
34 VC.make_nil
35 )
36 end
37
38
39 def test_1_nil_cons_else
40 script = <<-EOS
41 case xs of {
42 | %[] -> Datum @N ()
43 | %[x|xs'] -> Datum @C (x, xs')
44 else -> Datum @E ()
45 }
46 EOS
47
48 assert_raises(X::SyntaxError) do
49 Api.eval_expr @interp, script, xs:@nil_value
50 end
51
52 assert_raises(X::SyntaxError) do
53 Api.eval_expr @interp, script, xs:@cons_value
54 end
55 end
56
57
58 def test_2_nil_cons_no_else
59 script = <<-EOS
60 case xs of {
61 | %[] -> Datum @N ()
62 | %[x|xs'] -> Datum @C (x, xs')
63 }
64 EOS
65
66 value = Api.eval_expr @interp, script, xs:@nil_value
67 assert_instance_of VCU::Datum, value
68 assert_equal :N, value.tag_sym
69
70 value = Api.eval_expr @interp, script, xs:@cons_value
71 assert_instance_of VCU::Datum, value
72 assert_equal :C, value.tag_sym
73 assert_instance_of VCP::Tuple, value.contents
74
75 head_value, tail_value = value.contents.values
76 assert_instance_of VCAN::Int, head_value
77 assert_equal 3, head_value.val
78 assert_instance_of VCM::List::Nil, tail_value
79 end
80
81
82 def test_3_nil_no_cons_else
83 script = <<-EOS
84 case xs of {
85 %[] -> Datum @N ()
86 else -> Datum @E ()
87 }
88 EOS
89
90 value = Api.eval_expr @interp, script, xs:@nil_value
91 assert_instance_of VCU::Datum, value
92 assert_equal :N, value.tag_sym
93
94 value = Api.eval_expr @interp, script, xs:@cons_value
95 assert_instance_of VCU::Datum, value
96 assert_equal :E, value.tag_sym
97 end
98
99
100 def test_4_nil_no_cons_no_else
101 script = <<-EOS
102 case xs of {
103 %[] -> Datum @N ()
104 }
105 EOS
106
107 value = Api.eval_expr @interp, script, xs:@nil_value
108 assert_instance_of VCU::Datum, value
109 assert_equal :N, value.tag_sym
110
111 assert_raises(X::UnmatchError) do
112 value = Api.eval_expr @interp, script, xs:@cons_value
113 end
114 end
115
116
117 def test_5_no_nil_cons_else
118 script = <<-EOS
119 case xs of {
120 | %[x|xs'] -> Datum @C (x, xs')
121 else -> Datum @E ()
122 }
123 EOS
124
125 value = Api.eval_expr @interp, script, xs:@nil_value
126 assert_instance_of VCU::Datum, value
127 assert_equal :E, value.tag_sym
128
129 value = Api.eval_expr @interp, script, xs:@cons_value
130 assert_instance_of VCU::Datum, value
131 assert_equal :C, value.tag_sym
132 assert_instance_of VCP::Tuple, value.contents
133
134 head_value, tail_value = value.contents.values
135 assert_instance_of VCAN::Int, head_value
136 assert_equal 3, head_value.val
137 assert_instance_of VCM::List::Nil, tail_value
138 end
139
140
141 def test_6_no_nil_cons_no_else
142 script = <<-EOS
143 case xs of {
144 %[x|xs'] -> Datum @C (x, xs')
145 }
146 EOS
147
148 assert_raises(X::UnmatchError) do
149 Api.eval_expr @interp, script, xs:@nil_value
150 end
151 end
152
153
154 def test_7_no_nil_no_cons
155 script = <<-EOS
156 case xs of {
157 else -> Datum @E ()
158 }
159 EOS
160
161 assert_raises(X::SyntaxError) do
162 Api.eval_expr @interp, script, xs:@nil_value
163 end
164 end
165 end
166
167 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry::CaseExpression
168
169 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
170
171 end # Umu::Test::Grammar::CoreLanguage::Expression
172
173 end # Umu::Test::Grammar::CoreLanguage
174
175 end # Umu::Test::Grammar
176
177 end # Umu::Test
178
179 end # Umu