Skip to content

Commit b812dcc

Browse files
committed
tests for onTypeFormatting #432
1 parent f5b197f commit b812dcc

2 files changed

Lines changed: 353 additions & 0 deletions

File tree

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
2+
// Note: This example test is leveraging the Mocha test framework.
3+
// Please refer to their documentation on https://mochajs.org/ for help.
4+
5+
6+
// Place this right on top
7+
import { initialize, IS_TRAVIS, PYTHON_PATH, closeActiveWindows } from './initialize';
8+
// The module 'assert' provides assertion methods from node
9+
import * as assert from 'assert';
10+
11+
// You can import and use all API from the 'vscode' module
12+
// as well as import your extension to test it
13+
import * as vscode from 'vscode';
14+
import * as path from 'path';
15+
import * as settings from '../client/common/configSettings';
16+
import * as fs from 'fs-extra';
17+
import { BlockFormatProviders } from '../client/typeFormatters/blockFormatProvider';
18+
let pythonSettings = settings.PythonSettings.getInstance();
19+
let srcPythoFilesPath = path.join(__dirname, '..', '..', 'src', 'test', 'pythonFiles', 'typeFormatFiles');
20+
let outPythoFilesPath = path.join(__dirname, '..', 'pythonFiles', 'typeFormatFiles');
21+
22+
const tryBlock2OutFilePath = path.join(outPythoFilesPath, 'tryBlocks2.py');
23+
24+
suite('Formatting', () => {
25+
let provider: BlockFormatProviders;
26+
const formatOptions2: vscode.FormattingOptions = {
27+
insertSpaces: true, tabSize: 2
28+
};
29+
30+
suiteSetup(done => {
31+
initialize().then(() => {
32+
provider = new BlockFormatProviders();
33+
pythonSettings.pythonPath = PYTHON_PATH;
34+
fs.ensureDirSync(path.dirname(outPythoFilesPath));
35+
36+
['tryBlocks2.py', 'tryBlocks4.py', 'tryBlocksTab.py'].forEach(file => {
37+
const targetFile = path.join(outPythoFilesPath, file);
38+
if (fs.existsSync(targetFile)) { fs.unlinkSync(targetFile); }
39+
fs.copySync(path.join(srcPythoFilesPath, file), targetFile);
40+
});
41+
}).then(done).catch(done);
42+
});
43+
suiteTeardown(done => {
44+
closeActiveWindows().then(done, done);
45+
});
46+
teardown(done => {
47+
closeActiveWindows().then(done, done);
48+
});
49+
50+
function testFormatting(fileToFormat: string, position: vscode.Position, expectedEdits: vscode.TextEdit[]): PromiseLike<void> {
51+
let textEditor: vscode.TextEditor;
52+
let textDocument: vscode.TextDocument;
53+
return vscode.workspace.openTextDocument(fileToFormat).then(document => {
54+
textDocument = document;
55+
return vscode.window.showTextDocument(textDocument);
56+
}).then(editor => {
57+
return provider.provideOnTypeFormattingEdits(textDocument, position, ':', formatOptions2, null);
58+
}).then(edits => {
59+
assert.equal(edits.length, expectedEdits.length, 'Number of edits not the same');
60+
edits.forEach((edit, index) => {
61+
const expectedEdit = expectedEdits[index];
62+
assert.equal(edit.newText, expectedEdit.newText, `newText for edit is not the same for index = ${index}`);
63+
assert.ok(edit.range.isEqual(expectedEdit.range), `range for edit is not the same for index = ${index}, provided ${edit.range + ''}, expected ${expectedEdit.range + ''}`);
64+
});
65+
}, reason => {
66+
assert.fail(reason, undefined, 'Type Formatting failed', '');
67+
});
68+
}
69+
test('1. except off by tab', done => {
70+
const lineNumber = 6;
71+
const pos = new vscode.Position(lineNumber, 22);
72+
const expectedEdits = [
73+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
74+
];
75+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
76+
});
77+
test('2. except off by one should not be formatted', done => {
78+
const lineNumber = 15;
79+
const pos = new vscode.Position(lineNumber, 21);
80+
const expectedEdits = [];
81+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
82+
});
83+
test('3. except off by tab inside a for loop', done => {
84+
const lineNumber = 35;
85+
const pos = new vscode.Position(lineNumber, 13);
86+
const expectedEdits = [
87+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
88+
];
89+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
90+
});
91+
test('4. except off by one inside a for loop should not be formatted', done => {
92+
const lineNumber = 47;
93+
const pos = new vscode.Position(lineNumber, 12);
94+
const expectedEdits = [
95+
];
96+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
97+
});
98+
test('5. except IOError: off by tab inside a for loop', done => {
99+
const lineNumber = 54;
100+
const pos = new vscode.Position(lineNumber, 19);
101+
const expectedEdits = [
102+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
103+
];
104+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
105+
});
106+
test('6. else: off by tab inside a for loop', done => {
107+
const lineNumber = 76;
108+
const pos = new vscode.Position(lineNumber, 9);
109+
const expectedEdits = [
110+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
111+
];
112+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
113+
});
114+
test('7. except ValueError:: off by tab inside a function', done => {
115+
const lineNumber = 143;
116+
const pos = new vscode.Position(lineNumber, 22);
117+
const expectedEdits = [
118+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
119+
];
120+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
121+
});
122+
test('8. except ValueError as err: off by one inside a function should not be formatted', done => {
123+
const lineNumber = 157;
124+
const pos = new vscode.Position(lineNumber, 25);
125+
const expectedEdits = [
126+
];
127+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
128+
});
129+
test('9. else: off by tab inside function', done => {
130+
const lineNumber = 172;
131+
const pos = new vscode.Position(lineNumber, 11);
132+
const expectedEdits = [
133+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
134+
];
135+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
136+
});
137+
test('10. finally: off by tab inside function', done => {
138+
const lineNumber = 195;
139+
const pos = new vscode.Position(lineNumber, 12);
140+
const expectedEdits = [
141+
vscode.TextEdit.delete(new vscode.Range(lineNumber, 0, lineNumber, 2))
142+
];
143+
testFormatting(tryBlock2OutFilePath, pos, expectedEdits).then(done, done);
144+
});
145+
});
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
2+
while True:
3+
try:
4+
x = int(input("Please enter a number: "))
5+
break
6+
# except should be in same column as try:
7+
except ValueError:
8+
print("Oops! That was no valid number. Try again...")
9+
10+
11+
while True:
12+
try:
13+
x = int(input("Please enter a number: "))
14+
break
15+
# except should be in same column as try:
16+
except ValueError:
17+
print("Oops! That was no valid number. Try again...")
18+
19+
class B(Exception):
20+
pass
21+
22+
class C(B):
23+
pass
24+
25+
class D(C):
26+
pass
27+
28+
for cls in [B, C, D]:
29+
try:
30+
raise cls()
31+
except D:
32+
print("D")
33+
except C:
34+
print("C")
35+
# except should be in same level as except
36+
except B:
37+
print("B")
38+
39+
40+
for cls in [B, C, D]:
41+
try:
42+
raise cls()
43+
except D:
44+
print("D")
45+
except C:
46+
print("C")
47+
# except should be in same level as except
48+
except B:
49+
print("B")
50+
51+
for arg in sys.argv[1:]:
52+
try:
53+
f = open(arg, 'r')
54+
#except should be in same level as try
55+
except IOError:
56+
print('cannot open', arg)
57+
else:
58+
print(arg, 'has', len(f.readlines()), 'lines')
59+
f.close()
60+
61+
for arg in sys.argv[1:]:
62+
try:
63+
f = open(arg, 'r')
64+
#except should be in same level as try
65+
except IOError:
66+
print('cannot open', arg)
67+
else:
68+
print(arg, 'has', len(f.readlines()), 'lines')
69+
f.close()
70+
71+
for arg in sys.argv[1:]:
72+
try:
73+
f = open(arg, 'r')
74+
except IOError:
75+
print('cannot open', arg)
76+
#else should be in same level as try
77+
else:
78+
print(arg, 'has', len(f.readlines()), 'lines')
79+
f.close()
80+
81+
for arg in sys.argv[1:]:
82+
try:
83+
f = open(arg, 'r')
84+
except IOError:
85+
print('cannot open', arg)
86+
#else should be in same level as try
87+
else:
88+
print(arg, 'has', len(f.readlines()), 'lines')
89+
f.close()
90+
91+
def minus():
92+
while True:
93+
try:
94+
x = int(input("Please enter a number: "))
95+
break
96+
#except should be in same level as try:
97+
except ValueError:
98+
print("Oops! That was no valid number. Try again...")
99+
100+
def minus():
101+
while True:
102+
try:
103+
x = int(input("Please enter a number: "))
104+
break
105+
#except should be in same level as try:
106+
except ValueError:
107+
print("Oops! That was no valid number. Try again...")
108+
109+
110+
def zero():
111+
for cls in [B, C, D]:
112+
try:
113+
raise cls()
114+
#except should be in same level as try:
115+
except D:
116+
print("D")
117+
except C:
118+
print("C")
119+
except B:
120+
print("B")
121+
122+
def zero():
123+
for cls in [B, C, D]:
124+
try:
125+
raise cls()
126+
except D:
127+
print("D")
128+
#except should be in same level as try:
129+
except C:
130+
print("C")
131+
except B:
132+
print("B")
133+
134+
def one():
135+
import sys
136+
137+
try:
138+
f = open('myfile.txt')
139+
s = f.readline()
140+
i = int(s.strip())
141+
except OSError as err:
142+
print("OS error: {0}".format(err))
143+
# except should be in same level as except
144+
except ValueError:
145+
print("Could not convert data to an integer.")
146+
except:
147+
print("Unexpected error:", sys.exc_info()[0])
148+
raise
149+
150+
def one():
151+
import sys
152+
153+
try:
154+
f = open('myfile.txt')
155+
s = f.readline()
156+
i = int(s.strip())
157+
# except should be in same level as except
158+
except OSError as err:
159+
print("OS error: {0}".format(err))
160+
except ValueError:
161+
print("Could not convert data to an integer.")
162+
except:
163+
print("Unexpected error:", sys.exc_info()[0])
164+
raise
165+
166+
def two():
167+
for arg in sys.argv[1:]:
168+
try:
169+
f = open(arg, 'r')
170+
except IOError:
171+
print('cannot open', arg)
172+
# else should be in same level as except
173+
else:
174+
print(arg, 'has', len(f.readlines()), 'lines')
175+
f.close()
176+
177+
def two():
178+
for arg in sys.argv[1:]:
179+
try:
180+
f = open(arg, 'r')
181+
except IOError:
182+
print('cannot open', arg)
183+
# else should be in same level as except
184+
else:
185+
print(arg, 'has', len(f.readlines()), 'lines')
186+
f.close()
187+
188+
def divide(x, y):
189+
try:
190+
result = x / y
191+
except ZeroDivisionError:
192+
print("division by zero!")
193+
else:
194+
print("result is", result)
195+
# finally should be in same level as except
196+
finally:
197+
print("executing finally clause")
198+
199+
def divide(x, y):
200+
try:
201+
result = x / y
202+
except ZeroDivisionError:
203+
print("division by zero!")
204+
else:
205+
print("result is", result)
206+
# finally should be in same level as except
207+
finally:
208+
print("executing finally clause")

0 commit comments

Comments
 (0)