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
31var 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__
112print(obj.foo);
113
114// calls __put__
115obj.foo = 33;
116
117// calls __call__
118obj.func("hello", "world");
119
120// calls __new__
121new obj("hey!", "it works!");
122
123// calls __getKeys__
124for (i in obj) {
125    print(i);
126}
127
128// calls __getValues__
129for each (i in obj) {
130    print(i);
131}
132
133// calls __has__
134var x = "foo" in obj;
135print(x);
136
137// calls __has__
138var y = "js" in obj;
139print(y);
140
141// calls __delete__
142print(delete obj.prop);
143
144// call __get__ and __set__
145print(obj["js"]);
146obj["js"] = "javascript";
147print(obj["javascript"]);
148
149// call __isExtensible__, __isSealed__, __isFrozen__
150print(Object.isExtensible(obj));
151print(Object.isSealed(obj));
152print(Object.isFrozen(obj));
153
154// call __freeze__, __seal__, __preventExtensions__
155Object.freeze(obj);
156Object.seal(obj);
157Object.preventExtensions(obj);
158