TokenizerTests.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System;
  2. using System.Globalization;
  3. namespace DesktopClock.Tests;
  4. public class TokenizerTests
  5. {
  6. [Fact]
  7. public void FormatWithTokenizer()
  8. {
  9. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  10. var format = "{dddd}, {MMM dd}, {HH:mm:ss}";
  11. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  12. Assert.Equal("Sunday, Sep 24, 12:13:14", result);
  13. }
  14. [Fact]
  15. public void FormatWithFallback()
  16. {
  17. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  18. var format = "dddd, MMM dd, HH:mm:ss";
  19. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  20. Assert.Equal("Sunday, Sep 24, 12:13:14", result);
  21. }
  22. [Theory]
  23. [InlineData(null)]
  24. [InlineData("")]
  25. [InlineData(" ")]
  26. public void FormatWithTokenizer_NullOrWhitespace_ShouldReturnDefaultToString(string format)
  27. {
  28. // Arrange
  29. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  30. // Act
  31. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  32. // Assert
  33. Assert.Equal(dateTime.ToString(), result);
  34. }
  35. [Fact]
  36. public void FormatWithTokenizer_SingleToken_ShouldFormat()
  37. {
  38. // Arrange
  39. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  40. var format = "{yyyy}";
  41. // Act
  42. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  43. // Assert
  44. Assert.Equal("2023", result);
  45. }
  46. [Fact]
  47. public void FormatWithTokenizer_MixedTextAndTokens_ShouldFormat()
  48. {
  49. // Arrange
  50. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  51. var format = "Today is {dddd}!";
  52. // Act
  53. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  54. // Assert
  55. Assert.Equal("Today is Sunday!", result);
  56. }
  57. [Fact]
  58. public void FormatWithTokenizer_MultipleTokens_ShouldFormatAll()
  59. {
  60. // Arrange
  61. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  62. var format = "{HH}:{mm}:{ss}";
  63. // Act
  64. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  65. // Assert
  66. Assert.Equal("12:13:14", result);
  67. }
  68. [Fact]
  69. public void FormatWithTokenizer_12HourFormat_ShouldWork()
  70. {
  71. // Arrange
  72. var dateTime = new DateTime(2023, 09, 24, 14, 30, 45);
  73. var format = "{h:mm tt}";
  74. // Act
  75. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  76. // Assert
  77. Assert.Equal("2:30 PM", result);
  78. }
  79. [Fact]
  80. public void FormatWithTokenizer_DateTimeOffset_ShouldWork()
  81. {
  82. // Arrange
  83. var dateTimeOffset = new DateTimeOffset(2023, 09, 24, 12, 13, 14, TimeSpan.FromHours(2));
  84. var format = "{dddd}, {MMM dd}";
  85. // Act
  86. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTimeOffset, format, CultureInfo.InvariantCulture);
  87. // Assert
  88. Assert.Equal("Sunday, Sep 24", result);
  89. }
  90. [Fact]
  91. public void FormatWithTokenizer_StandardFormat_WithoutBraces_ShouldWork()
  92. {
  93. // Arrange
  94. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  95. var format = "D"; // Long date pattern
  96. // Act
  97. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  98. // Assert
  99. Assert.Equal("Sunday, 24 September 2023", result);
  100. }
  101. [Fact]
  102. public void FormatWithTokenizer_TimeSpan_ShouldWork()
  103. {
  104. // Arrange
  105. var timeSpan = new TimeSpan(1, 23, 45, 30);
  106. var format = @"{d\.hh\:mm\:ss}";
  107. // Act
  108. var result = Tokenizer.FormatWithTokenizerOrFallBack(timeSpan, format, CultureInfo.InvariantCulture);
  109. // Assert
  110. Assert.Equal("1.23:45:30", result);
  111. }
  112. [Fact]
  113. public void FormatWithTokenizer_InvalidFormat_ShouldNotThrow()
  114. {
  115. // Arrange
  116. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  117. var format = "{invalid-format-string-xyz}";
  118. // Act - should not throw, may produce unexpected output but should handle gracefully
  119. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  120. // Assert - just verify it returns something and doesn't throw
  121. Assert.NotNull(result);
  122. }
  123. [Fact]
  124. public void FormatWithTokenizer_EmptyTokens_ShouldHandleGracefully()
  125. {
  126. // Arrange
  127. var dateTime = new DateTime(2023, 09, 24, 12, 13, 14);
  128. var format = "{}";
  129. // Act
  130. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  131. // Assert
  132. // Empty braces should be handled
  133. Assert.NotNull(result);
  134. }
  135. [Theory]
  136. [InlineData("{yyyy}-{MM}-{dd}", "2023-09-24")]
  137. [InlineData("{yyyy}/{MM}/{dd}", "2023/09/24")]
  138. [InlineData("{dd}.{MM}.{yyyy}", "24.09.2023")]
  139. public void FormatWithTokenizer_VariousDateFormats_ShouldWork(string format, string expected)
  140. {
  141. // Arrange
  142. var dateTime = new DateTime(2023, 09, 24);
  143. // Act
  144. var result = Tokenizer.FormatWithTokenizerOrFallBack(dateTime, format, CultureInfo.InvariantCulture);
  145. // Assert
  146. Assert.Equal(expected, result);
  147. }
  148. }