newtests/unsupported_spread_args/test.js (163 lines of code) (raw):
/*
* @flow
*/
import type {Suite} from "flow-dev-tools/src/test/Suite";
const {suite, test} = require('flow-dev-tools/src/test/Tester');
/* This test suite documents a bunch of places where using spread arguments
* doesn't work, either intentionally or due to us being lazy */
module.exports = (suite(({addFile, addFiles, addCode}) => [
test('idx', [
addCode('declare var idx: $Facebookism$Idx;\n'),
addCode('idx(...arr, obj => obj.foo)')
.newErrors(
`
test.js:8
8: idx(...arr, obj => obj.foo)
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
addCode('idx({}, ...arr)')
.newErrors(
`
test.js:10
10: idx({}, ...arr)
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
addCode('idx(...arr, ...arr)')
.newErrors(
`
test.js:12
12: idx(...arr, ...arr)
^^^ A spread argument is unsupported here. [unsupported-syntax]
test.js:12
12: idx(...arr, ...arr)
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
]),
test('React.createElement', [
addCode('const React = require("react");'),
addCode('React.createElement(...arr, {})')
.newErrors(
`
test.js:7
7: React.createElement(...arr, {})
^^^^^^^^^^^^^ Cannot call \`React.createElement\` because number [1] is not a React component. [not-a-component]
References:
3: const arr = [1,2,3];
^ [1]
test.js:7
7: React.createElement(...arr, {})
^^^^^^^^^^^^^ Cannot call \`React.createElement\` because number [1] is not an object. [not-an-object]
References:
3: const arr = [1,2,3];
^ [1]
`,
),
addCode('React.createElement(({}: any), ...arr)')
.newErrors(
`
test.js:9
9: React.createElement(({}: any), ...arr)
^^^^^^^^^^^^^ Cannot call \`React.createElement\` because number [1] is not an object. [not-an-object]
References:
3: const arr = [1,2,3];
^ [1]
`,
),
addCode('React.createElement(...arr, ...arr)')
.newErrors(
`
test.js:11
11: React.createElement(...arr, ...arr)
^^^^^^^^^^^^^ Cannot call \`React.createElement\` because number [1] is not a React component. [not-a-component]
References:
3: const arr = [1,2,3];
^ [1]
test.js:11
11: React.createElement(...arr, ...arr)
^^^^^^^^^^^^^ Cannot call \`React.createElement\` because number [1] is not an object. [not-an-object]
References:
3: const arr = [1,2,3];
^ [1]
`,
),
]),
test('fun.call()', [
addCode('(function (...args) { return this.bar; }).call(...arr);')
.newErrors(
`
test.js:5
5: (function (...args) { return this.bar; }).call(...arr);
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
]),
test('fun.apply()', [
addCode('(function () { return this.bar; }).apply(...arr);')
.newErrors(
`
test.js:5
5: (function () { return this.bar; }).apply(...arr);
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
addCode('(function () { return this.bar; }).apply(({}: any), ...arr);')
.newErrors(
`
test.js:7
7: (function () { return this.bar; }).apply(({}: any), ...arr);
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
addCode('(function () { return this.bar; }).apply(...arr, ...arr);')
.newErrors(
`
test.js:9
9: (function () { return this.bar; }).apply(...arr, ...arr);
^^^ A spread argument is unsupported here. [unsupported-syntax]
test.js:9
9: (function () { return this.bar; }).apply(...arr, ...arr);
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
]),
test('Object.getPrototypeOf()', [
addCode('Object.getPrototypeOf(...arr)')
.newErrors(
`
test.js:5
5: Object.getPrototypeOf(...arr)
^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
]),
test('Object.assign()', [
addCode('const objArr = [ {x: string}, {y: number}]'),
addCode(`
const o1 = Object.assign(...objArr);
o1.x;
`)
.newErrors(
`
test.js:8
8: const o1 = Object.assign(...objArr);
^^^^^^ A spread argument is unsupported here. [unsupported-syntax]
`,
),
addCode(`
const o2 = Object.assign({}, ...objArr);
o2.x;
`)
.noNewErrors()
.because('This is actually fine, we just use array element type'),
addCode('Object.assign({}, ...[1])')
.newErrors(
`
test.js:17
17: Object.assign({}, ...[1])
^^^^^^^^^^^^^^^^^^^^^^^^^ Incorrect arguments passed to call of method \`assign\` because number [1] is not an object. [not-an-object]
References:
17: Object.assign({}, ...[1])
^ [1]
`,
)
.because('But this is an error since the array contains non-objects'),
]),
]).beforeEach((({addCode}) => [ addCode('const arr = [1,2,3];') ])): Suite);