["localStorage", "sessionStorage"].forEach(function(name) {
    test(function() {
        var key = Symbol();

        var storage = window[name];
        storage.clear();

        storage[key] = "test";
        assert_equals(storage[key], "test");
    }, name + ": plain set + get (loose)");

    test(function() {
        "use strict";
        var key = Symbol();

        var storage = window[name];
        storage.clear();

        storage[key] = "test";
        assert_equals(storage[key], "test");
    }, name + ": plain set + get (strict)");

    test(function() {
        var key = Symbol();

        var storage = window[name];
        storage.clear();

        Object.defineProperty(storage, key, { "value": "test" });
        assert_equals(storage[key], "test");
    }, name + ": defineProperty + get");

    test(function() {
        var key = Symbol();

        var storage = window[name];
        storage.clear();

        Object.defineProperty(storage, key, { "value": "test", "configurable": false });
        assert_equals(storage[key], "test");
        var desc = Object.getOwnPropertyDescriptor(storage, key);
        assert_false(desc.configurable, "configurable");

        assert_false(delete storage[key]);
        assert_equals(storage[key], "test");
    }, name + ": defineProperty not configurable");

    test(function() {
        var key = Symbol();
        Storage.prototype[key] = "test";
        this.add_cleanup(function() { delete Storage.prototype[key]; });

        var storage = window[name];
        storage.clear();

        assert_equals(storage[key], "test");
        var desc = Object.getOwnPropertyDescriptor(storage, key);
        assert_equals(desc, undefined);
    }, name + ": get with symbol on prototype");

    test(function() {
        var key = Symbol();

        var storage = window[name];
        storage.clear();

        storage[key] = "test";
        assert_true(delete storage[key]);
        assert_equals(storage[key], undefined);
    }, name + ": delete existing property");

    test(function() {
        var key = Symbol();

        var storage = window[name];
        storage.clear();

        assert_true(delete storage[key]);
        assert_equals(storage[key], undefined);
    }, name + ": delete non-existent property");
});
