// ========================================================================== // Project: SproutCore
- JavaScript Application Framework // Copyright: ©2006-2011 Apple Inc. and contributors. // License: Licensed under MIT license (see license.js) // ==========================================================================
/*global module test equals context ok same Q$ htmlbody Dummy */
var r, r2, sender, pane, pane2, barView, fooView, defaultResponder; var keyPane, mainPane, globalResponder, globalResponderContext, actionSender, actionContext;
var CommonSetup = {
setup: function() { actionSender = null; // use for sendAction tests actionContext = null; var action = function (sender, context) { actionSender = sender; actionContext = context; }; sender = SC.Object.create(); // default responder for each pane defaultResponder = SC.Object.create({ defaultAction: action }); // global default responder set on RootResponder globalResponder = SC.Object.create({ globalAction: action }); // global default responder as a responder context // set on RootResponder globalResponderContext = SC.Object.create(SC.ResponderContext, { globalAction: action }); // explicit pane pane = SC.Pane.create({ acceptsKeyPane: YES, defaultResponder: defaultResponder, childViews: [SC.View.extend({ bar: action, // implement bar action childViews: [SC.View.extend({ foo: action // implement foo action })] })], paneAction: action }); pane2 = SC.Pane.create({ acceptsKeyPane: YES, defaultResponder: defaultResponder, childViews: [SC.View.extend({ bar: action, // implement bar action childViews: [SC.View.extend({ foo: action // implement foo action })] })], paneAction: action, keyAction: action, mainAction: action, globalAction: action }); keyPane = SC.Pane.create({ acceptsKeyPane: YES, keyAction: action }); keyPane.firstResponder = keyPane ; mainPane = SC.Pane.create({ acceptsKeyPane: YES, mainAction: action }); mainPane.firstResponder = mainPane ; r = SC.RootResponder.create({ mainPane: mainPane, keyPane: keyPane, defaultResponder: globalResponder }); r2 = SC.RootResponder.create({ mainPane: mainPane, keyPane: keyPane, defaultResponder: globalResponderContext }); barView = pane.childViews[0]; ok(barView.bar, 'barView should implement bar'); fooView = barView.childViews[0]; ok(fooView.foo, 'fooView should implement foo'); // setup dummy namespace window.Dummy = { object: SC.Object.create({ foo: action }), hash: { foo: action } }; }, teardown: function() { r = r2 = sender = pane = window.Dummy = barView = fooView = null; defaultResponder = keyPane = mainPane = globalResponder = null; globalResponderContext = null; }
};
// .….….….….….….….….….….….….….….. // targetForAction() // module(“SC.RootResponder#targetForAction”, CommonSetup);
test(“pass property path string as target”, function() {
var result = r.targetForAction('foo', 'Dummy.object'); equals(result, Dummy.object, 'should find DummyNamespace.object if it implements the action'); equals(r.targetForAction("foo", "Dummy.hash"), Dummy.hash, 'should return if object found at path and it has function, even if it does not use respondsTo'); equals(r.targetForAction('bar', 'Dummy.object'), null, 'should return null if found DummyNamepace.object but does not implement action'); equals(r.targetForAction('foo', 'Dummy.imaginary.item'), null, 'should return null if property path could not resolve');
});
test(“pass real object as target”, function() {
equals(r.targetForAction('foo', Dummy.object), Dummy.object, 'returns target if respondsTo() action'); equals(r.targetForAction('foo', Dummy.hash), Dummy.hash, 'returns target if targets does not implement respondsTo() but does have action'); equals(r.targetForAction('bar', Dummy.object), null, 'returns null of target does not implement action name');
});
test(“no target, explicit pane, nested firstResponder”, function() {
pane.set('firstResponder', fooView) ; equals(r.targetForAction('foo', null, null, pane), fooView, 'should return firstResponder if implementation action'); equals(r.targetForAction('bar', null, null, pane), barView, 'should return parent of firstResponder'); equals(r.targetForAction('paneAction', null, null, pane), pane, 'should return pane action'); equals(r.targetForAction('defaultAction', null, null, pane), defaultResponder, 'should return defaultResponder'); equals(r.targetForAction('imaginaryAction', null, null, pane), null, 'should return null for not-found action');
});
test(“no target, explicit pane, top-level firstResponder”, function() {
pane.set('firstResponder', barView) ; // fooView is child... equals(r.targetForAction('foo', null, null, pane), null, 'should NOT return child of firstResponder'); equals(r.targetForAction('bar', null, null, pane), barView, 'should return firstResponder'); equals(r.targetForAction('paneAction', null, null, pane), pane, 'should return pane action'); equals(r.targetForAction('defaultAction', null, null, pane), defaultResponder, 'should return defaultResponder'); equals(r.targetForAction('imaginaryAction', null, null, pane), null, 'should return null for not-found action');
});
test(“no target, explicit pane, pane is first responder”, function() {
pane.set('firstResponder', pane) ; equals(r.targetForAction('foo', null, null, pane), null, 'should NOT return child view'); equals(r.targetForAction('bar', null, null, pane), null, 'should NOT return child view'); equals(r.targetForAction('paneAction', null, null, pane), pane, 'should return pane action'); equals(r.targetForAction('defaultAction', null, null, pane), defaultResponder, 'should return defaultResponder'); equals(r.targetForAction('imaginaryAction', null, null, pane), null, 'should return null for not-found action');
});
test(“no target, explicit pane, no first responder”, function() {
pane.set('firstResponder', null) ; equals(r.targetForAction('foo', null, null, pane), null, 'should NOT return child view'); equals(r.targetForAction('bar', null, null, pane), null, 'should NOT return child view'); equals(r.targetForAction('paneAction', null, null, pane), pane, 'should return pane'); equals(r.targetForAction('defaultAction', null, null, pane), defaultResponder, 'should return defaultResponder'); equals(r.targetForAction('imaginaryAction', null, null, pane), null, 'should return null for not-found action');
});
test(“no target, explicit pane, does not implement action”, function() {
equals(r.targetForAction('keyAction', null, null, pane), keyPane, 'should return keyPane'); equals(r.targetForAction('mainAction', null, null, pane), mainPane, 'should return mainPane'); equals(r.targetForAction('globalAction', null, null, pane), globalResponder, 'should return global defaultResponder'); equals(r2.targetForAction('globalAction', null, null, pane), globalResponderContext, 'should return global defaultResponder');
});
test(“no target, explicit pane, does implement action”, function() {
equals(r.targetForAction('keyAction', null, null, pane2), pane2, 'should return pane'); equals(r.targetForAction('mainAction', null, null, pane2), pane2, 'should return pane'); equals(r.targetForAction('globalAction', null, null, pane2), pane2, 'should return pane'); equals(r2.targetForAction('globalAction', null, null, pane2), pane2, 'should return pane');
});
test(“no target, no explicit pane”, function() {
equals(r.targetForAction('keyAction'), keyPane, 'should find keyPane'); equals(r.targetForAction('mainAction'), mainPane, 'should find mainPane'); equals(r.targetForAction('globalAction'), globalResponder, 'should find global defaultResponder'); equals(r.targetForAction('imaginaryAction'), null, 'should return null for not-found action'); equals(r2.targetForAction('globalAction'), globalResponderContext, 'should find global defaultResponder');
});
// .….….….….….….….….….….….….….….. // sendAction() // module(“SC.RootResponder#sendAction”, CommonSetup) ;
test(“if context given, passes context to action + target”, function() {
var context = {}; // pane.firstResponder = defaultResponder; r.sendAction('defaultAction', defaultResponder, sender, pane, context); equals(actionSender, sender, 'action did invoke'); equals(actionContext, context, 'context was passed'); actionSender = null; r.sendAction('imaginaryAction', null, sender, pane); equals(actionSender, null, 'action did not invoke');
});
test(“if pane passed, invokes action on pane if found”, function() {
pane.firstResponder = pane; r.sendAction('paneAction', null, sender, pane); equals(actionSender, sender, 'action did invoke'); actionSender = null; r.sendAction('imaginaryAction', null, sender, pane); equals(actionSender, null, 'action did not invoke');
});
test(“searches panes if none passed, invokes action if found”, function() {
r.sendAction('keyAction', null, sender); equals(actionSender, sender, 'action did invoke'); actionSender = null; r.sendAction('imaginaryAction', null, sender); equals(actionSender, null, 'action did not invoke');
});
test(“searches target if passed, invokes action if found”, function() {
r.sendAction('foo', fooView, sender); equals(actionSender, sender, 'action did invoke'); actionSender = null; r.sendAction('imaginaryAction', fooView, sender); equals(actionSender, null, 'action did not invoke');
});