160 lines
5.0 KiB
C++
160 lines
5.0 KiB
C++
#include "../test.h"
|
|
#include "rxcpp/operators/rx-sample_time.hpp"
|
|
|
|
SCENARIO("sample with time, error", "[sample_with_time][operators]"){
|
|
GIVEN("1 hot observable of ints."){
|
|
auto sc = rxsc::make_test();
|
|
auto so = rx::synchronize_in_one_worker(sc);
|
|
auto w = sc.create_worker();
|
|
const rxsc::test::messages<int> on;
|
|
|
|
std::runtime_error ex("sample_with_time on_error from source");
|
|
|
|
auto xs = sc.make_hot_observable({
|
|
on.next(100, 1),
|
|
on.next(210, 2),
|
|
on.next(240, 3),
|
|
on.next(280, 4),
|
|
on.next(320, 5),
|
|
on.next(350, 6),
|
|
on.next(380, 7),
|
|
on.next(420, 8),
|
|
on.next(470, 9),
|
|
on.error(600, ex)
|
|
});
|
|
WHEN("group ints on intersecting intervals"){
|
|
using namespace std::chrono;
|
|
|
|
auto res = w.start(
|
|
[&]() {
|
|
return xs
|
|
| rxo::sample_with_time(milliseconds(100), so)
|
|
| rxo::as_dynamic();
|
|
}
|
|
);
|
|
|
|
THEN("the output contains groups of ints"){
|
|
auto required = rxu::to_vector({
|
|
on.next(301, 4),
|
|
on.next(401, 7),
|
|
on.next(501, 9),
|
|
on.error(601, ex)
|
|
});
|
|
auto actual = res.get_observer().messages();
|
|
REQUIRE(required == actual);
|
|
}
|
|
|
|
THEN("there was one subscription and one unsubscription to the xs"){
|
|
auto required = rxu::to_vector({
|
|
on.subscribe(200, 600)
|
|
});
|
|
auto actual = xs.subscriptions();
|
|
REQUIRE(required == actual);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SCENARIO("sample with time, disposed", "[sample_with_time][operators]"){
|
|
GIVEN("1 hot observable of ints."){
|
|
auto sc = rxsc::make_test();
|
|
auto so = rx::synchronize_in_one_worker(sc);
|
|
auto w = sc.create_worker();
|
|
const rxsc::test::messages<int> on;
|
|
|
|
auto xs = sc.make_hot_observable({
|
|
on.next(100, 1),
|
|
on.next(210, 2),
|
|
on.next(240, 3),
|
|
on.next(280, 4), //
|
|
on.next(320, 5),
|
|
on.next(350, 6),
|
|
on.next(380, 7),
|
|
on.next(420, 8),
|
|
on.next(470, 9),
|
|
on.completed(600)
|
|
});
|
|
WHEN("group ints on intersecting intervals"){
|
|
using namespace std::chrono;
|
|
|
|
auto res = w.start(
|
|
[&]() {
|
|
return xs
|
|
.sample_with_time(milliseconds(100), so)
|
|
.as_dynamic();
|
|
},
|
|
370
|
|
);
|
|
|
|
THEN("the output contains groups of ints"){
|
|
auto required = rxu::to_vector({
|
|
on.next(301, 4),
|
|
});
|
|
auto actual = res.get_observer().messages();
|
|
REQUIRE(required == actual);
|
|
}
|
|
|
|
THEN("there was one subscription and one unsubscription to the xs"){
|
|
auto required = rxu::to_vector({
|
|
on.subscribe(200, 371)
|
|
});
|
|
auto actual = xs.subscriptions();
|
|
REQUIRE(required == actual);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SCENARIO("sample with time, same", "[sample_with_time][operators]"){
|
|
GIVEN("1 hot observable of ints."){
|
|
auto sc = rxsc::make_test();
|
|
auto so = rx::synchronize_in_one_worker(sc);
|
|
auto w = sc.create_worker();
|
|
const rxsc::test::messages<int> on;
|
|
const rxsc::test::messages<std::vector<int>> v_on;
|
|
|
|
auto xs = sc.make_hot_observable({
|
|
on.next(100, 1),
|
|
on.next(210, 2),
|
|
on.next(240, 3),
|
|
on.next(280, 4),
|
|
on.next(320, 5),
|
|
on.next(350, 6),
|
|
on.next(380, 7),
|
|
on.next(420, 8),
|
|
on.next(470, 9),
|
|
on.completed(600)
|
|
});
|
|
WHEN("group ints on intervals"){
|
|
using namespace std::chrono;
|
|
|
|
auto res = w.start(
|
|
[&]() {
|
|
return xs
|
|
.sample_with_time(milliseconds(100), so)
|
|
.as_dynamic();
|
|
}
|
|
);
|
|
|
|
THEN("the output contains groups of ints"){
|
|
auto required = rxu::to_vector({
|
|
on.next(301, 4),
|
|
on.next(401, 7),
|
|
on.next(501, 9),
|
|
on.completed(601)
|
|
});
|
|
auto actual = res.get_observer().messages();
|
|
REQUIRE(required == actual);
|
|
}
|
|
|
|
THEN("there was one subscription and one unsubscription to the xs"){
|
|
auto required = rxu::to_vector({
|
|
on.subscribe(200, 600)
|
|
});
|
|
auto actual = xs.subscriptions();
|
|
REQUIRE(required == actual);
|
|
}
|
|
}
|
|
}
|
|
}
|