// ========================================================================== // SC Unit Test // ========================================================================== /*globals SC */

var sc, root, foo, bar;

module(“SC.State: addSubstate method Tests”, {

setup: function() {

  sc = SC.Statechart.create({

    stateWillTryToHandleEvent: function(state, event, handler) {
      sc_super();
      this.stateWillTryToHandleEventInfo = {
        state: state,
        event: event,
        handler: handler
      };
    },

    stateDidTryToHandleEvent: function(state, event, handler, handled) {
      sc_super();
      this.stateDidTryToHandleEventInfo = {
        state: state,
        event: event,
        handler: handler,
        handled: handled
      };
    },

    initialState: 'foo',

    foo: SC.State.design({

      eventHandlerReturnValue: YES,

      _notifyHandledEvent: function(handler, event, arg1, arg2) {
        this.handledEventInfo = {
          handler: handler,
          event: event,
          arg1: arg1,
          arg2: arg2
        };
      },

      eventHandler1: function(arg1, arg2) {
        this._notifyHandledEvent('eventHandler1', 'eventHandler1', arg1, arg2);
        return this.get('eventHandlerReturnValue');
      },

      eventHandler2: function(event, arg1, arg2) {
        this._notifyHandledEvent('eventHandler2', event, arg1, arg2);
        return this.get('eventHandlerReturnValue');
      }.handleEvents('test1'),

      eventHandler3: function(event, arg1, arg2) {
        this._notifyHandledEvent('eventHandler3', event, arg1, arg2);
        return this.get('eventHandlerReturnValue');
      }.handleEvents(/^digit[0-9]$/),

      unknownEvent: function(event, arg1, arg2) {
        this._notifyHandledEvent('unknownEvent', event, arg1, arg2);
        return this.get('eventHandlerReturnValue');
      }

    })

  });

  sc.initStatechart();
  foo = sc.getState('foo');
},

teardown: function() {
  sc = foo = null;
}

});

test(“try to invoke state foo's eventHandler1 event handler”, function() {

var ret = foo.tryToHandleEvent('eventHandler1', 100, 200);

var info = foo.handledEventInfo;

equals(ret, true, 'foo.tryToHandleEvent should return true');
ok(info, 'foo.handledEventInfo should not be null');
equals(info.handler, 'eventHandler1', 'foo.eventHandler1 should have been invoked');
equals(info.arg1, 100, 'foo.eventHandler1 should handle event 100');
equals(info.arg2, 200, 'foo.eventHandler1 should handle event 200');

info = sc.stateWillTryToHandleEventInfo;

ok(info, 'sc.stateWillTryToHandleEvent should have been invoked');
equals(info.state, foo, 'sc.stateWillTryToHandleEvent should have been passed state foo');
equals(info.event, 'eventHandler1', 'sc.stateWillTryToHandleEvent should have been passed event eventHandler1');
equals(info.handler, 'eventHandler1', 'sc.stateWillTryToHandleEvent should have been passed handler eventHandler1');

info = sc.stateDidTryToHandleEventInfo;

ok(info, 'sc.stateDidTryToHandleEventInfo should have been invoked');
equals(info.state, foo, 'sc.stateDidTryToHandleEventInfo should have been passed state foo');
equals(info.event, 'eventHandler1', 'sc.stateDidTryToHandleEventInfo should have been passed event eventHandler1');
equals(info.handler, 'eventHandler1', 'sc.stateDidTryToHandleEventInfo should have been passed handler eventHandler1');
equals(info.handled, true, 'sc.stateDidTryToHandleEventInfo should have been passed handled true');

});

test(“try to invoke state foo's eventHandler2 event handler”, function() {

var ret = foo.tryToHandleEvent('test1', 100, 200);

var info = foo.handledEventInfo;

equals(ret, true, 'foo.tryToHandleEvent should return true');
ok(info, 'foo.handledEventInfo should not be null');
equals(info.handler, 'eventHandler2', 'foo.eventHandler2 should have been invoked');
equals(info.event, 'test1', 'foo.eventHandler2 should handle event test1');
equals(info.arg1, 100, 'foo.eventHandler2 should handle event 100');
equals(info.arg2, 200, 'foo.eventHandler2 should handle event 200');

info = sc.stateWillTryToHandleEventInfo;

ok(info, 'sc.stateWillTryToHandleEvent should have been invoked');
equals(info.state, foo, 'sc.stateWillTryToHandleEvent should have been passed state foo');
equals(info.event, 'test1', 'sc.stateWillTryToHandleEvent should have been passed event test1');
equals(info.handler, 'eventHandler2', 'sc.stateWillTryToHandleEvent should have been passed handler eventHandler2');

info = sc.stateDidTryToHandleEventInfo;

ok(info, 'sc.stateDidTryToHandleEventInfo should have been invoked');
equals(info.state, foo, 'sc.stateDidTryToHandleEventInfo should have been passed state foo');
equals(info.event, 'test1', 'sc.stateDidTryToHandleEventInfo should have been passed event test1');
equals(info.handler, 'eventHandler2', 'sc.stateDidTryToHandleEventInfo should have been passed handler eventHandler2');
equals(info.handled, true, 'sc.stateDidTryToHandleEventInfo should have been passed handled true');

});

