Skip to content

Commit 8ae49bc

Browse files
committed
Recreated generator module + better test coverage
1 parent def8595 commit 8ae49bc

38 files changed

+3153
-761
lines changed

lib/es_tree/tools/generator.ex

Lines changed: 1145 additions & 456 deletions
Large diffs are not rendered by default.

test/support.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule ESTree.Test.Support do
2+
use ShouldI
3+
4+
alias ESTree.Tools.Generator
5+
6+
defmacro assert_gen(ast, str, opts \\ []) do
7+
opts = Keyword.merge([beauty: true], opts)
8+
beauty = Keyword.get(opts, :beauty)
9+
10+
quote do
11+
assert Generator.generate(unquote(ast), unquote(beauty)) == unquote(str)
12+
end
13+
end
14+
end

test/test_helper.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
ExUnit.start(formatters: [ShouldI.CLIFormatter])
2+
3+
Code.require_file "support.ex", __DIR__
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
defmodule ESTree.Tools.Generator.ArrayExpression.Test do
22
use ShouldI
3+
34
alias ESTree.Tools.Builder
4-
alias ESTree.Tools.Generator
5+
import ESTree.Test.Support
56

67
should "convert array when elements is nil" do
7-
ast = Builder.array_expression(nil)
8-
assert Generator.generate(ast) == "[]"
8+
assert_gen Builder.array_expression(nil), "[]"
99
end
1010

1111
should "convert array when elements is empty" do
12-
ast = Builder.array_expression([])
13-
assert Generator.generate(ast) == "[]"
12+
assert_gen Builder.array_expression([]), "[]"
1413
end
1514

1615
should "convert array when elements contains one element" do
17-
ast = Builder.array_expression([
16+
assert_gen Builder.array_expression([
1817
Builder.literal(1)
19-
])
20-
assert Generator.generate(ast) == "[1]"
18+
]), "[1]"
2119
end
2220

2321
should "convert array when elements contains multiple elements" do
2422
ast = Builder.array_expression([
2523
Builder.literal(1),
26-
Builder.identifier(:a)
24+
Builder.identifier(:a),
25+
Builder.spread_element(Builder.identifier(:b))
2726
])
28-
assert Generator.generate(ast) == "[1, a]"
29-
end
3027

