// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2010 Sprout Systems, Inc. and contributors. // Portions ©2008-2010 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ========================================================================== var content, controller; // .......................................................... // SINGLE OBSERVABLE OBJECT // module("SC.ObjectController - single_case - OBSERVABLE OBJECT", { setup: function() { content = SC.Object.create({ foo: "foo1", bar: "bar1" }); controller = SC.ObjectController.create({ content: content }); }, teardown: function() { controller.destroy(); } }); test("getting any unknown value should pass through to object", function() { equals(controller.get("foo"), "foo1", 'controller.get(foo)'); equals(controller.get("bar"), "bar1", 'controller.get(bar)'); }); test("setting any unknown value should pass through", function() { equals(controller.set("foo", "EDIT"), controller, 'controller.set(foo, EDIT) should return self'); equals(controller.set("bar", "EDIT"), controller, 'controller.set(bar, EDIT) should return self'); equals(controller.set("baz", "EDIT"), controller, 'controller.set(baz, EDIT) should return self'); equals(content.get("foo"), "EDIT", 'controller.get(foo)'); equals(content.get("bar"), "EDIT", 'controller.get(bar)'); equals(content.get("baz"), "EDIT", 'controller.get(bar)'); }); test("changing a property on the content", function() { var callCount = 0; controller.addObserver("foo", function() { callCount++; }); equals(controller.get("foo"), "foo1", "controller.get(foo) before edit should have original value"); content.set("foo", "EDIT"); equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit should have updated value"); equals(callCount, 1, 'observer on controller should have fired'); }); test("changing the content from one to another", function() { var callCount = 0 ; var content2 = SC.Object.create({ foo: "foo2", bar: "bar2" }); controller.addObserver("foo", function() { callCount++; }); equals(controller.get("foo"), "foo1", "controller.get(foo) before edit should have original value"); controller.set("content", content2); equals(controller.get("foo"), "foo2", "controller.get(foo) after content should contain new content"); equals(callCount, 1, 'observer on controller should have fired'); callCount = 0 ; content2.set("foo", "EDIT"); equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit should have updated value"); equals(callCount, 1, 'observer on controller should have fired'); callCount = 0; content.set("foo", "BAR"); equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit of non-content object should not change value"); equals(callCount, 0, 'observer on controller should NOT have fired'); }); test("changing the content from one single to null and back", function() { var callCount = 0 ; controller.addObserver("foo", function() { callCount++; }); equals(controller.get("foo"), "foo1", "controller.get(foo) before edit should have original value"); controller.set("content", null); equals(controller.get("foo"), undefined, "controller.get(foo) after content change should be empty"); equals(callCount, 1, 'observer on controller should have fired'); callCount = 0; content.set("foo", "BAR"); equals(controller.get("foo"), undefined, "controller.get(foo) after edit of non-content object should not change value"); equals(callCount, 0, 'observer on controller should NOT have fired'); callCount = 0 ; controller.set("content", content); equals(callCount, 1, 'observer on controller should have fired'); callCount = 0 ; content.set("foo", "EDIT"); equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit should have updated value"); equals(callCount, 1, 'observer on controller should have fired'); }); test("hasContent", function() { equals(controller.get("hasContent"), YES, 'should have content'); var callCount = 0; controller.addObserver("hasContent", function() { callCount++; }); controller.set("content", null); equals(controller.get("hasContent"), NO, "hasContent should == NO after setting to null"); ok(callCount > 0, 'hasContent observer should fire when setting to null'); callCount = 0; controller.set("content", content); equals(controller.get("hasContent"), YES, "hasContent should == YES after setting back to content"); ok(callCount > 0, "hasContent observer should fire"); }); // .......................................................... // SINGLE NON-OBSERVABLE OBJECT // module("SC.ObjectController - single_case - NON-OBSERVABLE OBJECT", { setup: function() { content = { foo: "foo1", bar: "bar1" }; controller = SC.ObjectController.create({ content: content }); }, teardown: function() { controller.destroy(); } }); test("getting any unknown value should pass through to object", function() { equals(controller.get("foo"), "foo1", 'controller.get(foo)'); equals(controller.get("bar"), "bar1", 'controller.get(bar)'); }); test("setting any unknown value should pass through", function() { equals(controller.set("foo", "EDIT"), controller, 'controller.set(foo, EDIT) should return self'); equals(controller.set("bar", "EDIT"), controller, 'controller.set(bar, EDIT) should return self'); equals(controller.set("baz", "EDIT"), controller, 'controller.set(baz, EDIT) should return self'); equals(content.foo, "EDIT", 'content.foo'); equals(content.bar, "EDIT", 'content.bar'); equals(content.baz, "EDIT", 'content.baz'); }); test("changing a property on the content", function() { var callCount = 0; controller.addObserver("foo", function() { callCount++; }); equals(controller.get("foo"), "foo1", "controller.get(foo) before edit should have original value"); content.foo = "EDIT"; equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit should have updated value"); equals(callCount, 0, 'observer on controller should not fire because this is not observable'); }); test("changing the content from one to another", function() { var callCount = 0 ; var content2 = { foo: "foo2", bar: "bar2" }; controller.addObserver("foo", function() { callCount++; }); equals(controller.get("foo"), "foo1", "controller.get(foo) before edit should have original value"); controller.set("content", content2); equals(controller.get("foo"), "foo2", "controller.get(foo) after content should contain new content"); equals(callCount, 1, 'observer on controller should have fired'); content2.foo = "EDIT"; equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit should have updated value"); content.foo = "BAR"; equals(controller.get("foo"), "EDIT", "controller.get(foo) after edit of non-content object should not change value"); }); test("hasContent", function() { equals(controller.get("hasContent"), YES, 'should have content'); var callCount = 0; controller.addObserver("hasContent", function() { callCount++; }); controller.set("content", null); equals(controller.get("hasContent"), NO, "hasContent should == NO after setting to null"); ok(callCount > 0, 'hasContent observer should fire when setting to null'); callCount = 0; controller.set("content", content); equals(controller.get("hasContent"), YES, "hasContent should == YES after setting back to content"); ok(callCount > 0, "hasContent observer should fire"); });