swc/ecmascript/transforms/tests/es2015_for_of.rs
강동윤 8615d69ac3
Fix bugs (#758)
swc_ecma_transforms:
 - Module passes resolver pass now shares 'global' context (Closes #724)
 - TypeScript enums are treated as concrete (Closes #757)
2020-04-30 23:48:52 +09:00

641 lines
12 KiB
Rust

#![feature(box_syntax)]
#![feature(test)]
#![feature(box_patterns)]
#![feature(specialization)]
use swc_common::{chain, Mark};
use swc_ecma_parser::Syntax;
use swc_ecma_transforms::{
compat::es2015::for_of::{for_of, Config},
modules::{amd::amd, common_js::common_js},
};
#[macro_use]
mod common;
fn syntax() -> Syntax {
Default::default()
}
test!(
syntax(),
|_| for_of(Default::default()),
spec_identifier,
r#"for (i of arr) {
}"#,
r#"var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step =
_iterator.next()).done); _iteratorNormalCompletion = true) {
i = _step.value;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}"#,
ok_if_code_eq
);
test!(
syntax(),
|_| for_of(Default::default()),
spec_ignore_cases,
r#"for (var i of foo) {
switch (i) {
case 1:
break;
}
}"#,
r#"var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
for (var _iterator = foo[Symbol.iterator](), _step; !(_iteratorNormalCompletion =
(_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var i = _step.value;
switch (i) {
case 1:
break;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}"#,
ok_if_code_eq
);
test!(
syntax(),
|_| for_of(Default::default()),
spec_let,
r#"for (let i of arr) {
}"#,
r#"
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion =
(_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
let i = _step.value;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}"#,
ok_if_code_eq
);
test!(
syntax(),
|_| for_of(Default::default()),
spec_member_expr,
r#"for (obj.prop of arr) {
}"#,
r#"var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion =
(_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
obj.prop = _step.value;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}"#,
ok_if_code_eq
);
test!(
syntax(),
|_| for_of(Default::default()),
spec_multiple,
r#"for (var i of arr) {
}
for (var i of numbers) {
}
"#,
r#"var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion =
(_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var i = _step.value;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
try {
for (var _iterator1 = numbers[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 =
(_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
var i = _step1.value;
}
} catch (err) {
_didIteratorError1 = true;
_iteratorError1 = err;
} finally {
try {
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
_iterator1.return();
}
} finally {
if (_didIteratorError1) {
throw _iteratorError1;
}
}
}"#,
ok_if_code_eq
);
test!(
syntax(),
|_| for_of(Default::default()),
spec_nested_label_for_of,
r#"b: for (let c of d()) {
for (let e of f()) {
continue b;
}
}"#,
r#"var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
b: for (var _iterator = d()[Symbol.iterator](), _step; !(_iteratorNormalCompletion =
(_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
let c = _step.value;
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
try {
for (var _iterator1 = f()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 =
(_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
let e = _step1.value;
continue b;
}
} catch (err) {
_didIteratorError1 = true;
_iteratorError1 = err;
} finally {
try {
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
_iterator1.return();
}
} finally {
if (_didIteratorError1) {
throw _iteratorError1;
}
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}"#,
ok_if_code_eq
);
test!(
syntax(),
|_| for_of(Default::default()),
spec_var,
r#"for (var i of arr) {
}"#,
r#"var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion =
(_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var i = _step.value;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}"#,
ok_if_code_eq
);
// for_of_as_array_for_of_import_commonjs
test!(
syntax(),
|_| chain!(
for_of(Config { assume_array: true }),
common_js(Mark::fresh(Mark::root()), Default::default())
),
for_of_as_array_for_of_import_commonjs,
r#"
import { array } from "foo";
for (const elm of array) {
console.log(elm);
}
"#,
r#"
"use strict";
var _foo = require("foo");
for(let _i = 0; _i < _foo.array.length; _i++){
const elm = _foo.array[_i];
console.log(elm);
}
"#
);
// for_of_as_array_for_of
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of,
r#"
let elm;
for (elm of array) {
console.log(elm);
}
"#,
r#"
let elm;
for(let _i = 0; _i < array.length; _i++){
elm = array[_i];
console.log(elm);
}
"#
);
// for_of_as_array_for_of_import_amd
test!(
syntax(),
|_| chain!(
for_of(Config { assume_array: true }),
amd(Default::default())
),
for_of_as_array_for_of_import_amd,
r#"
import { array } from "foo";
for (const elm of array) {
console.log(elm);
}
"#,
r#"
define(["foo"], function (_foo) {
"use strict";
for(let _i = 0; _i < _foo.array.length; _i++){
const elm = _foo.array[_i];
console.log(elm);
}
});
"#
);
// for_of_as_array_for_of_array_pattern
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_array_pattern,
r#"
let elm;
for ([elm] of array) {
console.log(elm);
}
"#,
r#"
let elm;
for(let _i = 0; _i < array.length; _i++){
[elm] = array[_i];
console.log(elm);
}
"#
);
// regression_redeclare_array_8913
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
regression_redeclare_array_8913,
r#"
function f(...t) {
for (let o of t) {
const t = o;
}
}
"#,
r#"
function f(...t) {
for(let _i = 0; _i < t.length; _i++){
let o = t[_i];
const t = o;
}
}
"#
);
// for_of_as_array_for_of_declaration_array_pattern
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_declaration_array_pattern,
r#"
for (const [elm] of array) {
console.log(elm);
}
"#,
r#"
for(let _i = 0; _i < array.length; _i++){
const [elm] = array[_i];
console.log(elm);
}
"#
);
// for_of_as_array_for_of_expression
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_expression,
r#"
let i;
for (i of items) i;
"#,
r#"
let i;
for(let _i = 0; _i < items.length; _i++){
i = items[_i];
i;
}
"#
);
// for_of_as_array_for_of_declaration
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_declaration,
r#"
for (const elm of array) {
console.log(elm);
}
"#,
r#"
for(let _i = 0; _i < array.length; _i++){
const elm = array[_i];
console.log(elm);
}
"#
);
// regression_scope_9696
test_exec!(
syntax(),
|_| for_of(Config {
..Default::default()
}),
regression_scope_9696_exec,
r#"
var arr = [1, 2, 3];
var results = [];
for (let v of arr) {
results.push(v);
arr = null;
}
expect(results).toEqual([1, 2, 3]);
"#
);
// for_of_as_array_for_of_static_declaration
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_static_declaration,
r#"
const array = [];
for (const elm of array) {
console.log(elm);
}
"#,
r#"
const array = [];
for(let _i = 0; _i < array.length; _i++){
const elm = array[_i];
console.log(elm);
}
"#
);
// for_of_as_array_for_of_static
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_static,
r#"
const array = [];
let elm;
for (elm of array) {
console.log(elm);
}
"#,
r#"
const array = [];
let elm;
for (let _i = 0; _i < array.length; _i++) {
elm = array[_i];
console.log(elm);
}
"#
);
// for_of_as_array_for_of_import_es2015
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
for_of_as_array_for_of_import_es2015,
r#"
import { array } from "foo";
for (const elm of array) {
console.log(elm);
}
"#,
r#"
import { array } from "foo";
for(let _i = 0; _i < array.length; _i++){
const elm = array[_i];
console.log(elm);
}
"#
);
// regression_label_object_with_comment_4995
test!(
syntax(),
|_| for_of(Config {
..Default::default()
}),
regression_label_object_with_comment_4995,
r#"
myLabel: //woops
for (let a of b) {
continue myLabel;
}
"#,
r#"
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
myLabel: //woops
for (var _iterator = b[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
let a = _step.value;
continue myLabel;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
"#
);
// regression_if_label_3858
test!(
syntax(),
|_| for_of(Config { assume_array: true }),
regression_if_label_3858,
r#"
if ( true )
loop: for (let ch of []) {
}
"#,
r#"
if (true) loop: for(let _i = 0, _iter = []; _i < _iter.length; _i++){
let ch = _iter[_i];
}
"#
);