Home | History | Annotate | Download | only in harmony
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // Flags: --harmony-proxies --harmony-collections
     29 
     30 
     31 // Helper.
     32 
     33 function TestWithProxies(test, construct, handler) {
     34   test(construct, handler, Proxy.create)
     35   test(construct, handler, function(h) {
     36     return Proxy.createFunction(h, function() {})
     37   })
     38 }
     39 
     40 
     41 // Sets.
     42 
     43 function TestSet(construct, fix) {
     44   TestWithProxies(TestSet2, construct, fix)
     45 }
     46 
     47 function TestSet2(construct, fix, create) {
     48   var handler = {fix: function() { return {} }}
     49   var p1 = create(handler)
     50   var p2 = create(handler)
     51   var p3 = create(handler)
     52   fix(p3)
     53 
     54   var s = new construct();
     55   s.add(p1);
     56   s.add(p2);
     57   assertTrue(s.has(p1));
     58   assertTrue(s.has(p2));
     59   assertFalse(s.has(p3));
     60 
     61   fix(p1)
     62   fix(p2)
     63   assertTrue(s.has(p1));
     64   assertTrue(s.has(p2));
     65   assertFalse(s.has(p3));
     66 
     67   s.delete(p2);
     68   assertTrue(s.has(p1));
     69   assertFalse(s.has(p2));
     70   assertFalse(s.has(p3));
     71 }
     72 
     73 TestSet(Set, Object.seal)
     74 TestSet(Set, Object.freeze)
     75 TestSet(Set, Object.preventExtensions)
     76 
     77 
     78 // Maps and weak maps.
     79 
     80 function TestMap(construct, fix) {
     81   TestWithProxies(TestMap2, construct, fix)
     82 }
     83 
     84 function TestMap2(construct, fix, create) {
     85   var handler = {fix: function() { return {} }}
     86   var p1 = create(handler)
     87   var p2 = create(handler)
     88   var p3 = create(handler)
     89   fix(p3)
     90 
     91   var m = new construct();
     92   m.set(p1, 123);
     93   m.set(p2, 321);
     94   assertTrue(m.has(p1));
     95   assertTrue(m.has(p2));
     96   assertFalse(m.has(p3));
     97   assertSame(123, m.get(p1));
     98   assertSame(321, m.get(p2));
     99 
    100   fix(p1)
    101   fix(p2)
    102   assertTrue(m.has(p1));
    103   assertTrue(m.has(p2));
    104   assertFalse(m.has(p3));
    105   assertSame(123, m.get(p1));
    106   assertSame(321, m.get(p2));
    107 
    108   m.delete(p2);
    109   assertTrue(m.has(p1));
    110   assertFalse(m.has(p2));
    111   assertFalse(m.has(p3));
    112   assertSame(123, m.get(p1));
    113   assertSame(undefined, m.get(p2));
    114 }
    115 
    116 TestMap(Map, Object.seal)
    117 TestMap(Map, Object.freeze)
    118 TestMap(Map, Object.preventExtensions)
    119 
    120 TestMap(WeakMap, Object.seal)
    121 TestMap(WeakMap, Object.freeze)
    122 TestMap(WeakMap, Object.preventExtensions)
    123