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 MonoTest < Minitest::Test
21 =begin
22 <case-rule-head-list> ::=
23 "[" "]"
24 | "[" <var-pattern> "|" <var-pattern> "]"
25 ;
26
27 <case-rule-head-cell-stream> ::=
28 "&[" "]"
29 | "&[" <var-pattern> "|" <var-pattern> "]"
30 ;
31
32 <case-rule-head-memo-stream> ::=
33 "&{" "}"
34 | "&{" <var-pattern> "|" <var-pattern> "}"
35 ;
36 =end
37
38 def setup
39 @interp = Api.setup_interpreter
40
41 @loc = LOC.make_location __FILE__, __LINE__
42 end
43
44
45 def test_list
46 script = <<-EOS
47 case xs of {
48 | [] -> Datum @N ()
49 | [x|xs'] -> Datum @C (x, xs')
50 }
51 EOS
52
53 value = Api.eval_expr(
54 @interp, script, xs:VC.make_nil
55 )
56 assert_instance_of VCU::Datum, value
57 assert_equal :N, value.tag_sym
58
59 value = Api.eval_expr(
60 @interp,
61 script,
62 xs:VC.make_cons(VC.make_integer(3), VC.make_nil)
63 )
64 assert_instance_of VCU::Datum, value
65 assert_equal :C, value.tag_sym
66 assert_instance_of VCP::Tuple, value.contents
67
68 head_value, tail_value = value.contents.values
69 assert_instance_of VCAN::Int, head_value
70 assert_equal 3, head_value.val
71 assert_instance_of VCM::List::Nil, tail_value
72 end
73
74
75 def test_cell_stream
76 script = <<-EOS
77 val ys = case xs of {
78 | &[] -> Datum @N ()
79 | &[x|xs'] -> Datum @C (x, xs')
80 }
81 EOS
82
83 interp_1 = Api.eval_decls(
84 @interp,
85 script,
86 xs:VC.make_cell_stream_nil(
87 Api.va_context(@interp)
88 )
89 )
90 value_1 = Api.eval_expr interp_1, "ys"
91 assert_instance_of VCU::Datum, value_1
92 assert_equal :N, value_1.tag_sym
93
94 interp_2 = Api.eval_decls(
95 @interp,
96 script,
97 xs:VC.make_cell_stream_cons(
98 ASCE.make_integer(@loc, 3),
99 VC.make_cell_stream_nil(
100 Api.va_context(@interp)
101 ),
102 Api.va_context(@interp)
103 )
104 )
105 value_2 = Api.eval_expr interp_2, "ys"
106 assert_instance_of VCU::Datum, value_2
107 assert_equal :C, value_2.tag_sym
108 assert_instance_of VCP::Tuple, value_2.contents
109
110 interp_3 = Api.eval_decls interp_2, "val (hd, tl) = ys.contents"
111 head_value = Api.eval_expr interp_3, "hd"
112 tail_value = Api.eval_expr interp_3, "tl"
113
114 assert_instance_of VCAN::Int, head_value
115 assert_equal 3, head_value.val
116 assert_instance_of VCM::Stream::Entry::Cell, tail_value
117 assert_instance_of VCM::Stream::Cell::Nil, tail_value.cell
118 end
119
120
121 def test_memo_stream
122 script = <<-EOS
123 val ys = case xs of {
124 | &{} -> Datum @N ()
125 | &{x|xs'} -> Datum @C (x, xs')
126 }
127 EOS
128
129 interp_1 = Api.eval_decls(
130 @interp,
131 script,
132 xs:VC.make_memo_stream_nil(
133 Api.va_context(@interp)
134 )
135 )
136 value_1 = Api.eval_expr interp_1, "ys"
137 assert_instance_of VCU::Datum, value_1
138 assert_equal :N, value_1.tag_sym
139
140 interp_2 = Api.eval_decls(
141 @interp,
142
143 script,
144
145 xs:VC.make_memo_stream_entry(
146 ASCE.make_memo_stream_cons(
147 @loc,
148 ASCE.make_integer(@loc, 3),
149 ASCE.make_memo_stream_nil(@loc)
150 ),
151
152 Api.va_context(@interp)
153 )
154 )
155 value_2 = Api.eval_expr interp_2, "ys"
156 assert_instance_of VCU::Datum, value_2
157 assert_equal :C, value_2.tag_sym
158 assert_instance_of VCP::Tuple, value_2.contents
159
160 interp_3 = Api.eval_decls interp_2, "val (hd, tl) = ys.contents"
161 head_value = Api.eval_expr interp_3, "hd"
162 tail_value = Api.eval_expr interp_3, "tl"
163
164 assert_instance_of VCAN::Int, head_value
165 assert_equal 3, head_value.val
166 assert_instance_of VCM::Stream::Entry::Memorization, tail_value
167
168 forced_value_2 = Api.eval_expr interp_3, "tl.force"
169 assert_instance_of VCU::Option::None, forced_value_2
170 end
171 end
172
173 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry::CaseExpression
174
175 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
176
177 end # Umu::Test::Grammar::CoreLanguage::Expression
178
179 end # Umu::Test::Grammar::CoreLanguage
180
181 end # Umu::Test::Grammar
182
183 end # Umu::Test
184
185 end # Umu