Skip to content

Commit e2376a7

Browse files
author
Andy
authored
Merge pull request #9185 from Microsoft/simplify_range_tests
Use helper functions to simplify range tests
2 parents 38c89af + 8a025fc commit e2376a7

File tree

74 files changed

+267
-658
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+267
-658
lines changed

src/harness/fourslash.ts

Lines changed: 82 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -730,13 +730,78 @@ namespace FourSlash {
730730
}
731731
}
732732

733-
public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
733+
public verifyReferencesCountIs(count: number, localFilesOnly = true) {
734734
const references = this.getReferencesAtCaret();
735+
let referencesCount = 0;
736+
737+
if (localFilesOnly) {
738+
const localFiles = this.testData.files.map<string>(file => file.fileName);
739+
// Count only the references in local files. Filter the ones in lib and other files.
740+
ts.forEach(references, entry => {
741+
if (localFiles.some((fileName) => fileName === entry.fileName)) {
742+
referencesCount++;
743+
}
744+
});
745+
}
746+
else {
747+
referencesCount = references && references.length || 0;
748+
}
749+
750+
if (referencesCount !== count) {
751+
const condition = localFilesOnly ? "excluding libs" : "including libs";
752+
this.raiseError("Expected references count (" + condition + ") to be " + count + ", but is actually " + referencesCount);
753+
}
754+
}
755+
756+
public verifyReferencesAre(expectedReferences: Range[]) {
757+
const actualReferences = this.getReferencesAtCaret() || [];
758+
759+
if (actualReferences.length > expectedReferences.length) {
760+
// Find the unaccounted-for reference.
761+
for (const actual of actualReferences) {
762+
if (!ts.forEach(expectedReferences, r => r.start === actual.textSpan.start)) {
763+
this.raiseError(`A reference ${actual} is unaccounted for.`);
764+
}
765+
}
766+
// Probably will never reach here.
767+
this.raiseError(`There are ${actualReferences.length} references but only ${expectedReferences.length} were expected.`);
768+
}
769+
770+
for (const reference of expectedReferences) {
771+
const {fileName, start, end} = reference;
772+
if (reference.marker) {
773+
const {isWriteAccess, isDefinition} = reference.marker.data;
774+
this.verifyReferencesWorker(actualReferences, fileName, start, end, isWriteAccess, isDefinition);
775+
}
776+
else {
777+
this.verifyReferencesWorker(actualReferences, fileName, start, end);
778+
}
779+
}
780+
}
781+
782+
public verifyReferencesOf({fileName, start}: Range, references: Range[]) {
783+
this.openFile(fileName);
784+
this.goToPosition(start);
785+
this.verifyReferencesAre(references);
786+
}
735787

788+
public verifyRangesReferenceEachOther(ranges?: Range[]) {
789+
ranges = ranges || this.getRanges();
790+
assert(ranges.length);
791+
for (const range of ranges) {
792+
this.verifyReferencesOf(range, ranges);
793+
}
794+
}
795+
796+
public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
797+
const references = this.getReferencesAtCaret();
736798
if (!references || references.length === 0) {
737799
this.raiseError("verifyReferencesAtPositionListContains failed - found 0 references, expected at least one.");
738800
}
801+
this.verifyReferencesWorker(references, fileName, start, end, isWriteAccess, isDefinition);
802+
}
739803

