1
+ import _ from 'lodash' ;
2
+ import sinon from 'sinon' ;
3
+ import chai from 'chai' ;
4
+ import { loadDependencies , mockDOMGlobals ,
5
+ mockDependency } from '../meta/TestBootstrap.js' ;
6
+
7
+
8
+ let expect = chai . expect ;
9
+ let should = chai . should ( ) ;
10
+
11
+ describe ( 'Event emitter' , ( ) => {
12
+ let imports = { } ;
13
+
14
+ before ( ( ) => {
15
+ mockDOMGlobals ( ) ;
16
+
17
+ mockDependency ( './src/utils/Context.js' , {
18
+ Context : {
19
+ getContext : ( ) => ( {
20
+ 'get' : ( ) => ( { child : ( ) => ( { once : ( ) => 0 } ) } )
21
+ } )
22
+ }
23
+ } ) ;
24
+
25
+ return loadDependencies ( {
26
+ EventEmitter : System . normalizeSync ( 'famous/core/EventEmitter.js' )
27
+ } ) . then ( ( importedObjects ) => {
28
+ imports = importedObjects ;
29
+ } ) ;
30
+ } ) ;
31
+
32
+ describe ( '#constructor' , ( ) => {
33
+ it ( 'constructs without exceptions' , ( ) => {
34
+ let eventEmitter = new imports . EventEmitter ( ) ;
35
+ should . exist ( eventEmitter ) ;
36
+ } ) ;
37
+ } ) ;
38
+
39
+ describe ( '#once listener' , ( ) => {
40
+ it ( `Makes a once() registered listener only be called once` , ( ) => {
41
+ let eventEmitter = new imports . EventEmitter ( ) ;
42
+ let run = sinon . spy ( ) ;
43
+ eventEmitter . once ( 'ready' , run ) ;
44
+ eventEmitter . emit ( 'ready' ) ;
45
+ eventEmitter . emit ( 'ready' ) ;
46
+ expect ( run . calledOnce ) . to . be . true ;
47
+ } ) ;
48
+
49
+ it ( `Handles on() in combination with once() correctly` , ( ) => {
50
+ let eventEmitter = new imports . EventEmitter ( ) ;
51
+ let onceRunner = sinon . spy ( ) ;
52
+ let onRunner = sinon . spy ( ) ;
53
+ let secondOnRunner = sinon . spy ( ) ;
54
+ eventEmitter . on ( 'ready' , onRunner ) ;
55
+ eventEmitter . once ( 'ready' , onceRunner ) ;
56
+ eventEmitter . on ( 'ready' , secondOnRunner ) ;
57
+ eventEmitter . emit ( 'ready' ) ;
58
+ eventEmitter . emit ( 'ready' ) ;
59
+ expect ( onceRunner . calledOnce ) . to . be . true ;
60
+ expect ( onRunner . calledTwice ) . to . be . true ;
61
+ expect ( secondOnRunner . calledTwice ) . to . be . true ;
62
+ } ) ;
63
+
64
+ it ( `Doesn't let removeListener invalidate the once() logic` , ( ) => {
65
+ let eventEmitter = new imports . EventEmitter ( ) ;
66
+ let onceRunner = sinon . spy ( ) ;
67
+ let onRunner = sinon . spy ( ) ;
68
+ let secondOnRunner = sinon . spy ( ) ;
69
+ let selfRemoving = ( ) => {
70
+ eventEmitter . removeListener ( 'ready' , selfRemoving ) ;
71
+ } ;
72
+ eventEmitter . on ( 'ready' , selfRemoving ) ;
73
+ eventEmitter . on ( 'ready' , onRunner ) ;
74
+ eventEmitter . once ( 'ready' , onceRunner ) ;
75
+ eventEmitter . on ( 'ready' , secondOnRunner ) ;
76
+ eventEmitter . on ( 'ready' , selfRemoving ) ;
77
+ eventEmitter . emit ( 'ready' ) ;
78
+ eventEmitter . emit ( 'ready' ) ;
79
+ expect ( onceRunner . calledOnce ) . to . be . true ;
80
+ expect ( onRunner . calledTwice ) . to . be . true ;
81
+ expect ( secondOnRunner . calledTwice ) . to . be . true ;
82
+ } ) ;
83
+ } ) ;
84
+
85
+ } ) ;
0 commit comments