DateTests.cs 4.5 KB

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