1 /*
   2  * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /**
  25  * Verify that JSAdapter works as expected.
  26  *
  27  * @test
  28  * @run
  29  */
  30 
  31 var obj = new JSAdapter() {
  32     __get__: function(name) {
  33         Assert.assertTrue(this === obj);
  34         print("getter called for '" + name + "'"); return name;
  35     },
  36 
  37     __put__: function(name, value) {
  38         Assert.assertTrue(this === obj);
  39         print("setter called for '" + name + "' with " + value);
  40     },
  41 
  42     __call__: function(name, arg1, arg2) {
  43         Assert.assertTrue(this === obj);
  44         print("method '" + name + "' called with " + arg1 + ", " + arg2);
  45     },
  46 
  47     __new__: function(arg1, arg2) {
  48         Assert.assertTrue(this === obj);
  49         print("new with " + arg1 + ", " + arg2);
  50     },
  51 
  52     __getKeys__: function() {
  53         Assert.assertTrue(this === obj);
  54         print("__getKeys__ called");
  55         return [ "foo", "bar" ];
  56     },
  57 
  58     __getValues__: function() {
  59         Assert.assertTrue(this === obj);
  60         print("__getValues__ called");
  61         return [ "fooval", "barval" ];
  62     },
  63 
  64     __has__: function(name) {
  65         Assert.assertTrue(this === obj);
  66         print("__has__ called with '" + name + "'");
  67         return name == "js";
  68     },
  69 
  70     __delete__: function(name) {
  71         Assert.assertTrue(this === obj);
  72         print("__delete__ called with '" + name + "'");
  73         return true;
  74     },
  75 
  76     __preventExtensions__ : function() {
  77         Assert.assertTrue(this === obj);
  78         print("__preventExtensions__ called");
  79     },
  80 
  81     __freeze__ : function() {
  82         Assert.assertTrue(this === obj);
  83         print("__freeze__ called");
  84 
  85     },
  86 
  87     __isFrozen__ : function() {
  88         Assert.assertTrue(this === obj);
  89         print("__isFrozen__ called");
  90         return false;
  91     },
  92 
  93     __seal__ : function() {
  94         Assert.assertTrue(this === obj);
  95         print("__seal__ called");
  96     },
  97 
  98     __isSealed__ : function() {
  99         Assert.assertTrue(this === obj);
 100         print("__isSealed__ called");
 101         return false;
 102     },
 103 
 104     __isExtensible__ : function() {
 105         Assert.assertTrue(this === obj);
 106         print("__isExtensible__ called");
 107         return true;
 108     }
 109 };
 110 
 111 // calls __get__
 112 print(obj.foo);
 113 
 114 // calls __put__
 115 obj.foo = 33;
 116 
 117 // calls __call__
 118 obj.func("hello", "world");
 119 
 120 // calls __new__
 121 new obj("hey!", "it works!");
 122 
 123 // calls __getKeys__
 124 for (i in obj) {
 125     print(i);
 126 }
 127 
 128 // calls __getValues__
 129 for each (i in obj) {
 130     print(i);
 131 }
 132 
 133 // calls __has__
 134 var x = "foo" in obj;
 135 print(x);
 136 
 137 // calls __has__
 138 var y = "js" in obj;
 139 print(y);
 140 
 141 // calls __delete__
 142 print(delete obj.prop);
 143 
 144 // call __get__ and __set__
 145 print(obj["js"]);
 146 obj["js"] = "javascript";
 147 print(obj["javascript"]);
 148 
 149 // call __isExtensible__, __isSealed__, __isFrozen__
 150 print(Object.isExtensible(obj));
 151 print(Object.isSealed(obj));
 152 print(Object.isFrozen(obj));
 153 
 154 // call __freeze__, __seal__, __preventExtensions__
 155 Object.freeze(obj);
 156 Object.seal(obj);
 157 Object.preventExtensions(obj);