#include "../test.h" SCENARIO("repeat, basic test", "[repeat][operators]"){ GIVEN("cold observable of 3 ints."){ auto sc = rxsc::make_test(); auto w = sc.create_worker(); const rxsc::test::messages<int> on; auto xs = sc.make_cold_observable({ on.next(100, 1), on.next(150, 2), on.next(200, 3), on.completed(250) }); WHEN("infinite repeat is launched"){ auto res = w.start( [&]() { return xs .repeat() // forget type to workaround lambda deduction bug on msvc 2013 .as_dynamic(); } ); THEN("the output contains 3 sets of ints"){ auto required = rxu::to_vector({ on.next(300, 1), on.next(350, 2), on.next(400, 3),
auto ys1 = sc.make_hot_observable({ on.next(100, 1) }); auto ys2 = sc.make_hot_observable({ on.next(110, 2) }); auto ys3 = sc.make_hot_observable({ on.next(120, 3) }); auto xs = sc.make_cold_observable({ o_on.next(100, ys1), o_on.next(100, ys2), o_on.next(100, ys3), o_on.completed(200) }); WHEN("the first observable is selected to produce ints"){ auto res = w.start( [&]() { return xs .amb() // forget type to workaround lambda deduction bug on msvc 2013 .as_dynamic(); } ); THEN("the output is empty"){
#include "../test.h" SCENARIO("pairwise", "[pairwise][operators]") { GIVEN("a cold observable of n ints") { auto sc = rxsc::make_test(); auto w = sc.create_worker(); const rxsc::test::messages<int> on; const rxsc::test::messages<std::tuple<int, int>> on_pairwise; long invoked = 0; auto xs = sc.make_cold_observable({ on.next(180, 1), on.next(210, 2), on.next(240, 3), on.next(290, 4), on.next(350, 5), on.completed(400), }); WHEN("taken pairwise") { auto res = w.start( [xs, &invoked]() { return xs .pairwise() // forget type to workaround lambda deduction bug on msvc 2013 .as_dynamic(); } ); THEN("the output contains n-1 tuples of ints"){
WHEN("deferred"){ auto empty = rx::observable<>::empty<long>(); auto just = rx::observable<>::just(42); auto one = rx::observable<>::from(42); auto error = rx::observable<>::error<long>(std::exception_ptr()); auto runtimeerror = rx::observable<>::error<long>(std::runtime_error("runtime")); auto res = w.start( [&]() { return rx::observable<>::defer( [&](){ invoked++; xs.reset(sc.make_cold_observable({ on.next(100, sc.clock()), on.completed(200) })); return xs.get(); }) // forget type to workaround lambda deduction bug on msvc 2013 .as_dynamic(); } ); THEN("the output stops on completion"){ auto required = rxu::to_vector({ on.next(300, 200L), on.completed(400) }); auto actual = res.get_observer().messages(); REQUIRE(required == actual);
#include "rxcpp/rx-test.hpp" #include "catch.hpp" SCENARIO("switch_on_next - some changes", "[switch_on_next][operators]"){ GIVEN("a source"){ auto sc = rxsc::make_test(); auto w = sc.create_worker(); const rxsc::test::messages<int> on; const rxsc::test::messages<rx::observable<int>> o_on; auto ys1 = sc.make_cold_observable({ on.on_next(10, 101), on.on_next(20, 102), on.on_next(110, 103), on.on_next(120, 104), on.on_next(210, 105), on.on_next(220, 106), on.on_completed(230) }); auto ys2 = sc.make_cold_observable({ on.on_next(10, 201), on.on_next(20, 202), on.on_next(30, 203), on.on_next(40, 204), on.on_completed(50) }); auto ys3 = sc.make_cold_observable({ on.on_next(10, 301),
[&]() { return rx::observable<>:: scope( [&](){ return resource(rxu::to_vector({1, 2, 3, 4, 5})); }, [&](resource r){ auto msg = std::vector<rxsc::test::messages<int>::recorded_type>(); int time = 10; auto values = r.get(); std::for_each(values.begin(), values.end(), [&](int &v){ msg.push_back(on.next(time, v)); time += 10; }); msg.push_back(on.completed(time)); xs.reset(sc.make_cold_observable(msg)); return xs.get(); } ) // forget type to workaround lambda deduction bug on msvc 2013 .as_dynamic(); } ); THEN("the output stops on completion"){ auto required = rxu::to_vector({ on.next(210, 1), on.next(220, 2), on.next(230, 3), on.next(240, 4), on.next(250, 5),