/* global require, describe, it */

var assert = require("assert");
var CoreObject = require("../../js/CoreObject.js");
var Set = require("../../js/Set.js");

describe("MO5.Set", function () {

    describe("constructor", function () {

        it("should add the items given to it as an array.", function (done) {

            var o = {foo: "bar"};
            var co = new CoreObject();
            var items = [1, 2, 3, "foo", "bar", o, co];
            var s = new Set(items);

            items.forEach(function (item) {
                assert(s.has(item), "The item should be in the set.");
            });

            done();
        });

    });

    describe(".prototype.add(item)", function () {

        it("should add any type of item to the set and return the Set object.", function (done) {

            var o = {foo: "bar"};
            var co = new CoreObject();
            var items = [1, 2, 3, "foo", "bar", o, co, null, undefined, 2.22, [1, 2, 3]];
            var s = new Set();

            items.forEach(function (item) {
                assert(s.add(item) instanceof Set, "The Set object must be returned.");
                assert(s.has(item), "The item should be in the set.");
            });

            done();
        });

    });

    describe(".prototype.delete(item)", function () {

        it("should delete an item from the Set object and return a boolean.", function (done) {

            var o = {foo: "bar"};
            var co = new CoreObject();
            var items = [1, 2, 3, "foo", "bar", o, co, null, undefined, 2.22, [1, 2, 3]];
            var itemsToDelete = ["bar", 1, 2, o, co, null];
            var s = new Set();

            items.forEach(s.add.bind(s));

            itemsToDelete.forEach(function (item) {
                assert.equal(typeof s.delete(item), "boolean", "The return value must be a boolean.");
                assert(!s.has(item), "The item should be deleted.");
            });

            done();
        });

    });

    describe(".prototype.has(item)", function () {

        it("should return true for added items.", function (done) {

            var o = {foo: "bar"};
            var co = new CoreObject();
            var items = [1, 2, 3, "foo", "bar", o, co, null, undefined, 2.22, [1, 2, 3]];
            var s = new Set();

            items.forEach(function (item) {
                s.add(item);
                assert(typeof s.has(item), "boolean", "The return value must be boolean.");
                assert(s.has(item) === true, "The return value must be true");
            });

            done();
        });

        it("should return false for items not in the set.", function (done) {

            var o = {foo: "bar"};
            var co = new CoreObject();
            var items = [1, 2, 3, "foo", "bar", o, co, null, undefined, 2.22, [1, 2, 3]];
            var s = new Set();

            items.forEach(function (item) {
                assert(typeof s.has(item), "boolean", "The return value must be boolean.");
                assert(s.has(item) === false, "The return value must be false");
            });

            done();
        });

        it("should return false for destroyed CoreObjects.", function (done) {

            var items = [new CoreObject(), new CoreObject(), 1, 2, new CoreObject()];
            var s = new Set();

            items.forEach(function (item) {

                s.add(item);

                if (CoreObject.isCoreObject(item)) {
                    item.destroy();
                    assert(s.has(item) === false, "Return value should be false for CoreObejcts.");
                }
                else {
                    assert(s.has(item) === true, "Return value should be true for other items.");
                }
            });

            done();
        });

    });

});

Documents

