diff --git a/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings.csproj b/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings.csproj
index 2150e3797b..ed9781c223 100644
--- a/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings.csproj
+++ b/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings.csproj
@@ -2,7 +2,7 @@
Exe
- net8.0
+ net10.0
enable
enable
diff --git a/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/FormatStringsEscaping.cs b/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/FormatStringsEscaping.cs
index 7e99244b0f..2e8dabdc6f 100644
--- a/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/FormatStringsEscaping.cs
+++ b/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/FormatStringsEscaping.cs
@@ -10,6 +10,14 @@ public static string FormatStringExample()
return formattedString;
}
+ public static string UnescapedCurlyBrackets()
+ {
+ var formatValue = "World";
+ var formattedString = string.Format("{Hello, {0}!}", formatValue);
+
+ return formattedString;
+ }
+
public static string CurlyBracketsEscaping()
{
var formatValue = "World";
@@ -18,6 +26,44 @@ public static string CurlyBracketsEscaping()
return formattedString;
}
+ public static string InterpolatedCurlyBracketsEscaping()
+ {
+ var formatValue = "World";
+ var formattedString = $"{{Hello, {formatValue}!}}";
+
+ return formattedString;
+ }
+
+ public static string FormatSpecifierInsideCurlyBrackets()
+ {
+ var orderNumber = 42;
+ var formattedString = string.Format("Order {{{0:D5}}}", orderNumber);
+
+ return formattedString;
+ }
+
+ public static string InterpolatedFormatSpecifierInsideCurlyBrackets()
+ {
+ var orderNumber = 42;
+ var formattedString = $"Order {{{orderNumber:D5}}}";
+
+ return formattedString;
+ }
+
+ public static string RawStringLiteralJson()
+ {
+ var name = "John";
+ var age = 30;
+ var json = $$"""
+ {
+ "name": "{{name}}",
+ "age": {{age}}
+ }
+ """;
+
+ return json;
+ }
+
public static string DoubleQuotesEscaping()
{
var message = "Important message";
@@ -26,7 +72,33 @@ public static string DoubleQuotesEscaping()
return formattedString;
}
+ public static string DoubleQuotesInVerbatimString()
+ {
+ var message = "Important message";
+ var formattedString = string.Format(@"""{0}"" is the message.", message);
+
+ return formattedString;
+ }
+
+ public static string DoubleQuotesInRawStringLiteral()
+ {
+ var message = "Important message";
+ var formattedString = string.Format("""
+ "{0}" is the message.
+ """, message);
+
+ return formattedString;
+ }
+
public static string BackslashEscaping()
+ {
+ var path = "C:\\Program Files\\";
+ var formattedString = string.Format("The installation path is: {0}", path);
+
+ return formattedString;
+ }
+
+ public static string BackslashInVerbatimString()
{
var path = @"C:\Program Files\";
var formattedString = string.Format("The installation path is: {0}", path);
diff --git a/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/Program.cs b/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/Program.cs
index fc06165377..b164ff3859 100644
--- a/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/Program.cs
+++ b/strings-csharp/EscapingCurlyBracketsInFormatStrings/EscapingCurlyBracketsInFormatStrings/Program.cs
@@ -3,11 +3,41 @@
var formatExampleResult = FormatStringsEscaping.FormatStringExample();
Console.WriteLine($"Result: {formatExampleResult}\n");
+try
+{
+ FormatStringsEscaping.UnescapedCurlyBrackets();
+}
+catch (FormatException ex)
+{
+ Console.WriteLine($"Result: {ex.Message}\n");
+}
+
var curlyBracketsResult = FormatStringsEscaping.CurlyBracketsEscaping();
Console.WriteLine($"Result: {curlyBracketsResult}\n");
+var interpolatedResult = FormatStringsEscaping.InterpolatedCurlyBracketsEscaping();
+Console.WriteLine($"Result: {interpolatedResult}\n");
+
+var formatSpecifierResult = FormatStringsEscaping.FormatSpecifierInsideCurlyBrackets();
+Console.WriteLine($"Result: {formatSpecifierResult}\n");
+
+var interpolatedFormatSpecifierResult = FormatStringsEscaping.InterpolatedFormatSpecifierInsideCurlyBrackets();
+Console.WriteLine($"Result: {interpolatedFormatSpecifierResult}\n");
+
+var jsonResult = FormatStringsEscaping.RawStringLiteralJson();
+Console.WriteLine($"Result:\n{jsonResult}\n");
+
var doubleQuotesResult = FormatStringsEscaping.DoubleQuotesEscaping();
Console.WriteLine($"Result: {doubleQuotesResult}\n");
+var verbatimQuotesResult = FormatStringsEscaping.DoubleQuotesInVerbatimString();
+Console.WriteLine($"Result: {verbatimQuotesResult}\n");
+
+var rawQuotesResult = FormatStringsEscaping.DoubleQuotesInRawStringLiteral();
+Console.WriteLine($"Result: {rawQuotesResult}\n");
+
var backslashResult = FormatStringsEscaping.BackslashEscaping();
-Console.WriteLine($"Result: {backslashResult}\n");
\ No newline at end of file
+Console.WriteLine($"Result: {backslashResult}\n");
+
+var verbatimBackslashResult = FormatStringsEscaping.BackslashInVerbatimString();
+Console.WriteLine($"Result: {verbatimBackslashResult}\n");
diff --git a/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/StringFormattingTests.cs b/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/StringFormattingTests.cs
index 9efe7ab0ac..709f72eaf9 100644
--- a/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/StringFormattingTests.cs
+++ b/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/StringFormattingTests.cs
@@ -13,6 +13,12 @@ public void GivenName_WhenFormatted_ThenHelloWithName()
Assert.AreEqual("Hello, John!", formattedString);
}
+ [TestMethod]
+ public void GivenValue_WhenCurlyBracketsNotEscaped_ThenThrowsFormatException()
+ {
+ Assert.ThrowsExactly(() => FormatStringsEscaping.UnescapedCurlyBrackets());
+ }
+
[TestMethod]
public void GivenValue_WhenCurlyBracketsEscaped_ThenFormattedStringWithCurlyBrackets()
{
@@ -21,6 +27,42 @@ public void GivenValue_WhenCurlyBracketsEscaped_ThenFormattedStringWithCurlyBrac
Assert.AreEqual("{Hello, World!}", formattedString);
}
+ [TestMethod]
+ public void GivenValue_WhenCurlyBracketsEscapedInInterpolatedString_ThenStringWithCurlyBrackets()
+ {
+ var formattedString = FormatStringsEscaping.InterpolatedCurlyBracketsEscaping();
+
+ Assert.AreEqual("{Hello, World!}", formattedString);
+ }
+
+ [TestMethod]
+ public void GivenNumber_WhenFormatSpecifierInsideEscapedCurlyBrackets_ThenFormattedNumberInCurlyBrackets()
+ {
+ var formattedString = FormatStringsEscaping.FormatSpecifierInsideCurlyBrackets();
+
+ Assert.AreEqual("Order {00042}", formattedString);
+ }
+
+ [TestMethod]
+ public void GivenNumber_WhenInterpolatedFormatSpecifierInsideEscapedCurlyBrackets_ThenFormattedNumberInCurlyBrackets()
+ {
+ var formattedString = FormatStringsEscaping.InterpolatedFormatSpecifierInsideCurlyBrackets();
+
+ Assert.AreEqual("Order {00042}", formattedString);
+ }
+
+ [TestMethod]
+ public void GivenValues_WhenRawStringLiteralUsed_ThenJsonWithSingleCurlyBrackets()
+ {
+ var json = FormatStringsEscaping.RawStringLiteralJson();
+
+ var expected = "{" + Environment.NewLine
+ + " \"name\": \"John\"," + Environment.NewLine
+ + " \"age\": 30" + Environment.NewLine
+ + "}";
+ Assert.AreEqual(expected.ReplaceLineEndings(), json.ReplaceLineEndings());
+ }
+
[TestMethod]
public void GivenMessage_WhenDoubleQuotesEscaped_ThenFormattedStringWithDoubleQuotes()
{
@@ -29,6 +71,22 @@ public void GivenMessage_WhenDoubleQuotesEscaped_ThenFormattedStringWithDoubleQu
Assert.AreEqual("\"Important message\" is the message.", formattedString);
}
+ [TestMethod]
+ public void GivenMessage_WhenDoubleQuotesInVerbatimString_ThenSameResult()
+ {
+ var formattedString = FormatStringsEscaping.DoubleQuotesInVerbatimString();
+
+ Assert.AreEqual("\"Important message\" is the message.", formattedString);
+ }
+
+ [TestMethod]
+ public void GivenMessage_WhenDoubleQuotesInRawStringLiteral_ThenSameResult()
+ {
+ var formattedString = FormatStringsEscaping.DoubleQuotesInRawStringLiteral();
+
+ Assert.AreEqual("\"Important message\" is the message.", formattedString);
+ }
+
[TestMethod]
public void GivenPath_WhenBackslashEscaped_ThenFormattedStringWithBackslashes()
{
@@ -36,5 +94,13 @@ public void GivenPath_WhenBackslashEscaped_ThenFormattedStringWithBackslashes()
Assert.AreEqual("The installation path is: C:\\Program Files\\", formattedString);
}
+
+ [TestMethod]
+ public void GivenPath_WhenBackslashInVerbatimString_ThenSameResult()
+ {
+ var formattedString = FormatStringsEscaping.BackslashInVerbatimString();
+
+ Assert.AreEqual("The installation path is: C:\\Program Files\\", formattedString);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/Tests.csproj b/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/Tests.csproj
index 4872b6d24c..fb5811b6d8 100644
--- a/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/Tests.csproj
+++ b/strings-csharp/EscapingCurlyBracketsInFormatStrings/Tests/Tests.csproj
@@ -1,7 +1,7 @@
- net8.0
+ net10.0
enable
enable
@@ -10,10 +10,10 @@
-
-
-
-
+
+
+
+