Skip to content

Commit

Permalink
prefer-dom-node-remove: Use snapshot test (#2333)
Browse files Browse the repository at this point in the history
  • Loading branch information
fisker committed May 7, 2024
1 parent 99489b9 commit f3771b1
Show file tree
Hide file tree
Showing 3 changed files with 907 additions and 259 deletions.
326 changes: 67 additions & 259 deletions test/prefer-dom-node-remove.mjs
Expand Up @@ -4,64 +4,7 @@ import notDomNodeTypes from './utils/not-dom-node-types.mjs';

const {test} = getTester(import.meta);

const ERROR_MESSAGE_ID = 'error';
const SUGGESTION_MESSAGE_ID = 'suggestion';

const invalidTestCase = ({code, output, suggestionOutput, suggestionOutputs}) => {
if (suggestionOutput) {
return {
code,
errors: [
{
messageId: ERROR_MESSAGE_ID,
suggestions: [
{
messageId: SUGGESTION_MESSAGE_ID,
data: {dotOrQuestionDot: '.'},
output: suggestionOutput,
},
],
},
],
};
}

if (suggestionOutputs) {
return {
code,
errors: [
{
messageId: ERROR_MESSAGE_ID,
suggestions: [
{
messageId: SUGGESTION_MESSAGE_ID,
data: {dotOrQuestionDot: '?.'},
output: suggestionOutputs[0],
},
{
messageId: SUGGESTION_MESSAGE_ID,
data: {dotOrQuestionDot: '.'},
output: suggestionOutputs[1],
},
],
},
],
};
}

return {
code,
output,
errors: [
{
messageId: ERROR_MESSAGE_ID,
suggestions: undefined,
},
],
};
};

test({
test.snapshot({
valid: [
'foo.remove()',
'this.remove()',
Expand Down Expand Up @@ -93,217 +36,82 @@ test({
],
invalid: [
// Auto fix
{
code: 'parentNode.removeChild(foo)',
output: 'foo.remove()',
},
{
code: 'parentNode.removeChild(this)',
output: 'this.remove()',
},
{
code: 'parentNode.removeChild(some.node)',
output: 'some.node.remove()',
},
{
code: 'parentNode.removeChild(getChild())',
output: 'getChild().remove()',
},
{
code: 'parentNode.removeChild(lib.getChild())',
output: 'lib.getChild().remove()',
},
{
code: 'parentNode.removeChild((() => childNode)())',
output: '(() => childNode)().remove()',
},
'parentNode.removeChild(foo)',
'parentNode.removeChild(this)',
'parentNode.removeChild(some.node)',
'parentNode.removeChild(getChild())',
'parentNode.removeChild(lib.getChild())',
'parentNode.removeChild((() => childNode)())',

// Need parenthesized
{
code: outdent`
async function foo () {
parentNode.removeChild(
await getChild()
);
}
`,
output: outdent`
async function foo () {
(await getChild()).remove();
}
`,
},
{
code: outdent`
async function foo () {
parentNode.removeChild(
(await getChild())
);
}
`,
output: outdent`
async function foo () {
(await getChild()).remove();
}
`,
},
{
code: 'parentNode.removeChild((0, child))',
output: '(0, child).remove()',
},
{
code: 'parentNode.removeChild( ( (new Image)) )',
output: '( (new Image)).remove()',
},
{
code: 'parentNode.removeChild( new Audio )',
output: '(new Audio).remove()',
},
outdent`
async function foo () {
parentNode.removeChild(
await getChild()
);
}
`,
outdent`
async function foo () {
parentNode.removeChild(
(await getChild())
);
}
`,
'parentNode.removeChild((0, child))',
'parentNode.removeChild( ( (new Image)) )',
'parentNode.removeChild( new Audio )',

// Need semicolon
{
code: outdent`
outdent`
const array = []
parentNode.removeChild([a, b, c].reduce(child => child, child))
`,
outdent`
async function foo () {
const array = []
parentNode.removeChild([a, b, c].reduce(child => child, child))
`,
output: outdent`
parentNode.removeChild(
await getChild()
);
}
`,
outdent`
async function foo () {
const array = []
;[a, b, c].reduce(child => child, child).remove()
`,
},
{
code: outdent`
async function foo () {
const array = []
parentNode.removeChild(
await getChild()
);
}
`,
output: outdent`
async function foo () {
const array = []
;(await getChild()).remove();
}
`,
},
{
code: outdent`
async function foo () {
const array = []
parentNode.removeChild(
(0, childNode)
);
}
`,
output: outdent`
async function foo () {
const array = []
;(0, childNode).remove();
}
`,
},
parentNode.removeChild(
(0, childNode)
);
}
`,

// Value of `parentNode.removeChild` call is use
{
code: 'if (parentNode.removeChild(foo)) {}',
suggestionOutput: 'if (foo.remove()) {}',
},
{
code: 'var removed = parentNode.removeChild(child);',
suggestionOutput: 'var removed = child.remove();',
},
{
code: 'const foo = parentNode.removeChild(child);',
suggestionOutput: 'const foo = child.remove();',
},
{
code: 'foo.bar(parentNode.removeChild(child));',
suggestionOutput: 'foo.bar(child.remove());',
},
{
code: 'parentNode.removeChild(child) || "foo";',
suggestionOutput: 'child.remove() || "foo";',
},
{
code: 'parentNode.removeChild(child) + 0;',
suggestionOutput: 'child.remove() + 0;',
},
{
code: '+parentNode.removeChild(child);',
suggestionOutput: '+child.remove();',
},
{
code: 'parentNode.removeChild(child) ? "foo" : "bar";',
suggestionOutput: 'child.remove() ? "foo" : "bar";',
},
{
code: 'if (parentNode.removeChild(child)) {}',
suggestionOutput: 'if (child.remove()) {}',
},
{
code: 'const foo = [parentNode.removeChild(child)]',
suggestionOutput: 'const foo = [child.remove()]',
},
{
code: 'const foo = { bar: parentNode.removeChild(child) }',
suggestionOutput: 'const foo = { bar: child.remove() }',
},
{
code: 'function foo() { return parentNode.removeChild(child); }',
suggestionOutput: 'function foo() { return child.remove(); }',
},
{
code: 'const foo = () => { return parentElement.removeChild(child); }',
suggestionOutput: 'const foo = () => { return child.remove(); }',
},
{
code: 'foo(bar = parentNode.removeChild(child))',
suggestionOutput: 'foo(bar = child.remove())',
},
'if (parentNode.removeChild(foo)) {}',
'var removed = parentNode.removeChild(child);',
'const foo = parentNode.removeChild(child);',
'foo.bar(parentNode.removeChild(child));',
'parentNode.removeChild(child) || "foo";',
'parentNode.removeChild(child) + 0;',
'+parentNode.removeChild(child);',
'parentNode.removeChild(child) ? "foo" : "bar";',
'if (parentNode.removeChild(child)) {}',
'const foo = [parentNode.removeChild(child)]',
'const foo = { bar: parentNode.removeChild(child) }',
'function foo() { return parentNode.removeChild(child); }',
'const foo = () => { return parentElement.removeChild(child); }',
'foo(bar = parentNode.removeChild(child))',

// `parentNode` has side effect
{
code: 'foo().removeChild(child)',
suggestionOutput: 'child.remove()',
},
{
code: 'foo[doSomething()].removeChild(child)',
suggestionOutput: 'child.remove()',
},
'foo().removeChild(child)',
'foo[doSomething()].removeChild(child)',
// Optional parent
{
code: 'parentNode?.removeChild(foo)',
suggestionOutputs: ['foo?.remove()', 'foo.remove()'],
},
{
code: 'foo?.parentNode.removeChild(foo)',
output: 'foo?.remove()',
},
{
code: 'foo.parentNode?.removeChild(foo)',
suggestionOutputs: ['foo?.remove()', 'foo.remove()'],
},
{
code: 'foo?.parentNode?.removeChild(foo)',
suggestionOutputs: ['foo?.remove()', 'foo.remove()'],
},
{
code: 'foo.bar?.parentNode.removeChild(foo.bar)',
suggestionOutputs: ['foo.bar?.remove()', 'foo.bar.remove()'],
},
{
code: 'a.b?.c.parentNode.removeChild(foo)',
suggestionOutputs: ['foo?.remove()', 'foo.remove()'],
},
{
code: 'a[b?.c].parentNode.removeChild(foo)',
output: 'foo.remove()',
},
'parentNode?.removeChild(foo)',
'foo?.parentNode.removeChild(foo)',
'foo.parentNode?.removeChild(foo)',
'foo?.parentNode?.removeChild(foo)',
'foo.bar?.parentNode.removeChild(foo.bar)',
'a.b?.c.parentNode.removeChild(foo)',
'a[b?.c].parentNode.removeChild(foo)',
// The suggestions are bad, since they will break code
{
code: 'a?.b.parentNode.removeChild(a.b)',
suggestionOutputs: ['a.b?.remove()', 'a.b.remove()'],
},
].map(options => invalidTestCase(options)),
'a?.b.parentNode.removeChild(a.b)',
],
});

0 comments on commit f3771b1

Please sign in to comment.