ArrayTests.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using System;
  2. using Jint.Native.Array;
  3. using Xunit;
  4. namespace Jint.Tests.Runtime
  5. {
  6. public class ArrayTests
  7. {
  8. private readonly Engine _engine;
  9. public ArrayTests()
  10. {
  11. _engine = new Engine()
  12. .SetValue("log", new Action<object>(Console.WriteLine))
  13. .SetValue("assert", new Action<bool>(Assert.True))
  14. .SetValue("equal", new Action<object, object>(Assert.Equal));
  15. }
  16. private void RunTest(string source)
  17. {
  18. _engine.Execute(source);
  19. }
  20. [Fact]
  21. public void ArrayPrototypeToStringWithArray()
  22. {
  23. var result = _engine.Evaluate("Array.prototype.toString.call([1,2,3]);").AsString();
  24. Assert.Equal("1,2,3", result);
  25. }
  26. [Fact]
  27. public void ArrayPrototypeToStringWithNumber()
  28. {
  29. var result = _engine.Evaluate("Array.prototype.toString.call(1);").AsString();
  30. Assert.Equal("[object Number]", result);
  31. }
  32. [Fact]
  33. public void ArrayPrototypeToStringWithObject()
  34. {
  35. var result = _engine.Evaluate("Array.prototype.toString.call({});").AsString();
  36. Assert.Equal("[object Object]", result);
  37. }
  38. [Fact]
  39. public void EmptyStringKey()
  40. {
  41. var result = _engine.Evaluate("var x=[];x[\"\"]=8;x[\"\"];").AsNumber();
  42. Assert.Equal(8, result);
  43. }
  44. [Fact]
  45. public void LargeArraySize()
  46. {
  47. const string code = @"
  48. let arr = [];
  49. for (let i = 0; i < 10000; i++) arr.push(i);
  50. for (let i=0;i<10000;i++) arr.splice(0, 1);
  51. ";
  52. var engine = new Engine();
  53. engine.Execute(code);
  54. }
  55. [Fact]
  56. public void ArrayLengthFromInitialState()
  57. {
  58. var engine = new Engine();
  59. var array = new ArrayInstance(engine, 0);
  60. var length = (int) array.Length;
  61. Assert.Equal(0, length);
  62. }
  63. [Fact]
  64. public void ArraySortIsStable()
  65. {
  66. const string code = @"
  67. var items = [
  68. { name: 'Edward', value: 0 },
  69. { name: 'Sharpe', value: 0 },
  70. { name: 'And', value: 0 },
  71. { name: 'The', value: 1 },
  72. { name: 'Magnetic', value: 0 },
  73. { name: 'Zeros', value: 0 }
  74. ];
  75. // sort by value
  76. function compare(a, b) {
  77. return a.value - b.value;
  78. }
  79. var a = items.sort();
  80. assert(a[0].name == 'Edward');
  81. assert(a[1].name == 'Sharpe');
  82. assert(a[2].name == 'And');
  83. assert(a[3].name == 'The');
  84. assert(a[4].name == 'Magnetic');
  85. assert(a[5].name == 'Zeros');
  86. var a = items.sort(compare);
  87. assert(a[0].name == 'Edward');
  88. assert(a[1].name == 'Sharpe');
  89. assert(a[2].name == 'And');
  90. assert(a[3].name == 'Magnetic');
  91. assert(a[4].name == 'Zeros');
  92. assert(a[5].name == 'The');
  93. ";
  94. _engine.Execute(code);
  95. }
  96. [Fact]
  97. public void ExtendingArrayAndInstanceOf()
  98. {
  99. const string script = @"
  100. class MyArr extends Array {
  101. constructor(...args) {
  102. super(...args);
  103. }
  104. }";
  105. _engine.Execute(script);
  106. _engine.Evaluate("const a = new MyArr(1,2);");
  107. Assert.True(_engine.Evaluate("a instanceof MyArr").AsBoolean());
  108. }
  109. [Fact]
  110. public void IteratorShouldBeConvertibleToArray()
  111. {
  112. Assert.Equal("hello;again", _engine.Evaluate("Array.from(['hello', 'again'].values()).join(';')"));
  113. Assert.Equal("hello;another", _engine.Evaluate("Array.from(new Map([['hello', 'world'], ['another', 'value']]).keys()).join(';')"));
  114. }
  115. [Fact]
  116. public void ArrayFromShouldNotFlattenInputArray()
  117. {
  118. Assert.Equal("a;b", _engine.Evaluate("[...['a', 'b']].join(';')"));
  119. Assert.Equal("0,a;1,b", _engine.Evaluate("[...['a', 'b'].entries()].join(';')"));
  120. Assert.Equal("0,c;1,d", _engine.Evaluate("Array.from(['c', 'd'].entries()).join(';')"));
  121. Assert.Equal("0,e;1,f", _engine.Evaluate("Array.from([[0, 'e'],[1, 'f']]).join(';')"));
  122. }
  123. [Fact]
  124. public void ArrayEntriesShouldReturnKeyValuePairs()
  125. {
  126. Assert.Equal("0,hello,1,world", _engine.Evaluate("Array.from(['hello', 'world'].entries()).join()"));
  127. Assert.Equal("0,hello;1,world", _engine.Evaluate("Array.from(['hello', 'world'].entries()).join(';')"));
  128. Assert.Equal("0,;1,1;2,5", _engine.Evaluate("Array.from([,1,5,].entries()).join(';')"));
  129. }
  130. [Fact]
  131. public void IteratorsShouldHaveIteratorSymbol()
  132. {
  133. _engine.Execute("assert(!!['hello'].values()[Symbol.iterator])");
  134. _engine.Execute("assert(!!new Map([['hello', 'world']]).keys()[Symbol.iterator])");
  135. }
  136. }
  137. }