StringTests.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. namespace Jint.Tests.Runtime;
  2. public class StringTests
  3. {
  4. public StringTests()
  5. {
  6. _engine = new Engine()
  7. .SetValue("log", new Action<object>(Console.WriteLine))
  8. .SetValue("assert", new Action<bool>(Assert.True))
  9. .SetValue("equal", new Action<object, object>(Assert.Equal));
  10. }
  11. private readonly Engine _engine;
  12. [Fact]
  13. public void StringConcatenationAndReferences()
  14. {
  15. const string script = @"
  16. var foo = 'foo';
  17. foo += 'foo';
  18. var bar = foo;
  19. bar += 'bar';
  20. ";
  21. var value = _engine.Execute(script);
  22. var foo = _engine.Evaluate("foo").AsString();
  23. var bar = _engine.Evaluate("bar").AsString();
  24. Assert.Equal("foofoo", foo);
  25. Assert.Equal("foofoobar", bar);
  26. }
  27. [Fact]
  28. public void TrimLeftRightShouldBeSameAsTrimStartEnd()
  29. {
  30. _engine.Execute(@"
  31. assert(''.trimLeft === ''.trimStart);
  32. assert(''.trimRight === ''.trimEnd);
  33. ");
  34. }
  35. [Fact]
  36. public void HasProperIteratorPrototypeChain()
  37. {
  38. const string Script = @"
  39. // Iterator instance
  40. var iterator = ''[Symbol.iterator]();
  41. // %StringIteratorPrototype%
  42. var proto1 = Object.getPrototypeOf(iterator);
  43. // %IteratorPrototype%
  44. var proto2 = Object.getPrototypeOf(proto1);";
  45. var engine = new Engine();
  46. engine.Execute(Script);
  47. Assert.True(engine.Evaluate("proto2.hasOwnProperty(Symbol.iterator)").AsBoolean());
  48. Assert.True(engine.Evaluate("!proto1.hasOwnProperty(Symbol.iterator)").AsBoolean());
  49. Assert.True(engine.Evaluate("!iterator.hasOwnProperty(Symbol.iterator)").AsBoolean());
  50. Assert.True(engine.Evaluate("iterator[Symbol.iterator]() === iterator").AsBoolean());
  51. }
  52. [Fact]
  53. public void IndexOf()
  54. {
  55. var engine = new Engine();
  56. Assert.Equal(0, engine.Evaluate("''.indexOf('', 0)"));
  57. Assert.Equal(0, engine.Evaluate("''.indexOf('', 1)"));
  58. }
  59. [Fact]
  60. public void TemplateLiteralsWithArrays()
  61. {
  62. var engine = new Engine();
  63. engine.Execute("var a = [1,2,'three',true];");
  64. Assert.Equal("test 1,2,three,true", engine.Evaluate("'test ' + a"));
  65. Assert.Equal("test 1,2,three,true", engine.Evaluate("`test ${a}`"));
  66. }
  67. [Fact]
  68. public void TemplateLiteralAsObjectKey()
  69. {
  70. var engine=new Engine();
  71. var result = engine.Evaluate("({ [`key`]: 'value' })").AsObject();
  72. Assert.True(result.HasOwnProperty("key"));
  73. Assert.Equal("value", result["key"]);
  74. }
  75. [Fact]
  76. public void ShouldCompareWithLocale()
  77. {
  78. var engine = new Engine();
  79. Assert.Equal(1, engine.Evaluate("'王五'.localeCompare('张三')").AsInteger());
  80. Assert.Equal(-1, engine.Evaluate("'王五'.localeCompare('张三', 'zh-CN')").AsInteger());
  81. }
  82. public static TheoryData<string, string> GetLithuaniaTestsData()
  83. {
  84. return new StringTetsLithuaniaData().TestData();
  85. }
  86. /// <summary>
  87. /// Lithuanian case is special and Test262 suite tests cover only correct parsing by character. See:
  88. /// https://github.com/tc39/test262/blob/main/test/intl402/String/prototype/toLocaleUpperCase/special_casing_Lithuanian.js
  89. /// Added logic in the engine needs to parse full strings and not only spare characters. This is what these tests cover.
  90. /// </summary>
  91. [Theory]
  92. [MemberData(nameof(GetLithuaniaTestsData))]
  93. public void LithuanianToLocaleUpperCase(string parseStr, string result)
  94. {
  95. var value = _engine.Evaluate($"('{parseStr}').toLocaleUpperCase('lt')").AsString();
  96. Assert.Equal(result, value);
  97. }
  98. }