summaryrefslogtreecommitdiff
path: root/Rx/v2/test/operators/reduce.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Rx/v2/test/operators/reduce.cpp')
-rw-r--r--Rx/v2/test/operators/reduce.cpp293
1 files changed, 293 insertions, 0 deletions
diff --git a/Rx/v2/test/operators/reduce.cpp b/Rx/v2/test/operators/reduce.cpp
index e0f8e5e..b91d4b9 100644
--- a/Rx/v2/test/operators/reduce.cpp
+++ b/Rx/v2/test/operators/reduce.cpp
@@ -99,3 +99,296 @@ SCENARIO("average some data", "[reduce][average][operators]"){
}
}
}
+
+SCENARIO("sum some data", "[reduce][sum][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.next(210, 3),
+ on.next(220, 4),
+ on.next(230, 2),
+ on.completed(250)
+ });
+
+ WHEN("sum is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.sum();
+ }
+ );
+
+ THEN("the output contains the sum of source values"){
+ auto required = rxu::to_vector({
+ d_on.next(250, 9),
+ d_on.completed(250)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}
+
+SCENARIO("max", "[reduce][max][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.next(210, 3),
+ on.next(220, 4),
+ on.next(230, 2),
+ on.completed(250)
+ });
+
+ WHEN("max is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.max();
+ }
+ );
+
+ THEN("the output contains the max of source values"){
+ auto required = rxu::to_vector({
+ d_on.next(250, 4),
+ d_on.completed(250)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}
+
+SCENARIO("max, empty", "[reduce][max][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ std::runtime_error ex("max on_error");
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.completed(250)
+ });
+
+ WHEN("max is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.max();
+ }
+ );
+
+ THEN("the output contains only error message"){
+ auto required = rxu::to_vector({
+ d_on.error(250, ex)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}
+
+SCENARIO("max, error", "[reduce][max][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ std::runtime_error ex("max on_error from source");
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.error(250, ex)
+ });
+
+ WHEN("max is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.max();
+ }
+ );
+
+ THEN("the output contains only error message"){
+ auto required = rxu::to_vector({
+ d_on.error(250, ex)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}
+
+SCENARIO("min", "[reduce][min][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.next(210, 3),
+ on.next(220, 4),
+ on.next(230, 2),
+ on.completed(250)
+ });
+
+ WHEN("min is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.min();
+ }
+ );
+
+ THEN("the output contains the min of source values"){
+ auto required = rxu::to_vector({
+ d_on.next(250, 2),
+ d_on.completed(250)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}
+
+SCENARIO("min, empty", "[reduce][min][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ std::runtime_error ex("min on_error");
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.completed(250)
+ });
+
+ WHEN("min is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.min();
+ }
+ );
+
+ THEN("the output contains only error message"){
+ auto required = rxu::to_vector({
+ d_on.error(250, ex)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}
+
+SCENARIO("min, error", "[reduce][min][operators]"){
+ GIVEN("a test hot observable of ints"){
+ auto sc = rxsc::make_test();
+ auto w = sc.create_worker();
+ const rxsc::test::messages<int> on;
+ const rxsc::test::messages<int> d_on;
+
+ std::runtime_error ex("min on_error from source");
+
+ auto xs = sc.make_hot_observable({
+ on.next(150, 1),
+ on.error(250, ex)
+ });
+
+ WHEN("min is calculated"){
+
+ auto res = w.start(
+ [&]() {
+ return xs.min();
+ }
+ );
+
+ THEN("the output contains only error message"){
+ auto required = rxu::to_vector({
+ d_on.error(250, ex)
+ });
+ auto actual = res.get_observer().messages();
+ REQUIRE(required == actual);
+ }
+
+ THEN("there was one subscription and one unsubscription"){
+ auto required = rxu::to_vector({
+ on.subscribe(200, 250)
+ });
+ auto actual = xs.subscriptions();
+ REQUIRE(required == actual);
+ }
+ }
+ }
+}