docs/reference/elements/nametemplate.md
docs/reference/elements/stop.md
docs/development.md
docs/documentation.md
docs/downloads.md
docs/examples.md
docs/games.md
docs/index.md
docs/reference/elements/alert.md
docs/reference/elements/animation.md
docs/reference/elements/assets.md
docs/reference/elements/audio.md
docs/reference/elements/background.md
docs/reference/elements/break.md
docs/reference/elements/character.md
docs/reference/elements/choice.md
docs/reference/elements/clear.md
docs/reference/elements/composite.md
docs/reference/elements/conditionals.md
docs/reference/elements/confirm.md
docs/reference/elements/curtain.md
docs/reference/elements/displayname.md
docs/reference/elements/do.md
docs/reference/elements/easing_attribute.md
docs/reference/elements/else.md
docs/reference/elements/flash.md
docs/reference/elements/flicker.md
docs/reference/elements/fn.md
docs/reference/elements/global.md
docs/reference/elements/globalize.md
docs/reference/elements/goto.md
docs/reference/elements/group.md
docs/reference/elements/hide.md
docs/reference/elements/image.md
docs/reference/elements/imagepack.md
docs/reference/elements/line.md
docs/reference/elements/localize.md
docs/reference/elements/move.md
docs/community.md
docs/reference/elements/option.md
docs/reference/elements/pause.md
docs/reference/elements/play.md
docs/reference/elements/prompt.md
docs/reference/elements/restart.md
docs/reference/elements/scene.md
docs/reference/elements/scenes.md
docs/reference/elements/set.md
docs/reference/elements/set_vars.md
docs/reference/elements/settings.md
docs/reference/elements/shake.md
docs/reference/elements/show.md
docs/reference/elements/source.md
docs/reference/elements/stage.md
docs/reference/elements/start.md
docs/beginners-guide.md
docs/reference/elements/sub.md
docs/reference/elements/tag.md
docs/reference/elements/textbox.md
docs/reference/elements/track.md
docs/reference/elements/transform.md
docs/reference/elements/trigger.md
docs/reference/elements/trigger_command.md
docs/reference/elements/triggers.md
docs/reference/elements/var.md
docs/reference/elements/wait.md
docs/reference/elements/when.md
docs/reference/elements/while.md
docs/reference/elements/with.md
docs/reference/elements/ws.md
docs/reference/elements.md
docs/reference/language.md
docs/reference/structure.md
docs/reference/syntax.md
docs/web-servers.md
libs/MO5/README.md
libs/MO5/libs/using.js/README.md
libs/MO5/js/EventBus.js
libs/MO5/js/Animation.js
libs/MO5/js/CoreObject.js
libs/MO5/js/Exception.js
libs/MO5/js/List.js
libs/MO5/js/MO5.js
libs/MO5/js/Map.js
libs/MO5/js/Point.js
libs/MO5/js/Promise.js
libs/MO5/js/Queue.js
libs/MO5/js/Result.js
libs/MO5/js/Set.js
libs/MO5/js/Size.js
libs/MO5/js/Timer.js
libs/MO5/js/TimerWatcher.js
libs/MO5/js/ajax.js
libs/MO5/js/assert.js
libs/MO5/js/dom.Element.js
libs/MO5/js/dom.effects.typewriter.js
libs/MO5/js/dom.escape.js
libs/MO5/js/easing.js
libs/MO5/js/fail.js
libs/MO5/js/globals.document.js
libs/MO5/js/globals.window.js
libs/MO5/js/range.js
libs/MO5/js/tools.js
libs/MO5/js/transform.js
libs/MO5/js/types.js
libs/MO5/libs/using.js/tests/index.js
libs/MO5/libs/using.js/tests/module1.js
libs/MO5/libs/using.js/tests/module2.js
libs/MO5/libs/using.js/tests/module3.js
libs/MO5/libs/using.js/using.js
libs/MO5/tests/node/EventBus.test.js
libs/MO5/tests/node/Set.test.js
src/savegames.js
src/tools/reveal.js
src/tools/ui.js
src/loader.js
src/tools/tools.js
src/tools/compile.js
src/functions.js
src/DisplayObject.js
src/Game.js
src/Interpreter.js
src/Keys.js
src/LoadingScreen.js
src/Trigger.js
src/assets/Audio.js
src/assets/Background.js
src/assets/Character.js
src/assets/Composite.js
src/assets/Curtain.js
src/assets/Imagepack.js
src/assets/Textbox.js
src/assets.js
src/bus.js
src/commands/alert.js
src/commands/break.js
src/commands/choice.js
src/commands/confirm.js
src/commands/do.js
src/commands/fn.js
src/commands/global.js
src/commands/globalize.js
src/commands/goto.js
src/commands/line.js
src/commands/localize.js
src/commands/prompt.js
src/commands/restart.js
src/commands/set_vars.js
src/commands/sub.js
src/commands/trigger.js
src/commands/var.js
src/commands/wait.js
src/commands/while.js
src/commands/with.js
src/commands.js
src/dataSources/LocalStorage.js
src/dataSources.js
src/engine.js
src/extensions/button.js
src/extensions/colored-rectangle.js
src/extensions/get-backtrace.js
src/extensions/hello.js
src/extensions/side-images.js
CHANGELOG.md
LICENSE.md
README.md
build.js
index.js
index.md
package.js