Skip to content

Commit 10752cd

Browse files
authored
Finish migration of FSTFieldValue to C++ FieldValue (#3178)
* Split transform_operations * Revert "Make ServerTimestamp use FSTFieldValue for previous value" * Finish FieldValue migration * Delete FSTFieldValue
1 parent 227f856 commit 10752cd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1171
-2228
lines changed

Firestore/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
# limitations under the License.
1414

1515
add_subdirectory(Example/Benchmarks)
16-
add_subdirectory(Source)
17-
add_subdirectory(third_party/Immutable)
1816

1917
add_subdirectory(Protos)
2018
add_subdirectory(core)

Firestore/Example/Firestore.xcodeproj/project.pbxproj

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,6 @@
267267
5492E0BA2021555100B64F25 /* FSTDocumentSetTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */; };
268268
5492E0BD2021555100B64F25 /* FSTDocumentTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B62021555100B64F25 /* FSTDocumentTests.mm */; };
269269
5492E0BE2021555100B64F25 /* FSTMutationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B72021555100B64F25 /* FSTMutationTests.mm */; };
270-
5492E0BF2021555100B64F25 /* FSTFieldValueTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B82021555100B64F25 /* FSTFieldValueTests.mm */; };
271270
5492E0C72021557E00B64F25 /* FSTSerializerBetaTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0C12021557E00B64F25 /* FSTSerializerBetaTests.mm */; };
272271
5492E0C92021557E00B64F25 /* FSTRemoteEventTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0C32021557E00B64F25 /* FSTRemoteEventTests.mm */; };
273272
5493A424225F9990006DE7BA /* status_apple_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5493A423225F9990006DE7BA /* status_apple_test.mm */; };
@@ -572,7 +571,6 @@
572571
C8D3CE2343E53223E6487F2C /* Pods_Firestore_Example_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5918805E993304321A05E82B /* Pods_Firestore_Example_iOS.framework */; };
573572
C9F96C511F45851D38EC449C /* status.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = 618BBE9920B89AAC00B5BCE7 /* status.pb.cc */; };
574573
CA18CEF2585A6BC4974DB56D /* FSTQueryTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E061202154B900B64F25 /* FSTQueryTests.mm */; };
575-
CA69FC4DF0C906183CF5DCE9 /* FSTFieldValueTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B82021555100B64F25 /* FSTFieldValueTests.mm */; };
576574
CA989C0E6020C372A62B7062 /* testutil.cc in Sources */ = {isa = PBXBuildFile; fileRef = 54A0352820A3B3BD003E0143 /* testutil.cc */; };
577575
CD0AA9E5D83C00CAAE7C2F67 /* FIRTimestampTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B65D34A7203C99090076A5E1 /* FIRTimestampTest.m */; };
578576
CD78EEAA1CD36BE691CA3427 /* hashing_test_apple.mm in Sources */ = {isa = PBXBuildFile; fileRef = B69CF3F02227386500B281C8 /* hashing_test_apple.mm */; };
@@ -645,7 +643,6 @@
645643
ED420D8F49DA5C41EEF93913 /* FIRSnapshotMetadataTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E04D202154AA00B64F25 /* FIRSnapshotMetadataTests.mm */; };
646644
ED4E2AC80CAF2A8FDDAC3DEE /* field_mask_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 549CCA5320A36E1F00BCEB75 /* field_mask_test.cc */; };
647645
EF3518F84255BAF3EBD317F6 /* exponential_backoff_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B6D1B68420E2AB1A00B35856 /* exponential_backoff_test.cc */; };
648-
F007A46BE03A01C077EFCBD8 /* FSTFieldValueTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B82021555100B64F25 /* FSTFieldValueTests.mm */; };
649646
F1661B1C5F3E30535FB65046 /* FSTArraySortedDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DE2EF07E1F3D0B6E003D0CDC /* FSTArraySortedDictionaryTests.m */; };
650647
F19B749671F2552E964422F7 /* FIRListenerRegistrationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E06B202154D500B64F25 /* FIRListenerRegistrationTests.mm */; };
651648
F3261CBFC169DB375A0D9492 /* FSTMockDatastore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E02D20213FFC00B64F25 /* FSTMockDatastore.mm */; };
@@ -867,7 +864,6 @@
867864
5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentSetTests.mm; sourceTree = "<group>"; };
868865
5492E0B62021555100B64F25 /* FSTDocumentTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentTests.mm; sourceTree = "<group>"; };
869866
5492E0B72021555100B64F25 /* FSTMutationTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTMutationTests.mm; sourceTree = "<group>"; };
870-
5492E0B82021555100B64F25 /* FSTFieldValueTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTFieldValueTests.mm; sourceTree = "<group>"; };
871867
5492E0C12021557E00B64F25 /* FSTSerializerBetaTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTSerializerBetaTests.mm; sourceTree = "<group>"; };
872868
5492E0C32021557E00B64F25 /* FSTRemoteEventTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTRemoteEventTests.mm; sourceTree = "<group>"; };
873869
5493A423225F9990006DE7BA /* status_apple_test.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = status_apple_test.mm; sourceTree = "<group>"; };
@@ -1801,7 +1797,6 @@
18011797
5492E0B22021555000B64F25 /* FSTDocumentKeyTests.mm */,
18021798
5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */,
18031799
5492E0B62021555100B64F25 /* FSTDocumentTests.mm */,
1804-
5492E0B82021555100B64F25 /* FSTFieldValueTests.mm */,
18051800
5492E0B72021555100B64F25 /* FSTMutationTests.mm */,
18061801
54A0352320A3AEC3003E0143 /* field_transform_test.mm */,
18071802
54A0352220A3AEC3003E0143 /* transform_operations_test.mm */,
@@ -3011,7 +3006,6 @@
30113006
E980E1DCF759D5EF9F6B98F2 /* FSTDocumentTests.mm in Sources */,
30123007
F4F00BF4E87D7F0F0F8831DB /* FSTEventAccumulator.mm in Sources */,
30133008
21F821BF241244BA7BF070D9 /* FSTEventManagerTests.mm in Sources */,
3014-
F007A46BE03A01C077EFCBD8 /* FSTFieldValueTests.mm in Sources */,
30153009
0A6FBE65A7FE048BAD562A15 /* FSTGoogleTestTests.mm in Sources */,
30163010
939C898FE9D129F6A2EA259C /* FSTHelpers.mm in Sources */,
30173011
6672B445E006A7708B8531ED /* FSTImmutableSortedDictionary+Testing.m in Sources */,
@@ -3188,7 +3182,6 @@
31883182
4E679B9AA80202184D459569 /* FSTDocumentTests.mm in Sources */,
31893183
73E42D984FB36173A2BDA57C /* FSTEventAccumulator.mm in Sources */,
31903184
3E0C71810093ADFBAD9B453F /* FSTEventManagerTests.mm in Sources */,
3191-
CA69FC4DF0C906183CF5DCE9 /* FSTFieldValueTests.mm in Sources */,
31923185
E375FBA0632EFB4D14C4E5A9 /* FSTGoogleTestTests.mm in Sources */,
31933186
F72DF72447EA7AB9D100816A /* FSTHelpers.mm in Sources */,
31943187
8A0749707105A077728119C2 /* FSTImmutableSortedDictionary+Testing.m in Sources */,
@@ -3442,7 +3435,6 @@
34423435
5492E0BD2021555100B64F25 /* FSTDocumentTests.mm in Sources */,
34433436
5492E03E2021401F00B64F25 /* FSTEventAccumulator.mm in Sources */,
34443437
5492E067202154B900B64F25 /* FSTEventManagerTests.mm in Sources */,
3445-
5492E0BF2021555100B64F25 /* FSTFieldValueTests.mm in Sources */,
34463438
54764FAF1FAA21B90085E60A /* FSTGoogleTestTests.mm in Sources */,
34473439
5492E03F2021401F00B64F25 /* FSTHelpers.mm in Sources */,
34483440
DE2EF0861F3D0B6E003D0CDC /* FSTImmutableSortedDictionary+Testing.m in Sources */,

