88using namespace another_rxcpp ;
99using namespace another_rxcpp ::operators;
1010
11- void test_case_7 () {
12- log () << " test_case_7 -- begin " << std::endl ;
11+ struct watier : public std ::enable_shared_from_this<watier> {
12+ subjects::subject< int > breaker_subject ;
1313
14- {
15- log () << " #1 normal observer -- begin" << std::endl;
16- auto sbsc = observable<>::create<int >([](subscriber<int > s){
17- subjects::subject<int > sbj;
18- observables::range (0 , 10 )
19- .observe_on (schedulers::observe_on_new_thread ())
20- .take_until (sbj.as_observable ())
14+ virtual ~watier () {
15+ log () << " ~watier" << std::endl;
16+ }
17+
18+ auto wait_subscribe (std::string memo){
19+ auto THIS = shared_from_this ();
20+ return observable<>::create<int >([THIS , memo](subscriber<int > s){
21+ observables::interval (std::chrono::milliseconds (700 ), schedulers::new_thread_scheduler ())
22+ .take_until (THIS ->breaker_subject .as_observable ())
2123 .subscribe (
22- [s, sbj](auto x) {
23- log () << " #1 inner next: " << x << std::endl;
24- if (x == 5 ){
25- sbj.as_subscriber ().on_next (1 );
26- sbj.as_subscriber ().on_completed ();
27- }
24+ [s, memo](auto x) {
25+ log () << memo << " next: " << x << std::endl;
2826 },
29- [s](auto err) {
30- log () << " #1 inner error" << std::endl;
27+ [s, memo ](auto err) {
28+ log () << memo << " error" << std::endl;
3129 s.on_error (err);
3230 },
33- [s]{
34- log () << " #1 inner completed" << std::endl;
31+ [s, memo ]{
32+ log () << memo << " completed" << std::endl;
3533 s.on_next (999 );
3634 s.on_completed ();
3735 }
3836 );
39- })
40- .subscribe (
41- [](auto x) { log () << " #1 outer next: " << x << std::endl; },
42- [](auto ) { log () << " #1 outer error" << std::endl; },
43- [] { log () << " #1 outer completed" << std::endl; }
44- );
45- while (sbsc.is_subscribed ()) {}
46- log () << " #1 normal observer -- end" << std::endl;
37+ });
4738 }
4839
49- {
50- log () << " #2 stream_controller -- begin" << std::endl;
51-
52- auto sbsc = observable<>::create<int >([](subscriber<int > s){
40+ auto wait_stream_controller (std::string memo){
41+ auto THIS = shared_from_this ();
42+ return observable<>::create<int >([THIS , memo](subscriber<int > s){
5343 internal::stream_controller<int > sctl (s);
54- subjects::subject<int > sbj;
55- observables::range (0 , 10 )
56- .observe_on (schedulers::observe_on_new_thread ())
57- .take_until (sbj.as_observable ())
44+ observables::interval (std::chrono::milliseconds (700 ), schedulers::new_thread_scheduler ())
45+ .take_until (THIS ->breaker_subject .as_observable ())
5846 .subscribe (sctl.new_observer <int >(
59- [sctl, sbj](auto , auto x) {
60- log () << " #2 inner next: " << x << std::endl;
61- if (x == 5 ){
62- sbj.as_subscriber ().on_next (1 );
63- sbj.as_subscriber ().on_completed ();
64- }
47+ [sctl, memo](auto , auto x) {
48+ log () << memo << " next: " << x << std::endl;
6549 },
66- [sctl](auto , auto err) {
67- log () << " #2 inner error" << std::endl;
50+ [sctl, memo ](auto , auto err) {
51+ log () << memo << " error" << std::endl;
6852 sctl.sink_error (err);
6953 },
70- [sctl](auto serial){
71- log () << " #2 inner completed" << std::endl;
54+ [sctl, memo ](auto serial){
55+ log () << memo << " completed" << std::endl;
7256 sctl.sink_next (999 );
7357 sctl.sink_completed (serial);
7458 }
7559 ));
76- })
77- .subscribe (
78- [](auto x) { log () << " #2 outer next: " << x << std::endl; },
79- [](auto ) { log () << " #2 outer error" << std::endl; },
80- [] { log () << " #2 outer completed" << std::endl; }
81- );
82- while (sbsc.is_subscribed ()) {}
60+ });
61+ }
62+ };
63+
64+ auto emit_error (int ms){
65+ return observables::just (1 )
66+ .observe_on (schedulers::new_thread_scheduler ())
67+ .flat_map ([ms](auto ){
68+ return observable<>::create<int >([ms](subscriber<int > s){
69+ s.on_next (1 );
70+ std::this_thread::sleep_for (std::chrono::milliseconds (ms));
71+ log () << " emit_error" << std::endl;
72+ s.on_error (std::make_exception_ptr (std::runtime_error (" error" )));
73+ });
74+ });
75+ }
76+
77+ void test_case_7 () {
78+ log () << " test_case_7 -- begin" << std::endl;
79+
80+ {
81+ log () << " #1 -- begin" << std::endl;
82+ {
83+ auto w = std::make_shared<watier>();
84+ auto sbsc = emit_error (1000 )
85+ .flat_map ([w](auto ){
86+ return w->wait_subscribe (" #1 watier1" )
87+ .amb (schedulers::new_thread_scheduler (), w->wait_subscribe (" #1 watier2" ));
88+ })
89+ .on_error_resume_next ([w](auto ){
90+ log () << " #1 on_error_resume_next" << std::endl;
91+ std::thread ([w]{
92+ wait (100 );
93+ log () << " #1 break!" << std::endl;
94+ w->breaker_subject .as_subscriber ().on_next (1 );
95+ }).detach ();
96+ return observables::just (123456 );
97+ })
98+ .subscribe (
99+ [](auto x) {
100+ log () << " #1 next: " << x << std::endl;
101+ },
102+ [](auto err) {
103+ log () << " #1 error" << std::endl;
104+ },
105+ []{
106+ log () << " #1 completed" << std::endl;
107+ }
108+ );
109+ while (sbsc.is_subscribed ()) {}
110+ }
111+ log () << " #1-- end" << std::endl;
112+ }
113+
114+ wait (1000 );
83115
84- log () << " #2 stream_controller -- end" << std::endl;
116+ {
117+ log () << " #2 -- begin" << std::endl;
118+ {
119+ auto w = std::make_shared<watier>();
120+ auto sbsc = emit_error (1000 )
121+ .flat_map ([w](auto ){
122+ return w->wait_stream_controller (" #2 watier1" )
123+ .amb (schedulers::new_thread_scheduler (), w->wait_stream_controller (" #2 watier2" ));
124+ })
125+ .on_error_resume_next ([w](auto ){
126+ log () << " #2 on_error_resume_next" << std::endl;
127+ std::thread ([w]{
128+ wait (100 );
129+ log () << " #2 break!" << std::endl;
130+ w->breaker_subject .as_subscriber ().on_next (1 );
131+ }).detach ();
132+ return observables::just (123456 );
133+ })
134+ .subscribe (
135+ [](auto x) {
136+ log () << " #2 next: " << x << std::endl;
137+ },
138+ [](auto err) {
139+ log () << " #2 error" << std::endl;
140+ },
141+ []{
142+ log () << " #2 completed" << std::endl;
143+ }
144+ );
145+ while (sbsc.is_subscribed ()) {}
146+ }
147+ log () << " #2-- end" << std::endl;
85148 }
86149
150+ wait (1000 );
151+
87152 log () << " test_case_7 -- end" << std::endl << std::endl;
88153}
0 commit comments