804+
private verifyReferencesWorker(references: ts.ReferenceEntry[], fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
740805
for (let i = 0; i < references.length; i++) {
741806
const reference = references[i];
742807
if (reference && reference.fileName === fileName && reference.textSpan.start === start && ts.textSpanEnd(reference.textSpan) === end) {
@@ -752,29 +817,7 @@ namespace FourSlash {
752817

753818
const missingItem = { fileName, start, end, isWriteAccess, isDefinition };
754819
this.raiseError(`verifyReferencesAtPositionListContains failed - could not find the item: ${stringify(missingItem)} in the returned list: (${stringify(references)})`);
755-
}
756-
757-
public verifyReferencesCountIs(count: number, localFilesOnly = true) {
758-
const references = this.getReferencesAtCaret();
759-
let referencesCount = 0;
760-
761-
if (localFilesOnly) {
762-
const localFiles = this.testData.files.map<string>(file => file.fileName);
763-
// Count only the references in local files. Filter the ones in lib and other files.
764-
ts.forEach(references, entry => {
765-
if (localFiles.some((fileName) => fileName === entry.fileName)) {
766-
referencesCount++;
767-
}
768-
});
769-
}
770-
else {
771-
referencesCount = references && references.length || 0;
772-
}
773820

774-
if (referencesCount !== count) {
775-
const condition = localFilesOnly ? "excluding libs" : "including libs";
776-
this.raiseError("Expected references count (" + condition + ") to be " + count + ", but is actually " + referencesCount);
777-
}
778821
}
779822

780823
private getMemberListAtCaret() {
@@ -2836,14 +2879,6 @@ namespace FourSlashInterface {
28362879
this.state.verifyMemberListIsEmpty(this.negative);
28372880
}
28382881

2839-
public referencesCountIs(count: number) {
2840-
this.state.verifyReferencesCountIs(count, /*localFilesOnly*/ false);
2841-
}
2842-
2843-
public referencesAtPositionContains(range: FourSlash.Range, isWriteAccess?: boolean, isDefinition?: boolean) {
2844-
this.state.verifyReferencesAtPositionListContains(range.fileName, range.start, range.end, isWriteAccess, isDefinition);
2845-
}
2846-
28472882
public signatureHelpPresent() {
28482883
this.state.verifySignatureHelpPresent(!this.negative);
28492884
}
@@ -2935,6 +2970,22 @@ namespace FourSlashInterface {
29352970
this.state.verifyGetEmitOutputContentsForCurrentFile(expected);
29362971
}
29372972

2973+
public referencesCountIs(count: number) {
2974+
this.state.verifyReferencesCountIs(count, /*localFilesOnly*/ false);
2975+
}
2976+
2977+
public referencesAre(ranges: FourSlash.Range[]) {
2978+
this.state.verifyReferencesAre(ranges);
2979+
}
2980+
2981+
public referencesOf(start: FourSlash.Range, references: FourSlash.Range[]) {
2982+
this.state.verifyReferencesOf(start, references);
2983+
}
2984+
2985+
public rangesReferenceEachOther(ranges?: FourSlash.Range[]) {
2986+
this.state.verifyRangesReferenceEachOther(ranges);
2987+
}
2988+
29382989
public currentParameterHelpArgumentNameIs(name: string) {
29392990
this.state.verifyCurrentParameterHelpName(name);
29402991
}

tests/cases/fourslash/ambientShorthandFindAllRefs.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,4 @@
99
// @Filename: user2.ts
1010
////import {[|x|]} from "jquery";
1111

12-
let ranges = test.ranges();
13-
for (let range of ranges) {
14-
goTo.file(range.fileName);
15-
goTo.position(range.start);
16-
17-
verify.referencesCountIs(ranges.length);
18-
for (let expectedRange of ranges) {
19-
verify.referencesAtPositionContains(expectedRange);
20-
}
21-
}
12+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForComputedProperties.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,4 @@
1313
//// ["[|prop1|]"]: function () { },
1414
////}
1515

16-
let ranges = test.ranges();
17-
for (let range of ranges) {
18-
goTo.position(range.start);
19-
20-
verify.referencesCountIs(ranges.length);
21-
for (let expectedReference of ranges) {
22-
verify.referencesAtPositionContains(expectedReference);
23-
}
24-
}
16+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForComputedProperties2.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,4 @@
1212
//// ["[|42|]"]: function () { }
1313
////}
1414

15-
let ranges = test.ranges();
16-
for (let range of ranges) {
17-
goTo.position(range.start);
18-
19-
verify.referencesCountIs(ranges.length);
20-
for (let expectedReference of ranges) {
21-
verify.referencesAtPositionContains(expectedReference);
22-
}
23-
}
15+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForDefaultExport01.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,4 @@
77
////
88
////var y = new [|DefaultExportedClass|];
99

10-
let ranges = test.ranges()
11-
for (let range of ranges) {
12-
goTo.position(range.start);
13-
14-
verify.referencesCountIs(ranges.length);
15-
for (let expectedReference of ranges) {
16-
verify.referencesAtPositionContains(expectedReference);
17-
}
18-
}
10+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForDefaultExport02.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,4 @@
88
////
99
////var y = [|DefaultExportedFunction|]();
1010

11-
let ranges = test.ranges()
12-
for (let range of ranges) {
13-
goTo.position(range.start);
14-
15-
verify.referencesCountIs(ranges.length);
16-
for (let expectedReference of ranges) {
17-
verify.referencesAtPositionContains(expectedReference);
18-
}
19-
}
11+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForDefaultExport03.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,4 @@
1414
//// var local = 100;
1515
////}
1616

17-
let ranges = test.ranges()
18-
for (let range of ranges) {
19-
goTo.position(range.start);
20-
21-
verify.referencesCountIs(ranges.length);
22-
for (let expectedReference of ranges) {
23-
verify.referencesAtPositionContains(expectedReference);
24-
}
25-
}
17+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForDefaultExport04.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,4 @@
2020
// site is included in the references to the namespace.
2121

2222
goTo.marker();
23-
let ranges = test.ranges();
24-
verify.referencesCountIs(ranges.length);
25-
26-
for (let expectedReference of ranges) {
27-
verify.referencesAtPositionContains(expectedReference);
28-
}
23+
verify.referencesAre(test.ranges());

tests/cases/fourslash/findAllRefsForDefaultExport05.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,4 @@
2020
// and all value-uses of 'f' are included in the references to the function.
2121

2222
goTo.marker();
23-
let ranges = test.ranges();
24-
verify.referencesCountIs(ranges.length);
25-
26-
for (let expectedReference of ranges) {
27-
verify.referencesAtPositionContains(expectedReference);
28-
}
23+
verify.referencesAre(test.ranges());

tests/cases/fourslash/findAllRefsForDefaultExport06.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,4 @@
2020
// and all value-uses of 'f' are included in the references to the function.
2121

2222
goTo.marker();
23-
let ranges = test.ranges();
24-
verify.referencesCountIs(ranges.length);
25-
26-
for (let expectedReference of ranges) {
27-
verify.referencesAtPositionContains(expectedReference);
28-
}
23+
verify.referencesAre(test.ranges());

tests/cases/fourslash/findAllRefsForFunctionExpression01.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,4 @@
99
/////// <reference path="file1.ts" />
1010
////foo();
1111

12-
13-
let ranges = test.ranges()
14-
for (let range of ranges) {
15-
goTo.position(range.start);
16-
17-
verify.referencesCountIs(ranges.length);
18-
for (let expectedReference of ranges) {
19-
verify.referencesAtPositionContains(expectedReference);
20-
}
21-
}
12+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForObjectLiteralProperties.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,4 @@
88
////
99
////let {[|property|]: pVar} = x;
1010

11-
12-
let ranges = test.ranges();
13-
for (let range of ranges) {
14-
goTo.position(range.start);
15-
16-
verify.referencesCountIs(ranges.length);
17-
for (let expectedReference of ranges) {
18-
verify.referencesAtPositionContains(expectedReference);
19-
}
20-
}
11+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForStringLiteralTypes.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,4 @@
33
////type Options = "[|option 1|]" | "option 2";
44
////let myOption: Options = "[|option 1|]";
55

6-
let ranges = test.ranges();
7-
for (let range of ranges) {
8-
goTo.position(range.start);
9-
10-
verify.referencesCountIs(ranges.length);
11-
for (let expectedReference of ranges) {
12-
verify.referencesAtPositionContains(expectedReference);
13-
}
14-
}
6+
verify.rangesReferenceEachOther();
Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
11
/// <reference path="fourslash.ts"/>
22

3-
43
////var [|Base|] = class { };
54
////class C extends [|Base|] { }
65

7-
let ranges = test.ranges();
8-
for (let range of ranges) {
9-
goTo.position(range.start);
10-
11-
verify.referencesCountIs(ranges.length);
12-
for (let expectedReference of ranges) {
13-
verify.referencesAtPositionContains(expectedReference);
14-
}
15-
}
6+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForVariableInExtendsClause02.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,4 @@
66
//// interface I extends [|Base|] { }
77
////}
88

9-
let ranges = test.ranges();
10-
for (let range of ranges) {
11-
goTo.position(range.start);
12-
13-
verify.referencesCountIs(ranges.length);
14-
for (let expectedReference of ranges) {
15-
verify.referencesAtPositionContains(expectedReference);
16-
}
17-
}
9+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsInClassExpression.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,4 @@
55
//// [|boom|](){}
66
////}
77

8-
let ranges = test.ranges()
9-
for (let range of ranges) {
10-
goTo.position(range.start);
11-
12-
verify.referencesCountIs(ranges.length);
13-
for (let expectedReference of ranges) {
14-
verify.referencesAtPositionContains(expectedReference);
15-
}
16-
}
8+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsInheritedProperties1.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,8 @@
99
//// v.[|doStuff|]();
1010
//// v.[|propName|];
1111

12-
function verifyReferences(query: FourSlashInterface.Range, references: FourSlashInterface.Range[]) {
13-
goTo.position(query.start);
14-
for (const ref of references) {
15-
verify.referencesAtPositionContains(ref);
16-
}
17-
}
18-
19-
const ranges = test.ranges();
20-
verify.assertHasRanges(ranges);
21-
const [r0, r1, r2, r3] = ranges;
22-
verifyReferences(r0, [r0, r2]);
23-
verifyReferences(r1, [r1, r3]);
24-
verifyReferences(r2, [r0, r2]);
25-
verifyReferences(r3, [r1, r3]);
12+
const [r0, r1, r2, r3] = test.ranges();
13+
verify.referencesOf(r0, [r0, r2]);
14+
verify.referencesOf(r1, [r1, r3]);
15+
verify.referencesOf(r2, [r0, r2]);
16+
verify.referencesOf(r3, [r1, r3]);

0 commit comments

Comments
 (0)