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 Atomic
17
18 class IdentifierTest < Minitest::Test
19 =begin
20 <identifier> ::=
21 ID
22 | "(" <infix-operator> ")"
23 | MODULE-DIR <module-path> ID
24 | MODULE-DIR <module-path> "(" <infix-operator> ")"
25 | "&" ID
26 ;
27
28 <module-path> ::= /* empty */ | MODULE-DIR <module-path> ;
29
30 <infix-operator> ::=
31 <normal-infix-operator>
32 | <special-infix-operator>
33 ;
34
35 /* <normal-infix-operator> ::= ... ; See InfixOperator */
36
37 <special-infix-operator> ::= "," | "|" ;
38 =end
39
40
41 def setup
42 @interp = Api.setup_interpreter
43 end
44
45
46 def test_short_identifier
47 value = Api.eval_expr @interp, "TRUE"
48 assert_instance_of VCA::Bool, value
49 assert_equal true, value.val
50 end
51
52
53 def test_normal_infix_operator
54 value = Api.eval_expr @interp, "(+)"
55 assert_instance_of VC::Fun, value
56
57 value = Api.eval_expr @interp, "(+) 3 4"
58 assert_instance_of VCAN::Int, value
59 assert_equal 7, value.val
60 end
61
62
63 def test_special_infix_operator
64 value = Api.eval_expr @interp, "(,) 3 4"
65 assert_instance_of VCP::Tuple, value
66 assert_instance_of VCAN::Int, value.values[0]
67 assert_equal 3, value.values[0].val
68 assert_instance_of VCAN::Int, value.values[1]
69 assert_equal 4, value.values[1].val
70
71 value = Api.eval_expr @interp, "(|) 3 []"
72 assert_instance_of VCM::List::Cons, value
73 assert_instance_of VCAN::Int, value.head
74 assert_equal 3, value.head.val
75 assert_instance_of VCM::List::Nil, value.tail
76 end
77
78
79 def test_directory_value_should_be_a_struct_type
80 assert_raises(X::TypeError) do
81 Api.eval_expr @interp, "TRUE::FALSE"
82 end
83
84 assert_raises(X::TypeError) do
85 Api.eval_expr @interp, "Umu::TRUE::FALSE"
86 end
87 end
88
89
90 def test_long_infix_operator
91 value = Api.eval_expr @interp, "Umu::Prelude::(+)"
92 assert_instance_of VC::Fun, value
93
94 value = Api.eval_expr @interp, "Umu::Prelude::(+) 3 4"
95 assert_instance_of VCAN::Int, value
96 assert_equal 7, value.val
97 end
98
99
100 def test_class_instance
101 value = Api.eval_expr @interp, "&Int"
102 assert_instance_of VC::Class, value
103 end
104 end
105
106 end # Umu::Test::Grammar::CoreLanguage::Expression::Atomic
107
108 end # Umu::Test::Grammar::CoreLanguage::Expression
109
110 end # Umu::Test::Grammar::CoreLanguage
111
112 end # Umu::Test::Grammar
113
114 end # Umu::Test
115
116 end # Umu