From 2e6d332e10bab32a528f46f71c4b8590d97ba5a6 Mon Sep 17 00:00:00 2001 From: Jeff Bean Date: Sat, 11 Aug 2018 21:17:02 -0700 Subject: [PATCH 1/7] Adding new 'gotests' flags option. gotests has many options not used for vscode by default. This allows similar flags to other tools like lint and build where they are just free formed flags. The one difference here is some arguments have values needed but we are not validating on any specific flags and go with flexibility. The main use case here is the new 'template_dir' flag added to allow users to define custom templates. --- package.json | 9 +++++ src/goGenerateTests.ts | 77 ++++++++++++++++++++++++++++++++---------- src/goMain.ts | 8 +++-- test/go.test.ts | 8 ++--- 4 files changed, 78 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 483e5ea96..7e58926e2 100644 --- a/package.json +++ b/package.json @@ -761,6 +761,15 @@ "description": "Flags to pass to `go test`. If null, then buildFlags will be used.", "scope": "resource" }, + "go.genTestsFlags": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "Additional command line flags to pass to `gotests`.", + "scope": "resource" + }, "go.toolsEnvVars": { "type": "object", "default": {}, diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts index 63b4fbc9b..b662ad94d 100644 --- a/src/goGenerateTests.ts +++ b/src/goGenerateTests.ts @@ -12,8 +12,12 @@ import vscode = require('vscode'); import { getBinPath, getToolsEnvVars } from './util'; import { promptForMissingTool } from './goInstallTools'; import { GoDocumentSymbolProvider } from './goOutline'; +import { outputChannel } from './goStatus'; const generatedWord = 'Generated '; +export const FUNCTION_TYPE = 'function'; +export const FILE_TYPE = 'file'; +export const PACKAGE_TYPE = 'package'; /** * If current active editor has a Go file, returns the editor. @@ -64,30 +68,54 @@ export function toggleTestFile(): void { vscode.commands.executeCommand('vscode.open', vscode.Uri.file(targetFilePath)); } -export function generateTestCurrentPackage(): Thenable { +function getGoConfigObject(editor: vscode.TextEditor): vscode.WorkspaceConfiguration { + let documentUri = editor ? editor.document.uri : null; + return vscode.workspace.getConfiguration('go', documentUri); +} + +/** + * + * @param type The type of tests to generate. In this case a simple string to indicate what + * type of tests we need to create, function, file, or package + */ +export function GenerateTests(type: string): Thenable { let editor = checkActiveEditor(); if (!editor) { return; } + + let goConfig = getGoConfigObject(editor); + + switch (type) { + case PACKAGE_TYPE: + return generateTestCurrentPackage(editor, goConfig); + case FILE_TYPE: + return generateTestCurrentFile(editor, goConfig); + case FUNCTION_TYPE: + return generateTestCurrentFunction(editor, goConfig); + default: + vscode.window.showErrorMessage('unknown type passed to generate tests: ' + type); + return Promise.resolve(false); + } +} + +function generateTestCurrentPackage(editor: vscode.TextEditor, goConfig: vscode.WorkspaceConfiguration): Thenable { let dir = path.dirname(editor.document.uri.fsPath); - return generateTests({ dir: dir }); + const goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; + return generateTests({ dir: dir, genFlags: goGenerateTestsFlags }); } -export function generateTestCurrentFile(): Thenable { - let editor = checkActiveEditor(); - if (!editor) { - return; - } +function generateTestCurrentFile(editor: vscode.TextEditor, goConfig: vscode.WorkspaceConfiguration): Thenable { let file = editor.document.uri.fsPath; - return generateTests({ dir: file }); + const goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; + return generateTests({ dir: file, genFlags: goGenerateTestsFlags }); } -export function generateTestCurrentFunction(): Thenable { - let editor = checkActiveEditor(); - if (!editor) { - return; - } +function generateTestCurrentFunction(editor: vscode.TextEditor, goConfig: vscode.WorkspaceConfiguration): Thenable { let file = editor.document.uri.fsPath; + + const goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; + return getFunctions(editor.document).then(functions => { let currentFunction: vscode.SymbolInformation; for (let func of functions) { @@ -105,7 +133,7 @@ export function generateTestCurrentFunction(): Thenable { if (funcName.includes('.')) { funcName = funcName.split('.')[1]; } - return generateTests({ dir: file, func: funcName }); + return generateTests({ dir: file, func: funcName , genFlags: goGenerateTestsFlags }); }); } @@ -117,6 +145,10 @@ interface Config { * The working directory for `gotests`. */ dir: string; + /** + * Optional Template dir for any custom templates for `gotests`. + */ + genFlags: string[]; /** * Specific function names to generate tests squeleton. */ @@ -126,13 +158,21 @@ interface Config { function generateTests(conf: Config): Thenable { return new Promise((resolve, reject) => { let cmd = getBinPath('gotests'); - let args; + let args = ['-w']; + + conf.genFlags.forEach(flag => { + args.push(flag); + }); + if (conf.func) { - args = ['-w', '-only', `^${conf.func}$`, conf.dir]; + args = args.concat(['-only', `^${conf.func}$`, conf.dir]); } else { - args = ['-w', '-all', conf.dir]; + args = args.concat(['-all', conf.dir]); } + cp.execFile(cmd, args, {env: getToolsEnvVars()}, (err, stdout, stderr) => { + outputChannel.appendLine('Generating Tests: ' + cmd + ' ' + args.join(' ')); + try { if (err && (err).code === 'ENOENT') { promptForMissingTool('gotests'); @@ -140,6 +180,7 @@ function generateTests(conf: Config): Thenable { } if (err) { console.log(err); + outputChannel.appendLine(err.message); return reject('Cannot generate test due to errors'); } @@ -158,6 +199,7 @@ function generateTests(conf: Config): Thenable { } vscode.window.showInformationMessage(message); + outputChannel.append(message); if (testsGenerated) { toggleTestFile(); } @@ -165,6 +207,7 @@ function generateTests(conf: Config): Thenable { return resolve(true); } catch (e) { vscode.window.showInformationMessage(e.msg); + outputChannel.append(e.msg); reject(e); } }); diff --git a/src/goMain.ts b/src/goMain.ts index f0aedf9d0..540c0f856 100644 --- a/src/goMain.ts +++ b/src/goMain.ts @@ -329,15 +329,15 @@ export function activate(ctx: vscode.ExtensionContext): void { })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.package', () => { - goGenerateTests.generateTestCurrentPackage(); + goGenerateTests.GenerateTests(goGenerateTests.PACKAGE_TYPE); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.file', () => { - goGenerateTests.generateTestCurrentFile(); + goGenerateTests.GenerateTests(goGenerateTests.FILE_TYPE); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.function', () => { - goGenerateTests.generateTestCurrentFunction(); + goGenerateTests.GenerateTests(goGenerateTests.FUNCTION_TYPE); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.toggle.test.file', () => { @@ -424,6 +424,7 @@ function sendTelemetryEventForConfig(goConfig: vscode.WorkspaceConfiguration) { "buildTags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, "formatTool": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "formatFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, + "genTestsFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, "lintOnSave": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "lintFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, "lintTool": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, @@ -465,6 +466,7 @@ function sendTelemetryEventForConfig(goConfig: vscode.WorkspaceConfiguration) { lintOnSave: goConfig['lintOnSave'] + '', lintFlags: goConfig['lintFlags'], lintTool: goConfig['lintTool'], + genTestsFlags: goConfig['genTestsFlags'], vetOnSave: goConfig['vetOnSave'] + '', vetFlags: goConfig['vetFlags'], testOnSave: goConfig['testOnSave'] + '', diff --git a/test/go.test.ts b/test/go.test.ts index 2fe2cf6b7..82e0a3cf4 100644 --- a/test/go.test.ts +++ b/test/go.test.ts @@ -20,7 +20,7 @@ import { testCurrentFile } from '../src/goTest'; import { getBinPath, getGoVersion, isVendorSupported } from '../src/util'; import { documentSymbols } from '../src/goOutline'; import { listPackages, getTextEditForAddImport } from '../src/goImport'; -import { generateTestCurrentFile, generateTestCurrentPackage, generateTestCurrentFunction } from '../src/goGenerateTests'; +import { GenerateTests, FUNCTION_TYPE, PACKAGE_TYPE, FILE_TYPE } from '../src/goGenerateTests'; import { getAllPackages } from '../src/goPackages'; import { getImportPath } from '../src/util'; import { goPlay } from '../src/goPlayground'; @@ -302,7 +302,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generateTestsSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return generateTestCurrentFile().then((result: boolean) => { + return GenerateTests(FILE_TYPE).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -331,7 +331,7 @@ It returns the number of bytes written and any write error encountered. assert(vscode.window.activeTextEditor, 'No active editor'); let selection = new vscode.Selection(5, 0, 6, 0); editor.selection = selection; - return generateTestCurrentFunction().then((result: boolean) => { + return GenerateTests(FUNCTION_TYPE).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -357,7 +357,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generatePackageTestSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return generateTestCurrentPackage().then((result: boolean) => { + return GenerateTests(PACKAGE_TYPE).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); From 77ae6efbba3a44d4b94c27a4311c3c7463f5586f Mon Sep 17 00:00:00 2001 From: Jeff Bean Date: Mon, 13 Aug 2018 09:54:56 -0700 Subject: [PATCH 2/7] Change to Enum since that's the best fit here --- src/goGenerateTests.ts | 28 +++++++++++++++++----------- src/goMain.ts | 6 +++--- test/go.test.ts | 8 ++++---- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts index b662ad94d..4bdf11140 100644 --- a/src/goGenerateTests.ts +++ b/src/goGenerateTests.ts @@ -15,9 +15,15 @@ import { GoDocumentSymbolProvider } from './goOutline'; import { outputChannel } from './goStatus'; const generatedWord = 'Generated '; -export const FUNCTION_TYPE = 'function'; -export const FILE_TYPE = 'file'; -export const PACKAGE_TYPE = 'package'; + +/** + * This enum is the types of generation supported via the gotests tooling + */ +export enum GenerationType { + Function, + File, + Package, +} /** * If current active editor has a Go file, returns the editor. @@ -75,10 +81,10 @@ function getGoConfigObject(editor: vscode.TextEditor): vscode.WorkspaceConfigura /** * - * @param type The type of tests to generate. In this case a simple string to indicate what - * type of tests we need to create, function, file, or package + * @param genType the type of generation we want to use gotests to make us. The GenerationType + * enum has the supported types. */ -export function GenerateTests(type: string): Thenable { +export function GenerateTests(genType: GenerationType): Thenable { let editor = checkActiveEditor(); if (!editor) { return; @@ -86,15 +92,15 @@ export function GenerateTests(type: string): Thenable { let goConfig = getGoConfigObject(editor); - switch (type) { - case PACKAGE_TYPE: + switch (genType) { + case GenerationType.Package: return generateTestCurrentPackage(editor, goConfig); - case FILE_TYPE: + case GenerationType.File: return generateTestCurrentFile(editor, goConfig); - case FUNCTION_TYPE: + case GenerationType.Function: return generateTestCurrentFunction(editor, goConfig); default: - vscode.window.showErrorMessage('unknown type passed to generate tests: ' + type); + vscode.window.showErrorMessage('unknown type passed to generate tests: ' + genType); return Promise.resolve(false); } } diff --git a/src/goMain.ts b/src/goMain.ts index 540c0f856..d8ef67c56 100644 --- a/src/goMain.ts +++ b/src/goMain.ts @@ -329,15 +329,15 @@ export function activate(ctx: vscode.ExtensionContext): void { })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.package', () => { - goGenerateTests.GenerateTests(goGenerateTests.PACKAGE_TYPE); + goGenerateTests.GenerateTests(goGenerateTests.GenerationType.Package); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.file', () => { - goGenerateTests.GenerateTests(goGenerateTests.FILE_TYPE); + goGenerateTests.GenerateTests(goGenerateTests.GenerationType.File); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.function', () => { - goGenerateTests.GenerateTests(goGenerateTests.FUNCTION_TYPE); + goGenerateTests.GenerateTests(goGenerateTests.GenerationType.Function); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.toggle.test.file', () => { diff --git a/test/go.test.ts b/test/go.test.ts index 82e0a3cf4..c95bf6c43 100644 --- a/test/go.test.ts +++ b/test/go.test.ts @@ -20,7 +20,7 @@ import { testCurrentFile } from '../src/goTest'; import { getBinPath, getGoVersion, isVendorSupported } from '../src/util'; import { documentSymbols } from '../src/goOutline'; import { listPackages, getTextEditForAddImport } from '../src/goImport'; -import { GenerateTests, FUNCTION_TYPE, PACKAGE_TYPE, FILE_TYPE } from '../src/goGenerateTests'; +import { GenerateTests, GenerationType } from '../src/goGenerateTests'; import { getAllPackages } from '../src/goPackages'; import { getImportPath } from '../src/util'; import { goPlay } from '../src/goPlayground'; @@ -302,7 +302,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generateTestsSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return GenerateTests(FILE_TYPE).then((result: boolean) => { + return GenerateTests(GenerationType.File).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -331,7 +331,7 @@ It returns the number of bytes written and any write error encountered. assert(vscode.window.activeTextEditor, 'No active editor'); let selection = new vscode.Selection(5, 0, 6, 0); editor.selection = selection; - return GenerateTests(FUNCTION_TYPE).then((result: boolean) => { + return GenerateTests(GenerationType.Function).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -357,7 +357,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generatePackageTestSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return GenerateTests(PACKAGE_TYPE).then((result: boolean) => { + return GenerateTests(GenerationType.Package).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); From 598e0841c395e7b08a2bf95f1fb40a4ce0155cd4 Mon Sep 17 00:00:00 2001 From: Jeff Bean Date: Mon, 13 Aug 2018 17:26:09 -0700 Subject: [PATCH 3/7] Simplify the logic even further --- src/goGenerateTests.ts | 72 +++++++++++------------------------------- src/goMain.ts | 6 ++-- test/go.test.ts | 8 ++--- 3 files changed, 26 insertions(+), 60 deletions(-) diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts index 4bdf11140..bb88c108f 100644 --- a/src/goGenerateTests.ts +++ b/src/goGenerateTests.ts @@ -16,15 +16,6 @@ import { outputChannel } from './goStatus'; const generatedWord = 'Generated '; -/** - * This enum is the types of generation supported via the gotests tooling - */ -export enum GenerationType { - Function, - File, - Package, -} - /** * If current active editor has a Go file, returns the editor. */ @@ -79,48 +70,19 @@ function getGoConfigObject(editor: vscode.TextEditor): vscode.WorkspaceConfigura return vscode.workspace.getConfiguration('go', documentUri); } -/** - * - * @param genType the type of generation we want to use gotests to make us. The GenerationType - * enum has the supported types. - */ -export function GenerateTests(genType: GenerationType): Thenable { - let editor = checkActiveEditor(); - if (!editor) { - return; - } - - let goConfig = getGoConfigObject(editor); - - switch (genType) { - case GenerationType.Package: - return generateTestCurrentPackage(editor, goConfig); - case GenerationType.File: - return generateTestCurrentFile(editor, goConfig); - case GenerationType.Function: - return generateTestCurrentFunction(editor, goConfig); - default: - vscode.window.showErrorMessage('unknown type passed to generate tests: ' + genType); - return Promise.resolve(false); - } +export function generateTestCurrentPackage(uri: vscode.Uri): Thenable { + return generateTests({ dir: path.dirname(uri.fsPath) }); } -function generateTestCurrentPackage(editor: vscode.TextEditor, goConfig: vscode.WorkspaceConfiguration): Thenable { - let dir = path.dirname(editor.document.uri.fsPath); - const goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; - return generateTests({ dir: dir, genFlags: goGenerateTestsFlags }); +export function generateTestCurrentFile(uri: vscode.Uri): Thenable { + return generateTests({ dir: uri.fsPath }); } -function generateTestCurrentFile(editor: vscode.TextEditor, goConfig: vscode.WorkspaceConfiguration): Thenable { - let file = editor.document.uri.fsPath; - const goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; - return generateTests({ dir: file, genFlags: goGenerateTestsFlags }); -} - -function generateTestCurrentFunction(editor: vscode.TextEditor, goConfig: vscode.WorkspaceConfiguration): Thenable { - let file = editor.document.uri.fsPath; - - const goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; +export function generateTestCurrentFunction(uri: vscode.Uri): Thenable { + let editor = checkActiveEditor(); + if (!editor) { + return; + } return getFunctions(editor.document).then(functions => { let currentFunction: vscode.SymbolInformation; @@ -139,7 +101,7 @@ function generateTestCurrentFunction(editor: vscode.TextEditor, goConfig: vscode if (funcName.includes('.')) { funcName = funcName.split('.')[1]; } - return generateTests({ dir: file, func: funcName , genFlags: goGenerateTestsFlags }); + return generateTests({ dir: uri.fsPath, func: funcName }); }); } @@ -151,10 +113,6 @@ interface Config { * The working directory for `gotests`. */ dir: string; - /** - * Optional Template dir for any custom templates for `gotests`. - */ - genFlags: string[]; /** * Specific function names to generate tests squeleton. */ @@ -162,11 +120,19 @@ interface Config { } function generateTests(conf: Config): Thenable { + let editor = checkActiveEditor(); + if (!editor) { + return; + } + + let goConfig = getGoConfigObject(editor); + return new Promise((resolve, reject) => { let cmd = getBinPath('gotests'); let args = ['-w']; + let goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; - conf.genFlags.forEach(flag => { + goGenerateTestsFlags.forEach(flag => { args.push(flag); }); diff --git a/src/goMain.ts b/src/goMain.ts index d8ef67c56..22aca9d4e 100644 --- a/src/goMain.ts +++ b/src/goMain.ts @@ -329,15 +329,15 @@ export function activate(ctx: vscode.ExtensionContext): void { })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.package', () => { - goGenerateTests.GenerateTests(goGenerateTests.GenerationType.Package); + goGenerateTests.generateTestCurrentPackage(vscode.window.activeTextEditor.document.uri); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.file', () => { - goGenerateTests.GenerateTests(goGenerateTests.GenerationType.File); + goGenerateTests.generateTestCurrentFile(vscode.window.activeTextEditor.document.uri); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.function', () => { - goGenerateTests.GenerateTests(goGenerateTests.GenerationType.Function); + goGenerateTests.generateTestCurrentFunction(vscode.window.activeTextEditor.document.uri); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.toggle.test.file', () => { diff --git a/test/go.test.ts b/test/go.test.ts index c95bf6c43..3f23cd352 100644 --- a/test/go.test.ts +++ b/test/go.test.ts @@ -20,7 +20,7 @@ import { testCurrentFile } from '../src/goTest'; import { getBinPath, getGoVersion, isVendorSupported } from '../src/util'; import { documentSymbols } from '../src/goOutline'; import { listPackages, getTextEditForAddImport } from '../src/goImport'; -import { GenerateTests, GenerationType } from '../src/goGenerateTests'; +import { generateTestCurrentFile, generateTestCurrentFunction, generateTestCurrentPackage } from '../src/goGenerateTests'; import { getAllPackages } from '../src/goPackages'; import { getImportPath } from '../src/util'; import { goPlay } from '../src/goPlayground'; @@ -302,7 +302,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generateTestsSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return GenerateTests(GenerationType.File).then((result: boolean) => { + return generateTestCurrentFile(uri).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -331,7 +331,7 @@ It returns the number of bytes written and any write error encountered. assert(vscode.window.activeTextEditor, 'No active editor'); let selection = new vscode.Selection(5, 0, 6, 0); editor.selection = selection; - return GenerateTests(GenerationType.Function).then((result: boolean) => { + return generateTestCurrentFunction(uri).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -357,7 +357,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generatePackageTestSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return GenerateTests(GenerationType.Package).then((result: boolean) => { + return generateTestCurrentPackage(uri).then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); From 6dfb15e04f637f432766d690fd09ca1e24621e99 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 28 Aug 2018 23:50:14 -0700 Subject: [PATCH 4/7] Avoid error from goMain when no active editor --- src/goGenerateTests.ts | 39 +++++++++++++++++++-------------------- src/goMain.ts | 6 +++--- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts index bb88c108f..e5b2ea34d 100644 --- a/src/goGenerateTests.ts +++ b/src/goGenerateTests.ts @@ -65,20 +65,25 @@ export function toggleTestFile(): void { vscode.commands.executeCommand('vscode.open', vscode.Uri.file(targetFilePath)); } -function getGoConfigObject(editor: vscode.TextEditor): vscode.WorkspaceConfiguration { - let documentUri = editor ? editor.document.uri : null; - return vscode.workspace.getConfiguration('go', documentUri); -} - -export function generateTestCurrentPackage(uri: vscode.Uri): Thenable { - return generateTests({ dir: path.dirname(uri.fsPath) }); +export function generateTestCurrentPackage(): Thenable { + let editor = checkActiveEditor(); + if (!editor) { + return; + } + return generateTests({ dir: path.dirname(editor.document.uri.fsPath) }, + vscode.workspace.getConfiguration('go', editor.document.uri)); } -export function generateTestCurrentFile(uri: vscode.Uri): Thenable { - return generateTests({ dir: uri.fsPath }); +export function generateTestCurrentFile(): Thenable { + let editor = checkActiveEditor(); + if (!editor) { + return; + } + return generateTests({ dir: editor.document.uri.fsPath }, + vscode.workspace.getConfiguration('go', editor.document.uri)); } -export function generateTestCurrentFunction(uri: vscode.Uri): Thenable { +export function generateTestCurrentFunction(): Thenable { let editor = checkActiveEditor(); if (!editor) { return; @@ -101,7 +106,8 @@ export function generateTestCurrentFunction(uri: vscode.Uri): Thenable if (funcName.includes('.')) { funcName = funcName.split('.')[1]; } - return generateTests({ dir: uri.fsPath, func: funcName }); + return generateTests({ dir: editor.document.uri.fsPath, func: funcName }, + vscode.workspace.getConfiguration('go', editor.document.uri)); }); } @@ -119,14 +125,7 @@ interface Config { func?: string; } -function generateTests(conf: Config): Thenable { - let editor = checkActiveEditor(); - if (!editor) { - return; - } - - let goConfig = getGoConfigObject(editor); - +function generateTests(conf: Config, goConfig: vscode.WorkspaceConfiguration): Thenable { return new Promise((resolve, reject) => { let cmd = getBinPath('gotests'); let args = ['-w']; @@ -142,7 +141,7 @@ function generateTests(conf: Config): Thenable { args = args.concat(['-all', conf.dir]); } - cp.execFile(cmd, args, {env: getToolsEnvVars()}, (err, stdout, stderr) => { + cp.execFile(cmd, args, { env: getToolsEnvVars() }, (err, stdout, stderr) => { outputChannel.appendLine('Generating Tests: ' + cmd + ' ' + args.join(' ')); try { diff --git a/src/goMain.ts b/src/goMain.ts index 22aca9d4e..0f8ae5a0f 100644 --- a/src/goMain.ts +++ b/src/goMain.ts @@ -329,15 +329,15 @@ export function activate(ctx: vscode.ExtensionContext): void { })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.package', () => { - goGenerateTests.generateTestCurrentPackage(vscode.window.activeTextEditor.document.uri); + goGenerateTests.generateTestCurrentPackage(); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.file', () => { - goGenerateTests.generateTestCurrentFile(vscode.window.activeTextEditor.document.uri); + goGenerateTests.generateTestCurrentFile(); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.test.generate.function', () => { - goGenerateTests.generateTestCurrentFunction(vscode.window.activeTextEditor.document.uri); + goGenerateTests.generateTestCurrentFunction(); })); ctx.subscriptions.push(vscode.commands.registerCommand('go.toggle.test.file', () => { From 7adb034d627236d38ca5eed11d31c94dcdbd3ae9 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 28 Aug 2018 23:56:04 -0700 Subject: [PATCH 5/7] Fix test fails --- test/go.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/go.test.ts b/test/go.test.ts index 3f23cd352..c84d4f8d7 100644 --- a/test/go.test.ts +++ b/test/go.test.ts @@ -302,7 +302,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generateTestsSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return generateTestCurrentFile(uri).then((result: boolean) => { + return generateTestCurrentFile().then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -331,7 +331,7 @@ It returns the number of bytes written and any write error encountered. assert(vscode.window.activeTextEditor, 'No active editor'); let selection = new vscode.Selection(5, 0, 6, 0); editor.selection = selection; - return generateTestCurrentFunction(uri).then((result: boolean) => { + return generateTestCurrentFunction().then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); @@ -357,7 +357,7 @@ It returns the number of bytes written and any write error encountered. let uri = vscode.Uri.file(path.join(generatePackageTestSourcePath, 'generatetests.go')); return vscode.workspace.openTextDocument(uri).then(document => { return vscode.window.showTextDocument(document).then(editor => { - return generateTestCurrentPackage(uri).then((result: boolean) => { + return generateTestCurrentPackage().then((result: boolean) => { assert.equal(result, true); return Promise.resolve(); }); From 8e5c117617c4d7f3c089016f99335a1f9288c36c Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 30 Aug 2018 10:59:08 -0700 Subject: [PATCH 6/7] Avoid duplicate flags --- package.json | 4 ++-- src/goGenerateTests.ts | 16 ++++++++++++---- src/goMain.ts | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 7e58926e2..14656ceee 100644 --- a/package.json +++ b/package.json @@ -761,13 +761,13 @@ "description": "Flags to pass to `go test`. If null, then buildFlags will be used.", "scope": "resource" }, - "go.genTestsFlags": { + "go.generateTestsFlags": { "type": "array", "items": { "type": "string" }, "default": [], - "description": "Additional command line flags to pass to `gotests`.", + "description": "Additional command line flags to pass to `gotests` for generating tests.", "scope": "resource" }, "go.toolsEnvVars": { diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts index e5b2ea34d..d783a5450 100644 --- a/src/goGenerateTests.ts +++ b/src/goGenerateTests.ts @@ -129,11 +129,19 @@ function generateTests(conf: Config, goConfig: vscode.WorkspaceConfiguration): T return new Promise((resolve, reject) => { let cmd = getBinPath('gotests'); let args = ['-w']; - let goGenerateTestsFlags: string[] = goConfig['genTestsFlags'] || []; - - goGenerateTestsFlags.forEach(flag => { + let goGenerateTestsFlags: string[] = goConfig['generateTestsFlags'] || []; + + for (let i = 0; i < goGenerateTestsFlags.length; i++) { + const flag = goGenerateTestsFlags[i]; + if (flag === '-w' || flag == 'all') { + continue; + } + if (flag === '-only') { + i++; + continue; + } args.push(flag); - }); + } if (conf.func) { args = args.concat(['-only', `^${conf.func}$`, conf.dir]); diff --git a/src/goMain.ts b/src/goMain.ts index 0f8ae5a0f..d0a9965a8 100644 --- a/src/goMain.ts +++ b/src/goMain.ts @@ -424,7 +424,7 @@ function sendTelemetryEventForConfig(goConfig: vscode.WorkspaceConfiguration) { "buildTags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, "formatTool": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "formatFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, - "genTestsFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, + "generateTestsFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, "lintOnSave": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "lintFlags": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, "lintTool": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, @@ -466,7 +466,7 @@ function sendTelemetryEventForConfig(goConfig: vscode.WorkspaceConfiguration) { lintOnSave: goConfig['lintOnSave'] + '', lintFlags: goConfig['lintFlags'], lintTool: goConfig['lintTool'], - genTestsFlags: goConfig['genTestsFlags'], + generateTestsFlags: goConfig['generateTestsFlags'], vetOnSave: goConfig['vetOnSave'] + '', vetFlags: goConfig['vetFlags'], testOnSave: goConfig['testOnSave'] + '', From 0ac2f90e60b04daed57e1503744aff16c8cf08fd Mon Sep 17 00:00:00 2001 From: Jeff Bean Date: Thu, 30 Aug 2018 18:59:39 -0700 Subject: [PATCH 7/7] lint fixes --- src/goGenerateTests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts index d783a5450..15e294e00 100644 --- a/src/goGenerateTests.ts +++ b/src/goGenerateTests.ts @@ -130,10 +130,10 @@ function generateTests(conf: Config, goConfig: vscode.WorkspaceConfiguration): T let cmd = getBinPath('gotests'); let args = ['-w']; let goGenerateTestsFlags: string[] = goConfig['generateTestsFlags'] || []; - + for (let i = 0; i < goGenerateTestsFlags.length; i++) { const flag = goGenerateTestsFlags[i]; - if (flag === '-w' || flag == 'all') { + if (flag === '-w' || flag === 'all') { continue; } if (flag === '-only') {