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 CondExpressionTest < Minitest::Test
19 =begin
20 <cond-expression> ::=
21 COND <expression> OF "{"
22 [ "|" ] <cond-rule>
23 { "|" <cond-rule> }
24 [ ELSE "->" <expression> ]
25 "}"
26 ;
27
28 <cond-rule> ::= <expression> "->" <expression> ;
29 =end
30
31
32 def setup
33 @interp = Api.setup_interpreter
34 end
35
36
37 def test_cond_expression
38 script = <<-EOS
39 cond x of {
40 | positive? -> @P
41 }
42 EOS
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 :P, value.val
49
50 assert_raises(X::UnmatchError) do
51 value = Api.eval_expr(
52 @interp, script, x:VC.make_integer(0)
53 )
54 end
55 end
56
57
58 def test_no_vert_bar
59 value = Api.eval_expr @interp, <<-EOS
60 cond 1 of {
61 positive? -> @P
62 }
63 EOS
64 assert_instance_of VCA::Symbol, value
65 assert_equal :P, value.val
66 end
67
68
69 def test_with_else_clause
70 script = <<-EOS
71 cond x of {
72 positive? -> @P
73 else -> @E
74 }
75 EOS
76
77 value = Api.eval_expr(
78 @interp, script, x:VC::make_integer(1)
79 )
80 assert_instance_of VCA::Symbol, value
81 assert_equal :P, value.val
82
83 value = Api.eval_expr(
84 @interp, script, x:VC::make_integer(0)
85 )
86 assert_instance_of VCA::Symbol, value
87 assert_equal :E, value.val
88 end
89
90
91 def test_with_rules
92 script = <<-EOS
93 cond x of {
94 | positive? -> @P
95 | zero? -> @Z
96 | negative? -> @N
97 }
98 EOS
99
100 value = Api.eval_expr(
101 @interp, script, x:VC::make_integer(1)
102 )
103 assert_instance_of VCA::Symbol, value
104 assert_equal :P, value.val
105
106 value = Api.eval_expr(
107 @interp, script, x:VC::make_integer(0)
108 )
109 assert_instance_of VCA::Symbol, value
110 assert_equal :Z, value.val
111
112 value = Api.eval_expr(
113 @interp, script, x:VC::make_integer(-1)
114 )
115 assert_instance_of VCA::Symbol, value
116 assert_equal :N, value.val
117 end
118 end
119
120 end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
121
122 end # Umu::Test::Grammar::CoreLanguage::Expression
123
124 end # Umu::Test::Grammar::CoreLanguage
125
126 end # Umu::Test::Grammar
127
128 end # Umu::Test
129
130 end # Umu