Skip to content

Commit 315effe

Browse files
authored
Port FSTQueryListener to C++ (#2618)
1 parent ce07f8d commit 315effe

20 files changed

+553
-452
lines changed

Firestore/Example/Tests/Core/FSTEventManagerTests.mm

Lines changed: 46 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
#import <OCMock/OCMock.h>
2020
#import <XCTest/XCTest.h>
2121

22+
#include <memory>
2223
#include <utility>
24+
#include <vector>
2325

2426
#import "Firestore/Source/Core/FSTQuery.h"
2527
#import "Firestore/Source/Core/FSTSyncEngine.h"
@@ -31,26 +33,31 @@
3133
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
3234
#include "Firestore/core/src/firebase/firestore/model/types.h"
3335
#include "Firestore/core/src/firebase/firestore/util/statusor.h"
36+
#include "Firestore/core/test/firebase/firestore/testutil/xcgmock.h"
3437

38+
using firebase::firestore::core::ListenOptions;
3539
using firebase::firestore::core::ViewSnapshot;
3640
using firebase::firestore::core::ViewSnapshotHandler;
3741
using firebase::firestore::model::DocumentKeySet;
3842
using firebase::firestore::model::DocumentSet;
3943
using firebase::firestore::model::OnlineState;
4044
using firebase::firestore::util::StatusOr;
45+
using testing::ElementsAre;
4146

4247
NS_ASSUME_NONNULL_BEGIN
4348

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());
5257
}
5358

59+
} // namespace
60+
5461
// FSTEventManager implements this delegate privately
5562
@interface FSTEventManager () <FSTSyncEngineDelegate>
5663
@end
@@ -60,16 +67,10 @@ @interface FSTEventManagerTests : XCTestCase
6067

6168
@implementation FSTEventManagerTests
6269

63-
- (FSTQueryListener *)noopListenerForQuery:(FSTQuery *)query {
64-
return [[FSTQueryListener alloc] initWithQuery:query
65-
options:ListenOptions::DefaultOptions()
66-
viewSnapshotHandler:[](const StatusOr<ViewSnapshot> &) {}];
67-
}
68-
6970
- (void)testHandlesManyListenersPerQuery {
7071
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);
7374

7475
FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
7576
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
@@ -89,7 +90,7 @@ - (void)testHandlesManyListenersPerQuery {
8990

9091
- (void)testHandlesUnlistenOnUnknownListenerGracefully {
9192
FSTQuery *query = FSTTestQuery("foo/bar");
92-
FSTQueryListener *listener = [self noopListenerForQuery:query];
93+
auto listener = NoopQueryListener(query);
9394

9495
FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
9596
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
@@ -99,13 +100,6 @@ - (void)testHandlesUnlistenOnUnknownListenerGracefully {
99100
OCMVerifyAll((id)syncEngineMock);
100101
}
101102

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-
109103
- (ViewSnapshot)makeEmptyViewSnapshotWithQuery:(FSTQuery *)query {
110104
DocumentSet emptyDocs{query.comparator};
111105
// sync_state_changed has to be `true` to prevent an assertion about a meaningless view snapshot.
@@ -118,23 +112,17 @@ - (void)testNotifiesListenersInTheRightOrder {
118112
FSTQuery *query2 = FSTTestQuery("bar/baz");
119113
NSMutableArray *eventOrder = [NSMutableArray array];
120114

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+
});
126118

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+
});
132122

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+
});
138126

139127
FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
140128
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
@@ -155,27 +143,31 @@ - (void)testNotifiesListenersInTheRightOrder {
155143

156144
- (void)testWillForwardOnlineStateChanges {
157145
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);
169161

170162
FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
171163
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
172164
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
173165

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+
176169
[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));
179171
}
180172

181173
@end

0 commit comments

Comments
 (0)