19
19
#import < OCMock/OCMock.h>
20
20
#import < XCTest/XCTest.h>
21
21
22
+ #include < memory>
22
23
#include < utility>
24
+ #include < vector>
23
25
24
26
#import " Firestore/Source/Core/FSTQuery.h"
25
27
#import " Firestore/Source/Core/FSTSyncEngine.h"
31
33
#include " Firestore/core/src/firebase/firestore/model/document_set.h"
32
34
#include " Firestore/core/src/firebase/firestore/model/types.h"
33
35
#include " Firestore/core/src/firebase/firestore/util/statusor.h"
36
+ #include " Firestore/core/test/firebase/firestore/testutil/xcgmock.h"
34
37
38
+ using firebase::firestore::core::ListenOptions;
35
39
using firebase::firestore::core::ViewSnapshot;
36
40
using firebase::firestore::core::ViewSnapshotHandler;
37
41
using firebase::firestore::model::DocumentKeySet;
38
42
using firebase::firestore::model::DocumentSet;
39
43
using firebase::firestore::model::OnlineState;
40
44
using firebase::firestore::util::StatusOr;
45
+ using testing::ElementsAre;
41
46
42
47
NS_ASSUME_NONNULL_BEGIN
43
48
44
- /* *
45
- * Converts an OnlineState to an NSNumber, usually for the purpose of adding
46
- * it to an NSArray or similar container. There's no direct conversion from a
47
- * strongly-typed enum to an integral type that could be passed to an NSNumber
48
- * initializer.
49
- */
50
- static NSNumber * ToNSNumber (OnlineState state ) {
51
- return @( static_cast <std::underlying_type<OnlineState>::type>(state ));
49
+ namespace {
50
+
51
+ ViewSnapshotHandler NoopViewSnapshotHandler () {
52
+ return []( const StatusOr<ViewSnapshot> &) {};
53
+ }
54
+
55
+ std::shared_ptr<QueryListener> NoopQueryListener (FSTQuery *query ) {
56
+ return QueryListener::Create (query, NoopViewSnapshotHandler ( ));
52
57
}
53
58
59
+ } // namespace
60
+
54
61
// FSTEventManager implements this delegate privately
55
62
@interface FSTEventManager () <FSTSyncEngineDelegate>
56
63
@end
@@ -60,16 +67,10 @@ @interface FSTEventManagerTests : XCTestCase
60
67
61
68
@implementation FSTEventManagerTests
62
69
63
- - (FSTQueryListener *)noopListenerForQuery : (FSTQuery *)query {
64
- return [[FSTQueryListener alloc ] initWithQuery: query
65
- options:ListenOptions: :DefaultOptions ()
66
- viewSnapshotHandler: [](const StatusOr<ViewSnapshot> &) {}];
67
- }
68
-
69
70
- (void )testHandlesManyListenersPerQuery {
70
71
FSTQuery *query = FSTTestQuery (" foo/bar" );
71
- FSTQueryListener * listener1 = [ self noopListenerForQuery: query] ;
72
- FSTQueryListener * listener2 = [ self noopListenerForQuery: query] ;
72
+ auto listener1 = NoopQueryListener ( query) ;
73
+ auto listener2 = NoopQueryListener ( query) ;
73
74
74
75
FSTSyncEngine *syncEngineMock = OCMStrictClassMock ([FSTSyncEngine class ]);
75
76
OCMExpect ([syncEngineMock setSyncEngineDelegate: [OCMArg any ]]);
@@ -89,7 +90,7 @@ - (void)testHandlesManyListenersPerQuery {
89
90
90
91
- (void )testHandlesUnlistenOnUnknownListenerGracefully {
91
92
FSTQuery *query = FSTTestQuery (" foo/bar" );
92
- FSTQueryListener * listener = [ self noopListenerForQuery: query] ;
93
+ auto listener = NoopQueryListener ( query) ;
93
94
94
95
FSTSyncEngine *syncEngineMock = OCMStrictClassMock ([FSTSyncEngine class ]);
95
96
OCMExpect ([syncEngineMock setSyncEngineDelegate: [OCMArg any ]]);
@@ -99,13 +100,6 @@ - (void)testHandlesUnlistenOnUnknownListenerGracefully {
99
100
OCMVerifyAll ((id )syncEngineMock);
100
101
}
101
102
102
- - (FSTQueryListener *)queryListenerForQuery : (FSTQuery *)query
103
- withHandler : (ViewSnapshotHandler &&)handler {
104
- return [[FSTQueryListener alloc ] initWithQuery: query
105
- options:ListenOptions: :DefaultOptions ()
106
- viewSnapshotHandler:std: :move (handler)];
107
- }
108
-
109
103
- (ViewSnapshot)makeEmptyViewSnapshotWithQuery : (FSTQuery *)query {
110
104
DocumentSet emptyDocs{query.comparator };
111
105
// sync_state_changed has to be `true` to prevent an assertion about a meaningless view snapshot.
@@ -118,23 +112,17 @@ - (void)testNotifiesListenersInTheRightOrder {
118
112
FSTQuery *query2 = FSTTestQuery (" bar/baz" );
119
113
NSMutableArray *eventOrder = [NSMutableArray array ];
120
114
121
- FSTQueryListener *listener1 =
122
- [self queryListenerForQuery: query1
123
- withHandler: [eventOrder](const StatusOr<ViewSnapshot> &) {
124
- [eventOrder addObject: @" listener1" ];
125
- }];
115
+ auto listener1 = QueryListener::Create (query1, [eventOrder](const StatusOr<ViewSnapshot> &) {
116
+ [eventOrder addObject: @" listener1" ];
117
+ });
126
118
127
- FSTQueryListener *listener2 =
128
- [self queryListenerForQuery: query2
129
- withHandler: [eventOrder](const StatusOr<ViewSnapshot> &) {
130
- [eventOrder addObject: @" listener2" ];
131
- }];
119
+ auto listener2 = QueryListener::Create (query2, [eventOrder](const StatusOr<ViewSnapshot> &) {
120
+ [eventOrder addObject: @" listener2" ];
121
+ });
132
122
133
- FSTQueryListener *listener3 =
134
- [self queryListenerForQuery: query1
135
- withHandler: [eventOrder](const StatusOr<ViewSnapshot> &) {
136
- [eventOrder addObject: @" listener3" ];
137
- }];
123
+ auto listener3 = QueryListener::Create (query1, [eventOrder](const StatusOr<ViewSnapshot> &) {
124
+ [eventOrder addObject: @" listener3" ];
125
+ });
138
126
139
127
FSTSyncEngine *syncEngineMock = OCMClassMock ([FSTSyncEngine class ]);
140
128
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine: syncEngineMock];
@@ -155,27 +143,31 @@ - (void)testNotifiesListenersInTheRightOrder {
155
143
156
144
- (void )testWillForwardOnlineStateChanges {
157
145
FSTQuery *query = FSTTestQuery (" foo/bar" );
158
- FSTQueryListener *fakeListener = OCMClassMock ([FSTQueryListener class ]);
159
- NSMutableArray *events = [NSMutableArray array ];
160
- OCMStub ([fakeListener query ]).andReturn (query);
161
- OCMStub ([fakeListener applyChangedOnlineState: OnlineState: :Unknown])
162
- .andDo (^(NSInvocation *invocation) {
163
- [events addObject: ToNSNumber (OnlineState: :Unknown)];
164
- });
165
- OCMStub ([fakeListener applyChangedOnlineState: OnlineState: :Online])
166
- .andDo (^(NSInvocation *invocation) {
167
- [events addObject: ToNSNumber (OnlineState: :Online)];
168
- });
146
+
147
+ class FakeQueryListener : public QueryListener {
148
+ public:
149
+ explicit FakeQueryListener (FSTQuery *query)
150
+ : QueryListener(query, ListenOptions::DefaultOptions(), NoopViewSnapshotHandler()) {
151
+ }
152
+
153
+ void OnOnlineStateChanged (OnlineState online_state) override {
154
+ events.push_back (online_state);
155
+ }
156
+
157
+ std::vector<OnlineState> events;
158
+ };
159
+
160
+ auto fake_listener = std::make_shared<FakeQueryListener>(query);
169
161
170
162
FSTSyncEngine *syncEngineMock = OCMClassMock ([FSTSyncEngine class ]);
171
163
OCMExpect ([syncEngineMock setSyncEngineDelegate: [OCMArg any ]]);
172
164
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine: syncEngineMock];
173
165
174
- [eventManager addListener: fakeListener];
175
- XCTAssertEqualObjects (events, @[ ToNSNumber (OnlineState::Unknown) ]);
166
+ [eventManager addListener: fake_listener];
167
+ XC_ASSERT_THAT (fake_listener->events , ElementsAre (OnlineState::Unknown));
168
+
176
169
[eventManager applyChangedOnlineState: OnlineState: :Online];
177
- XCTAssertEqualObjects (events,
178
- (@[ ToNSNumber (OnlineState::Unknown), ToNSNumber (OnlineState::Online) ]));
170
+ XC_ASSERT_THAT (fake_listener->events , ElementsAre (OnlineState::Unknown, OnlineState::Online));
179
171
}
180
172
181
173
@end
0 commit comments