aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/src/firebase
diff options
context:
space:
mode:
authorGravatar Gil <mcg@google.com>2018-05-09 20:49:32 -0700
committerGravatar GitHub <noreply@github.com>2018-05-09 20:49:32 -0700
commit9ba088053d5680ac4720fa488367c745b994d006 (patch)
treeeddcdf7ae3c3acbbcb77f2df0180dcd7d5016f4a /Firestore/core/src/firebase
parent53b866443995ed8e796246d1f22a6fe47f76be6b (diff)
Add missing tests to the Firestore project (#1254)
* Fix order of project elements * Add immutable container tests to the Firestore project * Fix style problems in TransformOperations * Method names should have an initial upper case character (except getters/setters) * Pointers bind to the type not the name in C++ * Fix unsigned/signed comparison warning * Make transform_operations.h Objective-C++ only It turns out that you can't conditionally define virtual methods. This causes multiple versions of the vtable to be emitted and when the linker resolves all the vtable definitions for a class it picks one arbitrarily causing failures for callers that expect some of the conditional methods to be present. * Add precondition_test and field_mask_test to the project * Add field_transform_test and transform_operations_test to the project * Clean up missing newline/excess comments * Use braced initialization to avoid linter false positive on std::transform
Diffstat (limited to 'Firestore/core/src/firebase')
-rw-r--r--Firestore/core/src/firebase/firestore/model/transform_operations.h101
1 files changed, 43 insertions, 58 deletions
diff --git a/Firestore/core/src/firebase/firestore/model/transform_operations.h b/Firestore/core/src/firebase/firestore/model/transform_operations.h
index abc8d1b..8eed7ae 100644
--- a/Firestore/core/src/firebase/firestore/model/transform_operations.h
+++ b/Firestore/core/src/firebase/firestore/model/transform_operations.h
@@ -17,14 +17,16 @@
#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_TRANSFORM_OPERATIONS_H_
#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_TRANSFORM_OPERATIONS_H_
+#if !defined(__OBJC__)
+#error "This header only supports Objective-C++."
+#endif // !defined(__OBJC__)
+
#include <utility>
#include <vector>
-#include "Firestore/core/include/firebase/firestore/timestamp.h"
-
-#if defined(__OBJC__)
#import "Firestore/Source/Model/FSTFieldValue.h"
-#endif
+
+#include "Firestore/core/include/firebase/firestore/timestamp.h"
namespace firebase {
namespace firestore {
@@ -51,36 +53,31 @@ class TransformOperation {
/** Returns the actual type. */
virtual Type type() const = 0;
-// TODO(mikelehen): apply methods require FSTFieldValue which is Obj-C only.
-#if defined(__OBJC__)
/**
* Computes the local transform result against the provided `previousValue`,
* optionally using the provided localWriteTime.
*/
- virtual FSTFieldValue *applyToLocalView(
- FSTFieldValue *previousValue, FIRTimestamp *localWriteTime) const = 0;
+ virtual FSTFieldValue* ApplyToLocalView(
+ FSTFieldValue* previousValue, FIRTimestamp* localWriteTime) const = 0;
/**
* Computes a final transform result after the transform has been acknowledged
* by the server, potentially using the server-provided transformResult.
*/
- virtual FSTFieldValue *applyToRemoteDocument(
- FSTFieldValue *previousValue, FSTFieldValue *transformResult) const = 0;
-#endif
+ virtual FSTFieldValue* ApplyToRemoteDocument(
+ FSTFieldValue* previousValue, FSTFieldValue* transformResult) const = 0;
/** Returns whether the two are equal. */
- virtual bool operator==(const TransformOperation &other) const = 0;
+ virtual bool operator==(const TransformOperation& other) const = 0;
/** Returns whether the two are not equal. */
- bool operator!=(const TransformOperation &other) const {
+ bool operator!=(const TransformOperation& other) const {
return !operator==(other);
}
-#if defined(__OBJC__)
// For Objective-C++ hash; to be removed after migration.
// Do NOT use in C++ code.
virtual NSUInteger Hash() const = 0;
-#endif // defined(__OBJC__)
};
/** Transforms a value into a server-generated timestamp. */
@@ -93,33 +90,29 @@ class ServerTimestampTransform : public TransformOperation {
return Type::ServerTimestamp;
}
-// TODO(mikelehen): apply methods require FSTFieldValue which is Obj-C only.
-#if defined(__OBJC__)
- FSTFieldValue *applyToLocalView(FSTFieldValue *previousValue,
- FIRTimestamp *localWriteTime) const override {
+ FSTFieldValue* ApplyToLocalView(FSTFieldValue* previousValue,
+ FIRTimestamp* localWriteTime) const override {
return [FSTServerTimestampValue
serverTimestampValueWithLocalWriteTime:localWriteTime
previousValue:previousValue];
}
- FSTFieldValue *applyToRemoteDocument(
- FSTFieldValue *previousValue,
- FSTFieldValue *transformResult) const override {
+ FSTFieldValue* ApplyToRemoteDocument(
+ FSTFieldValue* /* previousValue */,
+ FSTFieldValue* transformResult) const override {
return transformResult;
}
-#endif
- bool operator==(const TransformOperation &other) const override {
+ bool operator==(const TransformOperation& other) const override {
// All ServerTimestampTransform objects are equal.
return other.type() == Type::ServerTimestamp;
}
- static const ServerTimestampTransform &Get() {
+ static const ServerTimestampTransform& Get() {
static ServerTimestampTransform shared_instance;
return shared_instance;
}
-#if defined(__OBJC__)
// For Objective-C++ hash; to be removed after migration.
// Do NOT use in C++ code.
NSUInteger Hash() const override {
@@ -127,24 +120,19 @@ class ServerTimestampTransform : public TransformOperation {
// instances are equal.
return 37;
}
-#endif // defined(__OBJC__)
private:
ServerTimestampTransform() {
}
};
-// TODO(mikelehen): ArrayTransform can only be used from Obj-C until we switch
-// to using FieldValue instead of FSTFieldValue.
-#if defined(__OBJC__)
-
/**
* Transforms an array via a union or remove operation (for convenience, we use
* this class for both Type::ArrayUnion and Type::ArrayRemove).
*/
class ArrayTransform : public TransformOperation {
public:
- ArrayTransform(Type type, std::vector<FSTFieldValue *> elements)
+ ArrayTransform(Type type, std::vector<FSTFieldValue*> elements)
: type_(type), elements_(std::move(elements)) {
}
@@ -155,33 +143,34 @@ class ArrayTransform : public TransformOperation {
return type_;
}
- FSTFieldValue *applyToLocalView(FSTFieldValue *previousValue,
- FIRTimestamp *localWriteTime) const override {
- return apply(previousValue);
+ FSTFieldValue* ApplyToLocalView(
+ FSTFieldValue* previousValue,
+ FIRTimestamp* /* localWriteTime */) const override {
+ return Apply(previousValue);
}
- FSTFieldValue *applyToRemoteDocument(
- FSTFieldValue *previousValue,
- FSTFieldValue *transformResult) const override {
+ FSTFieldValue* ApplyToRemoteDocument(
+ FSTFieldValue* previousValue,
+ FSTFieldValue* /* transformResult */) const override {
// The server just sends null as the transform result for array operations,
// so we have to calculate a result the same as we do for local
// applications.
- return apply(previousValue);
+ return Apply(previousValue);
}
- const std::vector<FSTFieldValue *> &elements() const {
+ const std::vector<FSTFieldValue*>& elements() const {
return elements_;
}
- bool operator==(const TransformOperation &other) const override {
+ bool operator==(const TransformOperation& other) const override {
if (other.type() != type()) {
return false;
}
- auto array_transform = static_cast<const ArrayTransform &>(other);
+ auto array_transform = static_cast<const ArrayTransform&>(other);
if (array_transform.elements_.size() != elements_.size()) {
return false;
}
- for (int i = 0; i < elements_.size(); i++) {
+ for (size_t i = 0; i < elements_.size(); i++) {
if (![array_transform.elements_[i] isEqual:elements_[i]]) {
return false;
}
@@ -189,51 +178,48 @@ class ArrayTransform : public TransformOperation {
return true;
}
-#if defined(__OBJC__)
// For Objective-C++ hash; to be removed after migration.
// Do NOT use in C++ code.
NSUInteger Hash() const override {
NSUInteger result = 37;
result = 31 * result + (type() == Type::ArrayUnion ? 1231 : 1237);
- for (FSTFieldValue *element : elements_) {
+ for (FSTFieldValue* element : elements_) {
result = 31 * result + [element hash];
}
return result;
}
-#endif // defined(__OBJC__)
- static const std::vector<FSTFieldValue *> &Elements(
- const TransformOperation &op) {
+ static const std::vector<FSTFieldValue*>& Elements(
+ const TransformOperation& op) {
FIREBASE_ASSERT(op.type() == Type::ArrayUnion ||
op.type() == Type::ArrayRemove);
- return static_cast<const ArrayTransform &>(op).elements();
+ return static_cast<const ArrayTransform&>(op).elements();
}
private:
Type type_;
- std::vector<FSTFieldValue *> elements_;
+ std::vector<FSTFieldValue*> elements_;
/**
* Inspects the provided value, returning a mutable copy of the internal array
* if it's an FSTArrayValue and an empty mutable array if it's nil or any
* other type of FSTFieldValue.
*/
- static NSMutableArray<FSTFieldValue *> *CoercedFieldValuesArray(
- FSTFieldValue *value) {
+ static NSMutableArray<FSTFieldValue*>* CoercedFieldValuesArray(
+ FSTFieldValue* value) {
if ([value isMemberOfClass:[FSTArrayValue class]]) {
return [NSMutableArray
- arrayWithArray:reinterpret_cast<FSTArrayValue *>(value)
- .internalValue];
+ arrayWithArray:reinterpret_cast<FSTArrayValue*>(value).internalValue];
} else {
// coerce to empty array.
return [NSMutableArray array];
}
}
- FSTFieldValue *apply(FSTFieldValue *previousValue) const {
- NSMutableArray<FSTFieldValue *> *result =
+ FSTFieldValue* Apply(FSTFieldValue* previousValue) const {
+ NSMutableArray<FSTFieldValue*>* result =
ArrayTransform::CoercedFieldValuesArray(previousValue);
- for (FSTFieldValue *element : elements_) {
+ for (FSTFieldValue* element : elements_) {
if (type_ == Type::ArrayUnion) {
if (![result containsObject:element]) {
[result addObject:element];
@@ -246,7 +232,6 @@ class ArrayTransform : public TransformOperation {
return [[FSTArrayValue alloc] initWithValueNoCopy:result];
}
};
-#endif
} // namespace model
} // namespace firestore