From dd28d2bb04649c79354b5ee187b4ed0fea64b16a Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 18 Jan 2019 21:36:08 +0100 Subject: [PATCH 1/5] test(eslint): migrate eslint rule tests from parser to plugin --- .../tests/lib/eslint-rules/no-dupe-args.js | 29 +++ .../tests/lib/eslint-rules/no-redeclare.js | 34 +++ .../lib/eslint-rules/no-restricted-globals.js | 35 +++ .../tests/lib/eslint-rules/no-shadow.js | 28 +++ .../lib/{rules => eslint-rules}/no-undef.js | 26 +- .../tests/lib/eslint-rules/no-unused-vars.js | 34 +++ .../lib/eslint-rules/no-use-before-define.js | 37 +++ .../tests/lib/eslint-rules/strict.js | 51 ++++ .../tests/lib/scope-analysis.ts | 226 ------------------ 9 files changed, 273 insertions(+), 227 deletions(-) create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-dupe-args.js create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-redeclare.js create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-restricted-globals.js create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-shadow.js rename packages/eslint-plugin-typescript/tests/lib/{rules => eslint-rules}/no-undef.js (63%) create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-unused-vars.js create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-use-before-define.js create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-dupe-args.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-dupe-args.js new file mode 100644 index 000000000000..65d2c88314e0 --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-dupe-args.js @@ -0,0 +1,29 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-dupe-args'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: {} + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-dupe-args', rule, { + valid: [ + // https://github.com/eslint/typescript-eslint-parser/issues/535 + ` +function foo({ bar }: { bar: string }) { + console.log(bar); +} + ` + ], + invalid: [] +}); diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-redeclare.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-redeclare.js new file mode 100644 index 000000000000..05b3efa9bb41 --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-redeclare.js @@ -0,0 +1,34 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-redeclare'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: {} + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-redeclare', rule, { + valid: [ + // https://github.com/eslint/typescript-eslint-parser/issues/443 + ` +const Foo = 1; +type Foo = 1; + `, + // https://github.com/eslint/typescript-eslint-parser/issues/535 + ` +function foo({ bar }: { bar: string }) { + console.log(bar); +} + ` + ], + invalid: [] +}); diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-restricted-globals.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-restricted-globals.js new file mode 100644 index 000000000000..a88cb359a5df --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-restricted-globals.js @@ -0,0 +1,35 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-restricted-globals'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: {} + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-restricted-globals', rule, { + valid: [ + // https://github.com/eslint/typescript-eslint-parser/issues/487 + { + code: ` +export default class Test { + private status: string; + getStatus() { + return this.status; + } +} + `, + options: ['status'] + } + ], + invalid: [] +}); diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-shadow.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-shadow.js new file mode 100644 index 000000000000..498e587aaa41 --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-shadow.js @@ -0,0 +1,28 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-shadow'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: {} + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-shadow', rule, { + valid: [ + // https://github.com/eslint/typescript-eslint-parser/issues/459 + ` +type foo = any; +function bar(foo: any) {} + ` + ], + invalid: [] +}); diff --git a/packages/eslint-plugin-typescript/tests/lib/rules/no-undef.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-undef.js similarity index 63% rename from packages/eslint-plugin-typescript/tests/lib/rules/no-undef.js rename to packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-undef.js index ba0603bd1724..1162170253ec 100644 --- a/packages/eslint-plugin-typescript/tests/lib/rules/no-undef.js +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-undef.js @@ -37,7 +37,31 @@ export * from './constants'; export * from './types'; export default Beemo; - ` + `, + // https://github.com/eslint/typescript-eslint-parser/issues/471 + ` +class X { + field = {} +} + `, + // https://github.com/eslint/typescript-eslint-parser/issues/466 + ` +/*globals document, selector */ +const links = document.querySelectorAll( selector ) as NodeListOf + `, + // https://github.com/eslint/typescript-eslint-parser/issues/437 + ` +interface Runnable { + run (): Result + toString (): string +} + `, + // https://github.com/eslint/typescript-eslint-parser/issues/416 + ` +export type SomeThing = { + id: string; +} + ` ], invalid: [] }); diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-unused-vars.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-unused-vars.js new file mode 100644 index 000000000000..1e80a0dd6502 --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-unused-vars.js @@ -0,0 +1,34 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-unused-vars'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: {} + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-unused-vars', rule, { + valid: [ + // https://github.com/eslint/typescript-eslint-parser/issues/535 + ` +import { + observable, +} from 'mobx'; + +export default class ListModalStore { + @observable + orderList: IObservableArray = observable([]); +} + ` + ], + invalid: [] +}); diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-use-before-define.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-use-before-define.js new file mode 100644 index 000000000000..4a16ea4c8a03 --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-use-before-define.js @@ -0,0 +1,37 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-use-before-define'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module' + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-undef', rule, { + valid: [ + // https://github.com/eslint/typescript-eslint-parser/issues/550 + ` +function test(file: Blob) { + const slice: typeof file.slice = + file.slice || (file as any).webkitSlice || (file as any).mozSlice + return slice +} + `, + // https://github.com/eslint/typescript-eslint-parser/issues/435 + ` +interface Foo { + bar: string +} +const bar = 'blah' + ` + ], + invalid: [] +}); diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js new file mode 100644 index 000000000000..d85bcfc9dc40 --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js @@ -0,0 +1,51 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/strict'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module' + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('strict', rule, { + valid: [ + // https://github.com/bradzacher/eslint-plugin-typescript/issues/255 + ` +window.whatevs = { + myFunc() { + console.log('yep'); + } +}; +` + ], + invalid: [ + { + // https://github.com/bradzacher/eslint-plugin-typescript/issues/255 + code: ` +window.whatevs = { + myFunc() { + console.log('yep'); + } +}; +`, + parserOptions: { + sourceType: 'script' + }, + errors: [ + { + message: "Use the function form of 'use strict'.", + line: 3, + column: 9 + } + ] + } + ] +}); diff --git a/packages/typescript-eslint-parser/tests/lib/scope-analysis.ts b/packages/typescript-eslint-parser/tests/lib/scope-analysis.ts index 7d77ccb952d0..8eec626225f1 100644 --- a/packages/typescript-eslint-parser/tests/lib/scope-analysis.ts +++ b/packages/typescript-eslint-parser/tests/lib/scope-analysis.ts @@ -1,4 +1,3 @@ -import { Linter } from 'eslint'; import fs from 'fs'; import path from 'path'; import * as parser from '../../src/parser'; @@ -214,229 +213,4 @@ describe('TypeScript scope analysis', () => { }); } }); - - const linter = new Linter(); - linter.defineParser('@typescript-eslint/parser', parser); - - it('https://github.com/eslint/typescript-eslint-parser/issues/416', () => { - const code = ` -export type SomeThing = { - id: string; -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-undef': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue416.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/435', () => { - const code = ` -interface Foo { - bar: string -} -const bar = 'blah' -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-use-before-define': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue435.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/437', () => { - const code = ` -interface Runnable { - run (): Result - toString (): string -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-undef': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue437.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/443', () => { - const code = ` -const Foo = 1; -type Foo = 1; -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-redeclare': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue443.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/459', () => { - const code = ` -type foo = any; -function bar(foo: any) {} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-shadow': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/466', () => { - const code = ` -/*globals document, selector */ -const links = document.querySelectorAll( selector ) as NodeListOf -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-undef': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/471', () => { - const code = ` -class X { - field = {} -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-undef': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/487', () => { - const code = ` -export default class Test { - private status: string; - getStatus() { - return this.status; - } -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-restricted-globals': ['error', 'status'] - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('1: https://github.com/eslint/typescript-eslint-parser/issues/535', () => { - const code = ` -function foo({ bar }: { bar: string }) { - console.log(bar); -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-dupe-args': 'error', - 'no-redeclare': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('2: https://github.com/eslint/typescript-eslint-parser/issues/535', () => { - const code = ` -import { - observable, -} from 'mobx'; - -export default class ListModalStore { - @observable - orderList: IObservableArray = observable([]); -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-unused-vars': 'error' - }, - parserOptions: { - sourceType: 'module' - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/eslint/typescript-eslint-parser/issues/550', () => { - const code = ` -function test(file: Blob) { - const slice: typeof file.slice = - file.slice || (file as any).webkitSlice || (file as any).mozSlice - return slice -} -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - rules: { - 'no-use-before-define': 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue.ts' }); - - expect(messages).toStrictEqual([]); - }); - - it('https://github.com/bradzacher/eslint-plugin-typescript/issues/255', () => { - const code = ` -window.whatevs = { - myFunc() { - console.log('yep'); - } -}; -`; - const config: Linter.Config = { - parser: '@typescript-eslint/parser', - parserOptions: { - sourceType: 'module' - }, - rules: { - strict: 'error' - } - }; - const messages = linter.verify(code, config, { filename: 'issue255.ts' }); - - expect(messages).toStrictEqual([]); - }); }); From 0518b81307dc5fef93d32cd2f91c5cc7c6d92038 Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 18 Jan 2019 21:40:13 +0100 Subject: [PATCH 2/5] test: add test case for #64 --- .../tests/lib/rules/no-explicit-any.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/eslint-plugin-typescript/tests/lib/rules/no-explicit-any.js b/packages/eslint-plugin-typescript/tests/lib/rules/no-explicit-any.js index 2d69b2267602..2f6e09350055 100644 --- a/packages/eslint-plugin-typescript/tests/lib/rules/no-explicit-any.js +++ b/packages/eslint-plugin-typescript/tests/lib/rules/no-explicit-any.js @@ -673,6 +673,25 @@ type obj = { column: 5 } ] + }, + { + // https://github.com/typescript-eslint/typescript-eslint/issues/64 + code: ` + function test>() {} + const test = >() => {}; + `, + errors: [ + { + message: 'Unexpected any. Specify a different type.', + line: 2, + column: 41 + }, + { + message: 'Unexpected any. Specify a different type.', + line: 3, + column: 41 + } + ] } ] }); From fa43e7285a22c493412656242cb713c45760cb5a Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 18 Jan 2019 21:41:32 +0100 Subject: [PATCH 3/5] test: add test case for #58 --- .../eslint-plugin-typescript/tests/lib/eslint-rules/strict.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js index d85bcfc9dc40..95b78ac1eeec 100644 --- a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/strict.js @@ -18,6 +18,7 @@ const ruleTester = new RuleTester({ ruleTester.run('strict', rule, { valid: [ // https://github.com/bradzacher/eslint-plugin-typescript/issues/255 + // https://github.com/typescript-eslint/typescript-eslint/issues/58 ` window.whatevs = { myFunc() { @@ -29,6 +30,7 @@ window.whatevs = { invalid: [ { // https://github.com/bradzacher/eslint-plugin-typescript/issues/255 + // https://github.com/typescript-eslint/typescript-eslint/issues/58 code: ` window.whatevs = { myFunc() { From bd30ac178c718c555b52fde627ba4041c6dde074 Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 18 Jan 2019 21:43:16 +0100 Subject: [PATCH 4/5] test(eslint): add test case for #23 --- .../lib/eslint-rules/no-implicit-globals.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-implicit-globals.js diff --git a/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-implicit-globals.js b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-implicit-globals.js new file mode 100644 index 000000000000..654c3374ca8b --- /dev/null +++ b/packages/eslint-plugin-typescript/tests/lib/eslint-rules/no-implicit-globals.js @@ -0,0 +1,30 @@ +'use strict'; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('eslint/lib/rules/no-implicit-globals'), + RuleTester = require('eslint').RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 6, + sourceType: 'module' + }, + parser: '@typescript-eslint/parser' +}); + +ruleTester.run('no-implicit-globals', rule, { + valid: [ + // https://github.com/typescript-eslint/typescript-eslint/issues/23 + ` +function foo() { + return "bar"; +} + +module.exports = foo; + ` + ], + invalid: [] +}); From c46e6a9724be36ee4aa9cb0d60821e80e30fe6c0 Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 18 Jan 2019 22:00:35 +0100 Subject: [PATCH 5/5] test(eslint-plugin): add regression test for #25 --- .../tests/lib/rules/no-unused-vars.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin-typescript/tests/lib/rules/no-unused-vars.js b/packages/eslint-plugin-typescript/tests/lib/rules/no-unused-vars.js index 401fdc461b98..8e7a5a8a7892 100644 --- a/packages/eslint-plugin-typescript/tests/lib/rules/no-unused-vars.js +++ b/packages/eslint-plugin-typescript/tests/lib/rules/no-unused-vars.js @@ -518,7 +518,14 @@ enum FormFieldIds { interface IFoo { fieldName: FormFieldIds.EMAIL, } - ` + `, + // https://github.com/typescript-eslint/typescript-eslint/issues/25 + ` +import * as fastify from 'fastify' +import { Server, IncomingMessage, ServerResponse } from 'http' +const server: fastify.FastifyInstance = fastify({}) +server.get('/ping') + ` ], invalid: [