DateTests.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using Jint.Native;
  2. namespace Jint.Tests.Runtime;
  3. public class DateTests
  4. {
  5. private readonly Engine _engine;
  6. public DateTests()
  7. {
  8. _engine = new Engine()
  9. .SetValue("log", new Action<object>(Console.WriteLine))
  10. .SetValue("assert", new Action<bool>(Assert.True))
  11. .SetValue("equal", new Action<object, object>(Assert.Equal));
  12. }
  13. [Fact]
  14. public void NaNToString()
  15. {
  16. var value = _engine.Evaluate("new Date(NaN).toString();").AsString();
  17. Assert.Equal("Invalid Date", value);
  18. }
  19. [Fact]
  20. public void NaNToDateString()
  21. {
  22. var value = _engine.Evaluate("new Date(NaN).toDateString();").AsString();
  23. Assert.Equal("Invalid Date", value);
  24. }
  25. [Fact]
  26. public void NaNToTimeString()
  27. {
  28. var value = _engine.Evaluate("new Date(NaN).toTimeString();").AsString();
  29. Assert.Equal("Invalid Date", value);
  30. }
  31. [Fact]
  32. public void NaNToLocaleString()
  33. {
  34. var value = _engine.Evaluate("new Date(NaN).toLocaleString();").AsString();
  35. Assert.Equal("Invalid Date", value);
  36. }
  37. [Fact]
  38. public void NaNToLocaleDateString()
  39. {
  40. var value = _engine.Evaluate("new Date(NaN).toLocaleDateString();").AsString();
  41. Assert.Equal("Invalid Date", value);
  42. }
  43. [Fact]
  44. public void NaNToLocaleTimeString()
  45. {
  46. var value = _engine.Evaluate("new Date(NaN).toLocaleTimeString();").AsString();
  47. Assert.Equal("Invalid Date", value);
  48. }
  49. [Fact]
  50. public void ToJsonFromNaNObject()
  51. {
  52. var result = _engine.Evaluate("JSON.stringify({ date: new Date(NaN) });");
  53. Assert.Equal("{\"date\":null}", result.ToString());
  54. }
  55. [Fact]
  56. public void ValuePrecisionIsIntegral()
  57. {
  58. var number = _engine.Evaluate("new Date() / 1").AsNumber();
  59. Assert.Equal((long) number, number);
  60. var dateInstance = _engine.Realm.Intrinsics.Date.Construct(123);
  61. Assert.Equal((long) dateInstance.DateValue, dateInstance.DateValue);
  62. }
  63. [Fact]
  64. public void ToStringFollowsJavaScriptFormat()
  65. {
  66. TimeZoneInfo timeZoneInfo;
  67. try
  68. {
  69. timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
  70. }
  71. catch
  72. {
  73. timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
  74. }
  75. var engine = new Engine(options => options.LocalTimeZone(timeZoneInfo));
  76. Assert.Equal("Tue Feb 01 2022 00:00:00 GMT+0800 (China Standard Time)", engine.Evaluate("new Date(2022,1,1).toString()"));
  77. Assert.Equal("Tue Feb 01 2022 00:00:00 GMT+0800 (China Standard Time)", engine.Evaluate("new Date(2022,1,1)").ToString());
  78. }
  79. [Theory]
  80. [InlineData("Thu, 30 Jan 2020 08:00:00 PST", 1580400000000)]
  81. [InlineData("Thursday January 01 1970 00:00:25 UTC", 25000)]
  82. [InlineData("Wednesday 31 December 1969 18:01:26 MDT", 86000)]
  83. [InlineData("Wednesday 31 December 1969 19:00:08 EST", 8000)]
  84. [InlineData("Wednesday 31 December 1969 17:01:59 PDT", 119000)]
  85. [InlineData("December 31 1969 17:01:14 MST", 74000)]
  86. [InlineData("January 01 1970 01:46:06 +0145", 66000)]
  87. [InlineData("December 31 1969 17:00:50 PDT", 50000)]
  88. public void CanParseLocaleString(string input, long expected)
  89. {
  90. Assert.Equal(expected, _engine.Evaluate($"new Date('{input}') * 1").AsNumber());
  91. }
  92. [Theory]
  93. [InlineData("December 31 1900 12:00:00 +0300", 31)]
  94. [InlineData("January 1 1969 12:00:00 +0300", 1)]
  95. [InlineData("December 31 1969 12:00:00 +0300", 31)]
  96. [InlineData("January 1 1970 12:00:00 +0300", 1)]
  97. [InlineData("December 31 1970 12:00:00 +0300", 31)]
  98. public void CanParseDate(string input, int expectedDate)
  99. {
  100. TimeZoneInfo timeZoneInfo;
  101. try
  102. {
  103. timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Europe/Kiev");
  104. }
  105. catch
  106. {
  107. timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");
  108. }
  109. var engine = new Engine(options => options.LocalTimeZone(timeZoneInfo));
  110. Assert.Equal(expectedDate, _engine.Evaluate($"new Date('{input}').getDate()").AsNumber());
  111. }
  112. [Fact]
  113. public void CanUseMoment()
  114. {
  115. var momentJs = EngineTests.GetEmbeddedFile("moment.js");
  116. _engine.Execute(momentJs);
  117. var parsedDate = _engine.Evaluate("moment().format('yyyy')").ToString();
  118. Assert.Equal(DateTime.Now.Year.ToString(),parsedDate);
  119. }
  120. [Fact]
  121. public void CanParseEmptyDate()
  122. {
  123. Assert.True(double.IsNaN(_engine.Evaluate("Date.parse('')").AsNumber()));
  124. }
  125. [Fact]
  126. public void DateTimeMinValueFlag()
  127. {
  128. var date = DateTime.MinValue;
  129. var jsDate = new JsDate(_engine, date);
  130. Assert.Equal(DateFlags.DateTimeMinValue, jsDate._dateValue.Flags);
  131. date = date.AddMilliseconds(1);
  132. jsDate = new JsDate(_engine, date);
  133. Assert.Equal(DateFlags.None, jsDate._dateValue.Flags);
  134. }
  135. [Fact]
  136. public void DateTimeMaxValueFlag()
  137. {
  138. var date = DateTime.MaxValue;
  139. var jsDate = new JsDate(_engine, date);
  140. Assert.Equal(DateFlags.DateTimeMaxValue, jsDate._dateValue.Flags);
  141. date = date.AddMilliseconds(-1);
  142. jsDate = new JsDate(_engine, date);
  143. Assert.Equal(DateFlags.None, jsDate._dateValue.Flags);
  144. }
  145. }