Skip to content

Commit 7c16f1b

Browse files
authored
Move all Expr conversion tests to test/expr.jl (#253)
1 parent ec705ed commit 7c16f1b

File tree

2 files changed

+160
-67
lines changed

2 files changed

+160
-67
lines changed

test/expr.jl

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@
7070
Expr(:function, :f)
7171
@test parsestmt(Expr, "macro f end") ==
7272
Expr(:macro, :f)
73+
74+
# weird cases with extra parens
75+
@test parsestmt(Expr, "function (f() where T) end") ==
76+
Expr(:function, Expr(:where, Expr(:call, :f), :T),
77+
Expr(:block, LineNumberNode(1), LineNumberNode(1)))
78+
@test parsestmt(Expr, "function (f()::S) end") ==
79+
Expr(:function, Expr(:(::), Expr(:call, :f), :S),
80+
Expr(:block, LineNumberNode(1), LineNumberNode(1)))
7381
end
7482

7583
@testset "elseif" begin
@@ -180,10 +188,22 @@
180188
Expr(:call, :f, Expr(:parameters, Expr(:kw, :b, 2)))
181189
@test parsestmt(Expr, "f(a=1; b=2)") ==
182190
Expr(:call, :f, Expr(:parameters, Expr(:kw, :b, 2)), Expr(:kw, :a, 1))
183-
184-
# Infix call = is not :kw
191+
@test parsestmt(Expr, "f(a; b; c)") ==
192+
Expr(:call, :f, Expr(:parameters, Expr(:parameters, :c), :b), :a)
193+
@test parsestmt(Expr, "+(a=1,)") ==
194+
Expr(:call, :+, Expr(:kw, :a, 1))
195+
@test parsestmt(Expr, "(a=1)()") ==
196+
Expr(:call, Expr(:(=), :a, 1))
197+
198+
# Operator calls: = is not :kw
185199
@test parsestmt(Expr, "(x=1) != 2") ==
186200
Expr(:call, :!=, Expr(:(=), :x, 1), 2)
201+
@test parsestmt(Expr, "+(a=1)") ==
202+
Expr(:call, :+, Expr(:(=), :a, 1))
203+
@test parsestmt(Expr, "(a=1)'") ==
204+
Expr(Symbol("'"), Expr(:(=), :a, 1))
205+
@test parsestmt(Expr, "(a=1)'ᵀ") ==
206+
Expr(:call, Symbol("'ᵀ"), Expr(:(=), :a, 1))
187207

188208
# Dotcall
189209
@test parsestmt(Expr, "f.(a=1; b=2)") ==
@@ -232,7 +252,6 @@
232252
Expr(:call, :f, Expr(:.=, :a, 1))
233253

234254
# = inside parens in calls and tuples
235-
# (TODO: we should warn for these cases.)
236255
@test parsestmt(Expr, "f(((a = 1)))") ==
237256
Expr(:call, :f, Expr(:kw, :a, 1))
238257
@test parsestmt(Expr, "(((a = 1)),)") ==
@@ -244,6 +263,9 @@
244263
@testset "dotcall / dotted operators" begin
245264
@test parsestmt(Expr, "f.(x,y)") == Expr(:., :f, Expr(:tuple, :x, :y))
246265
@test parsestmt(Expr, "f.(x=1)") == Expr(:., :f, Expr(:tuple, Expr(:kw, :x, 1)))
266+
@test parsestmt(Expr, "f.(a=1; b=2)") ==
267+
Expr(:., :f, Expr(:tuple, Expr(:parameters, Expr(:kw, :b, 2)), Expr(:kw, :a, 1)))
268+
@test parsestmt(Expr, "(a=1).()") == Expr(:., Expr(:(=), :a, 1), Expr(:tuple))
247269
@test parsestmt(Expr, "x .+ y") == Expr(:call, Symbol(".+"), :x, :y)
248270
@test parsestmt(Expr, "(x=1) .+ y") == Expr(:call, Symbol(".+"), Expr(:(=), :x, 1), :y)
249271
@test parsestmt(Expr, "a .< b .< c") == Expr(:comparison, :a, Symbol(".<"),
@@ -273,6 +295,27 @@
273295
@test parsestmt(Expr, "A.:.+") == Expr(:., :A, QuoteNode(Symbol(".+")))
274296
end
275297

298+
@testset "let" begin
299+
@test parsestmt(Expr, "let x=1\n end") ==
300+
Expr(:let, Expr(:(=), :x, 1), Expr(:block, LineNumberNode(2)))
301+
@test parsestmt(Expr, "let x=1 ; end") ==
302+
Expr(:let, Expr(:(=), :x, 1), Expr(:block, LineNumberNode(1)))
303+
@test parsestmt(Expr, "let x ; end") ==
304+
Expr(:let, :x, Expr(:block, LineNumberNode(1)))
305+
@test parsestmt(Expr, "let x::1 ; end") ==
306+
Expr(:let, Expr(:(::), :x, 1), Expr(:block, LineNumberNode(1)))
307+
@test parsestmt(Expr, "let x=1,y=2 end") ==
308+
Expr(:let, Expr(:block, Expr(:(=), :x, 1), Expr(:(=), :y, 2)), Expr(:block, LineNumberNode(1)))
309+
@test parsestmt(Expr, "let x+=1 ; end") ==
310+
Expr(:let, Expr(:block, Expr(:+=, :x, 1)), Expr(:block, LineNumberNode(1)))
311+
@test parsestmt(Expr, "let ; end") ==
312+
Expr(:let, Expr(:block), Expr(:block, LineNumberNode(1)))
313+
@test parsestmt(Expr, "let ; body end") ==
314+
Expr(:let, Expr(:block), Expr(:block, LineNumberNode(1), :body))
315+
@test parsestmt(Expr, "let\na\nb\nend") ==
316+
Expr(:let, Expr(:block), Expr(:block, LineNumberNode(2), :a, LineNumberNode(3), :b))
317+
end
318+
276319
@testset "where" begin
277320
@test parsestmt(Expr, "A where {X, Y; Z}") == Expr(:where, :A, Expr(:parameters, :Z), :X, :Y)
278321
end
@@ -289,6 +332,24 @@
289332
# @__dot__
290333
@test parsestmt(Expr, "@.") == Expr(:macrocall, Symbol("@__dot__"), LineNumberNode(1))
291334
@test parsestmt(Expr, "using A: @.") == Expr(:using, Expr(Symbol(":"), Expr(:., :A), Expr(:., Symbol("@__dot__"))))
335+
336+
# var""
337+
@test parsestmt(Expr, "@var\"#\" a") == Expr(:macrocall, Symbol("@#"), LineNumberNode(1), :a)
338+
@test parsestmt(Expr, "A.@var\"#\" a") == Expr(:macrocall, Expr(:., :A, QuoteNode(Symbol("@#"))), LineNumberNode(1), :a)
339+
340+
# Square brackets
341+
@test parsestmt(Expr, "@S[a,b]") ==
342+
Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:vect, :a, :b))
343+
@test parsestmt(Expr, "@S[a b]") ==
344+
Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:hcat, :a, :b))
345+
@test parsestmt(Expr, "@S[a; b]") ==
346+
Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:vcat, :a, :b))
347+
@test parsestmt(Expr, "@S[a ;; b]", version=v"1.7") ==
348+
Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:ncat, 2, :a, :b))
349+
end
350+
351+
@testset "vect" begin
352+
@test parsestmt(Expr, "[x,y ; z]") == Expr(:vect, Expr(:parameters, :z), :x, :y)
292353
end
293354

