Skip to content

Use helper functions to simplify range tests #9185

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
1 commit merged into from
Jun 15, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 82 additions & 31 deletions src/harness/fourslash.ts
Original file line number Diff line number Diff line change
Expand Up @@ -730,13 +730,78 @@ namespace FourSlash {
}
}

public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
public verifyReferencesCountIs(count: number, localFilesOnly = true) {
const references = this.getReferencesAtCaret();
let referencesCount = 0;

if (localFilesOnly) {
const localFiles = this.testData.files.map<string>(file => file.fileName);
// Count only the references in local files. Filter the ones in lib and other files.
ts.forEach(references, entry => {
if (localFiles.some((fileName) => fileName === entry.fileName)) {
referencesCount++;
}
});
}
else {
referencesCount = references && references.length || 0;
}

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

public verifyReferencesAre(expectedReferences: Range[]) {
const actualReferences = this.getReferencesAtCaret() || [];

if (actualReferences.length > expectedReferences.length) {
// Find the unaccounted-for reference.
for (const actual of actualReferences) {
if (!ts.forEach(expectedReferences, r => r.start === actual.textSpan.start)) {
this.raiseError(`A reference ${actual} is unaccounted for.`);
}
}
// Probably will never reach here.
this.raiseError(`There are ${actualReferences.length} references but only ${expectedReferences.length} were expected.`);
}

for (const reference of expectedReferences) {
const {fileName, start, end} = reference;
if (reference.marker) {
const {isWriteAccess, isDefinition} = reference.marker.data;
this.verifyReferencesWorker(actualReferences, fileName, start, end, isWriteAccess, isDefinition);
}
else {
this.verifyReferencesWorker(actualReferences, fileName, start, end);
}
}
}

public verifyReferencesOf({fileName, start}: Range, references: Range[]) {
this.openFile(fileName);
this.goToPosition(start);
this.verifyReferencesAre(references);
}

public verifyRangesReferenceEachOther(ranges?: Range[]) {
ranges = ranges || this.getRanges();
assert(ranges.length);
for (const range of ranges) {
this.verifyReferencesOf(range, ranges);
}
}

public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
const references = this.getReferencesAtCaret();
if (!references || references.length === 0) {
this.raiseError("verifyReferencesAtPositionListContains failed - found 0 references, expected at least one.");
}
this.verifyReferencesWorker(references, fileName, start, end, isWriteAccess, isDefinition);
}

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

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

