diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringBackTick.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringBackTick.ts
new file mode 100644
index 00000000000..5025c5df7c7
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringBackTick.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = `/*x*/w/*y*/ith back\`tick`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+"const foo = \"with back`tick\"",
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringBinaryExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringBinaryExpr.ts
new file mode 100644
index 00000000000..b545b7861c3
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringBinaryExpr.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = `/*x*/f/*y*/oobar is ${ 42 + 6 } years old`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+`const foo = "foobar is " + (42 + 6) + " years old"`,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringDollar.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringDollar.ts
new file mode 100644
index 00000000000..1629f7e7df9
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringDollar.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = `/*x*/w/*y*/ith \${dollar}`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+"const foo = \"with ${dollar}\"",
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringExprInRow.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringExprInRow.ts
new file mode 100644
index 00000000000..93a3897f67c
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringExprInRow.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = `/*x*/f/*y*/oobar is ${ 42 }${ 6 } years old`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+`const foo = "foobar is " + 42 + 6 + " years old"`,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringMultiExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringMultiExpr.ts
new file mode 100644
index 00000000000..8e1daf79c58
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringMultiExpr.ts
@@ -0,0 +1,16 @@
+///
+
+//// const age = 22
+//// const name = "Eddy"
+//// const foo = \`\${ /*x*/n/*y*/ame } is \${ age } years old\`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+`const age = 22
+const name = "Eddy"
+const foo = name + " is " + age + " years old"`,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNested.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNested.ts
new file mode 100644
index 00000000000..f3240a10b92
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNested.ts
@@ -0,0 +1,14 @@
+///
+
+//// const age = 42
+//// const foo = `/*x*/f/*y*/oobar is a ${ age < 18 ? 'child' : `grown-up ${ age > 40 ? 'who needs probaply assistance': ''}` }`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+`const age = 42
+const foo = "foobar is a " + ( age < 18 ? 'child' : \`grown-up \${ age > 40 ? 'who needs probaply assistance': ''}\` ) `,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOneExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOneExpr.ts
new file mode 100644
index 00000000000..a6bf5c4d192
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOneExpr.ts
@@ -0,0 +1,14 @@
+///
+
+//// const age = 42
+//// const foo = `/*x*/f/*y*/oobar is ${ age } years old`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+`const age = 42
+const foo = "foobar is " + age + " years old"`,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringSimple.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringSimple.ts
new file mode 100644
index 00000000000..7c6496be7b5
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringSimple.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = `/*x*/f/*y*/oobar rocks`
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to string concatenation",
+ actionDescription: "Convert to string concatenation",
+ newContent:
+`const foo = "foobar rocks"`,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBackTick.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBackTick.ts
new file mode 100644
index 00000000000..8c7b2a93833
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBackTick.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = "/*x*/w/*y*/ith back`tick"
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to template literal",
+ actionDescription: "Convert to template literal",
+ newContent:
+"const foo = `with back\`tick`",
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateCalcExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExpr.ts
similarity index 100%
rename from tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateCalcExpr.ts
rename to tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExpr.ts
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateDollar.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateDollar.ts
new file mode 100644
index 00000000000..884b3020235
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateDollar.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = "/*x*/w/*y*/ith ${dollar}"
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to template literal",
+ actionDescription: "Convert to template literal",
+ newContent:
+"const foo = `with \${dollar}`",
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprInRow.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprInRow.ts
new file mode 100644
index 00000000000..1c3af854309
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprInRow.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = "/*x*/f/*y*/oobar is " + 42 + 6 + " years old"
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to template literal",
+ actionDescription: "Convert to template literal",
+ newContent:
+`const foo = \`foobar is \${ 42 }\${ 6 } years old\``,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateMultiLines.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateMultiLines.ts
new file mode 100644
index 00000000000..e58111ebfb2
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateMultiLines.ts
@@ -0,0 +1,18 @@
+///
+
+//// const foo = "/*x*/w/*y*/ait for others\n"
+//// + "D'oh!\n"
+//// + ""Yada, yada, yada\n"
+//// + "Hasta la vista, baby!"
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to template literal",
+ actionDescription: "Convert to template literal",
+ newContent:
+`const foo = \`wait for others
+D'oh!
+Yada, yada, yada
+Hasta la vista, baby!\``,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateNewLine.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateNewLine.ts
new file mode 100644
index 00000000000..577c1de4efb
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateNewLine.ts
@@ -0,0 +1,14 @@
+///
+
+//// const foo = "/*x*/w/*y*/ait for new line\n"
+//// + "bada bum!"
+
+goTo.select("x", "y");
+edit.applyRefactor({
+ refactorName: "Convert string concatenation or template literal",
+ actionName: "Convert to template literal",
+ actionDescription: "Convert to template literal",
+ newContent:
+`const foo = \`wait for new line
+bada bum!\``,
+});