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 CaseExpressionTest < Minitest::Test
21 =begin
22 <cond-expression> ::=
23 CASE <expression> OF "{"
24 [ "|" ] <cond-rule>
25 { "|" <cond-rule> }
26 [ ELSE "->" <expression> ]
27 "}"
28 ;
29
30 <cond-rule> ::= <case-rule-head> "->" <expression> ;
31
32 <case-rule-head> ::=
33 <case-rule-head-atom>
34 | <case-rule-head-datum>
35 | <case-rule-head-class>
36 | <case-rule-head-poly>
37 | <case-rule-head-list>
38 | <case-rule-head-cell-stream>
39 | <case-rule-head-memo-stream>
40 =end
41
42 def setup
43 @interp = Api.setup_interpreter
44 end
45
46
47 def test_case_expression
48 script = <<-EOS
49 case x of {
50 | 1 -> @P
51 }
52 EOS
53
54 value = Api.eval_expr(
55 @interp, script, x:VC.make_integer(1)
56 )
57 assert_instance_of VCA::Symbol, value
58 assert_equal :P, value.val
59
60 assert_raises(X::UnmatchError) do
61 value = Api.eval_expr(
62 @interp, script, x:VC.make_integer(0)
63 )
64 end
65 end
66
67
68 def test_no_vert_bar
69 value = Api.eval_expr @interp, <<-EOS
70 case 1 of {
71 1 -> @P
72 }
73 EOS
74 assert_instance_of VCA::Symbol, value
75 assert_equal :P, value.val
76 end
77
78
79 def test_with_else_clause
80 script = <<-EOS
81 case x of {
82 1 -> @P
83 else -> @E
84 }
85 EOS
86
87 value = Api.eval_expr(
88 @interp, script, x:VC::make_integer(1)
89 )
90 assert_instance_of VCA::Symbol, value
91 assert_equal :P, value.val
92
93 value = Api.eval_expr(
94 @interp, script, x:VC::make_integer(0)
95 )
96 assert_instance_of VCA::Symbol, value
97 assert_equal :E, value.val
98 end
99
100
101 def test_with_rules
102 script = <<-EOS
103 case x of {
104 | 0 -> @Z
105 | 1 -> @O
106 else -> @E
107 }
108 EOS
109
110 value = Api.eval_expr(
111 @interp, script, x:VC::make_integer(0)
112 )
113 assert_instance_of VCA::Symbol, value
114 assert_equal :Z, value.val
115
116 value = Api.eval_expr(
117 @interp, script, x:VC::make_integer(1)
118 )
119 assert_instance_of VCA::Symbol, value
120 assert_equal :O, value.val
121
122 value = Api.eval_expr(
123 @interp, script, x:VC::make_integer(2)
124 )
125 assert_instance_of VCA::Symbol, value
126 assert_equal :E, value.val
127 end
128 end
129
130 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry::CaseExpression
131
132 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
133
134 end # Umu::Test::Grammar::CoreLanguage::Expression
135
136 end # Umu::Test::Grammar::CoreLanguage
137
138 end # Umu::Test::Grammar
139
140 end # Umu::Test
141
142 end # Umu