Skip to content

Commit 5ce5b2d

Browse files
author
Andy
authored
Merge pull request #9330 from Microsoft/range_tests
Change reference tests to verify actual ranges referenced and not just their count
2 parents 999ac0a + 6a60d8b commit 5ce5b2d

File tree

82 files changed

+583
-996
lines changed

Some content is hidden

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

82 files changed

+583
-996
lines changed

src/harness/fourslash.ts

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -730,29 +730,6 @@ namespace FourSlash {
730730
}
731731
}
732732

733-
public verifyReferencesCountIs(count: number, localFilesOnly = true) {
734-
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-
756733
public verifyReferencesAre(expectedReferences: Range[]) {
757734
const actualReferences = this.getReferencesAtCaret() || [];
758735

@@ -769,7 +746,7 @@ namespace FourSlash {
769746

770747
for (const reference of expectedReferences) {
771748
const {fileName, start, end} = reference;
772-
if (reference.marker) {
749+
if (reference.marker && reference.marker.data) {
773750
const {isWriteAccess, isDefinition} = reference.marker.data;
774751
this.verifyReferencesWorker(actualReferences, fileName, start, end, isWriteAccess, isDefinition);
775752
}
@@ -793,12 +770,8 @@ namespace FourSlash {
793770
}
794771
}
795772

796-
public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
797-
const references = this.getReferencesAtCaret();
798-
if (!references || references.length === 0) {
799-
this.raiseError("verifyReferencesAtPositionListContains failed - found 0 references, expected at least one.");
800-
}
801-
this.verifyReferencesWorker(references, fileName, start, end, isWriteAccess, isDefinition);
773+
public verifyRangesWithSameTextReferenceEachOther() {
774+
ts.forEachValue(this.rangesByText(), ranges => this.verifyRangesReferenceEachOther(ranges));
802775
}
803776

804777
private verifyReferencesWorker(references: ts.ReferenceEntry[], fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
@@ -817,7 +790,6 @@ namespace FourSlash {
817790

818791
const missingItem = { fileName, start, end, isWriteAccess, isDefinition };
819792
this.raiseError(`verifyReferencesAtPositionListContains failed - could not find the item: ${stringify(missingItem)} in the returned list: (${stringify(references)})`);
820-
821793
}
822794

823795
private getMemberListAtCaret() {
@@ -1541,19 +1513,32 @@ namespace FourSlash {
15411513
}
15421514

15431515
private updateMarkersForEdit(fileName: string, minChar: number, limChar: number, text: string) {
1544-
for (let i = 0; i < this.testData.markers.length; i++) {
1545-
const marker = this.testData.markers[i];
1516+
for (const marker of this.testData.markers) {
15461517
if (marker.fileName === fileName) {
1547-
if (marker.position > minChar) {
1548-
if (marker.position < limChar) {
1549-
// Marker is inside the edit - mark it as invalidated (?)
1550-
marker.position = -1;
1551-
}
1552-
else {
1553-
// Move marker back/forward by the appropriate amount
1554-
marker.position += (minChar - limChar) + text.length;
1555-
}
1518+
marker.position = updatePosition(marker.position);
1519+
}
1520+
}
1521+
1522+
for (const range of this.testData.ranges) {
1523+
if (range.fileName === fileName) {
1524+
range.start = updatePosition(range.start);
1525+
range.end = updatePosition(range.end);
1526+
}
1527+
}
1528+
1529+
function updatePosition(position: number) {
1530+
if (position > minChar) {
1531+
if (position < limChar) {
1532+
// Inside the edit - mark it as invalidated (?)
1533+
return -1;
15561534
}
1535+
else {
1536+
// Move marker back/forward by the appropriate amount
1537+
return position + (minChar - limChar) + text.length;
1538+
}
1539+
}
1540+
else {
1541+
return position;
15571542
}
15581543
}
15591544
}
@@ -1648,8 +1633,20 @@ namespace FourSlash {
16481633
}
16491634

16501635
public getRanges(): Range[] {
1651-
// Return a copy of the list
1652-
return this.testData.ranges.slice(0);
1636+
return this.testData.ranges;
1637+
}
1638+
1639+
public rangesByText(): ts.Map<Range[]> {
1640+
const result: ts.Map<Range[]> = {};
1641+
for (const range of this.getRanges()) {
1642+
const text = this.rangeText(range);
1643+
(ts.getProperty(result, text) || (result[text] = [])).push(range);
1644+
}
1645+
return result;
1646+
}
1647+
1648+
private rangeText({fileName, start, end}: Range, more = false): string {
1649+
return this.getFileContent(fileName).slice(start, end);
16531650
}
16541651

16551652
public verifyCaretAtMarker(markerName = "") {
@@ -2772,6 +2769,10 @@ namespace FourSlashInterface {
27722769
return this.state.getRanges();
27732770
}
27742771

2772+
public rangesByText(): ts.Map<FourSlash.Range[]> {
2773+
return this.state.rangesByText();
2774+
}
2775+
27752776
public markerByName(s: string): FourSlash.Marker {
27762777
return this.state.getMarkerByName(s);
27772778
}
@@ -2970,10 +2971,6 @@ namespace FourSlashInterface {
29702971
this.state.verifyGetEmitOutputContentsForCurrentFile(expected);
29712972
}
29722973

2973-
public referencesCountIs(count: number) {
2974-
this.state.verifyReferencesCountIs(count, /*localFilesOnly*/ false);
2975-
}
2976-
29772974
public referencesAre(ranges: FourSlash.Range[]) {
29782975
this.state.verifyReferencesAre(ranges);
29792976
}
@@ -2986,6 +2983,10 @@ namespace FourSlashInterface {
29862983
this.state.verifyRangesReferenceEachOther(ranges);
29872984
}
29882985

2986+
public rangesWithSameTextReferenceEachOther() {
2987+
this.state.verifyRangesWithSameTextReferenceEachOther();
2988+
}
2989+
29892990
public currentParameterHelpArgumentNameIs(name: string) {
29902991
this.state.verifyCurrentParameterHelpName(name);
29912992
}

tests/cases/fourslash/cancellationWhenfindingAllRefsOnDefinition.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
////
88
//// }
99
////
10-
//// public /*1*/start(){
10+
//// public /**/[|start|](){
1111
//// return this;
1212
//// }
1313
////
@@ -20,19 +20,14 @@
2020
////import Second = require("./findAllRefsOnDefinition-import");
2121
////
2222
////var second = new Second.Test()
23-
////second.start();
23+
////second.[|start|]();
2424
////second.stop();
2525

26-
goTo.file("findAllRefsOnDefinition-import.ts");
27-
goTo.marker("1");
28-
29-
verify.referencesCountIs(2);
26+
verify.rangesReferenceEachOther();
3027

3128
cancellation.setCancelled();
32-
goTo.marker("1");
33-
verifyOperationIsCancelled(() => verify.referencesCountIs(0) );
29+
verifyOperationIsCancelled(() => verify.rangesReferenceEachOther());
3430

3531
// verify that internal state is still correct
3632
cancellation.resetCancelled();
37-
goTo.marker("1");
38-
verify.referencesCountIs(2);
33+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForDefaultExport07.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
////
99
////var y = DefaultExportedFunction();
1010
////
11-
////namespace /**/DefaultExportedFunction {
11+
////namespace [|DefaultExportedFunction|] {
1212
////}
1313

1414
// The namespace and function do not merge,
1515
// so the namespace should be all alone.
16-
17-
goTo.marker();
18-
verify.referencesCountIs(1);
16+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsForDefaultExport08.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
////
88
////var y = new DefaultExportedClass;
99
////
10-
////namespace /**/DefaultExportedClass {
10+
////namespace [|DefaultExportedClass|] {
1111
////}
1212

1313
// The namespace and class do not merge,
1414
// so the namespace should be all alone.
1515

16-
goTo.marker();
17-
verify.referencesCountIs(1);
16+
verify.rangesReferenceEachOther();
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
/// <reference path="fourslash.ts"/>
22

3-
43
////var Base = class { };
5-
////class C extends Base implements [|Base|] { }
4+
////class C extends Base implements /**/Base { }
65

7-
let ranges = test.ranges();
8-
for (let range of ranges) {
9-
verify.referencesCountIs(0);
10-
}
6+
goTo.marker();
7+
verify.referencesAre([]);
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
/// <reference path='fourslash.ts'/>
22

3-
////var x = 0;
3+
////var [|x|] = 0;
44
////
55
////with ({}) {
66
//// var y = x; // Reference of x here should not be picked
77
//// /*2*/y++; // also reference for y should be ignored
88
////}
99
////
10-
////x = /*1*/x + 1;
10+
////[|x|] = [|x|] + 1;
1111

12-
goTo.marker('1');
13-
verify.referencesCountIs(3);
14-
15-
goTo.marker('2');
16-
verify.referencesCountIs(0);
12+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsObjectBindingElementPropertyName05.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
////}
1111

1212
goTo.marker();
13-
verify.referencesCountIs(0);
13+
verify.referencesAre([]);
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
/// <reference path="fourslash.ts" />
22

33
// @Filename: a.ts
4-
////function decorator(target) {
4+
////function [|decorator|](target) {
55
//// return target;
66
////}
7-
////decorator();
7+
////[|decorator|]();
88

99
// @Filename: b.ts
10-
////@deco/*1*/rator @decorator("again")
10+
////@[|decorator|] @[|decorator|]("again")
1111
////class C {
12-
//// @decorator
12+
//// @[|decorator|]
1313
//// method() {}
1414
////}
1515

16-
goTo.file("b.ts");
17-
goTo.marker("1");
18-
19-
verify.referencesCountIs(5);
16+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsOnDefinition.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
////
88
//// }
99
////
10-
//// public /*1*/start(){
10+
//// public [|start|](){
1111
//// return this;
1212
//// }
1313
////
@@ -20,10 +20,7 @@
2020
////import Second = require("./findAllRefsOnDefinition-import");
2121
////
2222
////var second = new Second.Test()
23-
////second.start();
23+
////second.[|start|]();
2424
////second.stop();
2525

26-
goTo.file("findAllRefsOnDefinition-import.ts");
27-
goTo.marker("1");
28-
29-
verify.referencesCountIs(2);
26+
verify.rangesReferenceEachOther();

tests/cases/fourslash/findAllRefsOnDefinition2.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,15 @@
33
//@Filename: findAllRefsOnDefinition2-import.ts
44
////export module Test{
55
////
6-
//// export interface /*1*/start { }
6+
//// export interface [|start|] { }
77
////
88
//// export interface stop { }
99
////}
1010

1111
//@Filename: findAllRefsOnDefinition2.ts
1212
////import Second = require("./findAllRefsOnDefinition2-import");
1313
////
14-
////var start: Second.Test.start;
14+
////var start: Second.Test.[|start|];
1515
////var stop: Second.Test.stop;
1616

17-
goTo.file("findAllRefsOnDefinition2-import.ts");
18-
goTo.marker("1");
19-
20-
verify.referencesCountIs(2);
17+
verify.rangesReferenceEachOther();

0 commit comments

Comments
 (0)