NumberTests.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using Jint.Runtime;
  2. namespace Jint.Tests.Runtime;
  3. public class NumberTests
  4. {
  5. private readonly Engine _engine;
  6. public NumberTests()
  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. private void RunTest(string source)
  14. {
  15. _engine.Execute(source);
  16. }
  17. [Theory]
  18. [InlineData(1, "3.0e+0")]
  19. [InlineData(50, "3.00000000000000000000000000000000000000000000000000e+0")]
  20. [InlineData(100, "3.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0")]
  21. public void ToExponential(int fractionDigits, string result)
  22. {
  23. var value = _engine.Evaluate($"(3).toExponential({fractionDigits}).toString()").AsString();
  24. Assert.Equal(result, value);
  25. }
  26. [Theory]
  27. [InlineData(1, "3.0")]
  28. [InlineData(50, "3.00000000000000000000000000000000000000000000000000")]
  29. [InlineData(99, "3.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")]
  30. public void ToFixed(int fractionDigits, string result)
  31. {
  32. var value = _engine.Evaluate($"(3).toFixed({fractionDigits}).toString()").AsString();
  33. Assert.Equal(result, value);
  34. }
  35. [Fact]
  36. public void ToFixedWith100FractionDigitsThrows()
  37. {
  38. var ex = Assert.Throws<JavaScriptException>(() => _engine.Evaluate($"(3).toFixed(100)"));
  39. Assert.Equal("100 fraction digits is not supported due to .NET format specifier limitation", ex.Message);
  40. }
  41. [Theory]
  42. [InlineData(1, "3")]
  43. [InlineData(50, "3.0000000000000000000000000000000000000000000000000")]
  44. [InlineData(100, "3.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")]
  45. public void ToPrecision(int fractionDigits, string result)
  46. {
  47. var value = _engine.Evaluate($"(3).toPrecision({fractionDigits}).toString()").AsString();
  48. Assert.Equal(result, value);
  49. }
  50. [Theory]
  51. [InlineData("1.7976931348623157e+308", double.MaxValue)]
  52. public void ParseFloat(string input, double result)
  53. {
  54. var value = _engine.Evaluate($"parseFloat('{input}')").AsNumber();
  55. Assert.Equal(result, value);
  56. }
  57. // Results from node -v v18.18.0.
  58. [Theory]
  59. // Thousand separators.
  60. [InlineData("1000000", "en-US", "1,000,000")]
  61. [InlineData("1000000", "en-GB", "1,000,000")]
  62. [InlineData("1000000", "de-DE", "1.000.000")]
  63. // TODO. Fails in Win CI due to U+2009
  64. // Check https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu
  65. // [InlineData("1000000", "fr-FR", "1 000 000")]
  66. [InlineData("1000000", "es-ES", "1.000.000")]
  67. [InlineData("1000000", "es-LA", "1.000.000")]
  68. [InlineData("1000000", "es-MX", "1,000,000")]
  69. [InlineData("1000000", "es-AR", "1.000.000")]
  70. [InlineData("1000000", "es-CL", "1.000.000")]
  71. // Comma separator.
  72. [InlineData("1,23", "en-US", "23")]
  73. [InlineData("1,23", "en-GB", "23")]
  74. [InlineData("1,23", "de-DE", "23")]
  75. [InlineData("1,23", "fr-FR", "23")]
  76. [InlineData("1,23", "es-ES", "23")]
  77. [InlineData("1,23", "es-LA", "23")]
  78. [InlineData("1,23", "es-MX", "23")]
  79. [InlineData("1,23", "es-AR", "23")]
  80. [InlineData("1,23", "es-CL", "23")]
  81. // Dot deicimal separator.
  82. [InlineData("1.23", "en-US", "1.23")]
  83. [InlineData("1.23", "en-GB", "1.23")]
  84. [InlineData("1.23", "de-DE", "1,23")]
  85. [InlineData("1.23", "fr-FR", "1,23")]
  86. [InlineData("1.23", "es-ES", "1,23")]
  87. [InlineData("1.23", "es-LA", "1,23")]
  88. [InlineData("1.23", "es-MX", "1.23")]
  89. [InlineData("1.23", "es-AR", "1,23")]
  90. [InlineData("1.23", "es-CL", "1,23")]
  91. // Scientific notation.
  92. [InlineData("1e6", "en-US", "1,000,000")]
  93. [InlineData("1e6", "en-GB", "1,000,000")]
  94. [InlineData("1e6", "de-DE", "1.000.000")]
  95. // TODO. Fails in Win CI due to U+2009
  96. // Check https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu
  97. // [InlineData("1000000", "fr-FR", "1 000 000")]
  98. [InlineData("1e6", "es-ES", "1.000.000")]
  99. [InlineData("1e6", "es-LA", "1.000.000")]
  100. [InlineData("1e6", "es-MX", "1,000,000")]
  101. [InlineData("1e6", "es-AR", "1.000.000")]
  102. [InlineData("1e6", "es-CL", "1.000.000")]
  103. // Returns the correct max decimal degits for the respective cultures, rounded down.
  104. [InlineData("1.234444449", "en-US", "1.234")]
  105. [InlineData("1.234444449", "en-GB", "1.234")]
  106. [InlineData("1.234444449", "de-DE", "1,234")]
  107. [InlineData("1.234444449", "fr-FR", "1,234")]
  108. [InlineData("1.234444449", "es-ES", "1,234")]
  109. [InlineData("1.234444449", "es-LA", "1,234")]
  110. [InlineData("1.234444449", "es-MX", "1.234")]
  111. [InlineData("1.234444449", "es-AR", "1,234")]
  112. [InlineData("1.234444449", "es-CL", "1,234")]
  113. // Returns the correct max decimal degits for the respective cultures, rounded up.
  114. [InlineData("1.234500001", "en-US", "1.235")]
  115. [InlineData("1.234500001", "en-GB", "1.235")]
  116. [InlineData("1.234500001", "de-DE", "1,235")]
  117. [InlineData("1.234500001", "fr-FR", "1,235")]
  118. [InlineData("1.234500001", "es-ES", "1,235")]
  119. [InlineData("1.234500001", "es-LA", "1,235")]
  120. [InlineData("1.234500001", "es-MX", "1.235")]
  121. [InlineData("1.234500001", "es-AR", "1,235")]
  122. [InlineData("1.234500001", "es-CL", "1,235")]
  123. public void ToLocaleString(string parseNumber, string culture, string result)
  124. {
  125. var value = _engine.Evaluate($"({parseNumber}).toLocaleString('{culture}')").AsString();
  126. Assert.Equal(result, value);
  127. }
  128. [Theory]
  129. // Does not add extra zeros of there is no cuture argument.
  130. [InlineData("123456")]
  131. public void ToLocaleStringNoArg(string parseNumber)
  132. {
  133. var value = _engine.Evaluate($"({parseNumber}).toLocaleString()").AsString();
  134. Assert.DoesNotContain(".0", value);
  135. }
  136. }