// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

js> var x = new JavaAdapter(java.util.HashMap, {})
js> x
{}
js> x instanceof java.util.HashMap
true
js> x instanceof java.util.Map
true
js> x.put("foo", "bar")
null
js> x
{foo=bar}
js> x.get("foo")
bar
js> x = new JavaAdapter(java.util.HashMap, {}, {a: "b"})
{a=b}
js> x.get("a")
b
js> x.remove("a")
b
js> x
{}
js> x.get("a")
null
js> x = new JavaAdapter(java.util.HashMap, {get: function(key) {return 2 + this.super$get(key)}})
{}
js> x.put("foo", "bar")
null
js> x.get("foo")
2bar
js> x.get("bar")
2.0
js> x = new JavaAdapter({}); x.class.superclass
class java.lang.Object
js> x.class.interfaces.length
0
js> var Appendable = java.lang.Appendable
js> var Runnable = java.lang.Runnable
js> function append() {return this}
js> function run() {return "done"}
js> var x = new JavaAdapter(Runnable, Appendable, {run: run, append: append})
js> x instanceof Appendable
true
js> x instanceof Runnable
true
js> x.append("foo") === x
true
js> x.run()
js> // test access to protected methods
js> x = JavaAdapter(java.util.Hashtable, {test: function() {this.rehash();}});
{}
js> x.test()
js> // test access to protected fields
js> x = JavaAdapter(java.util.Vector, {test: function() {return this.elementCount;}});
[]
js> x.test()
0
js> x.add(1)
true
js> x.test()
1
js> // test non-empty constructor with protected field
js> x = JavaAdapter(java.util.Vector, {test: function() {return this.elementData.length;}}, 20);
[]
js> x.test()
20
js> // test extending abstract base class
js> x = new java.util.AbstractList({get: function(i) { return i + 1; }})
[]
js> x.get(0)
1.0
js> x.get(1)
2.0
js> x.get(2)
3.0
js> // test implementing an interface
js> x = new java.util.List({get: function(i) { return i + 1; }, toString: function() { return "[]"; }})
[]
js> x.get(0)
1.0
js> x.get(1)
2.0
js> x.get(2)
3.0
