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 @@ - - - - + + + +