1+ import * as Rx from '../../dist/cjs/Rx.KitchenSink' ;
2+ import '../../dist/cjs/add/observable/generate' ;
3+ import { TestScheduler } from '../../dist/cjs/testing/TestScheduler' ;
4+ import { expect } from 'chai' ;
5+ declare const { asDiagram, expectObservable} ;
6+ declare const rxTestScheduler : TestScheduler ;
7+
8+ const Observable = Rx . Observable ;
9+
10+ function err ( ) : any {
11+ throw 'error' ;
12+ }
13+
14+ describe ( 'Observable.generate' , ( ) => {
15+ asDiagram ( 'generate(1, x => false, x => x + 1)' )
16+ ( 'should complete if condition does not meet' , ( ) => {
17+ const source = Observable . generate ( 1 , x => false , x => x + 1 ) ;
18+ const expected = '|' ;
19+
20+ expectObservable ( source ) . toBe ( expected ) ;
21+ } ) ;
22+
23+ asDiagram ( 'generate(1, x => x == 1, x => x + 1)' )
24+ ( 'should produce first value immediately' , ( ) => {
25+ const source = Observable . generate ( 1 , x => x == 1 , x => x + 1 ) ;
26+ const expected = '(1|)' ;
27+
28+ expectObservable ( source ) . toBe ( expected , { '1' : 1 } ) ;
29+ } ) ;
30+
31+ asDiagram ( 'generate(1, x => x < 3, x => x + 1)' )
32+ ( 'should produce all values synchronously' , ( ) => {
33+ const source = Observable . generate ( 1 , x => x < 3 , x => x + 1 ) ;
34+ const expected = '(12|)' ;
35+
36+ expectObservable ( source ) . toBe ( expected , { '1' : 1 , '2' : 2 } ) ;
37+ } ) ;
38+
39+ it ( 'should use result selector' , ( ) => {
40+ const source = Observable . generate ( 1 , x => x < 3 , x => x + 1 , x => ( x + 1 ) . toString ( ) ) ;
41+ const expected = '(23|)' ;
42+
43+ expectObservable ( source ) . toBe ( expected ) ;
44+ } ) ;
45+
46+ it ( 'should allow omit condition' , ( ) => {
47+ const source = Observable . generate ( {
48+ initialState : 1 ,
49+ iterate : x => x + 1 ,
50+ resultSelector : x => x . toString ( )
51+ } ) . take ( 5 ) ;
52+ const expected = '(12345|)' ;
53+
54+ expectObservable ( source ) . toBe ( expected ) ;
55+ } ) ;
56+
57+ it ( 'should stop producing when unsubscribed' , ( ) => {
58+ const source = Observable . generate ( 1 , x => x < 4 , x => x + 1 ) ;
59+ let count = 0 ;
60+ const subscriber = new Rx . Subscriber < number > (
61+ x => {
62+ count ++ ;
63+ if ( x == 2 ) {
64+ subscriber . unsubscribe ( ) ;
65+ }
66+ }
67+ ) ;
68+ source . subscribe ( subscriber ) ;
69+ expect ( count ) . to . be . equal ( 2 ) ;
70+ } ) ;
71+
72+ it ( 'should accept a scheduler' , ( ) => {
73+ const source = Observable . generate ( {
74+ initialState : 1 ,
75+ condition : x => x < 4 ,
76+ iterate : x => x + 1 ,
77+ resultSelector : x => x ,
78+ scheduler : rxTestScheduler
79+ } ) ;
80+ const expected = '(123|)' ;
81+
82+ let count = 0 ;
83+ source . subscribe ( x => count ++ ) ;
84+
85+ expect ( count ) . to . be . equal ( 0 ) ;
86+ rxTestScheduler . flush ( ) ;
87+ expect ( count ) . to . be . equal ( 3 ) ;
88+
89+ expectObservable ( source ) . toBe ( expected , { '1' : 1 , '2' : 2 , '3' : 3 } ) ;
90+ } ) ;
91+
92+ it ( 'should allow minimal possible options' , ( ) => {
93+ const source = Observable . generate ( {
94+ initialState : 1 ,
95+ iterate : x => x * 2
96+ } ) . take ( 3 ) ;
97+ const expected = '(124|)' ;
98+
99+ expectObservable ( source ) . toBe ( expected , { '1' : 1 , '2' : 2 , '4' : 4 } ) ;
100+ } ) ;
101+
102+ it ( 'should emit error if result selector throws' , ( ) => {
103+ const source = Observable . generate ( {
104+ initialState : 1 ,
105+ iterate : x => x * 2 ,
106+ resultSelector : err
107+ } ) ;
108+ const expected = '(#)' ;
109+
110+ expectObservable ( source ) . toBe ( expected ) ;
111+ } ) ;
112+
113+ it ( 'should emit error if result selector throws on scheduler' , ( ) => {
114+ const source = Observable . generate ( {
115+ initialState : 1 ,
116+ iterate : x => x * 2 ,
117+ resultSelector : err ,
118+ scheduler : rxTestScheduler
119+ } ) ;
120+ const expected = '(#)' ;
121+
122+ expectObservable ( source ) . toBe ( expected ) ;
123+ } ) ;
124+
125+ it ( 'should emit error after first value if iterate function throws' , ( ) => {
126+ const source = Observable . generate ( {
127+ initialState : 1 ,
128+ iterate : err
129+ } ) ;
130+ const expected = '(1#)' ;
131+
132+ expectObservable ( source ) . toBe ( expected , { '1' : 1 } ) ;
133+ } ) ;
134+
135+ it ( 'should emit error after first value if iterate function throws on scheduler' , ( ) => {
136+ const source = Observable . generate ( {
137+ initialState : 1 ,
138+ iterate : err ,
139+ scheduler : rxTestScheduler
140+ } ) ;
141+ const expected = '(1#)' ;
142+
143+ expectObservable ( source ) . toBe ( expected , { '1' : 1 } ) ;
144+ } ) ;
145+
146+ it ( 'should emit error if condition function throws' , ( ) => {
147+ const source = Observable . generate ( {
148+ initialState : 1 ,
149+ iterate : x => x + 1 ,
150+ condition : err
151+ } ) ;
152+ const expected = '(#)' ;
153+
154+ expectObservable ( source ) . toBe ( expected ) ;
155+ } ) ;
156+
157+ it ( 'should emit error if condition function throws on scheduler' , ( ) => {
158+ const source = Observable . generate ( {
159+ initialState : 1 ,
160+ iterate : x => x + 1 ,
161+ condition : err ,
162+ scheduler : rxTestScheduler
163+ } ) ;
164+ const expected = '(#)' ;
165+
166+ expectObservable ( source ) . toBe ( expected ) ;
167+ } ) ;
168+ } ) ;
0 commit comments