def test_send_inner_observable(self):
        observer = FlatMapMultiCastObserver(
            observer_info=init_multicast_observer_info(observer=self.sink),
            composite_disposable=self.composite_disposable,
            func=lambda v: v,
            lock=self.lock,
            state=[1],
        )
        self.source.observe(init_multicast_observer_info(observer))

        self.source.on_next_single(self.inner_source_1)
    def test_send_inner_items(self):
        observer = FlatMapMultiCastObserver(
            observer_info=init_multicast_observer_info(observer=self.sink),
            composite_disposable=self.composite_disposable,
            func=lambda v: v,
            lock=self.lock,
            state=[1],
        )
        self.source.observe(init_multicast_observer_info(observer))
        self.source.on_next_single(self.inner_source_1)
        self.inner_source_1.on_next_single(1)
        self.inner_source_1.on_next_single(2)

        self.assertListEqual(self.sink.received, [1, 2])
 def test_initialize(self):
     observer = FlatMapMultiCastObserver(
         observer_info=init_multicast_observer_info(observer=self.sink),
         composite_disposable=self.composite_disposable,
         func=lambda v: v,
         lock=self.lock,
         state=[1],
     )
    def test_two_observables(self):
        observer = FlatMapMultiCastObserver(
            observer_info=init_multicast_observer_info(observer=self.sink),
            composite_disposable=self.composite_disposable,
            func=lambda v: v,
            lock=self.lock,
            state=[1],
        )
        self.source.observe(init_multicast_observer_info(observer))
        self.source.on_next_single(self.inner_source_1)
        self.inner_source_1.on_next_single(1)
        self.inner_source_1.on_next_single(2)

        self.source.on_next_single(self.inner_source_2)
        self.inner_source_2.on_next_single(3)
        self.inner_source_2.on_completed()

        self.inner_source_1.on_next_single(4)
        self.inner_source_1.on_completed()

        self.source.on_completed()

        self.assertListEqual(self.sink.received, [1, 2, 3, 4])
        self.assertTrue(self.sink.is_completed)
        def action():
            inner_disposable = SingleAssignmentDisposable()

            disposable = self.source.observe(
                observer_info=init_multicast_observer_info(
                    observer=ToFlowableMultiCastObserver(
                        observer=observer_info.observer,
                        multicast_subscriber=self.multicast_subscriber,
                        subscriber=self.subscriber,
                        is_first=True,
                        inner_disposable=inner_disposable,
                    ),
                ),
            )

            return CompositeDisposable(
                disposable,
                inner_disposable,
            )
        def gen_conn_flowables():
            for source in self.sources:

                # buffers elements received before outgoing Flowable is subscribed
                conn_observer = ConnectableObserver(
                    underlying=None,
                    # scheduler=self.multicast_scheduler,
                )

                outer_self = self

                @dataclass
                class InnerObserver(Observer):
                    underlying: Observer
                    outer_observer: MultiCastObserver

                    def on_next(self, elem: ElementType):
                        if not outer_self.is_sent:

                            outer_self.is_sent = True
                            try:
                                observer_info.observer.on_next([flowables])
                                observer_info.observer.on_completed()
                            except Exception as exc:
                                observer_info.observer.on_error(exc)

                        return self.underlying.on_next(elem)

                    def on_error(self, err):
                        self.outer_observer.on_error(err)
                        self.underlying.on_error(err)

                    def on_completed(self):
                        self.underlying.on_completed()

                disposable = source.observe(
                    observer_info=init_multicast_observer_info(
                        observer=InnerObserver(
                            underlying=conn_observer,
                            outer_observer=observer_info.observer,
                        ), ), )

                # select a single Flowable per MultiCast
                def to_flowable(value):
                    if isinstance(value, FlowableMixin):
                        flowable = value

                    else:
                        raise Exception(f'illegal value "{value}"')

                    return flowable

                flattened_flowable = FlatConcatNoBackpressureFlowable(
                    source=ConnectableFlowable(
                        conn_observer=conn_observer,
                        disposable=disposable,
                    ),
                    selector=to_flowable,
                    subscribe_scheduler=self.source_scheduler,
                )

                # The outgoing Flowables are shared such that they can be subscribed more
                # than once
                yield init_flowable(
                    RefCountFlowable(
                        source=flattened_flowable,
                        stack=self.stack,
                    ))