destructuring-assignment.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. describe("parsing", () => {
  2. test("single name", () => {
  3. expect(`var { a } = {};`).toEval();
  4. expect(`const { a } = {};`).toEval();
  5. expect(`let { a } = {};`).toEval();
  6. });
  7. test("single name with rest values", () => {
  8. expect(`var { a, ...rest } = {};`).toEval();
  9. expect(`const { a, ...rest } = {};`).toEval();
  10. expect(`let { a, ...rest } = {};`).toEval();
  11. });
  12. test("single aliased name", () => {
  13. expect(`var { a: b } = {};`).toEval();
  14. expect(`const { a: b } = {};`).toEval();
  15. expect(`let { a: b } = {};`).toEval();
  16. });
  17. test("single aliased name with rest values", () => {
  18. expect(`var { a: b, ...rest } = {};`).toEval();
  19. expect(`const { a: b, ...rest } = {};`).toEval();
  20. expect(`let { a: b, ...rest } = {};`).toEval();
  21. });
  22. test("array destructuring patterns", () => {
  23. expect(`var [ a ] = [];`).toEval();
  24. expect(`const [ a ] = [];`).toEval();
  25. expect(`let [ a ] = [];`).toEval();
  26. });
  27. test("destructuring assignment with rest assignments, array patterns", () => {
  28. expect(`var [ a, ...rest ] = [];`).toEval();
  29. expect(`const [ a, ...rest ] = [];`).toEval();
  30. expect(`let [ a, ...rest ] = [];`).toEval();
  31. });
  32. test("destructuring assignment with rest names, array patterns with recursive patterns", () => {
  33. expect(`var [ a, [ ...rest ] ] = [];`).toEval();
  34. expect(`const [ a, [ ...rest ] ] = [];`).toEval();
  35. expect(`let [ a, [ ...rest ] ] = [];`).toEval();
  36. });
  37. test("destructuring assignment with rest names, array patterns with recursive patterns 2", () => {
  38. expect(`var [ a, [ ...{length} ] ] = [];`).toEval();
  39. expect(`const [ a, [ ...{length} ] ] = [];`).toEval();
  40. expect(`let [ a, [ ...{length} ] ] = [];`).toEval();
  41. });
  42. });
  43. describe("evaluating", () => {
  44. test("single name", () => {
  45. let o = { a: 1 };
  46. {
  47. var { a } = o;
  48. expect(a).toBe(o.a);
  49. }
  50. {
  51. const { a } = o;
  52. expect(a).toBe(o.a);
  53. }
  54. {
  55. let { a } = o;
  56. expect(a).toBe(o.a);
  57. }
  58. });
  59. test("single name with rest values", () => {
  60. let o = { a: 1, b: 2 };
  61. {
  62. var { a, ...b } = o;
  63. expect(a).toBe(o.a);
  64. expect(b).toEqual({ b: 2 });
  65. }
  66. {
  67. const { a, ...b } = o;
  68. expect(a).toBe(o.a);
  69. expect(b).toEqual({ b: 2 });
  70. }
  71. {
  72. let { a, ...b } = o;
  73. expect(a).toBe(o.a);
  74. expect(b).toEqual({ b: 2 });
  75. }
  76. });
  77. test("single aliased name", () => {
  78. let o = { a: 1 };
  79. {
  80. var { a: x } = o;
  81. expect(x).toBe(o.a);
  82. }
  83. {
  84. const { a: x } = o;
  85. expect(x).toBe(o.a);
  86. }
  87. {
  88. let { a: x } = o;
  89. expect(x).toBe(o.a);
  90. }
  91. });
  92. test("single aliased name with rest values", () => {
  93. let o = { a: 1, b: 2 };
  94. {
  95. var { a: x, ...b } = o;
  96. expect(x).toBe(o.a);
  97. expect(b).toEqual({ b: 2 });
  98. }
  99. {
  100. const { a: x, ...b } = o;
  101. expect(x).toBe(o.a);
  102. expect(b).toEqual({ b: 2 });
  103. }
  104. {
  105. let { a: x, ...b } = o;
  106. expect(x).toBe(o.a);
  107. expect(b).toEqual({ b: 2 });
  108. }
  109. });
  110. test("array patterns", () => {
  111. let o = [1, 2, 3, 4];
  112. {
  113. var [a, b] = o;
  114. expect(a).toBe(o[0]);
  115. expect(b).toBe(o[1]);
  116. }
  117. {
  118. const [a, b] = o;
  119. expect(a).toBe(o[0]);
  120. expect(b).toBe(o[1]);
  121. }
  122. {
  123. let [a, b] = o;
  124. expect(a).toBe(o[0]);
  125. expect(b).toBe(o[1]);
  126. }
  127. });
  128. test("destructuring assignment with rest names, array patterns", () => {
  129. let o = [1, 2, 3, 4];
  130. {
  131. var [a, ...b] = o;
  132. expect(a).toBe(o[0]);
  133. expect(b).toEqual(o.slice(1));
  134. }
  135. {
  136. const [a, ...b] = o;
  137. expect(a).toBe(o[0]);
  138. expect(b).toEqual(o.slice(1));
  139. }
  140. {
  141. let [a, ...b] = o;
  142. expect(a).toBe(o[0]);
  143. expect(b).toEqual(o.slice(1));
  144. }
  145. });
  146. test("destructuring assignment with rest names, array patterns with recursive patterns", () => {
  147. let o = [1, [2, 3, 4]];
  148. {
  149. var [a, [b, ...c]] = o;
  150. expect(a).toBe(o[0]);
  151. expect(b).toBe(o[1][0]);
  152. expect(c).toEqual(o[1].slice(1));
  153. }
  154. {
  155. const [a, [b, ...c]] = o;
  156. expect(a).toBe(o[0]);
  157. expect(b).toBe(o[1][0]);
  158. expect(c).toEqual(o[1].slice(1));
  159. }
  160. {
  161. let [a, [b, ...c]] = o;
  162. expect(a).toBe(o[0]);
  163. expect(b).toBe(o[1][0]);
  164. expect(c).toEqual(o[1].slice(1));
  165. }
  166. });
  167. test("destructuring assignment with rest names, array patterns with recursive patterns 2", () => {
  168. let o = [1, [2, 3, 4]];
  169. {
  170. var [a, [...{ length }]] = o;
  171. expect(a).toBe(o[0]);
  172. expect(length).toBe(o[1].length);
  173. }
  174. {
  175. const [a, [...{ length }]] = o;
  176. expect(a).toBe(o[0]);
  177. expect(length).toBe(o[1].length);
  178. }
  179. {
  180. let [a, [...{ length }]] = o;
  181. expect(a).toBe(o[0]);
  182. expect(length).toBe(o[1].length);
  183. }
  184. });
  185. test("patterns with default", () => {
  186. let o = { a: 1 };
  187. let { x = "foo", a = "bar" } = o;
  188. expect(x).toBe("foo");
  189. expect(a).toBe(o.a);
  190. });
  191. });