File size: 1,931 Bytes
5fae594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function spiedPubSub() {

   var realPubSub = pubSub();

   function fakedPubSub( eventName ) {
        
      var single = realPubSub(eventName);
   
      if( !single.emit.isSpy ) {   
         spyOn( single, 'emit' ).andCallThrough();
         spyOn( single, 'on'   ).andCallThrough();
         spyOn( single, 'un'   ).andCallThrough();
      }
      
      return single;
   }
   
   fakedPubSub.emit = realPubSub.emit;
   fakedPubSub.on = realPubSub.on;
   fakedPubSub.un = realPubSub.un;
   
   return fakedPubSub;
}

function fakePubSub( eventNames ) {

   var eventTypes = {};
   var eventsEmitted = [];   
   var eventNamesEmitted = [];
   var eventTypesEmitted = {};
   var callCount = {};      
      
   function record(eventName){
      return function() {
         eventsEmitted.push({
            type: eventName, 
            args: arguments
         });
         
         eventNamesEmitted.push(eventName);
         eventTypesEmitted[eventName].push(arguments);
         callCount[eventName]++;
      }
   }      
   
   eventNames.forEach( function( eventName ){
      eventTypes[eventName] = {
         'emit':  jasmine.createSpy(eventName + '/emit')
                     .andCallFake(record(eventName))
      ,  'on':    jasmine.createSpy(eventName + '/on')
      ,  'un':    jasmine.createSpy(eventName + '/un')
      };
      
      eventTypesEmitted[eventName] = [];
      callCount[eventName] = 0;      
   });

   function bus( eventName ) {
           
      return eventTypes[eventName];
   }
   
   bus.events            = eventsEmitted;
   bus.eventNames        = eventNamesEmitted;
   bus.eventTypesEmitted = eventTypesEmitted;
   bus.callCount         = callCount;
   

   ['emit', 'on'].forEach(function(methodName){
   
      bus[methodName] = varArgs(function(eventName, parameters){
         apply( parameters, eventTypes[eventName][methodName]);
      });   
   })
      
   return bus;
}