From 8c8b47819a6f415c0da773888ed7692cf5d76776 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Thu, 8 Oct 2020 16:40:50 +0200 Subject: [PATCH] fix(string-literal-mutator): don't mutate class property keys (#2544) Don't mutate class property keys that are written as a string literal. ```ts class Foo { 'bar-baz': 4 // don't mutate } ``` --- .../src/mutators/string-literal-mutator.ts | 1 + .../test/integration/instrumenter.it.spec.ts | 3 +++ .../unit/mutators/string-literal-mutator.spec.ts | 6 ++++++ .../testResources/instrumenter/string-mutations.ts | 7 +++++++ .../instrumenter/string-mutations.ts.out.snap | 13 +++++++++++++ 5 files changed, 30 insertions(+) create mode 100644 packages/instrumenter/testResources/instrumenter/string-mutations.ts create mode 100644 packages/instrumenter/testResources/instrumenter/string-mutations.ts.out.snap diff --git a/packages/instrumenter/src/mutators/string-literal-mutator.ts b/packages/instrumenter/src/mutators/string-literal-mutator.ts index eed6d19cb3..4b29b8bd36 100644 --- a/packages/instrumenter/src/mutators/string-literal-mutator.ts +++ b/packages/instrumenter/src/mutators/string-literal-mutator.ts @@ -40,6 +40,7 @@ export class StringLiteralMutator implements NodeMutator { types.isExpressionStatement(parent) || types.isTSLiteralType(parent) || (types.isObjectProperty(parent) && parent.key === child.node) || + (types.isClassProperty(parent) && parent.key === child.node) || (types.isCallExpression(parent) && types.isIdentifier(parent.callee, { name: 'require' })) ); } diff --git a/packages/instrumenter/test/integration/instrumenter.it.spec.ts b/packages/instrumenter/test/integration/instrumenter.it.spec.ts index f6a81db93a..d31bfec03f 100644 --- a/packages/instrumenter/test/integration/instrumenter.it.spec.ts +++ b/packages/instrumenter/test/integration/instrumenter.it.spec.ts @@ -55,6 +55,9 @@ describe('instrumenter integration', () => { it('should be able to instrument switch case statements (using the switchCaseMutantPlacer)', async () => { await arrangeAndActAssert('switch-case.js'); }); + it('should be able to instrument string literals in different places', async () => { + await arrangeAndActAssert('string-mutations.ts'); + }); describe('type declarations', () => { it('should not produce mutants for TS type definitions', async () => { diff --git a/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts b/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts index 51d1d538ff..c04500975e 100644 --- a/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts +++ b/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts @@ -87,6 +87,12 @@ describe(StringLiteralMutator.name, () => { it('should still mutate inside object property values', () => { expectJSMutation(sut, 'const foo = { bar: "baz" };', 'const foo = { bar: "" };'); }); + it('should not mutate class property keys', () => { + expectJSMutation(sut, 'class Foo { "baz-bar" = 4; }'); + }); + it('should mutate class property values', () => { + expectJSMutation(sut, 'class Foo { bar = "4"; }', 'class Foo { bar = ""; }'); + }); }); describe('jsx', () => { diff --git a/packages/instrumenter/testResources/instrumenter/string-mutations.ts b/packages/instrumenter/testResources/instrumenter/string-mutations.ts new file mode 100644 index 0000000000..d842c0e27f --- /dev/null +++ b/packages/instrumenter/testResources/instrumenter/string-mutations.ts @@ -0,0 +1,7 @@ +require('foo'); // no mutation +import 'foo'; // no mutation + +class Foo { + public 'bar-baz': string; // no mutation +} + diff --git a/packages/instrumenter/testResources/instrumenter/string-mutations.ts.out.snap b/packages/instrumenter/testResources/instrumenter/string-mutations.ts.out.snap new file mode 100644 index 0000000000..b995317096 --- /dev/null +++ b/packages/instrumenter/testResources/instrumenter/string-mutations.ts.out.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`instrumenter integration should be able to instrument string literals in different places 1`] = ` +"require('foo'); // no mutation + + +import 'foo'; // no mutation + +class Foo { + public 'bar-baz': string; // no mutation + +}" +`;