13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --harmony-proxies --harmony-collections
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Helper.
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestWithProxies(test, construct, handler) {
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  test(construct, handler, Proxy.create)
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  test(construct, handler, function(h) {
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Proxy.createFunction(h, function() {})
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  })
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Sets.
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSet(construct, fix) {
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  TestWithProxies(TestSet2, construct, fix)
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSet2(construct, fix, create) {
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var handler = {fix: function() { return {} }}
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var p1 = create(handler)
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var p2 = create(handler)
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var p3 = create(handler)
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  fix(p3)
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var s = construct();
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  s.add(p1);
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  s.add(p2);
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(s.has(p1));
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(s.has(p2));
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(s.has(p3));
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  fix(p1)
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  fix(p2)
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(s.has(p1));
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(s.has(p2));
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(s.has(p3));
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  s.delete(p2);
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(s.has(p1));
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(s.has(p2));
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(s.has(p3));
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestSet(Set, Object.seal)
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestSet(Set, Object.freeze)
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestSet(Set, Object.preventExtensions)
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Maps and weak maps.
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestMap(construct, fix) {
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  TestWithProxies(TestMap2, construct, fix)
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestMap2(construct, fix, create) {
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var handler = {fix: function() { return {} }}
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var p1 = create(handler)
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var p2 = create(handler)
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var p3 = create(handler)
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  fix(p3)
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var m = construct();
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  m.set(p1, 123);
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  m.set(p2, 321);
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(m.has(p1));
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(m.has(p2));
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(m.has(p3));
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(123, m.get(p1));
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(321, m.get(p2));
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  fix(p1)
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  fix(p2)
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(m.has(p1));
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(m.has(p2));
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(m.has(p3));
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(123, m.get(p1));
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(321, m.get(p2));
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  m.delete(p2);
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(m.has(p1));
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(m.has(p2));
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertFalse(m.has(p3));
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(123, m.get(p1));
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(undefined, m.get(p2));
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestMap(Map, Object.seal)
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestMap(Map, Object.freeze)
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestMap(Map, Object.preventExtensions)
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestMap(WeakMap, Object.seal)
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestMap(WeakMap, Object.freeze)
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestMap(WeakMap, Object.preventExtensions)
123