/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/ */

var symbols = [
    Symbol(),
    Symbol("one"),
    Symbol.for("two"),
    Symbol.iterator,
    Object(Symbol())
];

for (var sym of symbols) {
    var obj = {};

    // access a nonexistent property
    assertEq(sym in obj, false);
    assertEq(obj.hasOwnProperty(sym), false);
    assertEq(obj[sym], undefined);
    assertEq(typeof obj[sym], "undefined");
    assertEq(Object.getOwnPropertyDescriptor(obj, sym), undefined);

    // assign, then try accessing again
    obj[sym] = "ok";
    assertEq(sym in obj, true);
    assertEq(obj.hasOwnProperty(sym), true);
    assertEq(obj[sym], "ok");
    assertDeepEq(Object.getOwnPropertyDescriptor(obj, sym), {
        value: "ok",
        writable: true,
        enumerable: true,
        configurable: true
    });

    // assign again, observe value is overwritten
    obj[sym] = 12;
    assertEq(obj[sym], 12);

    // increment
    assertEq(obj[sym]++, 12);
    assertEq(obj[sym], 13);
}

if (typeof reportCompare === "function")
    reportCompare(0, 0);
