NumberTests.cs 6.4 KB

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