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
     29 
     30 
     31 // Helper.
     32 
     33 function TestWithProxies(test, construct, handler) {
     34   test(construct, handler, function(h) { return new Proxy({}, h) })
     35   // TODO(cbruni): Adapt and enable once we have [[Call]] working.
     36   // test(construct, handler, function(h) {
     37   //  return Proxy.createFunction(h, function() {})
     38   // })
     39 }
     40 
     41 
     42 // Sets.
     43 
     44 function TestSet(construct, fix) {
     45   TestWithProxies(TestSet2, construct, fix)
     46 }
     47 
     48 function TestSet2(construct, fix, create) {
     49   var handler = {fix: function() { return {} }}
     50   var p1 = create(handler)
     51   var p2 = create(handler)
     52   var p3 = create(handler)
     53   fix(p3)
     54 
     55   var s = new construct();
     56   s.add(p1);
     57   s.add(p2);
     58   assertTrue(s.has(p1));
     59   assertTrue(s.has(p2));
     60   assertFalse(s.has(p3));
     61 
     62   fix(p1)
     63   fix(p2)
     64   assertTrue(s.has(p1));
     65   assertTrue(s.has(p2));
     66   assertFalse(s.has(p3));
     67 
     68   s.delete(p2);
     69   assertTrue(s.has(p1));
     70   assertFalse(s.has(p2));
     71   assertFalse(s.has(p3));
     72 }
     73 
     74 TestSet(Set, Object.seal)
     75 TestSet(Set, Object.freeze)
     76 TestSet(Set, Object.preventExtensions)
     77 
     78 
     79 // Maps and weak maps.
     80 
     81 function TestMap(construct, fix) {
     82   TestWithProxies(TestMap2, construct, fix)
     83 }
     84 
     85 function TestMap2(construct, fix, create) {
     86   var handler = {fix: function() { return {} }}
     87   var p1 = create(handler)
     88   var p2 = create(handler)
     89   var p3 = create(handler)
     90   fix(p3)
     91 
     92   var m = new construct();
     93   m.set(p1, 123);
     94   m.set(p2, 321);
     95   assertTrue(m.has(p1));
     96   assertTrue(m.has(p2));
     97   assertFalse(m.has(p3));
     98   assertSame(123, m.get(p1));
     99   assertSame(321, m.get(p2));
    100 
    101   fix(p1)
    102   fix(p2)
    103   assertTrue(m.has(p1));
    104   assertTrue(m.has(p2));
    105   assertFalse(m.has(p3));
    106   assertSame(123, m.get(p1));
    107   assertSame(321, m.get(p2));
    108 
    109   m.delete(p2);
    110   assertTrue(m.has(p1));
    111   assertFalse(m.has(p2));
    112   assertFalse(m.has(p3));
    113   assertSame(123, m.get(p1));
    114   assertSame(undefined, m.get(p2));
    115 }
    116 
    117 TestMap(Map, Object.seal)
    118 TestMap(Map, Object.freeze)
    119 TestMap(Map, Object.preventExtensions)
    120 
    121 TestMap(WeakMap, Object.seal)
    122 TestMap(WeakMap, Object.freeze)
    123 TestMap(WeakMap, Object.preventExtensions)
    124