/*===
basic
object 3 [object Array]
0 foo
1 bar
2 quux
object 7 [object Array]
0 0
1 1
2 2
3 3
4 4
5 5
6 length
===*/

print('basic');

function basicTest() {
    var proto = { proto: 'prototype' };
    var obj;

    function test(o) {
        var t = Object.getOwnPropertyNames(o);
        var i;

        print(typeof t, t.length, Object.prototype.toString.call(t));
        for (i = 0; i < t.length; i++) {
            print(i, t[i]);
        }
    }

    obj = Object.create(proto);
    obj.foo = 1;
    obj.bar = 2;
    obj.quux = 3;

    // return own properties only; order is not mandated but we expect
    // that properties are returned in definition order here too
    test(obj);

    // character index properties must be returned (however, Rhino does not)
    test(new String('foobar'));
}

try {
    basicTest();
} catch (e) {
    print(e);
}

/*===
coercion
TypeError
TypeError
TypeError
TypeError
TypeError
TypeError
TypeError
object
object
object
===*/

print('coercion');

function coercionTest() {
    function test(o, is_noarg) {
        var t;

        try {
            if (is_noarg) {
                t = Object.getOwnPropertyNames(o);
            } else {
                t = Object.getOwnPropertyNames(o);
            }
            print(typeof t);  // don't print length because function properties are custom
        } catch (e) {
            print(e.name);
        }
    }

    test(undefined, true);
    test(undefined);
    test(null);
    test(true);
    test(false);
    test(123);
    test('foo');
    test([1,2]);
    test({ foo: 1, bar: 2 });
    test(function(){});
}

try {
    coercionTest();
} catch (e) {
    print(e);
}