public verifyReferencesCountIs(count: number, localFilesOnly = true) {
const references = this.getReferencesAtCaret();
let referencesCount = 0;

if (localFilesOnly) {
const localFiles = this.testData.files.map<string>(file => file.fileName);
// Count only the references in local files. Filter the ones in lib and other files.
ts.forEach(references, entry => {
if (localFiles.some((fileName) => fileName === entry.fileName)) {
referencesCount++;
}
});
}
else {
referencesCount = references && references.length || 0;
}

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

private getMemberListAtCaret() {
Expand Down Expand Up @@ -2836,14 +2879,6 @@ namespace FourSlashInterface {
this.state.verifyMemberListIsEmpty(this.negative);
}

public referencesCountIs(count: number) {
this.state.verifyReferencesCountIs(count, /*localFilesOnly*/ false);
}

public referencesAtPositionContains(range: FourSlash.Range, isWriteAccess?: boolean, isDefinition?: boolean) {
this.state.verifyReferencesAtPositionListContains(range.fileName, range.start, range.end, isWriteAccess, isDefinition);
}

public signatureHelpPresent() {
this.state.verifySignatureHelpPresent(!this.negative);
}
Expand Down Expand Up @@ -2935,6 +2970,22 @@ namespace FourSlashInterface {
this.state.verifyGetEmitOutputContentsForCurrentFile(expected);
}

public referencesCountIs(count: number) {
this.state.verifyReferencesCountIs(count, /*localFilesOnly*/ false);
}

public referencesAre(ranges: FourSlash.Range[]) {
this.state.verifyReferencesAre(ranges);
}

public referencesOf(start: FourSlash.Range, references: FourSlash.Range[]) {
this.state.verifyReferencesOf(start, references);
}

public rangesReferenceEachOther(ranges?: FourSlash.Range[]) {
this.state.verifyRangesReferenceEachOther(ranges);
}

public currentParameterHelpArgumentNameIs(name: string) {
this.state.verifyCurrentParameterHelpName(name);
}
Expand Down
11 changes: 1 addition & 10 deletions tests/cases/fourslash/ambientShorthandFindAllRefs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,4 @@
// @Filename: user2.ts
////import {[|x|]} from "jquery";

let ranges = test.ranges();
for (let range of ranges) {
goTo.file(range.fileName);
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedRange of ranges) {
verify.referencesAtPositionContains(expectedRange);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsForComputedProperties.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,4 @@
//// ["[|prop1|]"]: function () { },
////}

let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsForComputedProperties2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,4 @@
//// ["[|42|]"]: function () { }
////}

let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsForDefaultExport01.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,4 @@
////
////var y = new [|DefaultExportedClass|];

let ranges = test.ranges()
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsForDefaultExport02.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,4 @@
////
////var y = [|DefaultExportedFunction|]();

let ranges = test.ranges()
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsForDefaultExport03.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,4 @@
//// var local = 100;
////}

let ranges = test.ranges()
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
7 changes: 1 addition & 6 deletions tests/cases/fourslash/findAllRefsForDefaultExport04.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,4 @@
// site is included in the references to the namespace.

goTo.marker();
let ranges = test.ranges();
verify.referencesCountIs(ranges.length);

for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
verify.referencesAre(test.ranges());
7 changes: 1 addition & 6 deletions tests/cases/fourslash/findAllRefsForDefaultExport05.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,4 @@
// and all value-uses of 'f' are included in the references to the function.

goTo.marker();
let ranges = test.ranges();
verify.referencesCountIs(ranges.length);

for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
verify.referencesAre(test.ranges());
7 changes: 1 addition & 6 deletions tests/cases/fourslash/findAllRefsForDefaultExport06.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,4 @@
// and all value-uses of 'f' are included in the references to the function.

goTo.marker();
let ranges = test.ranges();
verify.referencesCountIs(ranges.length);

for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
verify.referencesAre(test.ranges());
11 changes: 1 addition & 10 deletions tests/cases/fourslash/findAllRefsForFunctionExpression01.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,4 @@
/////// <reference path="file1.ts" />
////foo();


let ranges = test.ranges()
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
11 changes: 1 addition & 10 deletions tests/cases/fourslash/findAllRefsForObjectLiteralProperties.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,4 @@
////
////let {[|property|]: pVar} = x;


let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsForStringLiteralTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,4 @@
////type Options = "[|option 1|]" | "option 2";
////let myOption: Options = "[|option 1|]";

let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
11 changes: 1 addition & 10 deletions tests/cases/fourslash/findAllRefsForVariableInExtendsClause01.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
/// <reference path="fourslash.ts"/>


////var [|Base|] = class { };
////class C extends [|Base|] { }

let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,4 @@
//// interface I extends [|Base|] { }
////}

let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
10 changes: 1 addition & 9 deletions tests/cases/fourslash/findAllRefsInClassExpression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,4 @@
//// [|boom|](){}
////}

let ranges = test.ranges()
for (let range of ranges) {
goTo.position(range.start);

verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}
verify.rangesReferenceEachOther();
19 changes: 5 additions & 14 deletions tests/cases/fourslash/findAllRefsInheritedProperties1.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,8 @@
//// v.[|doStuff|]();
//// v.[|propName|];

function verifyReferences(query: FourSlashInterface.Range, references: FourSlashInterface.Range[]) {
goTo.position(query.start);
for (const ref of references) {
verify.referencesAtPositionContains(ref);
}
}

const ranges = test.ranges();
verify.assertHasRanges(ranges);
const [r0, r1, r2, r3] = ranges;
verifyReferences(r0, [r0, r2]);
verifyReferences(r1, [r1, r3]);
verifyReferences(r2, [r0, r2]);
verifyReferences(r3, [r1, r3]);
const [r0, r1, r2, r3] = test.ranges();
verify.referencesOf(r0, [r0, r2]);
verify.referencesOf(r1, [r1, r3]);
verify.referencesOf(r2, [r0, r2]);
verify.referencesOf(r3, [r1, r3]);
Loading