summaryrefslogtreecommitdiff
path: root/Rx/v2/test/operators/with_latest_from.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Rx/v2/test/operators/with_latest_from.cpp')
-rw-r--r--Rx/v2/test/operators/with_latest_from.cpp1645
1 files changed, 0 insertions, 1645 deletions
diff --git a/Rx/v2/test/operators/with_latest_from.cpp b/Rx/v2/test/operators/with_latest_from.cpp
deleted file mode 100644
index ae7092a..0000000
--- a/Rx/v2/test/operators/with_latest_from.cpp
+++ /dev/null
@@ -1,1645 +0,0 @@
-#include "../test.h"
-#include "rxcpp/operators/rx-with_latest_from.hpp"
-
-SCENARIO("with_latest_from interleaved with tail", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto o1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.next(225, 4),
- on.completed(230)
- });
-
- auto o2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(220, 3),
- on.next(230, 5),
- on.next(235, 6),
- on.next(240, 7),
- on.completed(250)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o2
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o1
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains combined ints"){
- auto required = rxu::to_vector({
- on.next(220, 2 + 3),
- on.next(230, 4 + 5),
- on.next(235, 4 + 6),
- on.next(240, 4 + 7),
- on.completed(250)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 230)
- });
- auto actual = o1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 250)
- });
- auto actual = o2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from consecutive", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto o1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.next(225, 4),
- on.completed(230)
- });
-
- auto o2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(235, 6),
- on.next(240, 7),
- on.completed(250)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o2
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o1
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains combined ints"){
- auto required = rxu::to_vector({
- on.next(235, 4 + 6),
- on.next(240, 4 + 7),
- on.completed(250)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 230)
- });
- auto actual = o1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 250)
- });
- auto actual = o2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from consecutive ends with error left", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto o1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.next(225, 4),
- on.error(230, ex)
- });
-
- auto o2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(235, 6),
- on.next(240, 7),
- on.completed(250)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o2
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o1
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only an error"){
- auto required = rxu::to_vector({
- on.error(230, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 230)
- });
- auto actual = o1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 230)
- });
- auto actual = o2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from consecutive ends with error right", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto o1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.next(225, 4),
- on.completed(250)
- });
-
- auto o2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(235, 6),
- on.next(240, 7),
- on.error(245, ex)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o2
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o1
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains combined ints followed by an error"){
- auto required = rxu::to_vector({
- on.next(235, 4 + 6),
- on.next(240, 4 + 7),
- on.error(245, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 245)
- });
- auto actual = o1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 245)
- });
- auto actual = o2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from never N", "[with_latest_from][join][operators]"){
- GIVEN("N never completed hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- const int N = 4;
-
- std::vector<rxcpp::test::testable_observable<int>> n;
- for (int i = 0; i < N; ++i) {
- n.push_back(
- sc.make_hot_observable({
- on.next(150, 1)
- })
- );
- }
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return n[0]
- .with_latest_from(
- [](int v0, int v1, int v2, int v3){
- return v0 + v1 + v2 + v3;
- },
- n[1], n[2], n[3]
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output is empty"){
- auto required = std::vector<rxsc::test::messages<int>::recorded_type>();
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to each observable"){
-
- std::for_each(n.begin(), n.end(), [&](rxcpp::test::testable_observable<int> &s){
- auto required = rxu::to_vector({
- on.subscribe(200, 1000)
- });
- auto actual = s.subscriptions();
- REQUIRE(required == actual);
- });
- }
- }
- }
-}
-
-SCENARIO("with_latest_from empty N", "[with_latest_from][join][operators]"){
- GIVEN("N empty hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- const int N = 4;
-
- std::vector<rxcpp::test::testable_observable<int>> e;
- for (int i = 0; i < N; ++i) {
- e.push_back(
- sc.make_hot_observable({
- on.next(150, 1),
- on.completed(210 + 10 * i)
- })
- );
- }
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return e[0]
- .with_latest_from(
- [](int v0, int v1, int v2, int v3){
- return v0 + v1 + v2 + v3;
- },
- e[1], e[2], e[3]
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only complete message"){
- auto required = rxu::to_vector({
- on.completed(200 + 10 * N)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to each observable"){
-
- int i = 0;
- std::for_each(e.begin(), e.end(), [&](rxcpp::test::testable_observable<int> &s){
- auto required = rxu::to_vector({
- on.subscribe(200, 200 + 10 * ++i)
- });
- auto actual = s.subscriptions();
- REQUIRE(required == actual);
- });
- }
- }
- }
-}
-
-SCENARIO("with_latest_from never/empty", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto n = sc.make_hot_observable({
- on.next(150, 1)
- });
-
- auto e = sc.make_hot_observable({
- on.next(150, 1),
- on.completed(210)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return n
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- e
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output is empty"){
- auto required = std::vector<rxsc::test::messages<int>::recorded_type>();
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the n"){
- auto required = rxu::to_vector({
- on.subscribe(200, 1000)
- });
- auto actual = n.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the e"){
- auto required = rxu::to_vector({
- on.subscribe(200, 210)
- });
- auto actual = e.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from empty/never", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto e = sc.make_hot_observable({
- on.next(150, 1),
- on.completed(210)
- });
-
- auto n = sc.make_hot_observable({
- on.next(150, 1)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return e
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- n
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output is empty"){
- auto required = std::vector<rxsc::test::messages<int>::recorded_type>();
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the e"){
- auto required = rxu::to_vector({
- on.subscribe(200, 210)
- });
- auto actual = e.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the n"){
- auto required = rxu::to_vector({
- on.subscribe(200, 1000)
- });
- auto actual = n.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from empty/return", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto e = sc.make_hot_observable({
- on.next(150, 1),
- on.completed(210)
- });
-
- auto o = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.completed(220)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return e
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only complete message"){
- auto required = rxu::to_vector({
- on.completed(220)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the e"){
- auto required = rxu::to_vector({
- on.subscribe(200, 210)
- });
- auto actual = e.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from return/empty", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto o = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.completed(220)
- });
-
- auto e = sc.make_hot_observable({
- on.next(150, 1),
- on.completed(210)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- e
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only complete message"){
- auto required = rxu::to_vector({
- on.completed(220)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the e"){
- auto required = rxu::to_vector({
- on.subscribe(200, 210)
- });
- auto actual = e.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from never/return", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto n = sc.make_hot_observable({
- on.next(150, 1)
- });
-
- auto o = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.completed(220)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return n
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output is empty"){
- auto required = std::vector<rxsc::test::messages<int>::recorded_type>();
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the n"){
- auto required = rxu::to_vector({
- on.subscribe(200, 1000)
- });
- auto actual = n.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from return/never", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto o = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.completed(220)
- });
-
- auto n = sc.make_hot_observable({
- on.next(150, 1)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- n
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output is empty"){
- auto required = std::vector<rxsc::test::messages<int>::recorded_type>();
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the n"){
- auto required = rxu::to_vector({
- on.subscribe(200, 1000)
- });
- auto actual = n.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-
-SCENARIO("with_latest_from return/return", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- auto o1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.completed(230)
- });
-
- auto o2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(220, 3),
- on.completed(240)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o1
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- o2
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains combined ints"){
- auto required = rxu::to_vector({
- on.completed(240)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 230)
- });
- auto actual = o1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 240)
- });
- auto actual = o2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from empty/error", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto emp = sc.make_hot_observable({
- on.next(150, 1),
- on.completed(230)
- });
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return emp
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the emp"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = emp.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error/empty", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- auto emp = sc.make_hot_observable({
- on.next(150, 1),
- on.completed(230)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- emp
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the emp"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = emp.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from return/error", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto o = sc.make_hot_observable({
- on.next(150, 1),
- on.next(210, 2),
- on.completed(230)
- });
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the ret"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error/return", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- auto ret = sc.make_hot_observable({
- on.next(150, 1),
- on.next(210, 2),
- on.completed(230)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- ret
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the ret"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = ret.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error/error", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex1("with_latest_from on_error from source 1");
- std::runtime_error ex2("with_latest_from on_error from source 2");
-
- auto err1 = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex1)
- });
-
- auto err2 = sc.make_hot_observable({
- on.next(150, 1),
- on.error(230, ex2)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err1
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err2
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex1)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from next+error/error", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex1("with_latest_from on_error from source 1");
- std::runtime_error ex2("with_latest_from on_error from source 2");
-
- auto err1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(210, 2),
- on.error(220, ex1)
- });
-
- auto err2 = sc.make_hot_observable({
- on.next(150, 1),
- on.error(230, ex2)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err1
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err2
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex1)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error/next+error", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex1("with_latest_from on_error from source 1");
- std::runtime_error ex2("with_latest_from on_error from source 2");
-
- auto err1 = sc.make_hot_observable({
- on.next(150, 1),
- on.error(230, ex1)
- });
-
- auto err2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(210, 2),
- on.error(220, ex2)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err1
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err2
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex2)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from never/error", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto n = sc.make_hot_observable({
- on.next(150, 1)
- });
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return n
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the n"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = n.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error/never", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- auto n = sc.make_hot_observable({
- on.next(150, 1)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- n
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the n"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = n.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error after completed left", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto ret = sc.make_hot_observable({
- on.next(150, 1),
- on.next(210, 2),
- on.completed(215)
- });
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return ret
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- err
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the ret"){
- auto required = rxu::to_vector({
- on.subscribe(200, 215)
- });
- auto actual = ret.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from error after completed right", "[with_latest_from][join][operators]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto err = sc.make_hot_observable({
- on.next(150, 1),
- on.error(220, ex)
- });
-
- auto ret = sc.make_hot_observable({
- on.next(150, 1),
- on.next(210, 2),
- on.completed(215)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return err
- .with_latest_from(
- [](int v2, int v1){
- return v2 + v1;
- },
- ret
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error message"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the ret"){
- auto required = rxu::to_vector({
- on.subscribe(200, 215)
- });
- auto actual = ret.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the err"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = err.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from selector throws", "[with_latest_from][join][operators][!throws]"){
- GIVEN("2 hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- auto o1 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(215, 2),
- on.completed(230)
- });
-
- auto o2 = sc.make_hot_observable({
- on.next(150, 1),
- on.next(220, 3),
- on.completed(240)
- });
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o2
- .with_latest_from(
- [&ex](int, int) -> int {
- rxu::throw_exception(ex);
- },
- o1
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error"){
- auto required = rxu::to_vector({
- on.error(220, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o1"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o1.subscriptions();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to the o2"){
- auto required = rxu::to_vector({
- on.subscribe(200, 220)
- });
- auto actual = o2.subscriptions();
- REQUIRE(required == actual);
- }
- }
- }
-}
-
-SCENARIO("with_latest_from selector throws N", "[with_latest_from][join][operators][!throws]"){
- GIVEN("N hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- const int N = 4;
-
- std::runtime_error ex("with_latest_from on_error from source");
-
- std::vector<rxcpp::test::testable_observable<int>> e;
- for (int i = 0; i < N; ++i) {
- e.push_back(
- sc.make_hot_observable({
- on.next(210 + 10 * i, 1),
- on.completed(500)
- })
- );
- }
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return e[3]
- .with_latest_from(
- [&ex](int, int, int, int) -> int {
- rxu::throw_exception(ex);
- },
- e[0], e[1], e[2]
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains only error"){
- auto required = rxu::to_vector({
- on.error(200 + 10 * N, ex)
- });
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to each observable"){
-
- std::for_each(e.begin(), e.end(), [&](rxcpp::test::testable_observable<int> &s){
- auto required = rxu::to_vector({
- on.subscribe(200, 200 + 10 * N)
- });
- auto actual = s.subscriptions();
- REQUIRE(required == actual);
- });
- }
- }
- }
-}
-
-SCENARIO("with_latest_from typical N", "[with_latest_from][join][operators]"){
- GIVEN("N hot observables of ints."){
- auto sc = rxsc::make_test();
- auto w = sc.create_worker();
- const rxsc::test::messages<int> on;
-
- const int N = 4;
-
- std::vector<rxcpp::test::testable_observable<int>> o;
- for (int i = 0; i < N; ++i) {
- o.push_back(
- sc.make_hot_observable({
- on.next(150, 1),
- on.next(210 + 10 * i, i + 1),
- on.next(410 + 10 * i, i + N + 1),
- on.completed(800)
- })
- );
- }
-
- WHEN("each int is combined with the latest from the other source"){
-
- auto res = w.start(
- [&]() {
- return o[3]
- .with_latest_from(
- [](int v0, int v1, int v2, int v3) {
- return v0 + v1 + v2 + v3;
- },
- o[0], o[1], o[2]
- )
- // forget type to workaround lambda deduction bug on msvc 2013
- .as_dynamic();
- }
- );
-
- THEN("the output contains combined ints"){
- auto required = rxu::to_vector({
- on.next(200 + 10 * N, N * (N + 1) / 2),
- on.next(410 + 10 * (N - 1), (N - 1) * N / 2 + N + N * N)
- });
- required.push_back(on.completed(800));
- auto actual = res.get_observer().messages();
- REQUIRE(required == actual);
- }
-
- THEN("there was one subscription and one unsubscription to each observable"){
-
- std::for_each(o.begin(), o.end(), [&](rxcpp::test::testable_observable<int> &s){
- auto required = rxu::to_vector({
- on.subscribe(200, 800)
- });
- auto actual = s.subscriptions();
- REQUIRE(required == actual);
- });
- }
- }
- }
-}