1
+ /* globals describe, it, expect, expectObservable, hot */
2
+ var Rx = require ( '../../dist/cjs/Rx' ) ;
3
+ var Observable = Rx . Observable ;
4
+
5
+ describe ( 'Observable.prototype.shareBehavior' , function ( ) {
6
+ it ( 'should share a single subscription' , function ( ) {
7
+ var subscriptionCount = 0 ;
8
+ var obs = new Observable ( function ( observer ) {
9
+ subscriptionCount ++ ;
10
+ } ) ;
11
+
12
+ var source = obs . shareBehavior ( 0 ) ;
13
+
14
+ expect ( subscriptionCount ) . toBe ( 0 ) ;
15
+
16
+ source . subscribe ( ) ;
17
+ source . subscribe ( ) ;
18
+ source . subscribe ( ) ;
19
+
20
+ expect ( subscriptionCount ) . toBe ( 1 ) ;
21
+ } ) ;
22
+
23
+ it ( 'should replay 1 event from the past to a late subscriber' , function ( done ) {
24
+ var results1 = [ ] ;
25
+ var results2 = [ ] ;
26
+ var subscriptions = 0 ;
27
+
28
+ var source = new Observable ( function ( observer ) {
29
+ subscriptions ++ ;
30
+ observer . next ( 1 ) ;
31
+ observer . next ( 2 ) ;
32
+ observer . next ( 3 ) ;
33
+ observer . next ( 4 ) ;
34
+ } ) ;
35
+
36
+ var hot = source . shareBehavior ( 0 ) ;
37
+
38
+ expect ( results1 ) . toEqual ( [ ] ) ;
39
+ expect ( results2 ) . toEqual ( [ ] ) ;
40
+
41
+ hot . subscribe ( function ( x ) {
42
+ results1 . push ( x ) ;
43
+ } ) ;
44
+
45
+ expect ( results1 ) . toEqual ( [ 0 , 1 , 2 , 3 , 4 ] ) ;
46
+ expect ( results2 ) . toEqual ( [ ] ) ;
47
+
48
+ hot . subscribe ( function ( x ) {
49
+ results2 . push ( x ) ;
50
+ } ) ;
51
+
52
+ expect ( results1 ) . toEqual ( [ 0 , 1 , 2 , 3 , 4 ] ) ;
53
+ expect ( results2 ) . toEqual ( [ 4 ] ) ;
54
+ expect ( subscriptions ) . toBe ( 1 ) ;
55
+ done ( ) ;
56
+ } ) ;
57
+
58
+ it ( 'should replay the default value if no next() ever emits' , function ( done ) {
59
+ var results1 = [ ] ;
60
+ var results2 = [ ] ;
61
+ var subscriptions = 0 ;
62
+
63
+ var source = new Observable ( function ( observer ) {
64
+ subscriptions ++ ;
65
+ } ) ;
66
+
67
+ var hot = source . shareBehavior ( 0 ) ;
68
+
69
+ expect ( results1 ) . toEqual ( [ ] ) ;
70
+ expect ( results2 ) . toEqual ( [ ] ) ;
71
+
72
+ hot . subscribe ( function ( x ) {
73
+ results1 . push ( x ) ;
74
+ } ) ;
75
+
76
+ expect ( results1 ) . toEqual ( [ 0 ] ) ;
77
+ expect ( results2 ) . toEqual ( [ ] ) ;
78
+
79
+ hot . subscribe ( function ( x ) {
80
+ results2 . push ( x ) ;
81
+ } ) ;
82
+
83
+ expect ( results1 ) . toEqual ( [ 0 ] ) ;
84
+ expect ( results2 ) . toEqual ( [ 0 ] ) ;
85
+ expect ( subscriptions ) . toBe ( 1 ) ;
86
+ done ( ) ;
87
+ } ) ;
88
+
89
+ it ( 'should unsubscribe from the source as soon as no more subscribers on shared' , function ( ) {
90
+ var e1 = cold ( '--a---b-c--d--e--|' ) ;
91
+ var e1subs = '^ ! ' ;
92
+ var expected1 = 'x-a---b- ' ;
93
+ var unsub1 = ' ! ' ;
94
+ var expected2 = 'x-a---b-c--d- ' ;
95
+ var unsub2 = ' ! ' ;
96
+
97
+ var shared = e1 . shareBehavior ( 'x' ) ;
98
+ var observer1 = shared . do ( ) ;
99
+ var observer2 = shared . do ( ) ;
100
+
101
+ expectObservable ( observer1 , unsub1 ) . toBe ( expected1 ) ;
102
+ expectObservable ( observer2 , unsub2 ) . toBe ( expected2 ) ;
103
+ expectSubscriptions ( e1 . subscriptions ) . toBe ( e1subs ) ;
104
+ } ) ;
105
+
106
+ it ( 'should give latest value to a late observer' , function ( ) {
107
+ var e1 = cold ( '--a-b---c--d--e--|' ) ;
108
+ var e1subs = '^ ! ' ;
109
+ var expected1 = 'x-a-b---c--d-- ' ;
110
+ var unsub1 = ' ! ' ;
111
+ var e2 = cold ( '-------x----------' ) ;
112
+ var expected2 = ' bc--d--e-- ' ;
113
+ var unsub2 = ' ^ ! ' ;
114
+
115
+ var shared = e1 . shareBehavior ( 'x' ) ;
116
+ var observer1 = shared . do ( ) ;
117
+ var observer2 = e2 . mergeMap ( function ( ) { return shared . do ( ) ; } ) ;
118
+
119
+ expectObservable ( observer1 , unsub1 ) . toBe ( expected1 ) ;
120
+ expectObservable ( observer2 , unsub2 ) . toBe ( expected2 ) ;
121
+ expectSubscriptions ( e1 . subscriptions ) . toBe ( e1subs ) ;
122
+ } ) ;
123
+
124
+ it ( 'should not change the output of the observable when successful' , function ( ) {
125
+ var e1 = hot ( '---a--^--b-c--d--e--|' ) ;
126
+ var expected = 'x--b-c--d--e--|' ;
127
+
128
+ expectObservable ( e1 . shareBehavior ( 'x' ) ) . toBe ( expected ) ;
129
+ } ) ;
130
+
131
+ it ( 'should not change the output of the observable when error' , function ( ) {
132
+ var e1 = hot ( '---a--^--b-c--d--e--#' ) ;
133
+ var expected = 'x--b-c--d--e--#' ;
134
+
135
+ expectObservable ( e1 . shareBehavior ( 'x' ) ) . toBe ( expected ) ;
136
+ } ) ;
137
+
138
+ it ( 'should not change the output of the observable when never' , function ( ) {
139
+ var e1 = cold ( '----' ) ;
140
+ var expected = 'a---' ;
141
+
142
+ expectObservable ( e1 . shareBehavior ( 'a' ) ) . toBe ( expected ) ;
143
+ } ) ;
144
+
145
+ it ( 'should not change the output of the observable when empty' , function ( ) {
146
+ var e1 = cold ( '| ' ) ;
147
+ var expected = '(a|)' ;
148
+
149
+ expectObservable ( e1 . shareBehavior ( 'a' ) ) . toBe ( expected ) ;
150
+ } ) ;
151
+ } ) ;
0 commit comments