11import 'package:test/test.dart' ;
22import 'package:yx_scope/src/base_scope_container.dart' ;
3+ import 'package:yx_scope/src/core/scope_state.dart' ;
34import 'package:yx_scope/yx_scope.dart' ;
45
56import 'utils/test_logger.dart' ;
@@ -9,95 +10,215 @@ void main() {
910 ScopeObservatory .logger = const TestLogger ();
1011 });
1112
12- test ('stream for scope happy path' , () async {
13- final holder = _TestScopeHolder ();
13+ group ('stream of scope' , () {
14+ test ('stream for scope happy path' , () async {
15+ final holder = _TestScopeHolder ();
1416
15- int counter = 0 ;
16- holder.stream.listen ((scope) {
17- if (counter % 2 == 0 ) {
18- expect (scope, isNotNull);
19- } else {
20- expect (scope, isNull);
21- }
17+ int counter = 0 ;
18+ holder.stream.listen ((scope) {
19+ if (counter % 2 == 0 ) {
20+ expect (scope, isNotNull);
21+ } else {
22+ expect (scope, isNull);
23+ }
24+ });
25+
26+ await holder.create ();
27+ counter++ ;
28+ await holder.drop ();
29+ counter++ ;
30+ await holder.create ();
31+ counter++ ;
32+ await holder.drop ();
33+ counter++ ;
2234 });
2335
24- await holder.create ();
25- counter++ ;
26- await holder.drop ();
27- counter++ ;
28- await holder.create ();
29- counter++ ;
30- await holder.drop ();
31- counter++ ;
32- });
36+ test ('after pausing stream of scope it emits buffered events' , () async {
37+ final holder = _TestScopeHolder ();
3338
34- test ('after pausing stream of scope it emits buffered events' , () async {
35- final holder = _TestScopeHolder ();
39+ int counter = 0 ;
40+ final subscription = holder.stream.listen ((scope) {
41+ if (counter % 2 == 0 ) {
42+ expect (scope, isNotNull);
43+ } else {
44+ expect (scope, isNull);
45+ }
46+ counter++ ;
47+ });
3648
37- int counter = 0 ;
38- final subscription = holder.stream.listen ((scope) {
39- if (counter % 2 == 0 ) {
40- expect (scope, isNotNull);
41- } else {
42- expect (scope, isNull);
43- }
44- counter++ ;
45- });
49+ await holder.create ();
50+ await holder.drop ();
4651
47- await holder.create ();
48- await holder.drop ();
52+ subscription.pause ();
4953
50- subscription.pause ();
54+ await holder.create ();
55+ await holder.drop ();
56+ await holder.create ();
5157
52- await holder.create ();
53- await holder.drop ();
54- await holder.create ();
58+ subscription.resume ();
5559
56- subscription.resume ();
60+ await holder.drop ();
61+ await holder.create ();
62+ await holder.drop ();
63+
64+ expect (counter, 7 );
65+ });
5766
58- await holder. drop ();
59- await holder. create ();
60- await holder.drop () ;
67+ test ( 'reusing the same instance of stream cause an exception' , () async {
68+ final holder = _TestScopeHolder ();
69+ final stream = holder.stream ;
6170
62- expect (counter, 7 );
71+ stream.listen ((_) {});
72+ try {
73+ stream.listen ((_) {});
74+ fail ('Must throw an exception' );
75+ } on StateError catch (e) {
76+ expect (e.message, 'Stream has already been listened to.' );
77+ }
78+ });
79+
80+ test ('two different get calls return different streams' , () async {
81+ final holder = _TestScopeHolder ();
82+ final stream1 = holder.stream;
83+ final stream2 = holder.stream;
84+ expect (stream1, isNot (stream2));
85+ });
86+
87+ test ('ask for a stream creates new listener and cancelling removes it' ,
88+ () async {
89+ final holder = _TestScopeHolder ();
90+ final testHolder = TestableScopeStateHolder (holder);
91+ final stream1 = holder.stream;
92+ expect (testHolder.listeners.isEmpty, isTrue);
93+ final sub1 = stream1.listen ((_) {});
94+ expect (testHolder.listeners.length, 1 );
95+ final stream2 = holder.stream;
96+ expect (testHolder.listeners.length, 1 );
97+ final sub2 = stream2.listen ((_) {});
98+ expect (testHolder.listeners.length, 2 );
99+ await sub1.cancel ();
100+ expect (testHolder.listeners.length, 1 );
101+ await sub2.cancel ();
102+ expect (testHolder.listeners.isEmpty, isTrue);
103+ });
63104 });
64105
65- test ('reusing the same instance of stream cause an exception' , () async {
66- final holder = _TestScopeHolder ();
67- final stream = holder.stream;
106+ group ('stream of state' , () {
107+ test ('stream for scope happy path' , () async {
108+ final holder = _TestScopeHolder ();
109+
110+ int counter = 0 ;
111+ holder.stateStream.listen ((state) {
112+ switch (counter % 4 ) {
113+ case 0 :
114+ expect (state, isA <ScopeStateInitializing <_TestScopeContainer >>());
115+ break ;
116+ case 1 :
117+ expect (state, isA <ScopeStateAvailable <_TestScopeContainer >>());
118+ expect ((state as ScopeStateAvailable ).scope,
119+ isA <_TestScopeContainer >());
120+ break ;
121+ case 2 :
122+ expect (state, isA <ScopeStateDisposing <_TestScopeContainer >>());
123+ break ;
124+ case 3 :
125+ expect (state, isA <ScopeStateNone <_TestScopeContainer >>());
126+ break ;
127+ default :
128+ }
129+ counter++ ;
130+ });
131+
132+ await holder.create ();
133+ await holder.drop ();
134+ await holder.create ();
135+ await holder.drop ();
136+ await holder.create ();
137+ await holder.drop ();
138+ });
139+
140+ test ('after pausing stream of scope it emits buffered events' , () async {
141+ final holder = _TestScopeHolder ();
142+
143+ int counter = 0 ;
144+ final subscription = holder.stateStream.listen ((state) {
145+ print (counter);
146+ print (state);
147+ switch (counter % 4 ) {
148+ case 0 :
149+ expect (state, isA <ScopeStateInitializing <_TestScopeContainer >>());
150+ break ;
151+ case 1 :
152+ expect (state, isA <ScopeStateAvailable <_TestScopeContainer >>());
153+ expect ((state as ScopeStateAvailable ).scope,
154+ isA <_TestScopeContainer >());
155+ break ;
156+ case 2 :
157+ expect (state, isA <ScopeStateDisposing <_TestScopeContainer >>());
158+ break ;
159+ case 3 :
160+ expect (state, isA <ScopeStateNone <_TestScopeContainer >>());
161+ break ;
162+ default :
163+ }
164+ counter++ ;
165+ });
166+
167+ await holder.create ();
168+ await holder.drop ();
169+
170+ subscription.pause ();
171+
172+ await holder.create ();
173+ await holder.drop ();
174+ await holder.create ();
175+
176+ subscription.resume ();
177+
178+ await holder.drop ();
179+ await holder.create ();
180+ await holder.drop ();
181+
182+ expect (counter, 8 );
183+ });
184+
185+ test ('reusing the same instance of stream cause an exception' , () async {
186+ final holder = _TestScopeHolder ();
187+ final stream = holder.stateStream;
68188
69- stream.listen ((_) {});
70- try {
71189 stream.listen ((_) {});
72- fail ('Must throw an exception' );
73- } on StateError catch (e) {
74- expect (e.message, 'Stream has already been listened to.' );
75- }
76- });
190+ try {
191+ stream.listen ((_) {});
192+ fail ('Must throw an exception' );
193+ } on StateError catch (e) {
194+ expect (e.message, 'Stream has already been listened to.' );
195+ }
196+ });
77197
78- test ('two different get calls return different streams' , () async {
79- final holder = _TestScopeHolder ();
80- final stream1 = holder.stream ;
81- final stream2 = holder.stream ;
82- expect (stream1, isNot (stream2));
83- });
198+ test ('two different get calls return different streams' , () async {
199+ final holder = _TestScopeHolder ();
200+ final stream1 = holder.stateStream ;
201+ final stream2 = holder.stateStream ;
202+ expect (stream1, isNot (stream2));
203+ });
84204
85- test ('ask for a stream creates new listener and cancelling removes it' ,
86- () async {
87- final holder = _TestScopeHolder ();
88- final testHolder = TestableScopeStateHolder (holder);
89- final stream1 = holder.stream;
90- expect (testHolder.listeners.isEmpty, isTrue);
91- final sub1 = stream1.listen ((_) {});
92- expect (testHolder.listeners.length, 1 );
93- final stream2 = holder.stream;
94- expect (testHolder.listeners.length, 1 );
95- final sub2 = stream2.listen ((_) {});
96- expect (testHolder.listeners.length, 2 );
97- await sub1.cancel ();
98- expect (testHolder.listeners.length, 1 );
99- await sub2.cancel ();
100- expect (testHolder.listeners.isEmpty, isTrue);
205+ test ('ask for a stream creates new listener and cancelling removes it' ,
206+ () async {
207+ final holder = _TestScopeHolder ();
208+ final testHolder = TestableScopeStateHolder (holder);
209+ final stream1 = holder.stateStream;
210+ expect (testHolder.listeners.isEmpty, isTrue);
211+ final sub1 = stream1.listen ((_) {});
212+ expect (testHolder.listeners.length, 1 );
213+ final stream2 = holder.stateStream;
214+ expect (testHolder.listeners.length, 1 );
215+ final sub2 = stream2.listen ((_) {});
216+ expect (testHolder.listeners.length, 2 );
217+ await sub1.cancel ();
218+ expect (testHolder.listeners.length, 1 );
219+ await sub2.cancel ();
220+ expect (testHolder.listeners.isEmpty, isTrue);
221+ });
101222 });
102223}
103224
0 commit comments