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 class GrammarTest < Minitest::Test
13 =begin
14 <entry> ::= <statement> { ";;" <statement> } ;
15
16 <statement> ::=
17 { <md-module-declaration> }
18 | <expression>
19 ;
20 =end
21 def setup
22 @interp = Api.setup_interpreter
23 end
24
25
26 def test_empty_declaration
27 assert (
28 Api.eval_decls @interp, ""
29 )
30 end
31
32
33 def test_empty_expression
34 assert_nil (
35 Api.eval_expr @interp, ""
36 )
37 end
38
39
40 def test_single_declaration
41 assert (
42 Api.eval_decls @interp, "val x = 3"
43 )
44 end
45
46
47 def test_some_declarations
48 assert (
49 Api.eval_decls @interp, "val x = 3 val y = 4"
50 )
51 end
52
53
54 def test_expression
55 value = Api.eval_expr @interp, "3"
56 assert_instance_of VCAN::Int, value
57 assert_equal 3, value.val
58 end
59
60
61 def test_declarations_followed_by_expression
62 value = Api.eval_expr @interp, <<-EOS
63 val x = 3
64 val y = 4
65 ;;
66 x + y
67 EOS
68 assert_instance_of VCAN::Int, value
69 assert_equal 7, value.val
70 end
71
72
73 def test_expression_followed_by_declaration
74 interp = Api.eval_decls @interp, <<-EOS
75 3
76 ;;
77 val y = 4
78 EOS
79
80 value = Api.eval_expr interp, "y"
81 assert_instance_of VCAN::Int, value
82 assert_equal 4, value.val
83 end
84
85
86 def test_some_expressions
87 value = Api.eval_expr @interp, <<-EOS
88 3
89 ;;
90 4
91 EOS
92
93 assert_instance_of VCAN::Int, value
94 assert_equal 4, value.val
95 end
96 end
97
98 end # Umu::Test::Grammar
99
100 end # Umu::Test
101
102 end # Umu