swc_ecma_codegen/
expr.rs

1/// Copied from [ratel][]
2///
3/// [ratel]:https://github.com/ratel-rust/ratel-core
4#[cfg(test)]
5mod tests {
6    use crate::tests::assert_min;
7
8    #[test]
9    fn values() {
10        assert_min("null", "null");
11        assert_min("undefined", "undefined");
12        assert_min("true", "true");
13        assert_min("false", "false");
14        assert_min("42", "42");
15        assert_min("3.14", "3.14");
16        assert_min(r#" 'foobar' "#, r#""foobar""#);
17    }
18
19    #[test]
20    fn bin_expr() {
21        assert_min("1+2+3+4+5", "1+2+3+4+5");
22    }
23
24    #[test]
25    fn template_expression() {
26        assert_min("``", "``");
27        assert_min("foo``", "foo``");
28        assert_min("`foobar`", "`foobar`");
29        assert_min("foo`bar`", "foo`bar`");
30        assert_min("`foo${ 10 }bar${ 20 }baz`", "`foo${10}bar${20}baz`");
31        assert_min("foo`bar${ 10 }baz`", "foo`bar${10}baz`");
32        assert_min("foo`${ 10 }`", "foo`${10}`");
33    }
34
35    #[test]
36    fn sequence_expression() {
37        assert_min("foo, bar, baz;", "foo,bar,baz");
38        assert_min("1, 2, 3;", "1,2,3");
39        assert_min("1,2,3+4;", "1,2,3+4");
40        assert_min("1+2,3,4;", "1+2,3,4");
41        assert_min("1+(2,3,4);", "1+(2,3,4)");
42        assert_min("(1,2,3)+4;", "(1,2,3)+4");
43    }
44
45    #[test]
46    fn binary_expression() {
47        assert_min("a = 10", "a=10");
48        assert_min("a == 10", "a==10");
49        assert_min("a === 10", "a===10");
50        assert_min("a != 10", "a!=10");
51        assert_min("a !== 10", "a!==10");
52        assert_min("a += 10", "a+=10");
53        assert_min("a -= 10", "a-=10");
54        assert_min("a <<= 10", "a<<=10");
55        assert_min("a >>= 10", "a>>=10");
56        assert_min("a >>>= 10", "a>>>=10");
57        assert_min("2 + 2", "2+2");
58        assert_min("2 - 2", "2-2");
59        assert_min("2 * 2", "2*2");
60        assert_min("2 / 2", "2/2");
61        assert_min("2 % 2", "2%2");
62        assert_min("2 ** 2", "2**2");
63        assert_min("2 << 2", "2<<2");
64        assert_min("2 >> 2", "2>>2");
65        assert_min("2 >>> 2", "2>>>2");
66        assert_min("foo in bar", "foo in bar");
67        assert_min("foo instanceof Foo", "foo instanceof Foo");
68
69        assert_min("foo() in b", "foo()in b");
70        assert_min("typeof foo() in b", "typeof foo()in b");
71        assert_min("`` in b", "``in b");
72        assert_min("a?.foo() in b", "a?.foo()in b");
73        assert_min("++a[1] in b", "++a[1]in b");
74        assert_min("a++ in foo", "a++in foo");
75        assert_min("``+`` in b", "``+``in b");
76        assert_min("new Foo(a) in b", "new Foo(a)in b");
77
78        assert_min("new Foo() in b", "new Foo in b");
79        assert_min("++a in b", "++a in b");
80    }
81
82    #[test]
83    fn prefix_expression() {
84        assert_min("+foo", "+foo");
85        assert_min("-foo", "-foo");
86        assert_min("!foo", "!foo");
87        assert_min("~foo", "~foo");
88        assert_min("++foo", "++foo");
89        assert_min("--foo", "--foo");
90        assert_min("new foo", "new foo");
91        assert_min("new foo()", "new foo");
92        assert_min("new foo().bar()", "new foo().bar()");
93        assert_min("void foo", "void foo");
94        assert_min("typeof foo", "typeof foo");
95    }
96
97    #[test]
98    fn postfix_expression() {
99        assert_min("foo++", "foo++");
100        assert_min("foo--", "foo--");
101    }
102
103    #[test]
104    fn conditional_expression() {
105        assert_min("true ? foo : bar", "true?foo:bar")
106    }
107
108    #[test]
109    fn function_expression() {
110        assert_min("(function () {})", "(function(){})");
111        assert_min("(function foo() {})", "(function foo(){})");
112    }
113
114    #[test]
115    #[ignore]
116    fn class_expression() {
117        assert_min("(class {})", "(class{})");
118        assert_min("(class Foo {})", "(class Foo{})");
119        assert_min("(class extends Foo {})", "(class extends Foo{})");
120        assert_min("(class Foo extends Bar {})", "(class Foo extends Bar{})");
121    }
122
123    #[test]
124    fn call_expression() {
125        assert_min("foobar();", "foobar()");
126        assert_min("foobar(1, 2, 3);", "foobar(1,2,3)");
127    }
128
129    #[test]
130    fn member_expression() {
131        assert_min("foo.bar", "foo.bar");
132        assert_min("this.bar", "this.bar");
133        assert_min("10..fooz", "10..fooz");
134        assert_min("foo[10]", "foo[10]");
135        assert_min(r#"foo["bar"]"#, r#"foo["bar"]"#);
136    }
137
138    #[test]
139    fn array_expression() {
140        assert_min("[]", "[]");
141        assert_min("[foo]", "[foo]");
142        assert_min("[foo,bar]", "[foo,bar]");
143        assert_min("[foo,bar,baz,]", "[foo,bar,baz]");
144    }
145
146    #[test]
147    fn array_spread() {
148        assert_min("[...foo,...bar]", "[...foo,...bar]");
149    }
150
151    #[test]
152    fn sparse_array_expression() {
153        assert_min("[]", "[]");
154        assert_min("[,]", "[,]");
155        assert_min("[,1]", "[,1]");
156        assert_min("[,,];", "[,,]");
157        assert_min("[1,,];", "[1,,]");
158        assert_min("[,,1];", "[,,1]");
159    }
160
161    // #[test]
162    // fn sparse_array_expression_pretty() {
163    //     assert_pretty("[]", "[];");
164    //     assert_pretty("[,]", "[, ];");
165    //     assert_pretty("[1,]", "[1, ];");
166    //     assert_pretty("[,1]", "[, 1];");
167    //     assert_pretty("[,,];", "[, , ];");
168    //     assert_pretty("[1,,];", "[1, , ];");
169    //     assert_pretty("[,,1];", "[, , 1];");
170    // }
171
172    #[test]
173    fn object_expression() {
174        assert_min("({});", "({})");
175        assert_min("({ foo });", "({foo})");
176        assert_min("({ foo: 10 });", "({foo:10})");
177        assert_min("({ foo, bar });", "({foo,bar})");
178        assert_min("({ foo: 10, bar: 20 });", "({foo:10,bar:20})");
179        assert_min("({ foo: 10, bar() {} });", "({foo:10,bar(){}})");
180        assert_min("({ foo(bar, baz) {} });", "({foo(bar,baz){}})");
181        // let expected = "({\n    foo: true,\n    bar: false\n});";
182        // assert_pretty("({ foo: true, bar: false })", expected);
183    }
184
185    #[test]
186    fn binding_power() {
187        assert_min("1 + 2 * 3;", "1+2*3");
188        assert_min("1 + 2 * 3;", "1+2*3");
189        assert_min("(1 + 2) * 3;", "(1+2)*3");
190        assert_min(
191            "(denominator / divider * 100).toFixed(2);",
192            "(denominator/divider*100).toFixed(2)",
193        );
194        assert_min("(1 + 1)[0];", "(1+1)[0]");
195        assert_min("2 * 2 / 2;", "2*2/2");
196        assert_min("2 * (2 / 2);", "2*(2/2)");
197        assert_min("2 * 2 / 2;", "2*2/2");
198    }
199
200    #[test]
201    fn regression_increments() {
202        assert_min("x++ + ++y", "x+++ ++y");
203        assert_min("x++ - ++y", "x++-++y");
204    }
205
206    #[test]
207    fn bigint_property_key() {
208        assert_min("({ 1n: 2 });", "({1n:2})");
209        assert_min("(class C { 1n = 1 });", "(class C{1n=1})");
210        assert_min("(class C { 1n () { } });", "(class C{1n(){}})");
211    }
212
213    #[test]
214    fn html_comment() {
215        assert_min("a < !--b && c-- > d;", "a< !--b&&c-- >d");
216    }
217}