test(“try to invoke state foo's eventHandler3 event handler”, function() {

var ret = foo.tryToHandleEvent('digit3', 100, 200);

var info = foo.handledEventInfo;

equals(ret, true, 'foo.tryToHandleEvent should return true');
ok(info, 'foo.handledEventInfo should not be null');
equals(info.handler, 'eventHandler3', 'foo.eventHandler3 should have been invoked');
equals(info.event, 'digit3', 'foo.eventHandler3 should handle event test1');
equals(info.arg1, 100, 'foo.eventHandler3 should handle event 100');
equals(info.arg2, 200, 'foo.eventHandler3 should handle event 200');

info = sc.stateWillTryToHandleEventInfo;

ok(info, 'sc.stateWillTryToHandleEvent should have been invoked');
equals(info.state, foo, 'sc.stateWillTryToHandleEvent should have been passed state foo');
equals(info.event, 'digit3', 'sc.stateWillTryToHandleEvent should have been passed event digit3');
equals(info.handler, 'eventHandler3', 'sc.stateWillTryToHandleEvent should have been passed handler eventHandler3');

info = sc.stateDidTryToHandleEventInfo;

ok(info, 'sc.stateDidTryToHandleEventInfo should have been invoked');
equals(info.state, foo, 'sc.stateDidTryToHandleEventInfo should have been passed state foo');
equals(info.event, 'digit3', 'sc.stateDidTryToHandleEventInfo should have been passed event digit3');
equals(info.handler, 'eventHandler3', 'sc.stateDidTryToHandleEventInfo should have been passed handler eventHandler3');
equals(info.handled, true, 'sc.stateDidTryToHandleEventInfo should have been passed handled true');

});

test(“try to invoke state foo's unknownEvent event handler”, function() {

var ret = foo.tryToHandleEvent('test', 100, 200);

var info = foo.handledEventInfo;

equals(ret, true, 'foo.tryToHandleEvent should return true');
ok(info, 'foo.handledEventInfo should not be null');
equals(info.handler, 'unknownEvent', 'foo.unknownEvent should have been invoked');
equals(info.event, 'test', 'foo.unknownEvent should handle event test');
equals(info.arg1, 100, 'foo.unknownEvent should handle event 100');
equals(info.arg2, 200, 'foo.unknownEvent should handle event 200');

info = sc.stateWillTryToHandleEventInfo;

ok(info, 'sc.stateWillTryToHandleEvent should have been invoked');
equals(info.state, foo, 'sc.stateWillTryToHandleEvent should have been passed state foo');
equals(info.event, 'test', 'sc.stateWillTryToHandleEvent should have been passed event test');
equals(info.handler, 'unknownEvent', 'sc.stateWillTryToHandleEvent should have been passed handler unknownEvent');

info = sc.stateDidTryToHandleEventInfo;

ok(info, 'sc.stateDidTryToHandleEventInfo should have been invoked');
equals(info.state, foo, 'sc.stateDidTryToHandleEventInfo should have been passed state foo');
equals(info.event, 'test', 'sc.stateDidTryToHandleEventInfo should have been passed event test');
equals(info.handler, 'unknownEvent', 'sc.stateDidTryToHandleEventInfo should have been passed handler unknownEvent');
equals(info.handled, true, 'sc.stateDidTryToHandleEventInfo should have been passed handled true');

});

test(“try not to invoke any of state foo's event handlers”, function() {

foo.unknownEvent = undefined;

var ret = foo.tryToHandleEvent('test', 100, 200);

var info = foo.handledEventInfo;

equals(ret, NO, 'foo.tryToHandleEvent should return false');
ok(!info, 'foo.handledEventInfo should be null');

info = sc.stateWillTryToHandleEventInfo;
ok(!info, 'sc.stateWillTryToHandleEvent should not have been invoked');

info = sc.stateDidTryToHandleEventInfo;
ok(!info, 'sc.stateDidTryToHandleEventInfo should not have been invoked');

});

