diff --git a/packages/javascript-mutator/src/mutators/ArrowFunctionPropertyMutator.ts b/packages/javascript-mutator/src/mutators/ArrowFunctionPropertyMutator.ts new file mode 100644 index 0000000000..b9ef031217 --- /dev/null +++ b/packages/javascript-mutator/src/mutators/ArrowFunctionPropertyMutator.ts @@ -0,0 +1,25 @@ +import * as types from '@babel/types'; + +import { NodeGenerator } from '../helpers/NodeGenerator'; + +import { NodeMutator } from './NodeMutator'; + +/** + * Represents a mutator which can mutate an object shorthand property. + */ +export default class ArrowFunctionPropertyMutator implements NodeMutator { + public name = 'ArrowFunctionProperty'; + + public mutate(node: types.Node): Array<[types.Node, types.Node | { raw: string }]> { + return types.isObjectPattern(node) + ? node.properties + .filter((prop) => types.isObjectProperty(prop) && prop.shorthand) + .map((mutateProp) => [ + node, + NodeGenerator.createMutatedCloneWithProperties(node, { + properties: node.properties.filter((prop) => prop !== mutateProp), + }), + ]) + : []; + } +} diff --git a/packages/javascript-mutator/src/mutators/index.ts b/packages/javascript-mutator/src/mutators/index.ts index 7464040c3c..5424d248e4 100644 --- a/packages/javascript-mutator/src/mutators/index.ts +++ b/packages/javascript-mutator/src/mutators/index.ts @@ -1,6 +1,7 @@ import ArithmeticOperatorMutator from './ArithmeticOperatorMutator'; import ArrayDeclarationMutator from './ArrayDeclarationMutator'; import ArrowFunctionMutator from './ArrowFunctionMutator'; +import ArrowFunctionPropertyMutator from './ArrowFunctionPropertyMutator'; import BlockStatementMutator from './BlockStatementMutator'; import BooleanLiteralMutator from './BooleanLiteralMutator'; import ConditionalExpressionMutator from './ConditionalExpressionMutator'; @@ -15,6 +16,7 @@ export const nodeMutators = Object.freeze([ new ArithmeticOperatorMutator(), new ArrayDeclarationMutator(), new ArrowFunctionMutator(), + new ArrowFunctionPropertyMutator(), new BlockStatementMutator(), new BooleanLiteralMutator(), new ConditionalExpressionMutator(), diff --git a/packages/javascript-mutator/test/unit/mutators/ArrowFunctionPropertyMutator.spec.ts b/packages/javascript-mutator/test/unit/mutators/ArrowFunctionPropertyMutator.spec.ts new file mode 100644 index 0000000000..dbaf477dce --- /dev/null +++ b/packages/javascript-mutator/test/unit/mutators/ArrowFunctionPropertyMutator.spec.ts @@ -0,0 +1,6 @@ +import ArrowFunctionPropertyMutatorSpec from '@stryker-mutator/mutator-specification/src/ArrowFunctionPropertyMutatorSpec'; + +import ArrowFunctionPropertyMutator from '../../../src/mutators/ArrowFunctionPropertyMutator'; +import { verifySpecification } from '../../helpers/mutatorAssertions'; + +verifySpecification(ArrowFunctionPropertyMutatorSpec, ArrowFunctionPropertyMutator); diff --git a/packages/mutator-specification/src/ArrowFunctionPropertyMutatorSpec.ts b/packages/mutator-specification/src/ArrowFunctionPropertyMutatorSpec.ts new file mode 100644 index 0000000000..36be1fbef3 --- /dev/null +++ b/packages/mutator-specification/src/ArrowFunctionPropertyMutatorSpec.ts @@ -0,0 +1,23 @@ +import { expect } from 'chai'; + +import ExpectMutation from './ExpectMutation'; + +export default function ArrowFunctionPropertyMutatorSpec(name: string, expectMutation: ExpectMutation) { + describe('ArrowFunctionPropertyMutator', () => { + it('should have name "ArrowFunctionProperty"', () => { + expect(name).eq('ArrowFunctionProperty'); + }); + + it('should mutate a single object property in an arrow function expression', () => { + expectMutation('({ bar }) => baz', '({}) => baz'); + }); + + it('should mutate multiple object shorthand properties in an arrow function expression', () => { + expectMutation('({ bar, baz = "qux" }) => baz', '({ baz = "qux" }) => baz', '({ bar }) => baz'); + }); + + it('shoud not mutate empty properties in an arrow function expression', () => { + expectMutation('({}) => baz'); + }); + }); +} diff --git a/packages/mutator-specification/src/index.ts b/packages/mutator-specification/src/index.ts index f5f08ebdfd..8b2755630e 100644 --- a/packages/mutator-specification/src/index.ts +++ b/packages/mutator-specification/src/index.ts @@ -1,6 +1,7 @@ export { default as ArithmeticOperatorMutatorSpec } from './ArithmeticOperatorMutatorSpec'; export { default as ArrayDeclarationMutatorSpec } from './ArrayDeclarationMutatorSpec'; export { default as ArrowFunctionMutatorSpec } from './ArrowFunctionMutatorSpec'; +export { default as ArrowFunctionPropertyMutatorSpec } from './ArrowFunctionPropertyMutatorSpec'; export { default as BlockStatementMutatorSpec } from './BlockStatementMutatorSpec'; export { default as BooleanLiteralMutatorSpec } from './BooleanLiteralMutatorSpec'; export { default as ConditionalExpressionMutatorSpec } from './ConditionalExpressionMutatorSpec';