21
21
#import < XCTest/XCTest.h>
22
22
23
23
#import " Firestore/Example/Tests/Util/FSTHelpers.h"
24
+ #import " Firestore/Source/API/converters.h"
24
25
25
26
#include " Firestore/core/src/firebase/firestore/model/database_id.h"
26
27
#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"
27
30
28
31
namespace util = firebase::firestore::util;
32
+ using firebase::firestore::api::MakeGeoPoint;
33
+ using firebase::firestore::api::MakeTimestamp;
29
34
using firebase::firestore::model::DatabaseId;
30
35
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;
31
40
32
41
@interface FSTUserDataConverterTests : XCTestCase
33
42
@end
34
43
35
44
@implementation FSTUserDataConverterTests
36
45
37
46
- (void )testConvertsIntegers {
38
- NSArray *values = @[
47
+ NSArray < NSNumber *> *values = @[
39
48
@(INT_MIN), @(-1 ), @0 , @1 , @2 , @(UCHAR_MAX), @(INT_MAX), // Standard integers
40
49
@(LONG_MIN), @(LONG_MAX), @(LLONG_MIN), @(LLONG_MAX) // Larger values
41
50
];
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 ]);
47
55
}
48
56
}
49
57
50
58
- (void )testConvertsDoubles {
51
59
// Note that 0x1.0p-1074 is a hex floating point literal representing the minimum subnormal
52
60
// number: <https://en.wikipedia.org/wiki/Denormal_number>.
53
- NSArray *values = @[
61
+ NSArray < NSNumber *> *values = @[
54
62
@(-INFINITY), @(-DBL_MAX), @(LLONG_MIN * -1.0 ), @(-1.1 ), @(-0x1 .0p-1074 ), @(-0.0 ), @(0.0 ),
55
63
@(0x1 .0p-1074 ), @(DBL_MIN), @(1.1 ), @(LLONG_MAX * 1.0 ), @(DBL_MAX), @(INFINITY)
56
64
];
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 ]);
62
69
}
63
70
}
64
71
65
72
- (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);
71
77
}
72
78
73
79
- (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 ]);
80
85
}
81
86
}
82
87
@@ -86,8 +91,8 @@ - (void)testConvertsUnsignedCharToInteger {
86
91
// with signed chars but on arm64 these end up being stored as signed shorts. This forces us to
87
92
// choose, and it's more useful to support shorts as Integers than it is to treat unsigned char as
88
93
// 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 ));
91
96
}
92
97
93
98
union DoubleBits {
@@ -96,115 +101,112 @@ - (void)testConvertsUnsignedCharToInteger {
96
101
};
97
102
98
103
- (void )testConvertsStrings {
99
- NSArray *values = @[ @" " , @" abc" ];
104
+ NSArray < NSString *> *values = @[ @" " , @" abc" ];
100
105
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));
105
109
}
106
110
}
107
111
108
112
- (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));
116
119
}
117
120
}
118
121
119
122
- (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 ) ];
121
124
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));
127
129
}
128
130
}
129
131
130
132
- (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);
137
138
}
138
139
}
139
140
140
141
- (void )testConvertsResourceNames {
141
- NSArray *values = @[
142
+ NSArray <FSTDocumentKeyReference *> *values = @[
142
143
FSTTestRef (" project" , DatabaseId::kDefault , @" foo/bar" ),
143
144
FSTTestRef (" project" , DatabaseId::kDefault , @" foo/baz" )
144
145
];
145
146
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 );
151
151
}
152
152
}
153
153
154
154
- (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);
157
157
}
158
158
159
159
- (void )testConvertsSimpleObjects {
160
- FSTObjectValue * actual =
160
+ ObjectValue actual =
161
161
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);
170
168
}
171
169
172
170
- (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);
183
179
}
184
180
185
181
- (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);
192
190
}
193
191
194
192
- (void )testNSDatesAreConvertedToTimestamps {
195
193
NSDate *date = [NSDate date ];
196
194
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);
199
196
{
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));
203
204
}
204
205
{
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));
208
210
}
209
211
}
210
212
0 commit comments