28+
assert_gen ast, "[1, a, ...b]"
29+
assert_gen ast, "[1,a,...b]", beauty: false
30+
end
3131
end
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
defmodule ESTree.Tools.Generator.ArrayPattern.Test do
2+
use ShouldI
3+
4+
alias ESTree.Tools.Builder
5+
import ESTree.Test.Support
6+
7+
should "convert array pattern when elements is nil" do
8+
assert_gen Builder.array_pattern(nil), "[]"
9+
end
10+
11+
should "convert array pattern when elements is empty" do
12+
assert_gen Builder.array_pattern([]), "[]"
13+
end
14+
15+
should "convert array pattern when elements contains one element" do
16+
assert_gen Builder.array_pattern([
17+
Builder.identifier(:a)
18+
]), "[a]"
19+
end
20+
21+
should "convert array pattern when elements contains multiple elements" do
22+
ast = Builder.array_pattern([
23+
Builder.identifier(:a),
24+
Builder.identifier(:b),
25+
Builder.spread_element(Builder.identifier(:c))
26+
])
27+
28+
assert_gen ast, "[a, b, ...c]"
29+
assert_gen ast, "[a,b,...c]", beauty: false
30+
end
31+
end
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
defmodule ESTree.Tools.Generator.ArrowFunctionExpression.Test do
2+
use ShouldI
3+
4+
alias ESTree.Tools.Builder
5+
import ESTree.Test.Support
6+
7+
should "convert basic arrow function" do
8+
ast = Builder.arrow_function_expression(
9+
[],
10+
[],
11+
Builder.block_statement([]),
12+
false,
13+
false
14+
)
15+
16+
assert_gen ast, "() => {}"
17+
assert_gen ast, "()=>{}", beauty: false
18+
end
19+
20+
should "convert basic arrow function returns object" do
21+
ast = Builder.arrow_function_expression(
22+
[],
23+
[],
24+
Builder.object_expression([]),
25+
false,
26+
false
27+
)
28+
29+
assert_gen ast, "() => ({})"
30+
assert_gen ast, "()=>({})", beauty: false
31+
end
32+
33+
should "convert basic arrow function expression generator" do
34+
ast = Builder.arrow_function_expression(
35+
[],
36+
[],
37+
Builder.block_statement([]),
38+
true,
39+
false
40+
)
41+
42+
assert_gen ast, "()* => {}"
43+
assert_gen ast, "()*=>{}", beauty: false
44+
end
45+
46+
should "convert arrow function with params" do
47+
ast = Builder.arrow_function_expression(
48+
[Builder.identifier(:one)],
49+
[],
50+
Builder.block_statement([]),
51+
false,
52+
false
53+
)
54+
55+
assert_gen ast, "(one) => {}"
56+
assert_gen ast, "one=>{}", beauty: false
57+
58+
ast = Builder.arrow_function_expression(
59+
[Builder.identifier(:one), Builder.identifier(:two)],
60+
[],
61+
Builder.block_statement([]),
62+
false,
63+
false
64+
)
65+
66+
assert_gen ast, "(one, two) => {}"
67+
assert_gen ast, "(one,two)=>{}", beauty: false
68+
end
69+
70+
should "convert arrow function with default values" do
71+
ast = Builder.arrow_function_expression(
72+
[Builder.identifier(:one), Builder.identifier(:two)],
73+
[nil, Builder.literal(1)],
74+
Builder.block_statement([]),
75+
false,
76+
false
77+
)
78+
79+
assert_gen ast, "(one, two = 1) => {}"
80+
assert_gen ast, "(one,two=1)=>{}", beauty: false
81+
end
82+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
defmodule ESTree.Tools.Generator.Assignment.Test do
2+
use ShouldI
3+
4+
alias ESTree.Tools.Builder
5+
import ESTree.Test.Support
6+
7+
should "convert assignment expression" do
8+
ast = Builder.assignment_expression(
9+
:=,
10+
Builder.identifier(:a),
11+
Builder.literal(0)
12+
)
13+
14+
assert_gen ast, "a = 0"
15+
assert_gen ast, "a=0", beauty: false
16+
end
17+
end
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
defmodule ESTree.Generator.BinaryExpression.Test do
2+
use ShouldI
3+
4+
alias ESTree.Tools.Builder
5+
import ESTree.Test.Support
6+
7+
should "convert binary expression with correct precedence" do
8+
ast = Builder.binary_expression(
9+
:+,
10+
Builder.literal(1),
11+
Builder.binary_expression(
12+
:/,
13+
Builder.binary_expression(
14+
:*,
15+
Builder.literal(2),
16+
Builder.literal(3)
17+
),
18+
Builder.literal(4)
19+
)
20+
)
21+
22+
assert_gen ast, "1 + 2 * 3 / 4"
23+
assert_gen ast, "1+2*3/4", beauty: false
24+
25+
ast = Builder.binary_expression(
26+
:+,
27+
Builder.literal(1),
28+
Builder.binary_expression(
29+
:*,
30+
Builder.literal(2),
31+
Builder.binary_expression(
32+
:/,
33+
Builder.literal(3),
34+
Builder.literal(4)
35+
)
36+
)
37+
)
38+
39+
assert_gen ast, "1 + 2 * (3 / 4)"
40+
assert_gen ast, "1+2*(3/4)", beauty: false
41+
42+
ast = Builder.binary_expression(
43+
:/,
44+
Builder.binary_expression(
45+
:*,
46+
Builder.binary_expression(
47+
:+,
48+
Builder.literal(1),
49+
Builder.literal(2)
50+
),
51+
Builder.literal(3)
52+
),
53+
Builder.literal(4)
54+
)
55+
56+
assert_gen ast, "(1 + 2) * 3 / 4"
57+
assert_gen ast, "(1+2)*3/4", beauty: false
58+
59+
ast = Builder.binary_expression(
60+
:*,
61+
Builder.binary_expression(
62+
:+,
63+
Builder.literal(1),
64+
Builder.literal(2)
65+
),
66+
Builder.binary_expression(
67+
:/,
68+
Builder.literal(3),
69+
Builder.literal(4)
70+
)
71+
)
72+
73+
assert_gen ast, "(1 + 2) * (3 / 4)"
74+
assert_gen ast, "(1+2)*(3/4)", beauty: false
75+
end
76+
77+
should "convert binary expression in" do
78+
ast = Builder.binary_expression(
79+
:in,
80+
Builder.identifier(:a),
81+
Builder.identifier(:b)
82+
)
83+
84+
assert_gen ast, "(a in b)"
85+
assert_gen ast, "(a in b)", beauty: false
86+
end
87+
88+
should "convert binary expression instanceof" do
89+
ast = Builder.binary_expression(
90+
:instanceof,
91+
Builder.unary_expression(
92+
:!,
93+
true,
94+
Builder.identifier(:x)
95+
),
96+
Builder.identifier(:Number)
97+
)
98+
99+
assert_gen ast, "!x instanceof Number"
100+
assert_gen ast, "!x instanceof Number", beauty: false
101+
102+
ast = Builder.unary_expression(
103+
:!,
104+
true,
105+
Builder.binary_expression(
106+
:instanceof,
107+
Builder.identifier(:x),
108+
Builder.identifier(:Number)
109+
)
110+
)
111+
112+
assert_gen ast, "!(x instanceof Number)"
113+
assert_gen ast, "!(x instanceof Number)", beauty: false
114+
end
115+
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
defmodule ESTree.Tools.Generator.BlockStatement.Test do
2+
use ShouldI
3+
4+
alias ESTree.Tools.Builder
5+
import ESTree.Test.Support
6+
7+
should "convert basic function declaration" do
8+
ast = Builder.function_declaration(
9+
Builder.identifier(:hello),
10+
[],
11+
[],
12+
Builder.block_statement([
13+
Builder.variable_declaration([
14+
Builder.variable_declarator(Builder.identifier(:a), Builder.literal(1)),
15+
Builder.variable_declarator(Builder.identifier(:b)),
16+
Builder.variable_declarator(
17+
Builder.identifier(:c),
18+
Builder.binary_expression(
19+
:+,
20+
Builder.identifier(:a),
21+
Builder.literal(2)
22+
)
23+
)
24+
]),
25+
]),
26+
false,
27+
false
28+
)
29+
30+
str = """
31+
function hello() {
32+
var a = 1,
33+
b,
34+
c = a + 2;
35+
}
36+
"""
37+
38+
assert_gen ast, String.trim(str)
39+
assert_gen ast, "function hello(){var a=1,b,c=a+2;}", beauty: false
40+
end
41+
end

0 commit comments

Comments
 (0)