Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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";
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Console.WriteLine($"Result: {backslashResult}\n");

var verbatimBackslashResult = FormatStringsEscaping.BackslashInVerbatimString();
Console.WriteLine($"Result: {verbatimBackslashResult}\n");
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ public void GivenName_WhenFormatted_ThenHelloWithName()
Assert.AreEqual("Hello, John!", formattedString);
}

[TestMethod]
public void GivenValue_WhenCurlyBracketsNotEscaped_ThenThrowsFormatException()
{
Assert.ThrowsExactly<FormatException>(() => FormatStringsEscaping.UnescapedCurlyBrackets());
}

[TestMethod]
public void GivenValue_WhenCurlyBracketsEscaped_ThenFormattedStringWithCurlyBrackets()
{
Expand All @@ -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()
{
Expand All @@ -29,12 +71,36 @@ 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()
{
var formattedString = FormatStringsEscaping.BackslashEscaping();

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);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.0.4" />
<PackageReference Include="MSTest.TestFramework" Version="3.0.4" />
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
<PackageReference Include="MSTest.TestAdapter" Version="4.5.2" />
<PackageReference Include="MSTest.TestFramework" Version="4.5.2" />
<PackageReference Include="coverlet.collector" Version="10.1.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading