1c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Copyright 2011 the V8 project authors. All rights reserved.
2c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Redistribution and use in source and binary forms, with or without
3c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// modification, are permitted provided that the following conditions are
4c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// met:
5c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//
6c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//     * Redistributions of source code must retain the above copyright
7c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//       notice, this list of conditions and the following disclaimer.
8c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//     * Redistributions in binary form must reproduce the above
9c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//       copyright notice, this list of conditions and the following
10c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//       disclaimer in the documentation and/or other materials provided
11c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//       with the distribution.
12c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//     * Neither the name of Google Inc. nor the names of its
13c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//       contributors may be used to endorse or promote products derived
14c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//       from this software without specific prior written permission.
15c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com//
16c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
28cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org// Flags: --harmony-proxies
29c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
30c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
31c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Helper.
32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
33394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction TestWithProxies(test, construct, handler) {
34394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  test(construct, handler, Proxy.create)
35394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  test(construct, handler, function(h) {
36394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return Proxy.createFunction(h, function() {})
37394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  })
38c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
39c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
40c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
41394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Sets.
42c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
43394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction TestSet(construct, fix) {
44394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  TestWithProxies(TestSet2, construct, fix)
45c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
46c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
47394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction TestSet2(construct, fix, create) {
48c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  var handler = {fix: function() { return {} }}
49c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  var p1 = create(handler)
50c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  var p2 = create(handler)
51c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  var p3 = create(handler)
52c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  fix(p3)
53c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
54d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var s = new construct();
55394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  s.add(p1);
56394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  s.add(p2);
57394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(s.has(p1));
58394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(s.has(p2));
59394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(s.has(p3));
60394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
61394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  fix(p1)
62394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  fix(p2)
63394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(s.has(p1));
64394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(s.has(p2));
65394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(s.has(p3));
66394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
67394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  s.delete(p2);
68394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(s.has(p1));
69394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(s.has(p2));
70394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(s.has(p3));
71394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
72394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
73394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestSet(Set, Object.seal)
74394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestSet(Set, Object.freeze)
75394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestSet(Set, Object.preventExtensions)
76394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
77394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
78394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Maps and weak maps.
79394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
80394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction TestMap(construct, fix) {
81394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  TestWithProxies(TestMap2, construct, fix)
82394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
83394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
84394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction TestMap2(construct, fix, create) {
85394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  var handler = {fix: function() { return {} }}
86394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  var p1 = create(handler)
87394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  var p2 = create(handler)
88394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  var p3 = create(handler)
89394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  fix(p3)
90394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
91d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var m = new construct();
92c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  m.set(p1, 123);
93c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  m.set(p2, 321);
94394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(m.has(p1));
95394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(m.has(p2));
96394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(m.has(p3));
97c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  assertSame(123, m.get(p1));
98c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  assertSame(321, m.get(p2));
99c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
100c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  fix(p1)
101c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  fix(p2)
102394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(m.has(p1));
103394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(m.has(p2));
104394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(m.has(p3));
105c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  assertSame(123, m.get(p1));
106c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  assertSame(321, m.get(p2));
107394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
108394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  m.delete(p2);
109394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertTrue(m.has(p1));
110394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(m.has(p2));
111394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertFalse(m.has(p3));
112394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertSame(123, m.get(p1));
113394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertSame(undefined, m.get(p2));
114c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
115c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
116394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestMap(Map, Object.seal)
117394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestMap(Map, Object.freeze)
118394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestMap(Map, Object.preventExtensions)
119394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
120394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestMap(WeakMap, Object.seal)
121394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestMap(WeakMap, Object.freeze)
122394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTestMap(WeakMap, Object.preventExtensions)
123