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

// Like other primitives, symbols can be treated as objects, using object-like
// syntax: `symbol.prop` or `symbol[key]`.
//
// In ECMAScript spec jargon, this creates a Reference whose base value is a
// primitive Symbol value.

var symbols = [
    Symbol(),
    Symbol("ponies"),
    Symbol.for("sym"),
    Symbol.iterator
];

// Test accessor property, used below.
var gets, sets;
Object.defineProperty(Symbol.prototype, "prop", {
    get: function () {
        "use strict";
        gets++;
        assertEq(typeof this, "object");
        assertEq(this instanceof Symbol, true);
        assertEq(this.valueOf(), sym);
        return "got";
    },
    set: function (v) {
        "use strict";
        sets++;
        assertEq(typeof this, "object");
        assertEq(this instanceof Symbol, true);
        assertEq(this.valueOf(), sym);
        assertEq(v, "newvalue");
    }
});

for (var sym of symbols) {
    assertEq(sym.constructor, Symbol);

    // method on Object.prototype
    assertEq(sym.hasOwnProperty("constructor"), false);
    assertEq(sym.toLocaleString(), sym.toString()); // once .toString() exists

    // custom method monkeypatched onto Symbol.prototype
    Symbol.prototype.nonStrictMethod = function (arg) {
        assertEq(arg, "ok");
        assertEq(this instanceof Symbol, true);
        assertEq(this.valueOf(), sym);
        return 13;
    };
    assertEq(sym.nonStrictMethod("ok"), 13);

    // the same, but strict mode
    Symbol.prototype.strictMethod = function (arg) {
        "use strict";
        assertEq(arg, "ok2");
        assertEq(this, sym);
        return 14;
    };
    assertEq(sym.strictMethod("ok2"), 14);

    // getter/setter on Symbol.prototype
    gets = 0;
    sets = 0;
    var propname = "prop";

    assertEq(sym.prop, "got");
    assertEq(gets, 1);
    assertEq(sym[propname], "got");
    assertEq(gets, 2);

    assertEq(sym.prop = "newvalue", "newvalue");
    assertEq(sets, 1);
    assertEq(sym[propname] = "newvalue", "newvalue");
    assertEq(sets, 2);

    // non-existent property
    assertEq(sym.noSuchProp, undefined);
    var noSuchPropName = "nonesuch";
    assertEq(sym[noSuchPropName], undefined);

    // non-existent method
    assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError);
    assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError);
}

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