]> gitweb.factorcode.org Git - factor.git/blob - extra/smalltalk/parser/parser-tests.factor
Merge branch 'master' into smalltalk
[factor.git] / extra / smalltalk / parser / parser-tests.factor
1 IN: smalltalk.parser.tests
2 USING: smalltalk.parser smalltalk.ast peg.ebnf tools.test accessors
3 io.files io.encodings.ascii kernel ;
4
5 EBNF: test-Character
6 test         = <foreign parse-smalltalk Character>
7 ;EBNF
8
9 [ CHAR: a ] [ "a" test-Character ] unit-test
10
11 EBNF: test-Comment
12 test         = <foreign parse-smalltalk Comment>
13 ;EBNF
14
15 [ T{ ast-comment f "Hello, this is a comment." } ]
16 [ "\"Hello, this is a comment.\"" test-Comment ]
17 unit-test
18
19 [ T{ ast-comment f "Hello, \"this\" is a comment." } ]
20 [ "\"Hello, \"\"this\"\" is a comment.\"" test-Comment ]
21 unit-test
22
23 EBNF: test-Identifier
24 test         = <foreign parse-smalltalk Identifier>
25 ;EBNF
26
27 [ "OrderedCollection" ] [ "OrderedCollection" test-Identifier ] unit-test
28
29 EBNF: test-Literal
30 test         = <foreign parse-smalltalk Literal>
31 ;EBNF
32
33 [ nil ] [ "nil" test-Literal ] unit-test
34 [ 123 ] [ "123" test-Literal ] unit-test
35 [ HEX: deadbeef ] [ "16rdeadbeef" test-Literal ] unit-test
36 [ -123 ] [ "-123" test-Literal ] unit-test
37 [ 1.2 ] [ "1.2" test-Literal ] unit-test
38 [ -1.24 ] [ "-1.24" test-Literal ] unit-test
39 [ 12.4e7 ] [ "12.4e7" test-Literal ] unit-test
40 [ 12.4e-7 ] [ "12.4e-7" test-Literal ] unit-test
41 [ -12.4e7 ] [ "-12.4e7" test-Literal ] unit-test
42 [ CHAR: x ] [ "$x" test-Literal ] unit-test
43 [ "Hello, world" ] [ "'Hello, world'" test-Literal ] unit-test
44 [ "Hello, 'funny' world" ] [ "'Hello, ''funny'' world'" test-Literal ] unit-test
45 [ T{ symbol f "foo" } ] [ "#foo" test-Literal ] unit-test
46 [ T{ symbol f "+" } ] [ "#+" test-Literal ] unit-test
47 [ T{ symbol f "at:put:" } ] [ "#at:put:" test-Literal ] unit-test
48 [ T{ symbol f "Hello world" } ] [ "#'Hello world'" test-Literal ] unit-test
49 [ B{ 1 2 3 4 } ] [ "#[1 2 3 4]" test-Literal ] unit-test
50 [ { nil t f } ] [ "#(nil true false)" test-Literal ] unit-test
51 [ { nil { t f } } ] [ "#(nil (true false))" test-Literal ] unit-test
52 [ T{ ast-block f { } { } } ] [ "[]" test-Literal ] unit-test
53 [ T{ ast-block f { "x" } { T{ ast-return f T{ ast-name f "x" } } } } ] [ "[ :x|^x]" test-Literal ] unit-test
54 [ T{ ast-block f { } { T{ ast-return f self } } } ] [ "[^self]" test-Literal ] unit-test
55
56 [
57     T{ ast-block
58        { arguments { "i" } }
59        { body
60          {
61              T{ ast-message-send
62                 { receiver T{ ast-name { name "i" } } }
63                 { selector "print" }
64              }
65          }
66        }
67     }
68 ]
69 [ "[ :i | i print ]" test-Literal ] unit-test
70
71 [
72     T{ ast-block
73        { body { 5 self } }
74     }
75 ]
76 [ "[5. self]" test-Literal ] unit-test
77
78 EBNF: test-FormalBlockArgumentDeclarationList
79 test         = <foreign parse-smalltalk FormalBlockArgumentDeclarationList>
80 ;EBNF
81
82 [ V{ "x" "y" "elt" } ] [ ":x :y :elt" test-FormalBlockArgumentDeclarationList ] unit-test
83
84 EBNF: test-Operand
85 test         = <foreign parse-smalltalk Operand>
86 ;EBNF
87
88 [ { 123 15.6 { t f } } ] [ "#(123 15.6 (true false))" test-Operand ] unit-test
89 [ T{ ast-name f "x" } ] [ "x" test-Operand ] unit-test
90
91 EBNF: test-Expression
92 test         = <foreign parse-smalltalk Expression>
93 ;EBNF
94
95 [ self ] [ "self" test-Expression ] unit-test
96 [ { 123 15.6 { t f } } ] [ "#(123 15.6 (true false))" test-Expression ] unit-test
97 [ T{ ast-name f "x" } ] [ "x" test-Expression ] unit-test
98 [ T{ ast-message-send f 5 "print" { } } ] [ "5 print" test-Expression ] unit-test
99 [ T{ ast-message-send f T{ ast-message-send f 5 "squared" { } } "print" { } } ] [ "5 squared print" test-Expression ] unit-test
100 [ T{ ast-message-send f 2 "+" { 2 } } ] [ "2+2" test-Expression ] unit-test
101
102 [
103     T{ ast-message-send f
104         T{ ast-message-send f 3 "factorial" { } }
105         "+"
106         { T{ ast-message-send f 4 "factorial" { } } }
107     }
108 ]
109 [ "3 factorial + 4 factorial" test-Expression ] unit-test
110
111 [
112     T{ ast-message-send f
113         T{ ast-message-send f 3 "factorial" { } }
114         "+"
115         { T{ ast-message-send f 4 "factorial" { } } }
116     }
117 ]
118 [ "   3 factorial + 4 factorial" test-Expression ] unit-test
119
120 [
121     T{ ast-message-send f
122         T{ ast-message-send f 3 "factorial" { } }
123         "+"
124         { T{ ast-message-send f 4 "factorial" { } } }
125     }
126 ]
127 [ "   3 factorial + 4 factorial     " test-Expression ] unit-test
128
129 [
130     T{ ast-message-send f
131         T{ ast-message-send f
132             T{ ast-message-send f 3 "factorial" { } }
133             "+"
134             { 4 }
135         }
136         "factorial"
137         { }
138     }
139 ]
140 [ "(3 factorial + 4) factorial" test-Expression ] unit-test
141
142 [
143     T{ ast-message-send
144        { receiver
145          T{ ast-message-send
146             { receiver
147               T{ ast-message-send
148                  { receiver 1 }
149                  { selector "<" }
150                  { arguments { 10 } }
151               }
152             }
153             { selector "ifTrue:ifFalse:" }
154             { arguments
155               {
156                   T{ ast-block { body { "HI" } } }
157                   T{ ast-block { body { "BYE" } } }
158               }
159             }
160          }
161        }
162        { selector "print" }
163     }
164 ]
165 [ "((1 < 10) ifTrue: [ 'HI' ] ifFalse: [ 'BYE' ]) print" test-Expression ] unit-test
166
167 [
168     T{ ast-message-send
169        { receiver
170          T{ ast-message-send
171             { receiver { T{ ast-block { body { "a" } } } } }
172             { selector "at:" }
173             { arguments { 0 } }
174          }
175        }
176        { selector "value" }
177     }
178 ]
179 [ "(#(['a']) at: 0) value" test-Expression ] unit-test
180
181 EBNF: test-FinalStatement
182 test         = <foreign parse-smalltalk FinalStatement>
183 ;EBNF
184
185 [ T{ ast-name f "value" } ] [ "value" test-FinalStatement ] unit-test
186 [ T{ ast-return f T{ ast-name f "value" } } ] [ "^value" test-FinalStatement ] unit-test
187 [ T{ ast-assignment f T{ ast-name f "value" } 5 } ] [ "value:=5" test-FinalStatement ] unit-test
188
189 EBNF: test-LocalVariableDeclarationList
190 test         = <foreign parse-smalltalk LocalVariableDeclarationList>
191 ;EBNF
192
193 [ T{ ast-local-variables f { "i" "j" } } ] [ " |  i j   |" test-LocalVariableDeclarationList ] unit-test
194
195
196 EBNF: test-KeywordMessageSend
197 test         = <foreign parse-smalltalk KeywordMessageSend>
198 ;EBNF
199
200 [ T{ ast-message-send f T{ ast-name f "x" } "foo:bar:" { 1 2 } } ]
201 [ "x foo:1 bar:2" test-KeywordMessageSend ] unit-test
202
203 [
204     T{ ast-message-send
205         f
206         T{ ast-message-send f
207             T{ ast-message-send f 3 "factorial" { } }
208             "+"
209             { T{ ast-message-send f 4 "factorial" { } } }
210         }
211         "between:and:"
212         { 10 100 }
213     }
214 ]
215 [ "3 factorial + 4 factorial between: 10 and: 100" test-KeywordMessageSend ] unit-test
216
217 [ { 1 2 } ] [ "1. 2" parse-smalltalk ] unit-test
218
219 [
220     T{ ast-class
221        { name "Test" }
222        { superclass "Object" }
223        { ivars { "a" } }
224     }
225 ]
226 [ "class Test [|a|]" parse-smalltalk ] unit-test
227
228 [ ] [ "vocab:smalltalk/parser/test.st" ascii file-contents parse-smalltalk drop ] unit-test