forked from DonJayamanne/pythonVSCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisplay.test.ts
More file actions
143 lines (135 loc) · 8.42 KB
/
Copy pathdisplay.test.ts
File metadata and controls
143 lines (135 loc) · 8.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import * as assert from 'assert';
import * as child_process from 'child_process';
import { EOL } from 'os';
import * as path from 'path';
import { ConfigurationTarget, Uri, window, workspace } from 'vscode';
import { PythonSettings } from '../../client/common/configSettings';
import { InterpreterType } from '../../client/interpreter/contracts';
import { InterpreterDisplay } from '../../client/interpreter/display';
import { getFirstNonEmptyLineFromMultilineString } from '../../client/interpreter/helpers';
import { VirtualEnvironmentManager } from '../../client/interpreter/virtualEnvs';
import { clearPythonPathInWorkspaceFolder, rootWorkspaceUri, updateSetting } from '../common';
import { closeActiveWindows, initialize, initializeTest, IS_MULTI_ROOT_TEST } from '../initialize';
import { MockStatusBarItem } from '../mockClasses';
import { MockInterpreterVersionProvider } from './mocks';
import { MockProvider, MockVirtualEnv } from './mocks';
const fileInNonRootWorkspace = path.join(__dirname, '..', '..', '..', 'src', 'test', 'pythonFiles', 'dummy.py');
// tslint:disable-next-line:max-func-body-length
suite('Interpreters Display', () => {
const configTarget = IS_MULTI_ROOT_TEST ? ConfigurationTarget.WorkspaceFolder : ConfigurationTarget.Workspace;
suiteSetup(initialize);
setup(async () => {
await initializeTest();
if (IS_MULTI_ROOT_TEST) {
await initializeMultiRoot();
}
});
teardown(async () => {
await clearPythonPathInWorkspaceFolder(fileInNonRootWorkspace);
await initialize();
await closeActiveWindows();
});
test('Must have command name', () => {
const statusBar = new MockStatusBarItem();
const displayNameProvider = new MockInterpreterVersionProvider('');
// tslint:disable-next-line:no-unused-expression
new InterpreterDisplay(statusBar, new MockProvider([]), new VirtualEnvironmentManager([]), displayNameProvider);
assert.equal(statusBar.command, 'python.setInterpreter', 'Incorrect command name');
});
test('Must get display name from interpreter itself', async () => {
const statusBar = new MockStatusBarItem();
const provider = new MockProvider([]);
const displayName = 'Mock Display Name';
const displayNameProvider = new MockInterpreterVersionProvider(displayName);
const display = new InterpreterDisplay(statusBar, provider, new VirtualEnvironmentManager([]), displayNameProvider);
await display.refresh();
assert.equal(statusBar.text, displayName, 'Incorrect display name');
});
test('Must suffix display name with name of interpreter', async () => {
const statusBar = new MockStatusBarItem();
const provider = new MockProvider([]);
const env1 = new MockVirtualEnv(false, 'Mock 1');
const env2 = new MockVirtualEnv(true, 'Mock 2');
const env3 = new MockVirtualEnv(true, 'Mock 3');
const displayName = 'Mock Display Name';
const displayNameProvider = new MockInterpreterVersionProvider(displayName);
const display = new InterpreterDisplay(statusBar, provider, new VirtualEnvironmentManager([env1, env2, env3]), displayNameProvider);
await display.refresh();
assert.equal(statusBar.text, `${displayName} (${env2.name})`, 'Incorrect display name');
});
test('Must display default \'Display name\' for unknown interpreter', async () => {
const statusBar = new MockStatusBarItem();
const provider = new MockProvider([]);
const displayName = 'Mock Display Name';
const displayNameProvider = new MockInterpreterVersionProvider(displayName, true);
const display = new InterpreterDisplay(statusBar, provider, new VirtualEnvironmentManager([]), displayNameProvider);
// Change interpreter to an invalid value
const pythonPath = 'UnknownInterpreter';
await updateSetting('pythonPath', pythonPath, rootWorkspaceUri, configTarget);
await display.refresh();
const defaultDisplayName = `${path.basename(pythonPath)} [Environment]`;
assert.equal(statusBar.text, defaultDisplayName, 'Incorrect display name');
});
test('Must get display name from a list of interpreters', async () => {
const pythonPath = await new Promise<string>(resolve => {
child_process.execFile(PythonSettings.getInstance(Uri.file(fileInNonRootWorkspace)).pythonPath, ['-c', 'import sys;print(sys.executable)'], (_, stdout) => {
resolve(getFirstNonEmptyLineFromMultilineString(stdout));
});
}).then(value => value.length === 0 ? PythonSettings.getInstance(Uri.file(fileInNonRootWorkspace)).pythonPath : value);
const statusBar = new MockStatusBarItem();
const interpreters = [
{ displayName: 'One', path: 'c:/path1/one.exe', type: InterpreterType.VirtualEnv },
{ displayName: 'Two', path: pythonPath, type: InterpreterType.VirtualEnv },
{ displayName: 'Three', path: 'c:/path3/three.exe', type: InterpreterType.VirtualEnv }
];
const provider = new MockProvider(interpreters);
const displayName = 'Mock Display Name';
const displayNameProvider = new MockInterpreterVersionProvider(displayName, true);
const display = new InterpreterDisplay(statusBar, provider, new VirtualEnvironmentManager([]), displayNameProvider);
await display.refresh();
assert.equal(statusBar.text, interpreters[1].displayName, 'Incorrect display name');
});
test('Must suffix tooltip with the companyDisplayName of interpreter', async () => {
const pythonPath = await new Promise<string>(resolve => {
child_process.execFile(PythonSettings.getInstance(Uri.file(fileInNonRootWorkspace)).pythonPath, ['-c', 'import sys;print(sys.executable)'], (_, stdout) => {
resolve(getFirstNonEmptyLineFromMultilineString(stdout));
});
}).then(value => value.length === 0 ? PythonSettings.getInstance(Uri.file(fileInNonRootWorkspace)).pythonPath : value);
const statusBar = new MockStatusBarItem();
const interpreters = [
{ displayName: 'One', path: 'c:/path1/one.exe', companyDisplayName: 'One 1', type: InterpreterType.VirtualEnv },
{ displayName: 'Two', path: pythonPath, companyDisplayName: 'Two 2', type: InterpreterType.VirtualEnv },
{ displayName: 'Three', path: 'c:/path3/three.exe', companyDisplayName: 'Three 3', type: InterpreterType.VirtualEnv }
];
const provider = new MockProvider(interpreters);
const displayNameProvider = new MockInterpreterVersionProvider('');
const display = new InterpreterDisplay(statusBar, provider, new VirtualEnvironmentManager([]), displayNameProvider);
await display.refresh();
assert.equal(statusBar.text, interpreters[1].displayName, 'Incorrect display name');
assert.equal(statusBar.tooltip, `${pythonPath}${EOL}${interpreters[1].companyDisplayName}`, 'Incorrect tooltip');
});
test('Will update status prompting user to select an interpreter', async () => {
const statusBar = new MockStatusBarItem();
const interpreters = [
{ displayName: 'One', path: 'c:/path1/one.exe', companyDisplayName: 'One 1', type: InterpreterType.VirtualEnv },
{ displayName: 'Two', path: 'c:/asdf', companyDisplayName: 'Two 2', type: InterpreterType.VirtualEnv },
{ displayName: 'Three', path: 'c:/path3/three.exe', companyDisplayName: 'Three 3', type: InterpreterType.VirtualEnv }
];
const provider = new MockProvider(interpreters);
const displayNameProvider = new MockInterpreterVersionProvider('', true);
const display = new InterpreterDisplay(statusBar, provider, new VirtualEnvironmentManager([]), displayNameProvider);
// Change interpreter to an invalid value
const pythonPath = 'UnknownInterpreter';
await updateSetting('pythonPath', pythonPath, rootWorkspaceUri, configTarget);
await display.refresh();
assert.equal(statusBar.text, '$(alert) Select Python Environment', 'Incorrect display name');
});
async function initializeMultiRoot() {
// For multiroot environments, we need a file open to determine the best interpreter that needs to be displayed
await openDummyFile();
}
async function openDummyFile() {
const document = await workspace.openTextDocument(fileInNonRootWorkspace);
await window.showTextDocument(document);
}
});