builtin_array_circular_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package goja
  2. import (
  3. "testing"
  4. )
  5. func TestArrayCircularReferenceToString(t *testing.T) {
  6. const SCRIPT = `
  7. var T = [1, 2, 3];
  8. T[42] = T; // Create circular reference
  9. var str = String(T);
  10. // Circular reference should be replaced with empty string
  11. str === "1,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
  12. `
  13. testScript(SCRIPT, valueTrue, t)
  14. }
  15. func TestArrayCircularReferenceNumericOperation(t *testing.T) {
  16. const SCRIPT = `
  17. var T = [1, 2, 3];
  18. T[42] = T; // Create circular reference
  19. try {
  20. var x = T % 2; // This should not crash
  21. true;
  22. } catch (e) {
  23. false;
  24. }
  25. `
  26. testScript(SCRIPT, valueTrue, t)
  27. }
  28. func TestArrayCircularReferenceJoin(t *testing.T) {
  29. const SCRIPT = `
  30. var T = [1, 2, 3];
  31. T[42] = T; // Create circular reference
  32. var str = T.join(',');
  33. // Circular reference should be replaced with empty string
  34. str === "1,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
  35. `
  36. testScript(SCRIPT, valueTrue, t)
  37. }
  38. func TestArrayCircularReferenceConcat(t *testing.T) {
  39. const SCRIPT = `
  40. var T = [1, 2, 3];
  41. T[42] = T; // Create circular reference
  42. var str = '' + T; // String concatenation
  43. // Circular reference should be replaced with empty string
  44. str === "1,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
  45. `
  46. testScript(SCRIPT, valueTrue, t)
  47. }
  48. func TestArrayCircularReferenceToLocaleString(t *testing.T) {
  49. const SCRIPT = `
  50. var T = [1, 2, 3];
  51. T[42] = T; // Create circular reference
  52. var str = T.toLocaleString();
  53. // Circular reference should be replaced with empty string
  54. str === "1,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
  55. `
  56. testScript(SCRIPT, valueTrue, t)
  57. }
  58. func TestArrayMultipleCircularReferences(t *testing.T) {
  59. const SCRIPT = `
  60. var T = [1, 2, 3];
  61. T[42] = T;
  62. T[76] = T;
  63. T[80] = T;
  64. var str = String(T);
  65. // Should handle multiple circular references - all should be empty strings
  66. str.split(',').length === 81;
  67. `
  68. testScript(SCRIPT, valueTrue, t)
  69. }
  70. func TestArrayNestedCircularReference(t *testing.T) {
  71. const SCRIPT = `
  72. var A = [1, 2];
  73. var B = [3, 4];
  74. A[2] = B;
  75. B[2] = A; // Mutual circular reference
  76. var str = String(A);
  77. // A contains B which contains A - circular refs should be empty
  78. str === "1,2,3,4,";
  79. `
  80. testScript(SCRIPT, valueTrue, t)
  81. }
  82. func TestArrayCircularReferenceAccessOK(t *testing.T) {
  83. const SCRIPT = `
  84. // These operations should still work fine
  85. var T = [1, 2, 3];
  86. T[42] = T;
  87. // Accessing circular reference is OK
  88. var same = T[42] === T;
  89. // Accessing elements through circular reference is OK
  90. var first = T[42][0];
  91. // Deep nesting is OK
  92. var deep = T[42][42][42][42][42][0];
  93. same && first === 1 && deep === 1;
  94. `
  95. testScript(SCRIPT, valueTrue, t)
  96. }
  97. func TestArrayCircularReferenceComparison(t *testing.T) {
  98. const SCRIPT = `
  99. var T = [1, 2, 3];
  100. T[42] = T; // Create circular reference
  101. try {
  102. var result = T == 5; // Comparison should not crash
  103. true;
  104. } catch (e) {
  105. false;
  106. }
  107. `
  108. testScript(SCRIPT, valueTrue, t)
  109. }