Home | History | Annotate | Download | only in operators
      1 #include "../test.h"
      2 #include "rxcpp/operators/rx-sequence_equal.hpp"
      3 
      4 SCENARIO("sequence_equal - source never emits", "[sequence_equal][operators]"){
      5     GIVEN("two sources"){
      6         auto sc = rxsc::make_test();
      7         auto w = sc.create_worker();
      8         const rxsc::test::messages<int> on;
      9 
     10         auto xs = sc.make_hot_observable({
     11             on.next(150, 1)
     12         });
     13 
     14         auto ys = sc.make_hot_observable({
     15             on.next(150, 1),
     16             on.next(200, 2),
     17             on.next(300, 3),
     18             on.next(400, 4),
     19             on.next(500, 5),
     20             on.completed(600)
     21         });
     22 
     23         WHEN("two observables are checked for equality"){
     24 
     25             auto res = w.start(
     26                 [xs, ys]() {
     27                     return xs
     28                             | rxo::sequence_equal(ys)
     29                             | rxo::as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
     30                 }
     31             );
     32 
     33             THEN("the output is empty"){
     34                 auto required = std::vector<rxsc::test::messages<bool>::recorded_type>();
     35                 auto actual = res.get_observer().messages();
     36                 REQUIRE(required == actual);
     37             }
     38 
     39             THEN("there was 1 subscription/unsubscription to the source"){
     40                 auto required = rxu::to_vector({
     41                     on.subscribe(200, 1000)
     42                 });
     43                 auto actual = xs.subscriptions();
     44                 REQUIRE(required == actual);
     45             }
     46         }
     47     }
     48 }
     49 
     50 SCENARIO("sequence_equal - other source never emits", "[sequence_equal][operators]"){
     51     GIVEN("two sources"){
     52         auto sc = rxsc::make_test();
     53         auto w = sc.create_worker();
     54         const rxsc::test::messages<int> on;
     55 
     56         auto xs = sc.make_hot_observable({
     57             on.next(150, 1),
     58             on.next(210, 2),
     59             on.next(310, 3),
     60             on.next(410, 4),
     61             on.next(510, 5),
     62             on.completed(610)
     63         });
     64 
     65         auto ys = sc.make_hot_observable({
     66             on.next(150, 1)
     67         });
     68 
     69         WHEN("two observables are checked for equality"){
     70 
     71             auto res = w.start(
     72                 [xs, ys]() {
     73                     return xs
     74                             .sequence_equal(ys)
     75                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
     76                 }
     77             );
     78 
     79             THEN("the output is empty"){
     80                 auto required = std::vector<rxsc::test::messages<bool>::recorded_type>();
     81                 auto actual = res.get_observer().messages();
     82                 REQUIRE(required == actual);
     83             }
     84 
     85             THEN("there was 1 subscription/unsubscription to the source"){
     86                 auto required = rxu::to_vector({
     87                     on.subscribe(200, 610)
     88                 });
     89                 auto actual = xs.subscriptions();
     90                 REQUIRE(required == actual);
     91             }
     92         }
     93     }
     94 }
     95 
     96 SCENARIO("sequence_equal - both sources never emit any items", "[sequence_equal][operators]"){
     97     GIVEN("two sources"){
     98         auto sc = rxsc::make_test();
     99         auto w = sc.create_worker();
    100         const rxsc::test::messages<int> on;
    101 
    102         auto xs = sc.make_hot_observable({
    103             on.next(150, 1)
    104         });
    105 
    106         auto ys = sc.make_hot_observable({
    107             on.next(150, 0),
    108         });
    109 
    110         WHEN("two observables are checked for equality"){
    111 
    112             auto res = w.start(
    113                 [xs, ys]() {
    114                     return xs
    115                             .sequence_equal(ys)
    116                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    117                 }
    118             );
    119 
    120             THEN("the output is empty"){
    121                 auto required = std::vector<rxsc::test::messages<bool>::recorded_type>();
    122                 auto actual = res.get_observer().messages();
    123                 REQUIRE(required == actual);
    124             }
    125 
    126             THEN("there was 1 subscription/unsubscription to the source"){
    127                 auto required = rxu::to_vector({
    128                     on.subscribe(200, 1000)
    129                 });
    130                 auto actual = xs.subscriptions();
    131                 REQUIRE(required == actual);
    132             }
    133         }
    134     }
    135 }
    136 
    137 SCENARIO("sequence_equal - both sources emit the same sequence of items", "[sequence_equal][operators]"){
    138     GIVEN("two sources"){
    139         auto sc = rxsc::make_test();
    140         auto w = sc.create_worker();
    141         const rxsc::test::messages<int> on;
    142         const rxsc::test::messages<bool> o_on;
    143 
    144         auto xs = sc.make_hot_observable({
    145             on.next(150, 1),
    146             on.next(210, 2),
    147             on.next(310, 3),
    148             on.next(410, 4),
    149             on.next(510, 5),
    150             on.completed(610)
    151         });
    152 
    153         auto ys = sc.make_hot_observable({
    154             on.next(150, 1),
    155             on.next(220, 2),
    156             on.next(330, 3),
    157             on.next(440, 4),
    158             on.next(550, 5),
    159             on.completed(600)
    160         });
    161 
    162         WHEN("two observables are checked for equality"){
    163 
    164             auto res = w.start(
    165                 [xs, ys]() {
    166                     return xs
    167                             .sequence_equal(ys)
    168                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    169                 }
    170             );
    171 
    172             THEN("the output contains true"){
    173                 auto required = rxu::to_vector({
    174                     o_on.next(610, true),
    175                     o_on.completed(610)
    176                 });
    177                 auto actual = res.get_observer().messages();
    178                 REQUIRE(required == actual);
    179             }
    180 
    181             THEN("there was 1 subscription/unsubscription to the source"){
    182                 auto required = rxu::to_vector({
    183                     on.subscribe(200, 610)
    184                 });
    185                 auto actual = xs.subscriptions();
    186                 REQUIRE(required == actual);
    187             }
    188         }
    189     }
    190 }
    191 
    192 SCENARIO("sequence_equal - first source emits less items than the second one", "[sequence_equal][operators]"){
    193     GIVEN("two sources"){
    194         auto sc = rxsc::make_test();
    195         auto w = sc.create_worker();
    196         const rxsc::test::messages<int> on;
    197         const rxsc::test::messages<bool> o_on;
    198 
    199         auto xs = sc.make_hot_observable({
    200             on.next(150, 1),
    201             on.next(210, 2),
    202             on.next(310, 3),
    203             on.next(410, 4),
    204             on.completed(610)
    205         });
    206 
    207         auto ys = sc.make_hot_observable({
    208             on.next(150, 1),
    209             on.next(220, 2),
    210             on.next(330, 3),
    211             on.next(440, 4),
    212             on.next(550, 5),
    213             on.completed(600)
    214         });
    215 
    216         WHEN("two observables are checked for equality"){
    217 
    218             auto res = w.start(
    219                 [xs, ys]() {
    220                     return xs
    221                             .sequence_equal(ys)
    222                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    223                 }
    224             );
    225 
    226             THEN("the output contains false"){
    227                 auto required = rxu::to_vector({
    228                     o_on.next(610, false),
    229                     o_on.completed(610)
    230                 });
    231                 auto actual = res.get_observer().messages();
    232                 REQUIRE(required == actual);
    233             }
    234 
    235             THEN("there was 1 subscription/unsubscription to the source"){
    236                 auto required = rxu::to_vector({
    237                     on.subscribe(200, 610)
    238                 });
    239                 auto actual = xs.subscriptions();
    240                 REQUIRE(required == actual);
    241             }
    242         }
    243     }
    244 }
    245 
    246 SCENARIO("sequence_equal - second source emits less items than the first one", "[sequence_equal][operators]"){
    247     GIVEN("two sources"){
    248         auto sc = rxsc::make_test();
    249         auto w = sc.create_worker();
    250         const rxsc::test::messages<int> on;
    251         const rxsc::test::messages<bool> o_on;
    252 
    253         auto xs = sc.make_hot_observable({
    254             on.next(150, 1),
    255             on.next(210, 2),
    256             on.next(310, 3),
    257             on.next(410, 4),
    258             on.next(510, 5),
    259             on.completed(610)
    260         });
    261 
    262         auto ys = sc.make_hot_observable({
    263             on.next(150, 1),
    264             on.next(220, 2),
    265             on.next(330, 3),
    266             on.next(440, 4),
    267             on.completed(600)
    268         });
    269 
    270         WHEN("two observables are checked for equality"){
    271 
    272             auto res = w.start(
    273                 [xs, ys]() {
    274                     return xs
    275                             .sequence_equal(ys)
    276                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    277                 }
    278             );
    279 
    280             THEN("the output contains false"){
    281                 auto required = rxu::to_vector({
    282                     o_on.next(610, false),
    283                     o_on.completed(610)
    284                 });
    285                 auto actual = res.get_observer().messages();
    286                 REQUIRE(required == actual);
    287             }
    288 
    289             THEN("there was 1 subscription/unsubscription to the source"){
    290                 auto required = rxu::to_vector({
    291                     on.subscribe(200, 610)
    292                 });
    293                 auto actual = xs.subscriptions();
    294                 REQUIRE(required == actual);
    295             }
    296         }
    297     }
    298 }
    299 
    300 SCENARIO("sequence_equal - sources emit different sequence of items", "[sequence_equal][operators]"){
    301     GIVEN("two sources"){
    302         auto sc = rxsc::make_test();
    303         auto w = sc.create_worker();
    304         const rxsc::test::messages<int> on;
    305         const rxsc::test::messages<bool> o_on;
    306 
    307         auto xs = sc.make_hot_observable({
    308             on.next(150, 1),
    309             on.next(210, 2),
    310             on.next(310, 9), //
    311             on.next(410, 4),
    312             on.next(510, 5),
    313             on.completed(610)
    314         });
    315 
    316         auto ys = sc.make_hot_observable({
    317             on.next(150, 1),
    318             on.next(220, 2),
    319             on.next(330, 3),
    320             on.next(440, 4),
    321             on.next(550, 5),
    322             on.completed(600)
    323         });
    324 
    325         WHEN("two observables are checked for equality"){
    326 
    327             auto res = w.start(
    328                 [xs, ys]() {
    329                     return xs
    330                             .sequence_equal(ys)
    331                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    332                 }
    333             );
    334 
    335             THEN("the output contains false"){
    336                 auto required = rxu::to_vector({
    337                     o_on.next(330, false),
    338                     o_on.completed(330)
    339                 });
    340                 auto actual = res.get_observer().messages();
    341                 REQUIRE(required == actual);
    342             }
    343 
    344             THEN("there was 1 subscription/unsubscription to the source"){
    345                 auto required = rxu::to_vector({
    346                     on.subscribe(200, 330)
    347                 });
    348                 auto actual = xs.subscriptions();
    349                 REQUIRE(required == actual);
    350             }
    351         }
    352     }
    353 }
    354 
    355 SCENARIO("sequence_equal - sources emit items in a different order", "[sequence_equal][operators]"){
    356     GIVEN("two sources"){
    357         auto sc = rxsc::make_test();
    358         auto w = sc.create_worker();
    359         const rxsc::test::messages<int> on;
    360         const rxsc::test::messages<bool> o_on;
    361 
    362         auto xs = sc.make_hot_observable({
    363             on.next(150, 1),
    364             on.next(210, 2),
    365             on.next(310, 3),
    366             on.next(410, 4),
    367             on.next(510, 5),
    368             on.completed(610)
    369         });
    370 
    371         auto ys = sc.make_hot_observable({
    372             on.next(150, 1),
    373             on.next(220, 2),
    374             on.next(330, 4),
    375             on.next(440, 3),
    376             on.next(550, 5),
    377             on.completed(600)
    378         });
    379 
    380         WHEN("two observables are checked for equality"){
    381 
    382             auto res = w.start(
    383                 [xs, ys]() {
    384                     return xs
    385                             .sequence_equal(ys)
    386                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    387                 }
    388             );
    389 
    390             THEN("the output contains false"){
    391                 auto required = rxu::to_vector({
    392                     o_on.next(330, false),
    393                     o_on.completed(330)
    394                 });
    395                 auto actual = res.get_observer().messages();
    396                 REQUIRE(required == actual);
    397             }
    398 
    399             THEN("there was 1 subscription/unsubscription to the source"){
    400                 auto required = rxu::to_vector({
    401                     on.subscribe(200, 330)
    402                 });
    403                 auto actual = xs.subscriptions();
    404                 REQUIRE(required == actual);
    405             }
    406         }
    407     }
    408 }
    409 
    410 SCENARIO("sequence_equal - source observable is empty", "[sequence_equal][operators]"){
    411     GIVEN("two sources"){
    412         auto sc = rxsc::make_test();
    413         auto w = sc.create_worker();
    414         const rxsc::test::messages<int> on;
    415         const rxsc::test::messages<bool> o_on;
    416 
    417         auto xs = sc.make_hot_observable({
    418             on.completed(250)
    419         });
    420 
    421         auto ys = sc.make_hot_observable({
    422             on.next(150, 1),
    423             on.next(220, 2),
    424             on.next(330, 3),
    425             on.completed(600)
    426         });
    427 
    428         WHEN("two observables are checked for equality"){
    429 
    430             auto res = w.start(
    431                 [xs, ys]() {
    432                     return xs
    433                             .sequence_equal(ys)
    434                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    435                 }
    436             );
    437 
    438             THEN("the output contains false"){
    439                 auto required = rxu::to_vector({
    440                     o_on.next(330, false),
    441                     o_on.completed(330)
    442                 });
    443                 auto actual = res.get_observer().messages();
    444                 REQUIRE(required == actual);
    445             }
    446 
    447             THEN("there was 1 subscription/unsubscription to the source"){
    448                 auto required = rxu::to_vector({
    449                     on.subscribe(200, 250)
    450                 });
    451                 auto actual = xs.subscriptions();
    452                 REQUIRE(required == actual);
    453             }
    454         }
    455     }
    456 }
    457 
    458 SCENARIO("sequence_equal - other observable is empty", "[sequence_equal][operators]"){
    459     GIVEN("two sources"){
    460         auto sc = rxsc::make_test();
    461         auto w = sc.create_worker();
    462         const rxsc::test::messages<int> on;
    463         const rxsc::test::messages<bool> o_on;
    464 
    465         auto xs = sc.make_hot_observable({
    466             on.next(150, 1),
    467             on.next(210, 2),
    468             on.next(310, 3),
    469             on.completed(400)
    470         });
    471 
    472         auto ys = sc.make_hot_observable({
    473             on.completed(250)
    474         });
    475 
    476         WHEN("two observables are checked for equality"){
    477 
    478             auto res = w.start(
    479                 [xs, ys]() {
    480                     return xs
    481                             .sequence_equal(ys)
    482                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    483                 }
    484             );
    485 
    486             THEN("the output contains false"){
    487                 auto required = rxu::to_vector({
    488                     o_on.next(310, false),
    489                     o_on.completed(310)
    490                 });
    491                 auto actual = res.get_observer().messages();
    492                 REQUIRE(required == actual);
    493             }
    494 
    495             THEN("there was 1 subscription/unsubscription to the source"){
    496                 auto required = rxu::to_vector({
    497                     on.subscribe(200, 310)
    498                 });
    499                 auto actual = xs.subscriptions();
    500                 REQUIRE(required == actual);
    501             }
    502         }
    503     }
    504 }
    505 
    506 SCENARIO("sequence_equal - both observables are empty", "[sequence_equal][operators]"){
    507     GIVEN("two sources"){
    508         auto sc = rxsc::make_test();
    509         auto w = sc.create_worker();
    510         const rxsc::test::messages<int> on;
    511         const rxsc::test::messages<bool> o_on;
    512 
    513         auto xs = sc.make_hot_observable({
    514             on.completed(400)
    515         });
    516 
    517         auto ys = sc.make_hot_observable({
    518             on.completed(250)
    519         });
    520 
    521         WHEN("two observables are checked for equality"){
    522 
    523             auto res = w.start(
    524                 [xs, ys]() {
    525                     return xs
    526                             .sequence_equal(ys)
    527                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    528                 }
    529             );
    530 
    531             THEN("the output contains false"){
    532                 auto required = rxu::to_vector({
    533                     o_on.next(400, true),
    534                     o_on.completed(400)
    535                 });
    536                 auto actual = res.get_observer().messages();
    537                 REQUIRE(required == actual);
    538             }
    539 
    540             THEN("there was 1 subscription/unsubscription to the source"){
    541                 auto required = rxu::to_vector({
    542                     on.subscribe(200, 400)
    543                 });
    544                 auto actual = xs.subscriptions();
    545                 REQUIRE(required == actual);
    546             }
    547         }
    548     }
    549 }
    550 
    551 SCENARIO("sequence_equal - source observable emits an error", "[sequence_equal][operators]"){
    552     GIVEN("two sources"){
    553         auto sc = rxsc::make_test();
    554         auto w = sc.create_worker();
    555         const rxsc::test::messages<int> on;
    556         const rxsc::test::messages<bool> o_on;
    557 
    558         std::runtime_error ex("sequence_equal error");
    559 
    560         auto xs = sc.make_hot_observable({
    561             on.next(150, 1),
    562             on.error(250, ex)
    563         });
    564 
    565         auto ys = sc.make_hot_observable({
    566             on.next(150, 1),
    567             on.next(220, 2),
    568             on.next(550, 5),
    569             on.completed(600)
    570         });
    571 
    572         WHEN("two observables are checked for equality"){
    573 
    574             auto res = w.start(
    575                 [xs, ys]() {
    576                     return xs
    577                             .sequence_equal(ys)
    578                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    579                 }
    580             );
    581 
    582             THEN("the output contains an error"){
    583                 auto required = rxu::to_vector({
    584                     o_on.error(250, ex)
    585                 });
    586                 auto actual = res.get_observer().messages();
    587                 REQUIRE(required == actual);
    588             }
    589 
    590             THEN("there was 1 subscription/unsubscription to the source"){
    591                 auto required = rxu::to_vector({
    592                     on.subscribe(200, 250)
    593                 });
    594                 auto actual = xs.subscriptions();
    595                 REQUIRE(required == actual);
    596             }
    597         }
    598     }
    599 }
    600 
    601 SCENARIO("sequence_equal - other observable emits an error", "[sequence_equal][operators]"){
    602     GIVEN("two sources"){
    603         auto sc = rxsc::make_test();
    604         auto w = sc.create_worker();
    605         const rxsc::test::messages<int> on;
    606         const rxsc::test::messages<bool> o_on;
    607 
    608         std::runtime_error ex("sequence_equal error");
    609 
    610         auto xs = sc.make_hot_observable({
    611             on.next(150, 1),
    612             on.next(210, 2),
    613             on.next(310, 3),
    614             on.completed(400)
    615         });
    616 
    617         auto ys = sc.make_hot_observable({
    618             on.next(150, 1),
    619             on.error(250, ex)
    620         });
    621 
    622         WHEN("two observables are checked for equality"){
    623 
    624             auto res = w.start(
    625                 [xs, ys]() {
    626                     return xs
    627                             .sequence_equal(ys)
    628                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    629                 }
    630             );
    631 
    632             THEN("the output contains an error"){
    633                 auto required = rxu::to_vector({
    634                     o_on.error(250, ex)
    635                 });
    636                 auto actual = res.get_observer().messages();
    637                 REQUIRE(required == actual);
    638             }
    639 
    640             THEN("there was 1 subscription/unsubscription to the source"){
    641                 auto required = rxu::to_vector({
    642                     on.subscribe(200, 250)
    643                 });
    644                 auto actual = xs.subscriptions();
    645                 REQUIRE(required == actual);
    646             }
    647         }
    648     }
    649 }
    650 
    651 SCENARIO("sequence_equal - both observables emit errors", "[sequence_equal][operators]"){
    652     GIVEN("two sources"){
    653         auto sc = rxsc::make_test();
    654         auto w = sc.create_worker();
    655         const rxsc::test::messages<int> on;
    656         const rxsc::test::messages<bool> o_on;
    657 
    658         std::runtime_error ex("sequence_equal error1");
    659 
    660         auto xs = sc.make_hot_observable({
    661             on.next(150, 1),
    662             on.next(210, 2),
    663             on.error(250, ex)
    664         });
    665 
    666         auto ys = sc.make_hot_observable({
    667             on.error(300, ex)
    668         });
    669 
    670         WHEN("two observables are checked for equality"){
    671 
    672             auto res = w.start(
    673                 [xs, ys]() {
    674                     return xs
    675                             .sequence_equal(ys)
    676                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    677                 }
    678             );
    679 
    680             THEN("the output contains an error"){
    681                 auto required = rxu::to_vector({
    682                     o_on.error(250, ex)
    683                 });
    684                 auto actual = res.get_observer().messages();
    685                 REQUIRE(required == actual);
    686             }
    687 
    688             THEN("there was 1 subscription/unsubscription to the source"){
    689                 auto required = rxu::to_vector({
    690                     on.subscribe(200, 250)
    691                 });
    692                 auto actual = xs.subscriptions();
    693                 REQUIRE(required == actual);
    694             }
    695         }
    696     }
    697 }
    698 
    699 SCENARIO("sequence_equal - both sources emit the same sequence of items, custom comparing function", "[sequence_equal][operators]"){
    700     GIVEN("two sources"){
    701         auto sc = rxsc::make_test();
    702         auto w = sc.create_worker();
    703         const rxsc::test::messages<int> on;
    704         const rxsc::test::messages<bool> o_on;
    705 
    706         auto xs = sc.make_hot_observable({
    707             on.next(150, 1),
    708             on.next(210, 2),
    709             on.next(310, 3),
    710             on.next(410, 4),
    711             on.next(510, 5),
    712             on.completed(610)
    713         });
    714 
    715         auto ys = sc.make_hot_observable({
    716             on.next(150, 1),
    717             on.next(220, 2),
    718             on.next(330, 3),
    719             on.next(440, 4),
    720             on.next(550, 5),
    721             on.completed(600)
    722         });
    723 
    724         WHEN("two observables are checked for equality"){
    725 
    726             auto res = w.start(
    727                 [xs, ys]() {
    728                     return xs
    729                             .sequence_equal(ys, [](int x, int y) { return x == y; })
    730                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    731                 }
    732             );
    733 
    734             THEN("the output contains true"){
    735                 auto required = rxu::to_vector({
    736                     o_on.next(610, true),
    737                     o_on.completed(610)
    738                 });
    739                 auto actual = res.get_observer().messages();
    740                 REQUIRE(required == actual);
    741             }
    742 
    743             THEN("there was 1 subscription/unsubscription to the source"){
    744                 auto required = rxu::to_vector({
    745                     on.subscribe(200, 610)
    746                 });
    747                 auto actual = xs.subscriptions();
    748                 REQUIRE(required == actual);
    749             }
    750         }
    751     }
    752 }
    753 
    754 SCENARIO("sequence_equal - both sources emit the same sequence of items, custom coordinator", "[sequence_equal][operators]"){
    755     GIVEN("two sources"){
    756         auto sc = rxsc::make_test();
    757         auto w = sc.create_worker();
    758         const rxsc::test::messages<int> on;
    759         const rxsc::test::messages<bool> o_on;
    760 
    761         auto xs = sc.make_hot_observable({
    762             on.next(150, 1),
    763             on.next(210, 2),
    764             on.next(310, 3),
    765             on.next(410, 4),
    766             on.next(510, 5),
    767             on.completed(610)
    768         });
    769 
    770         auto ys = sc.make_hot_observable({
    771             on.next(150, 1),
    772             on.next(220, 2),
    773             on.next(330, 3),
    774             on.next(440, 4),
    775             on.next(550, 5),
    776             on.completed(600)
    777         });
    778 
    779         WHEN("two observables are checked for equality"){
    780 
    781             auto res = w.start(
    782                 [xs, ys]() {
    783                     return xs
    784                             .sequence_equal(ys, rxcpp::identity_one_worker(rxsc::make_current_thread()))
    785                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    786                 }
    787             );
    788 
    789             THEN("the output contains true"){
    790                 auto required = rxu::to_vector({
    791                     o_on.next(610, true),
    792                     o_on.completed(610)
    793                 });
    794                 auto actual = res.get_observer().messages();
    795                 REQUIRE(required == actual);
    796             }
    797 
    798             THEN("there was 1 subscription/unsubscription to the source"){
    799                 auto required = rxu::to_vector({
    800                     on.subscribe(200, 610)
    801                 });
    802                 auto actual = xs.subscriptions();
    803                 REQUIRE(required == actual);
    804             }
    805         }
    806     }
    807 }
    808 
    809 SCENARIO("sequence_equal - both sources emit the same sequence of items, custom comparing function and coordinator", "[sequence_equal][operators]"){
    810     GIVEN("two sources"){
    811         auto sc = rxsc::make_test();
    812         auto w = sc.create_worker();
    813         const rxsc::test::messages<int> on;
    814         const rxsc::test::messages<bool> o_on;
    815 
    816         auto xs = sc.make_hot_observable({
    817             on.next(150, 1),
    818             on.next(210, 2),
    819             on.next(310, 3),
    820             on.next(410, 4),
    821             on.next(510, 5),
    822             on.completed(610)
    823         });
    824 
    825         auto ys = sc.make_hot_observable({
    826             on.next(150, 1),
    827             on.next(220, 2),
    828             on.next(330, 3),
    829             on.next(440, 4),
    830             on.next(550, 5),
    831             on.completed(600)
    832         });
    833 
    834         WHEN("two observables are checked for equality"){
    835 
    836             auto res = w.start(
    837                 [xs, ys]() {
    838                     return xs
    839                             .sequence_equal(ys, [](int x, int y) { return x == y; }, rxcpp::identity_one_worker(rxsc::make_current_thread()))
    840                             .as_dynamic(); // forget type to workaround lambda deduction bug on msvc 2013
    841                 }
    842             );
    843 
    844             THEN("the output contains true"){
    845                 auto required = rxu::to_vector({
    846                     o_on.next(610, true),
    847                     o_on.completed(610)
    848                 });
    849                 auto actual = res.get_observer().messages();
    850                 REQUIRE(required == actual);
    851             }
    852 
    853             THEN("there was 1 subscription/unsubscription to the source"){
    854                 auto required = rxu::to_vector({
    855                     on.subscribe(200, 610)
    856                 });
    857                 auto actual = xs.subscriptions();
    858                 REQUIRE(required == actual);
    859             }
    860         }
    861     }
    862 }
    863