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 ModuleLanguage
13
14 module Declaration
15
16 class StructureTest < Minitest::Test
17 =begin
18 <md-structure-declaration> ::=
19 STRUCTURE ID "=" <me-expression>
20 [ WHERE "{" { <md-declaration> } "}"
21 ;
22 =end
23 def setup
24 @interp = Api.setup_interpreter
25 end
26
27
28 def test_structure
29 interp = Api.eval_decls @interp, <<-EOS
30 structure M = struct { val x = 3 }
31 EOS
32
33 value = Api.eval_expr interp, "M::x"
34 assert_instance_of VCAN::Int, value
35 assert_equal 3, value.val
36 end
37
38
39 def test_with_empty_declaration
40 interp = Api.eval_decls @interp, <<-EOS
41 structure M = struct { val x = 3 } where { }
42 EOS
43
44 value = Api.eval_expr interp, "M::x"
45 assert_instance_of VCAN::Int, value
46 assert_equal 3, value.val
47 end
48
49
50 def test_with_single_declaration
51 interp = Api.eval_decls @interp, <<-EOS
52 structure M = struct {
53 val x = y
54 } where {
55 val y = 3
56 }
57 EOS
58
59 value = Api.eval_expr interp, "M::x"
60 assert_instance_of VCAN::Int, value
61 assert_equal 3, value.val
62
63 assert_raises(X::SelectionError) do
64 Api.eval_expr interp, "M::y"
65 end
66 end
67
68
69 def test_with_some_declarations
70 interp = Api.eval_decls @interp, <<-EOS
71 structure M = struct {
72 val x = y + z
73 } where {
74 val y = 3
75 val z = 4
76 }
77 EOS
78
79 value = Api.eval_expr interp, "M::x"
80 assert_instance_of VCAN::Int, value
81 assert_equal 7, value.val
82
83 assert_raises(X::SelectionError) do
84 Api.eval_expr interp, "M::y"
85 end
86
87 assert_raises(X::SelectionError) do
88 Api.eval_expr interp, "M::z"
89 end
90 end
91
92
93 def test_nested_structure
94 interp = Api.eval_decls @interp, <<-EOS
95 structure M = struct {
96 val x = 3
97 structure N = struct { val y = 4 }
98 val z = 5
99 }
100 EOS
101
102 value = Api.eval_expr interp, "M::x"
103 assert_instance_of VCAN::Int, value
104 assert_equal 3, value.val
105
106 value = Api.eval_expr interp, "M::N::y"
107 assert_instance_of VCAN::Int, value
108 assert_equal 4, value.val
109
110 value = Api.eval_expr interp, "M::z"
111 assert_instance_of VCAN::Int, value
112 assert_equal 5, value.val
113
114 assert_raises(X::SelectionError) do
115 Api.eval_expr interp, "M::y"
116 end
117 end
118 end
119
120 end # Umu::Test::Grammar::ModuleLanguage::Declaration
121
122 end # Umu::Test::Grammar::ModuleLanguage
123
124 end # Umu::Test::Grammar
125
126 end # Umu::Test
127
128 end # Umu