1#[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]
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 }
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}