diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts
index 0bcea9367e4..26af0a77b31 100644
--- a/src/harness/fourslash.ts
+++ b/src/harness/fourslash.ts
@@ -832,6 +832,44 @@ module FourSlash {
}
}
+ private validate(name: string, expected: string, actual: string) {
+ if (expected && expected !== actual) {
+ throw new Error("Expected " + name + " '" + expected + "'. Got '" + actual + "' instead.");
+ }
+ }
+
+ public verifyRenameInfoSucceeded(displayName?: string, fullDisplayName?: string, kind?: string, kindModifiers?: string) {
+ var renameInfo = this.languageService.getRenameInfo(this.activeFile.fileName, this.currentCaretPosition);
+ if (!renameInfo.canRename) {
+ throw new Error("Rename did not succeed");
+ }
+
+ this.validate("displayName", displayName, renameInfo.displayName);
+ this.validate("fullDisplayName", fullDisplayName, renameInfo.fullDisplayName);
+ this.validate("kind", kind, renameInfo.kind);
+ this.validate("kindModifiers", kindModifiers, renameInfo.kindModifiers);
+
+ if (this.getRanges().length !== 1) {
+ throw new Error("Expected a single range to be selected in the test file.");
+ }
+
+ var expectedRange = this.getRanges()[0];
+ if (renameInfo.triggerSpan.start() !== expectedRange.start ||
+ renameInfo.triggerSpan.end() !== expectedRange.end) {
+ throw new Error("Expected triggerSpan [" + expectedRange.start + "," + expectedRange.end + "). Got [" +
+ renameInfo.triggerSpan.start() + "," + renameInfo.triggerSpan.end() + ") instead.");
+ }
+ }
+
+ public verifyRenameInfoFailed(message?: string) {
+ var renameInfo = this.languageService.getRenameInfo(this.activeFile.fileName, this.currentCaretPosition);
+ if (renameInfo.canRename) {
+ throw new Error("Rename was expected to fail");
+ }
+
+ this.validate("error", message, renameInfo.localizedErrorMessage);
+ }
+
//private getFormalParameter() {
// var help = this.languageService.getSignatureHelpItems(this.activeFile.fileName, this.currentCaretPosition);
// return help.formal;
diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts
index e1b1e26c3c2..09ca70134f9 100644
--- a/tests/cases/fourslash/fourslash.ts
+++ b/tests/cases/fourslash/fourslash.ts
@@ -390,6 +390,14 @@ module FourSlashInterface {
public semanticClassificationsAre(...classifications: { classificationType: string; text: string }[]) {
FourSlash.currentTestState.verifySemanticClassifications(classifications);
}
+
+ public renameInfoSucceeded(displayName?: string, fullDisplayName?: string, kind?: string, kindModifiers?: string) {
+ FourSlash.currentTestState.verifyRenameInfoSucceeded(displayName, fullDisplayName, kind, kindModifiers)
+ }
+
+ public renameInfoFailed(message?: string) {
+ FourSlash.currentTestState.verifyRenameInfoFailed(message)
+ }
}
export class edit {
diff --git a/tests/cases/fourslash/getRenameInfoTests1.ts b/tests/cases/fourslash/getRenameInfoTests1.ts
new file mode 100644
index 00000000000..6f4300282d6
--- /dev/null
+++ b/tests/cases/fourslash/getRenameInfoTests1.ts
@@ -0,0 +1,8 @@
+///
+
+////class [|/**/C|] {
+////
+////}
+
+goTo.marker("");
+verify.renameInfoSucceeded("C");
\ No newline at end of file
diff --git a/tests/cases/fourslash/getRenameInfoTests2.ts b/tests/cases/fourslash/getRenameInfoTests2.ts
new file mode 100644
index 00000000000..93e8e451b4a
--- /dev/null
+++ b/tests/cases/fourslash/getRenameInfoTests2.ts
@@ -0,0 +1,8 @@
+///
+
+/////**/class C {
+////
+////}
+
+goTo.marker("");
+verify.renameInfoFailed();
\ No newline at end of file