Firestore/Example/Tests/API/FSTUserDataConverterTests.mm

Lines changed: 92 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -21,62 +21,67 @@
2121
#import <XCTest/XCTest.h>
2222

2323
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
24+
#import "Firestore/Source/API/converters.h"
2425

2526
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
2627
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
28+
#include "Firestore/core/src/firebase/firestore/nanopb/nanopb_util.h"
29+
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
2730

2831
namespace util = firebase::firestore::util;
32+
using firebase::firestore::api::MakeGeoPoint;
33+
using firebase::firestore::api::MakeTimestamp;
2934
using firebase::firestore::model::DatabaseId;
3035
using firebase::firestore::model::FieldValue;
36+
using firebase::firestore::model::ObjectValue;
37+
using firebase::firestore::nanopb::MakeNSData;
38+
using firebase::firestore::testutil::Field;
39+
using firebase::firestore::testutil::WrapObject;
3140

3241
@interface FSTUserDataConverterTests : XCTestCase
3342
@end
3443

3544
@implementation FSTUserDataConverterTests
3645

3746
- (void)testConvertsIntegers {
38-
NSArray *values = @[
47+
NSArray<NSNumber *> *values = @[
3948
@(INT_MIN), @(-1), @0, @1, @2, @(UCHAR_MAX), @(INT_MAX), // Standard integers
4049
@(LONG_MIN), @(LONG_MAX), @(LLONG_MIN), @(LLONG_MAX) // Larger values
4150
];
42-
for (id value in values) {
43-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
44-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
45-
XCTAssertEqualObjects([wrapped value], @([value longLongValue]));
46-
XCTAssertEqual(wrapped.type, FieldValue::Type::Integer);
51+
for (NSNumber *value in values) {
52+
FieldValue wrapped = FSTTestFieldValue(value);
53+
XCTAssertEqual(wrapped.type(), FieldValue::Type::Integer);
54+
XCTAssertEqual(wrapped.integer_value(), [value longLongValue]);
4755
}
4856
}
4957

5058
- (void)testConvertsDoubles {
5159
// Note that 0x1.0p-1074 is a hex floating point literal representing the minimum subnormal
5260
// number: <https://en.wikipedia.org/wiki/Denormal_number>.
53-
NSArray *values = @[
61+
NSArray<NSNumber *> *values = @[
5462
@(-INFINITY), @(-DBL_MAX), @(LLONG_MIN * -1.0), @(-1.1), @(-0x1.0p-1074), @(-0.0), @(0.0),
5563
@(0x1.0p-1074), @(DBL_MIN), @(1.1), @(LLONG_MAX * 1.0), @(DBL_MAX), @(INFINITY)
5664
];
57-
for (id value in values) {
58-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
59-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
60-
XCTAssertEqualObjects([wrapped value], value);
61-
XCTAssertEqual(wrapped.type, FieldValue::Type::Double);
65+
for (NSNumber *value in values) {
66+
FieldValue wrapped = FSTTestFieldValue(value);
67+
XCTAssertEqual(wrapped.type(), FieldValue::Type::Double);
68+
XCTAssertEqual(wrapped.double_value(), [value doubleValue]);
6269
}
6370
}
6471

6572
- (void)testConvertsNilAndNSNull {
66-
FSTFieldValue *nullValue = FieldValue::Null().Wrap();
67-
XCTAssertEqualObjects(FSTTestFieldValue(nil), nullValue);
68-
XCTAssertEqualObjects(FSTTestFieldValue([NSNull null]), nullValue);
69-
XCTAssertEqualObjects([nullValue value], [NSNull null]);
70-
XCTAssertEqual(nullValue.type, FieldValue::Type::Null);
73+
FieldValue nullValue = FieldValue::Null();
74+
XCTAssertEqual(nullValue.type(), FieldValue::Type::Null);
75+
XCTAssertEqual(FSTTestFieldValue(nil), nullValue);
76+
XCTAssertEqual(FSTTestFieldValue([NSNull null]), nullValue);
7177
}
7278

7379
- (void)testConvertsBooleans {
74-
NSArray *values = @[ @YES, @NO ];
75-
for (id value in values) {
76-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
77-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
78-
XCTAssertEqualObjects([wrapped value], value);
79-
XCTAssertEqual(wrapped.type, FieldValue::Type::Boolean);
80+
NSArray<NSNumber *> *values = @[ @YES, @NO ];
81+
for (NSNumber *value in values) {
82+
FieldValue wrapped = FSTTestFieldValue(value);
83+
XCTAssertEqual(wrapped.type(), FieldValue::Type::Boolean);
84+
XCTAssertEqual(wrapped.boolean_value(), [value boolValue]);
8085
}
8186
}
8287

@@ -86,8 +91,8 @@ - (void)testConvertsUnsignedCharToInteger {
8691
// with signed chars but on arm64 these end up being stored as signed shorts. This forces us to
8792
// choose, and it's more useful to support shorts as Integers than it is to treat unsigned char as
8893
// Boolean.
89-
FSTFieldValue *wrapped = FSTTestFieldValue([NSNumber numberWithUnsignedChar:1]);
90-
XCTAssertEqualObjects(wrapped, FieldValue::FromInteger(1).Wrap());
94+
FieldValue wrapped = FSTTestFieldValue([NSNumber numberWithUnsignedChar:1]);
95+
XCTAssertEqual(wrapped, FieldValue::FromInteger(1));
9196
}
9297

9398
union DoubleBits {
@@ -96,115 +101,112 @@ - (void)testConvertsUnsignedCharToInteger {
96101
};
97102

98103
- (void)testConvertsStrings {
99-
NSArray *values = @[ @"", @"abc" ];
104+
NSArray<NSString *> *values = @[ @"", @"abc" ];
100105
for (id value in values) {
101-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
102-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
103-
XCTAssertEqualObjects([wrapped value], value);
104-
XCTAssertEqual(wrapped.type, FieldValue::Type::String);
106+
FieldValue wrapped = FSTTestFieldValue(value);
107+
XCTAssertEqual(wrapped.type(), FieldValue::Type::String);
108+
XCTAssertEqual(wrapped.string_value(), util::MakeString(value));
105109
}
106110
}
107111

108112
- (void)testConvertsDates {
109-
NSArray *values = @[ FSTTestDate(1900, 12, 1, 1, 20, 30), FSTTestDate(2017, 4, 24, 13, 20, 30) ];
110-
for (id value in values) {
111-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
112-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
113-
XCTAssertEqualObjects([[wrapped value] class], [FIRTimestamp class]);
114-
XCTAssertEqualObjects([wrapped value], [FIRTimestamp timestampWithDate:value]);
115-
XCTAssertEqual(wrapped.type, FieldValue::Type::Timestamp);
113+
NSArray<NSDate *> *values =
114+
@[ FSTTestDate(1900, 12, 1, 1, 20, 30), FSTTestDate(2017, 4, 24, 13, 20, 30) ];
115+
for (NSDate *value in values) {
116+
FieldValue wrapped = FSTTestFieldValue(value);
117+
XCTAssertEqual(wrapped.type(), FieldValue::Type::Timestamp);
118+
XCTAssertEqual(wrapped.timestamp_value(), MakeTimestamp(value));
116119
}
117120
}
118121

119122
- (void)testConvertsGeoPoints {
120-
NSArray *values = @[ FSTTestGeoPoint(1.24, 4.56), FSTTestGeoPoint(-20, 100) ];
123+
NSArray<FIRGeoPoint *> *values = @[ FSTTestGeoPoint(1.24, 4.56), FSTTestGeoPoint(-20, 100) ];
121124

122-
for (id value in values) {
123-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
124-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
125-
XCTAssertEqualObjects([wrapped value], value);
126-
XCTAssertEqual(wrapped.type, FieldValue::Type::GeoPoint);
125+
for (FIRGeoPoint *value in values) {
126+
FieldValue wrapped = FSTTestFieldValue(value);
127+
XCTAssertEqual(wrapped.type(), FieldValue::Type::GeoPoint);
128+
XCTAssertEqual(wrapped.geo_point_value(), MakeGeoPoint(value));
127129
}
128130
}
129131

130132
- (void)testConvertsBlobs {
131-
NSArray *values = @[ FSTTestData(1, 2, 3), FSTTestData(1, 2) ];
132-
for (id value in values) {
133-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
134-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
135-
XCTAssertEqualObjects([wrapped value], value);
136-
XCTAssertEqual(wrapped.type, FieldValue::Type::Blob);
133+
NSArray<NSData *> *values = @[ FSTTestData(1, 2, 3), FSTTestData(1, 2) ];
134+
for (NSData *value in values) {
135+
FieldValue wrapped = FSTTestFieldValue(value);
136+
XCTAssertEqual(wrapped.type(), FieldValue::Type::Blob);
137+
XCTAssertEqualObjects(MakeNSData(wrapped.blob_value()), value);
137138
}
138139
}
139140

140141
- (void)testConvertsResourceNames {
141-
NSArray *values = @[
142+
NSArray<FSTDocumentKeyReference *> *values = @[
142143
FSTTestRef("project", DatabaseId::kDefault, @"foo/bar"),
143144
FSTTestRef("project", DatabaseId::kDefault, @"foo/baz")
144145
];
145146
for (FSTDocumentKeyReference *value in values) {
146-
FSTFieldValue *wrapped = FSTTestFieldValue(value);
147-
XCTAssertEqualObjects([wrapped class], [FSTDelegateValue class]);
148-
XCTAssertEqualObjects([wrapped value], [FSTDocumentKey keyWithDocumentKey:value.key]);
149-
XCTAssertTrue(((FSTDelegateValue *)wrapped).referenceValue.database_id() == value.databaseID);
150-
XCTAssertEqual(wrapped.type, FieldValue::Type::Reference);
147+
FieldValue wrapped = FSTTestFieldValue(value);
148+
XCTAssertEqual(wrapped.type(), FieldValue::Type::Reference);
149+
XCTAssertEqual(wrapped.reference_value().key(), value.key);
150+
XCTAssertTrue(wrapped.reference_value().database_id() == value.databaseID);
151151
}
152152
}
153153

154154
- (void)testConvertsEmptyObjects {
155-
XCTAssertEqualObjects(FSTTestFieldValue(@{}), [FSTObjectValue objectValue]);
156-
XCTAssertEqual(FSTTestFieldValue(@{}).type, FieldValue::Type::Object);
155+
XCTAssertEqual(ObjectValue(FSTTestFieldValue(@{})), ObjectValue::Empty());
156+
XCTAssertEqual(FSTTestFieldValue(@{}).type(), FieldValue::Type::Object);
157157
}
158158

159159
- (void)testConvertsSimpleObjects {
160-
FSTObjectValue *actual =
160+
ObjectValue actual =
161161
FSTTestObjectValue(@{@"a" : @"foo", @"b" : @(1L), @"c" : @YES, @"d" : [NSNull null]});
162-
FSTObjectValue *expected = [[FSTObjectValue alloc] initWithDictionary:@{
163-
@"a" : FieldValue::FromString("foo").Wrap(),
164-
@"b" : FieldValue::FromInteger(1).Wrap(),
165-
@"c" : FieldValue::True().Wrap(),
166-
@"d" : FieldValue::Null().Wrap()
167-
}];
168-
XCTAssertEqualObjects(actual, expected);
169-
XCTAssertEqual(actual.type, FieldValue::Type::Object);
162+
ObjectValue expected = ObjectValue::FromMap({{"a", FieldValue::FromString("foo")},
163+
{"b", FieldValue::FromInteger(1)},
164+
{"c", FieldValue::True()},
165+
{"d", FieldValue::Null()}});
166+
XCTAssertEqual(actual, expected);
167+
XCTAssertEqual(actual.AsFieldValue().type(), FieldValue::Type::Object);
170168
}
171169

172170
- (void)testConvertsNestedObjects {
173-
FSTObjectValue *actual = FSTTestObjectValue(@{@"a" : @{@"b" : @{@"c" : @"foo"}, @"d" : @YES}});
174-
FSTObjectValue *expected = [[FSTObjectValue alloc] initWithDictionary:@{
175-
@"a" : [[FSTObjectValue alloc] initWithDictionary:@{
176-
@"b" : [[FSTObjectValue alloc]
177-
initWithDictionary:@{@"c" : FieldValue::FromString("foo").Wrap()}],
178-
@"d" : FieldValue::True().Wrap()
179-
}]
180-
}];
181-
XCTAssertEqualObjects(actual, expected);
182-
XCTAssertEqual(actual.type, FieldValue::Type::Object);
171+
ObjectValue actual = FSTTestObjectValue(@{@"a" : @{@"b" : @{@"c" : @"foo"}, @"d" : @YES}});
172+
ObjectValue expected = ObjectValue::FromMap({
173+
{"a",
174+
ObjectValue::FromMap({{"b", ObjectValue::FromMap({{"c", FieldValue::FromString("foo")}})},
175+
{"d", FieldValue::True()}})},
176+
});
177+
XCTAssertEqual(actual, expected);
178+
XCTAssertEqual(actual.AsFieldValue().type(), FieldValue::Type::Object);
183179
}
184180

185181
- (void)testConvertsArrays {
186-
FSTArrayValue *expected = [[FSTArrayValue alloc]
187-
initWithValueNoCopy:@[ FieldValue::FromString("value").Wrap(), FieldValue::True().Wrap() ]];
188-
189-
FSTArrayValue *actual = (FSTArrayValue *)FSTTestFieldValue(@[ @"value", @YES ]);
190-
XCTAssertEqualObjects(actual, expected);
191-
XCTAssertEqual(actual.type, FieldValue::Type::Array);
182+
FieldValue expected = FieldValue::FromArray({
183+
FieldValue::FromString("value"),
184+
FieldValue::True(),
185+
});
186+
187+
FieldValue actual = (FieldValue)FSTTestFieldValue(@[ @"value", @YES ]);
188+
XCTAssertEqual(actual, expected);
189+
XCTAssertEqual(actual.type(), FieldValue::Type::Array);
192190
}
193191

194192
- (void)testNSDatesAreConvertedToTimestamps {
195193
NSDate *date = [NSDate date];
196194
id input = @{@"array" : @[ @1, date ], @"obj" : @{@"date" : date, @"string" : @"hi"}};
197-
FSTObjectValue *value = FSTTestObjectValue(input);
198-
id output = [value value];
195+
ObjectValue value = FSTTestObjectValue(input);
199196
{
200-
XCTAssertTrue([output[@"array"][1] isKindOfClass:[FIRTimestamp class]]);
201-
FIRTimestamp *actual = output[@"array"][1];
202-
XCTAssertEqualObjects([FIRTimestamp timestampWithDate:date], actual);
197+
auto array = value.Get(Field("array"));
198+
XCTAssertTrue(array.has_value());
199+
XCTAssertEqual(array->type(), FieldValue::Type::Array);
200+
201+
const FieldValue &actual = array->array_value()[1];
202+
XCTAssertEqual(actual.type(), FieldValue::Type::Timestamp);
203+
XCTAssertEqual(actual.timestamp_value(), MakeTimestamp(date));
203204
}
204205
{
205-
XCTAssertTrue([output[@"obj"][@"date"] isKindOfClass:[FIRTimestamp class]]);
206-
FIRTimestamp *actual = output[@"array"][1];
207-
XCTAssertEqualObjects([FIRTimestamp timestampWithDate:date], actual);
206+
auto found = value.Get(Field("obj.date"));
207+
XCTAssertTrue(found.has_value());
208+
XCTAssertEqual(found->type(), FieldValue::Type::Timestamp);
209+
XCTAssertEqual(found->timestamp_value(), MakeTimestamp(date));
208210
}
209211
}
210212

0 commit comments

Comments
 (0)