294355
@testset "try" begin
@@ -360,6 +421,47 @@
360421
Expr(:struct, false, :A, Expr(:block, LineNumberNode(1)))
361422
@test parsestmt(Expr, "mutable struct A end") ==
362423
Expr(:struct, true, :A, Expr(:block, LineNumberNode(1)))
424+
425+
@test parsestmt(Expr, "struct A <: B \n a::X \n end") ==
426+
Expr(:struct, false, Expr(:<:, :A, :B),
427+
Expr(:block, LineNumberNode(2), Expr(:(::), :a, :X)))
428+
@test parsestmt(Expr, "struct A \n a \n b \n end") ==
429+
Expr(:struct, false, :A,
430+
Expr(:block, LineNumberNode(2), :a, LineNumberNode(3), :b))
431+
@test parsestmt(Expr, "struct A const a end", version=v"1.8") ==
432+
Expr(:struct, false, :A, Expr(:block, LineNumberNode(1), Expr(:const, :a)))
433+
end
434+
435+
@testset "export" begin
436+
@test parsestmt(Expr, "export a") == Expr(:export, :a)
437+
@test parsestmt(Expr, "export @a") == Expr(:export, Symbol("@a"))
438+
@test parsestmt(Expr, "export @var\"'\"") == Expr(:export, Symbol("@'"))
439+
@test parsestmt(Expr, "export a, \n @b") == Expr(:export, :a, Symbol("@b"))
440+
@test parsestmt(Expr, "export +, ==") == Expr(:export, :+, :(==))
441+
@test parsestmt(Expr, "export \n a") == Expr(:export, :a)
442+
end
443+
444+
@testset "global/const/local" begin
445+
@test parsestmt(Expr, "global x") == Expr(:global, :x)
446+
@test parsestmt(Expr, "local x") == Expr(:local, :x)
447+
@test parsestmt(Expr, "global x,y") == Expr(:global, :x, :y)
448+
@test parsestmt(Expr, "global const x = 1") == Expr(:const, Expr(:global, Expr(:(=), :x, 1)))
449+
@test parsestmt(Expr, "local const x = 1") == Expr(:const, Expr(:local, Expr(:(=), :x, 1)))
450+
@test parsestmt(Expr, "const global x = 1") == Expr(:const, Expr(:global, Expr(:(=), :x, 1)))
451+
@test parsestmt(Expr, "const local x = 1") == Expr(:const, Expr(:local, Expr(:(=), :x, 1)))
452+
@test parsestmt(Expr, "const x,y = 1,2") == Expr(:const, Expr(:(=), Expr(:tuple, :x, :y), Expr(:tuple, 1, 2)))
453+
@test parsestmt(Expr, "const x = 1") == Expr(:const, Expr(:(=), :x, 1))
454+
@test parsestmt(Expr, "global x ~ 1") == Expr(:global, Expr(:call, :~, :x, 1))
455+
@test parsestmt(Expr, "global x += 1") == Expr(:global, Expr(:+=, :x, 1))
456+
end
457+
458+
@testset "tuples" begin
459+
@test parsestmt(Expr, "(;)") == Expr(:tuple, Expr(:parameters))
460+
@test parsestmt(Expr, "(; a=1)") == Expr(:tuple, Expr(:parameters, Expr(:kw, :a, 1)))
461+
@test parsestmt(Expr, "(; a=1; b=2)") ==
462+
Expr(:tuple, Expr(:parameters, Expr(:parameters, Expr(:kw, :b, 2)), Expr(:kw, :a, 1)))
463+
@test parsestmt(Expr, "(a; b; c,d)") ==
464+
Expr(:tuple, Expr(:parameters, Expr(:parameters, :c, :d), :b), :a)
363465
end
364466

365467
@testset "module" begin

0 commit comments

Comments
 (0)