1+ #pragma once
2+
3+ #include < queue>
4+ #include < string>
5+
6+ #include " gtest/gtest.h"
7+
8+ #include " react/Conversion.h"
9+
10+ // //////////////////////////////////////////////////////////////////////////////////////
11+ namespace {
12+
13+ using namespace react ;
14+ using namespace std ;
15+
16+ // //////////////////////////////////////////////////////////////////////////////////////
17+ // / EventStreamTest fixture
18+ // //////////////////////////////////////////////////////////////////////////////////////
19+ template <typename TEngine>
20+ class ConversionTest : public testing ::Test
21+ {
22+ public:
23+ REACTIVE_DOMAIN (MyDomain, TEngine);
24+ };
25+
26+ TYPED_TEST_CASE_P (ConversionTest);
27+
28+ // //////////////////////////////////////////////////////////////////////////////////////
29+ // / Fold1 test
30+ // //////////////////////////////////////////////////////////////////////////////////////
31+ TYPED_TEST_P (ConversionTest, Fold1)
32+ {
33+ auto numSrc = MyDomain::MakeEventSource<int >();
34+ auto numFold = Fold (0 , numSrc, [] (int v, int d) {
35+ return v + d;
36+ });
37+
38+ for (auto i=1 ; i<=100 ; i++)
39+ numSrc << i;
40+
41+ ASSERT_EQ (numFold (), 5050 );
42+
43+ auto charSrc = MyDomain::MakeEventSource<char >();
44+ auto strFold = Fold (string (" " ), charSrc, [] (string s, char c) {
45+ return s + c;
46+ });
47+
48+ charSrc << ' T' << ' e' << ' s' << ' t' ;
49+
50+ ASSERT_EQ (strFold (), " Test" );
51+ }
52+
53+ // //////////////////////////////////////////////////////////////////////////////////////
54+ // / Fold2 test
55+ // //////////////////////////////////////////////////////////////////////////////////////
56+ TYPED_TEST_P (ConversionTest, Fold2)
57+ {
58+ auto src = MyDomain::MakeEventSource<int >();
59+ auto f = Fold (0 , src, [] (int v, int d) {
60+ return v + d;
61+ });
62+
63+ int c = 0 ;
64+
65+ Observe (f, [&] (int v) {
66+ c++;
67+ ASSERT_EQ (v, 5050 );
68+ });
69+
70+ {
71+ MyDomain::ScopedTransaction _;
72+
73+ for (auto i=1 ; i<=100 ; i++)
74+ src << i;
75+ }
76+
77+ ASSERT_EQ (f (), 5050 );
78+ ASSERT_EQ (c, 1 );
79+ }
80+
81+ // //////////////////////////////////////////////////////////////////////////////////////
82+ // / Iterate1 test
83+ // //////////////////////////////////////////////////////////////////////////////////////
84+ TYPED_TEST_P (ConversionTest, Iterate1)
85+ {
86+ auto trigger = MyDomain::MakeEventSource ();
87+
88+ {
89+ auto inc = Iterate (0 , trigger, Incrementer<int >{});
90+ for (auto i=1 ; i<=100 ; i++)
91+ trigger.Emit ();
92+
93+ ASSERT_EQ (inc (), 100 );
94+ }
95+
96+ {
97+ auto dec = Iterate (100 , trigger, Decrementer<int >{});
98+ for (auto i=1 ; i<=100 ; i++)
99+ trigger.Emit ();
100+
101+ ASSERT_EQ (dec (), 0 );
102+ }
103+ }
104+
105+ // //////////////////////////////////////////////////////////////////////////////////////
106+ // / Monitor1
107+ // //////////////////////////////////////////////////////////////////////////////////////
108+ TYPED_TEST_P (ConversionTest, Monitor1)
109+ {
110+ auto target = MyDomain::MakeSignal ();
111+
112+ {
113+ auto inc = Iterate (0 , trigger, Incrementer<int >{});
114+ for (auto i=1 ; i<=100 ; i++)
115+ trigger.Emit ();
116+
117+ ASSERT_EQ (inc (), 100 );
118+ }
119+
120+ {
121+ auto dec = Iterate (100 , trigger, Decrementer<int >{});
122+ for (auto i=1 ; i<=100 ; i++)
123+ trigger.Emit ();
124+
125+ ASSERT_EQ (dec (), 0 );
126+ }
127+ }
128+
129+ // //////////////////////////////////////////////////////////////////////////////////////
130+ REGISTER_TYPED_TEST_CASE_P
131+ (
132+ ConversionTest,
133+ Fold1,
134+ Fold2,
135+ Iterate1
136+ );
137+
138+ } // ~namespace
0 commit comments