toJSON.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. var TEST = function(a, b) {
  6. if (a != b) {
  7. throw new Error(a + " != " + b);
  8. }
  9. }
  10. var fnc = function(n) { this.number = n };
  11. fnc.prototype.toJSON = function() {
  12. return this.number.toString();
  13. }
  14. // test getter - no-enum
  15. {
  16. var obj = {};
  17. Object.defineProperty(obj, "c", { get: () => 3, enumerable: false });
  18. obj.a = 1;
  19. obj.b = 2;
  20. obj.d = 4;
  21. TEST('{"a":1,"b":2,"d":4}', JSON.stringify(obj));
  22. }
  23. // test getter - no-enum - delete
  24. {
  25. var obj = {};
  26. Object.defineProperty(obj, "c", { get: () => 3, enumerable: false, configurable: true });
  27. obj.a = 1;
  28. obj.b = 2;
  29. delete obj['c']
  30. TEST('{"a":1,"b":2}', JSON.stringify(obj));;
  31. Object.defineProperty(obj, "c", { get: () => 3, enumerable: false });
  32. obj.d = 4;
  33. TEST('{"a":1,"b":2,"d":4}', JSON.stringify(obj));
  34. }
  35. // test getter - enum - delete 'em all
  36. {
  37. var obj = {};
  38. Object.defineProperty(obj, "c", { get: () => 3, enumerable: true, configurable: true });
  39. obj.a = 1;
  40. obj.b = 2;
  41. delete obj['c']
  42. TEST('{"a":1,"b":2}', JSON.stringify(obj));;
  43. Object.defineProperty(obj, "c", { get: () => 3, enumerable: true });
  44. obj.d = 4;
  45. TEST('{"c":3,"a":1,"b":2,"d":4}', JSON.stringify(obj));
  46. obj[9]=19;
  47. TEST('{"9":19,"c":3,"a":1,"b":2,"d":4}', JSON.stringify(obj));
  48. delete obj[9]
  49. TEST('{"c":3,"a":1,"b":2,"d":4}', JSON.stringify(obj));
  50. delete obj['a']
  51. TEST('{"c":3,"b":2,"d":4}', JSON.stringify(obj));
  52. }
  53. // test getter
  54. {
  55. var obj = {a:1, b:2};
  56. Object.defineProperty(obj, "c", { get: () => 3, enumerable: true });
  57. obj.d = 4;
  58. TEST('{"a":1,"b":2,"c":3,"d":4}', JSON.stringify(obj));;
  59. }
  60. // test getter - setter
  61. {
  62. var obj = {a:1, b:2};
  63. Object.defineProperty(obj, "c", { get: () => 3, enumerable: true }); // should print
  64. Object.defineProperty(obj, "d", { set: () => 4, enumerable: true }); // skips undefined
  65. obj.e = 5;
  66. TEST('{"a":1,"b":2,"c":3,"e":5}', JSON.stringify(obj));
  67. }
  68. // test getter with revive
  69. {
  70. function rev(name, value) {
  71. if (value == 3) {
  72. return undefined;
  73. }
  74. else if (value == true) {
  75. return 99;
  76. }
  77. return value;
  78. }
  79. var obj = {a:1, b:2};
  80. Object.defineProperty(obj, "c", { get: () => 3, enumerable: true });
  81. obj.d = 4;
  82. TEST('{"a":99,"b":2,"d":4}', JSON.stringify( JSON.parse(JSON.stringify(obj), rev) ));
  83. }
  84. // test getter with revive && objectArray
  85. {
  86. function rev(name, value) {
  87. if (value == 3) {
  88. return undefined;
  89. }
  90. else if (value == true) {
  91. return 99;
  92. }
  93. return value;
  94. }
  95. var obj = {a:1, b:2, q:3};
  96. obj[9] = 9;
  97. obj[44] = 44;
  98. Object.defineProperty(obj, "c", { get: () => 7, enumerable: true });
  99. obj.d = 4;
  100. obj = JSON.parse(JSON.stringify(obj), rev);
  101. TEST('{"9":9,"44":44,"a":99,"b":2,"c":7,"d":4}', JSON.stringify( obj ));
  102. }
  103. // test getter with revive && objectArray && no-enum
  104. {
  105. function rev(name, value) {
  106. if (value == 9) {
  107. return undefined;
  108. }
  109. else if (value == true) {
  110. return 99;
  111. }
  112. return value;
  113. }
  114. var obj = {a:1, b:2};
  115. obj[7] = 8;
  116. obj[9] = 9;
  117. obj[44] = 44;
  118. Object.defineProperty(obj, "c", { get: () => 3, enumerable: false });
  119. obj.d = 4;
  120. obj = JSON.parse(JSON.stringify(obj), rev);
  121. TEST('{"7":8,"44":44,"a":99,"b":2,"d":4}', JSON.stringify( obj ));
  122. }
  123. // test - hasObjectArray but no elements in it
  124. {
  125. var obj = {"a":1};
  126. obj[0] = 2;
  127. TEST(JSON.stringify(obj), '{"0":2,"a":1}');
  128. delete obj[0];
  129. TEST(JSON.stringify(obj), '{"a":1}');
  130. }
  131. // test internal properties
  132. {
  133. let obj = {foo: 1};
  134. let wm = new WeakMap();
  135. // Add internal WeakMapKeyMap property to obj
  136. wm.set(obj,obj);
  137. TEST('{"foo":1}', JSON.stringify(obj));
  138. Object.defineProperty(obj, "getter", {get: function () { return 2}, enumerable: true, configurable: true});
  139. TEST('{"foo":1,"getter":2}', JSON.stringify(obj));
  140. const err = new Error("message");
  141. TEST('{}', JSON.stringify(err));
  142. }
  143. // test - function prototype new instance
  144. TEST("\"1\"", JSON.stringify(new fnc(1)))
  145. // test - pre-post alter Date toJSON definition
  146. var dateString = JSON.stringify(new Date(0));
  147. TEST("1970", dateString.substr(dateString.indexOf("1970"), 4))
  148. Date.prototype.toJSON = 1;
  149. TEST("{}", JSON.stringify(new Date(0)))
  150. delete Date.prototype.toJSON
  151. TEST("{}", JSON.stringify(new Date(0)))
  152. // test - use from Object prototype
  153. Object.prototype.toJSON = function() { return 2; }
  154. delete fnc.prototype.toJSON;
  155. TEST(2, JSON.stringify(new fnc(1)))
  156. // test - symbol
  157. Object.prototype[Symbol("toJSON")] = function() { return 3; }
  158. TEST(2, JSON.stringify(new fnc(1)))
  159. console.log("PASS")