test(“try to invoke state foo's eventHandler1 but tryToHandleEvent returns false”, function() {

foo.eventHandlerReturnValue = NO;

var ret = foo.tryToHandleEvent('eventHandler1', 100, 200);

var info = foo.handledEventInfo;

equals(ret, NO, 'foo.tryToHandleEvent should return false');
ok(info, 'foo.handledEventInfo should be null');
equals(info.handler, 'eventHandler1', 'foo.eventHandler1 should have been invoked');
equals(info.event, 'eventHandler1', 'foo.eventHandler1 should handle event test');
equals(info.arg1, 100, 'foo.eventHandler1 should handle event 100');
equals(info.arg2, 200, 'foo.eventHandler1 should handle event 200');

info = sc.stateWillTryToHandleEventInfo;
ok(info, 'sc.stateWillTryToHandleEvent should not have been invoked');
equals(info.state, foo, 'sc.stateWillTryToHandleEvent should have been passed state foo');
equals(info.event, 'eventHandler1', 'sc.stateWillTryToHandleEvent should have been passed event test');
equals(info.handler, 'eventHandler1', 'sc.stateWillTryToHandleEvent should have been passed handler eventHandler1');

info = sc.stateDidTryToHandleEventInfo;
ok(info, 'sc.stateDidTryToHandleEventInfo should not have been invoked');
equals(info.state, foo, 'sc.stateDidTryToHandleEventInfo should have been passed state foo');
equals(info.event, 'eventHandler1', 'sc.stateDidTryToHandleEventInfo should have been passed event test');
equals(info.handler, 'eventHandler1', 'sc.stateDidTryToHandleEventInfo should have been passed handler eventHandler1');
equals(info.handled, false, 'sc.stateDidTryToHandleEventInfo should have been passed handled false');

});

test(“try to invoke all of state foo's handlers but tryToHandleEvent returns false”, function() {

var ret, info;

foo.eventHandlerReturnValue = NO;

ret = foo.tryToHandleEvent('eventHandler1');

equals(ret, NO, 'foo.tryToHandleEvent should return false');
info = foo.handledEventInfo;
ok(info, 'foo.handledEventInfo should be null');
equals(info.handler, 'eventHandler1', 'foo.eventHandler1 should have been invoked');
ok(sc.stateWillTryToHandleEventInfo, 'sc.stateWillTryToHandleEvent should not have been invoked');
ok(sc.stateDidTryToHandleEventInfo, 'sc.stateDidTryToHandleEventInfo should not have been invoked');

ret = foo.tryToHandleEvent('test1');

equals(ret, NO, 'foo.tryToHandleEvent should return false for event test1');
info = foo.handledEventInfo;
ok(info, 'foo.handledEventInfo should be null');
equals(info.handler, 'eventHandler2', 'foo.eventHandler2 should have been invoked');
ok(sc.stateWillTryToHandleEventInfo, 'sc.stateWillTryToHandleEvent should not have been invoked');
ok(sc.stateDidTryToHandleEventInfo, 'sc.stateDidTryToHandleEventInfo should not have been invoked');

ret = foo.tryToHandleEvent('digit3');

equals(ret, NO, 'foo.tryToHandleEvent should return false for event digit3');
info = foo.handledEventInfo;
ok(info, 'foo.handledEventInfo should be null');
equals(info.handler, 'eventHandler3', 'foo.eventHandler3 should have been invoked');
ok(sc.stateWillTryToHandleEventInfo, 'sc.stateWillTryToHandleEvent should not have been invoked');
ok(sc.stateDidTryToHandleEventInfo, 'sc.stateDidTryToHandleEventInfo should not have been invoked');

ret = foo.tryToHandleEvent('blah');

equals(ret, NO, 'foo.tryToHandleEvent should return false for event blah');
info = foo.handledEventInfo;
ok(info, 'foo.handledEventInfo should be null');
equals(info.handler, 'unknownEvent', 'foo.unknownEvent should have been invoked');
ok(sc.stateWillTryToHandleEventInfo, 'sc.stateWillTryToHandleEvent should not have been invoked');
ok(sc.stateDidTryToHandleEventInfo, 'sc.stateDidTryToHandleEventInfo should not have been invoked');

});