Daniel@0: "use strict"; Daniel@0: Daniel@0: describe("ContextModule.AppContext", function() { Daniel@0: Daniel@0: var serializedAppContexts = { Daniel@0: "empty": { Daniel@0: "stateHistory": { Daniel@0: "currentSerializedState": { Daniel@0: "musicCollectionGrid": { Daniel@0: "entityConfigs": [], Daniel@0: "viewConfigs": [], Daniel@0: }, Daniel@0: "musicRecordingGrid": { Daniel@0: "entityConfigs": [], Daniel@0: "viewConfigs": [], Daniel@0: } Daniel@0: }, Daniel@0: "undoStack": [], Daniel@0: "redoStack": [] Daniel@0: }, Daniel@0: "stateBookmarks": [] Daniel@0: }, Daniel@0: Daniel@0: "empty_faulty1": { Daniel@0: }, Daniel@0: "empty_faulty2": 42, Daniel@0: "empty_faulty3": null, Daniel@0: Daniel@0: "empty_incomplete1": { Daniel@0: "stateHistory": { Daniel@0: "currentSerializedState": { Daniel@0: "musicCollectionGrid": { Daniel@0: "entityConfigs": [], Daniel@0: "viewConfigs": [], Daniel@0: }, Daniel@0: }, Daniel@0: "redoStack": [] Daniel@0: }, Daniel@0: "stateBookmarks": [] Daniel@0: }, Daniel@0: "empty_incomplete2": { Daniel@0: "stateHistory": { Daniel@0: "currentSerializedState": null, Daniel@0: "undoStack": [], Daniel@0: "redoStack": [] Daniel@0: }, Daniel@0: "stateBookmarks": [] Daniel@0: }, Daniel@0: }; Daniel@0: Daniel@0: it("is promptly created", function() { Daniel@0: var testedAppContext = new App.ContextModule.AppContext(); Daniel@0: Daniel@0: expect(testedAppContext).not.toBe(null); Daniel@0: Daniel@0: expect(testedAppContext.get("state")).not.toBe(null); Daniel@0: expect(testedAppContext.get("state") instanceof App.ContextModule.State).toBe(true); Daniel@0: Daniel@0: expect(testedAppContext.get("stateHistory")).not.toBe(null); Daniel@0: expect(testedAppContext.get("stateHistory") instanceof App.ContextModule.StateHistory).toBe(true); Daniel@0: Daniel@0: expect(testedAppContext.get("stateBookmarks")).not.toBe(null); Daniel@0: expect(testedAppContext.get("stateBookmarks") instanceof App.ContextModule.StateBookmarkCollection).toBe(true); Daniel@0: Daniel@0: }); Daniel@0: Daniel@0: it("serializes and unserializes itself", function() { Daniel@0: var testedAppContext = new App.ContextModule.AppContext(); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty"]); Daniel@0: expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty_faulty1"]); Daniel@0: expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty_faulty2"]); Daniel@0: expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty_faulty3"]); Daniel@0: expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty_incomplete1"]); Daniel@0: expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty_incomplete2"]); Daniel@0: expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]); Daniel@0: }); Daniel@0: Daniel@0: it("triggers change events when something changes", function() { Daniel@0: var testedAppContext = new App.ContextModule.AppContext(); Daniel@0: Daniel@0: var spyNames = [ Daniel@0: "change", Daniel@0: "changeState", Daniel@0: "changeStateHistory", Daniel@0: "changeStateBookmarks", Daniel@0: ]; Daniel@0: var spy = jasmine.createSpyObj("listener", spyNames); Daniel@0: var expectSpyCallCount = function() { Daniel@0: _.each(arguments, function(arg, i) { Daniel@0: //console.log("___", i, "--->", spy[spyNames[i]].calls.count(), arg); Daniel@0: expect(spy[spyNames[i]].calls.count()).toEqual(arg); Daniel@0: }); Daniel@0: for (var i = arguments.length; i < spyNames.length; i++) { Daniel@0: //console.log("___", i, "--->", spy[spyNames[i]].calls.count(), 0); Daniel@0: expect(spy[spyNames[i]].calls.count()).toEqual(0); Daniel@0: } Daniel@0: }; Daniel@0: var resetSpyCallCount = function() { Daniel@0: _.each(spyNames, function(spyName) { Daniel@0: spy[spyName].calls.reset(); Daniel@0: }); Daniel@0: }; Daniel@0: var expectSpyCallCountAndReset = function() { Daniel@0: expectSpyCallCount.apply(null, arguments); Daniel@0: resetSpyCallCount(); Daniel@0: }; Daniel@0: Daniel@0: testedAppContext.on("change", spy["change"]); Daniel@0: testedAppContext.get("state").on("change", spy["changeState"]); Daniel@0: testedAppContext.get("stateHistory").on("change", spy["changeStateHistory"]); Daniel@0: testedAppContext.get("stateBookmarks").on("change", spy["changeStateBookmarks"]); Daniel@0: Daniel@0: expectSpyCallCountAndReset(0); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty"]); Daniel@0: expectSpyCallCountAndReset(0); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty_faulty1"]); Daniel@0: expectSpyCallCountAndReset(0); Daniel@0: expect(testedAppContext.get("stateHistory").canUndo()).toEqual(false); Daniel@0: expect(testedAppContext.get("stateHistory").canRedo()).toEqual(false); Daniel@0: Daniel@0: testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.add(new App.ContextModule.Config({ Daniel@0: "parameters": { Daniel@0: "x": 2, Daniel@0: "y": 3, Daniel@0: } Daniel@0: })); Daniel@0: expectSpyCallCountAndReset(1, 1, 1); Daniel@0: testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).planParameterUpdate("x", 10); Daniel@0: expectSpyCallCountAndReset(1, 1, 1); Daniel@0: testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).applyPlannedParameterUpdates(); Daniel@0: expectSpyCallCountAndReset(1, 1, 1); Daniel@0: testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).planParameterUpdate("x", 10); Daniel@0: expectSpyCallCountAndReset(0, 0, 0); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getParameterValue("x")).toEqual(10); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getPlannedParameterValue("x")).toEqual(10); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).isPlannedToUpdate("x")).toEqual(false); Daniel@0: Daniel@0: testedAppContext.get("stateHistory").undo(); Daniel@0: expectSpyCallCountAndReset(1, 1, 1); Daniel@0: expect(testedAppContext.get("stateHistory").canUndo()).toEqual(true); Daniel@0: expect(testedAppContext.get("stateHistory").canRedo()).toEqual(true); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getParameterValue("x")).toEqual(2); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getPlannedParameterValue("x")).toEqual(10); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).isPlannedToUpdate("x")).toEqual(true); Daniel@0: Daniel@0: testedAppContext.get("stateHistory").undo(); Daniel@0: testedAppContext.get("stateHistory").undo(); Daniel@0: expectSpyCallCountAndReset(2, 2, 2); Daniel@0: expect(testedAppContext.get("stateHistory").canUndo()).toEqual(false); Daniel@0: expect(testedAppContext.get("stateHistory").canRedo()).toEqual(true); Daniel@0: expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.size()).toEqual(0); Daniel@0: Daniel@0: testedAppContext.get("stateHistory").redo(); Daniel@0: expectSpyCallCountAndReset(1, 1, 1); Daniel@0: expect(testedAppContext.get("stateHistory").canUndo()).toEqual(true); Daniel@0: expect(testedAppContext.get("stateHistory").canRedo()).toEqual(true); Daniel@0: Daniel@0: testedAppContext.unserialize(serializedAppContexts["empty"]); Daniel@0: expectSpyCallCountAndReset(1, 1, 1); Daniel@0: expect(testedAppContext.get("stateHistory").canUndo()).toEqual(false); Daniel@0: expect(testedAppContext.get("stateHistory").canRedo()).toEqual(false); Daniel@0: }); Daniel@0: });