summaryrefslogtreecommitdiff
path: root/src/mongo/db/ops/modifier_compare_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/ops/modifier_compare_test.cpp')
-rw-r--r--src/mongo/db/ops/modifier_compare_test.cpp487
1 files changed, 243 insertions, 244 deletions
diff --git a/src/mongo/db/ops/modifier_compare_test.cpp b/src/mongo/db/ops/modifier_compare_test.cpp
index 9f19dd1d718..fb6bcf8d84f 100644
--- a/src/mongo/db/ops/modifier_compare_test.cpp
+++ b/src/mongo/db/ops/modifier_compare_test.cpp
@@ -39,257 +39,256 @@
namespace {
- using mongo::BSONObj;
- using mongo::LogBuilder;
- using mongo::ModifierCompare;
- using mongo::ModifierInterface;
- using mongo::Status;
- using mongo::StringData;
- using mongo::fromjson;
- using mongo::mutablebson::ConstElement;
- using mongo::mutablebson::Document;
- using mongo::mutablebson::Element;
-
- const char kModNameMin[] = "$min";
- const char kModNameMax[] = "$max";
-
- /** Helper to build and manipulate a $min/max mod. */
- class Mod {
- public:
- Mod() : _mod() {}
-
- explicit Mod(BSONObj modObj)
- : _modObj(modObj)
- , _mod((modObj.firstElement().fieldNameStringData() == "$min") ?
- ModifierCompare::MIN :
- ModifierCompare::MAX) {
- StringData modName = modObj.firstElement().fieldName();
- ASSERT_OK(_mod.init(modObj[modName].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
- }
-
- Status prepare(Element root,
- StringData matchedField,
- ModifierInterface::ExecInfo* execInfo) {
- return _mod.prepare(root, matchedField, execInfo);
- }
-
- Status apply() const {
- return _mod.apply();
- }
-
- Status log(LogBuilder* logBuilder) const {
- return _mod.log(logBuilder);
- }
-
- ModifierCompare& mod() { return _mod; }
-
- private:
- BSONObj _modObj;
- ModifierCompare _mod;
- };
-
- TEST(Init, ValidValues) {
- BSONObj modObj;
- ModifierCompare mod;
-
- modObj = fromjson("{ $min : { a : 2 } }");
- ASSERT_OK(mod.init(modObj[kModNameMin].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- modObj = fromjson("{ $max : { a : 1 } }");
- ASSERT_OK(mod.init(modObj[kModNameMax].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- modObj = fromjson("{ $min : { a : {$date : 0 } } }");
- ASSERT_OK(mod.init(modObj[kModNameMin].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
+using mongo::BSONObj;
+using mongo::LogBuilder;
+using mongo::ModifierCompare;
+using mongo::ModifierInterface;
+using mongo::Status;
+using mongo::StringData;
+using mongo::fromjson;
+using mongo::mutablebson::ConstElement;
+using mongo::mutablebson::Document;
+using mongo::mutablebson::Element;
+
+const char kModNameMin[] = "$min";
+const char kModNameMax[] = "$max";
+
+/** Helper to build and manipulate a $min/max mod. */
+class Mod {
+public:
+ Mod() : _mod() {}
+
+ explicit Mod(BSONObj modObj)
+ : _modObj(modObj),
+ _mod((modObj.firstElement().fieldNameStringData() == "$min") ? ModifierCompare::MIN
+ : ModifierCompare::MAX) {
+ StringData modName = modObj.firstElement().fieldName();
+ ASSERT_OK(_mod.init(modObj[modName].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
}
- TEST(ExistingNumber, MaxSameNumber) {
- Document doc(fromjson("{a: 1 }"));
- Mod mod(fromjson("{$max: {a: 1} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(ExistingNumber, MinSameNumber) {
- Document doc(fromjson("{a: 1 }"));
- Mod mod(fromjson("{$min: {a: 1} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(ExistingNumber, MaxNumberIsLess) {
- Document doc(fromjson("{a: 1 }"));
- Mod mod(fromjson("{$max: {a: 0} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(ExistingNumber, MinNumberIsMore) {
- Document doc(fromjson("{a: 1 }"));
- Mod mod(fromjson("{$min: {a: 2} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(ExistingDouble, MaxSameValInt) {
- Document doc(fromjson("{a: 1.0 }"));
- Mod mod(BSON("$max" << BSON("a" << 1LL)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(ExistingDoubleZero, MaxSameValIntZero) {
- Document doc(fromjson("{a: 0.0 }"));
- Mod mod(BSON("$max" << BSON("a" << 0LL)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(ExistingDoubleZero, MinSameValIntZero) {
- Document doc(fromjson("{a: 0.0 }"));
- Mod mod(BSON("$min" << BSON("a" << 0LL)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- }
-
- TEST(MissingField, MinNumber) {
- Document doc(fromjson("{}"));
- Mod mod(fromjson("{$min: {a: 0} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
-
- ASSERT_OK(mod.apply());
- ASSERT_EQUALS(fromjson("{a : 0}"), doc);
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
- }
-
- TEST(ExistingNumber, MinNumber) {
- Document doc(fromjson("{a: 1 }"));
- Mod mod(fromjson("{$min: {a: 0} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
-
- ASSERT_OK(mod.apply());
- ASSERT_EQUALS(fromjson("{a : 0}"), doc);
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
+ Status prepare(Element root, StringData matchedField, ModifierInterface::ExecInfo* execInfo) {
+ return _mod.prepare(root, matchedField, execInfo);
}
- TEST(MissingField, MaxNumber) {
- Document doc(fromjson("{}"));
- Mod mod(fromjson("{$max: {a: 0} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
-
- ASSERT_OK(mod.apply());
- ASSERT_EQUALS(fromjson("{a : 0}"), doc);
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
+ Status apply() const {
+ return _mod.apply();
}
- TEST(ExistingNumber, MaxNumber) {
- Document doc(fromjson("{a: 1 }"));
- Mod mod(fromjson("{$max: {a: 2} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
-
- ASSERT_OK(mod.apply());
- ASSERT_EQUALS(fromjson("{a : 2}"), doc);
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 2 } }"), logDoc);
+ Status log(LogBuilder* logBuilder) const {
+ return _mod.log(logBuilder);
}
- TEST(ExistingDate, MaxDate) {
- Document doc(fromjson("{a: {$date: 0} }"));
- Mod mod(fromjson("{$max: {a: {$date: 123123123}} }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
-
- ASSERT_OK(mod.apply());
- ASSERT_EQUALS(fromjson("{a: {$date: 123123123}}"), doc);
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{$set: {a: {$date: 123123123}} }"), logDoc);
- }
-
- TEST(ExistingEmbeddedDoc, MaxDoc) {
- Document doc(fromjson("{a: {b: 2}}"));
- Mod mod(fromjson("{$max: {a: {b: 3}}}"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
-
- ASSERT_OK(mod.apply());
- ASSERT_EQUALS(fromjson("{a: {b: 3}}}"), doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{$set: {a: {b: 3}} }"), logDoc);
- }
-
- TEST(ExistingEmbeddedDoc, MaxNumber) {
- Document doc(fromjson("{a: {b: 2}}"));
- Mod mod(fromjson("{$max: {a: 3}}"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
- ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+ ModifierCompare& mod() {
+ return _mod;
}
-} // namespace
+private:
+ BSONObj _modObj;
+ ModifierCompare _mod;
+};
+
+TEST(Init, ValidValues) {
+ BSONObj modObj;
+ ModifierCompare mod;
+
+ modObj = fromjson("{ $min : { a : 2 } }");
+ ASSERT_OK(mod.init(modObj[kModNameMin].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
+
+ modObj = fromjson("{ $max : { a : 1 } }");
+ ASSERT_OK(mod.init(modObj[kModNameMax].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
+
+ modObj = fromjson("{ $min : { a : {$date : 0 } } }");
+ ASSERT_OK(mod.init(modObj[kModNameMin].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
+}
+
+TEST(ExistingNumber, MaxSameNumber) {
+ Document doc(fromjson("{a: 1 }"));
+ Mod mod(fromjson("{$max: {a: 1} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(ExistingNumber, MinSameNumber) {
+ Document doc(fromjson("{a: 1 }"));
+ Mod mod(fromjson("{$min: {a: 1} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(ExistingNumber, MaxNumberIsLess) {
+ Document doc(fromjson("{a: 1 }"));
+ Mod mod(fromjson("{$max: {a: 0} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(ExistingNumber, MinNumberIsMore) {
+ Document doc(fromjson("{a: 1 }"));
+ Mod mod(fromjson("{$min: {a: 2} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(ExistingDouble, MaxSameValInt) {
+ Document doc(fromjson("{a: 1.0 }"));
+ Mod mod(BSON("$max" << BSON("a" << 1LL)));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(ExistingDoubleZero, MaxSameValIntZero) {
+ Document doc(fromjson("{a: 0.0 }"));
+ Mod mod(BSON("$max" << BSON("a" << 0LL)));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(ExistingDoubleZero, MinSameValIntZero) {
+ Document doc(fromjson("{a: 0.0 }"));
+ Mod mod(BSON("$min" << BSON("a" << 0LL)));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+}
+
+TEST(MissingField, MinNumber) {
+ Document doc(fromjson("{}"));
+ Mod mod(fromjson("{$min: {a: 0} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+
+ ASSERT_OK(mod.apply());
+ ASSERT_EQUALS(fromjson("{a : 0}"), doc);
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
+}
+
+TEST(ExistingNumber, MinNumber) {
+ Document doc(fromjson("{a: 1 }"));
+ Mod mod(fromjson("{$min: {a: 0} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+
+ ASSERT_OK(mod.apply());
+ ASSERT_EQUALS(fromjson("{a : 0}"), doc);
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
+}
+
+TEST(MissingField, MaxNumber) {
+ Document doc(fromjson("{}"));
+ Mod mod(fromjson("{$max: {a: 0} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+
+ ASSERT_OK(mod.apply());
+ ASSERT_EQUALS(fromjson("{a : 0}"), doc);
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
+}
+
+TEST(ExistingNumber, MaxNumber) {
+ Document doc(fromjson("{a: 1 }"));
+ Mod mod(fromjson("{$max: {a: 2} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+
+ ASSERT_OK(mod.apply());
+ ASSERT_EQUALS(fromjson("{a : 2}"), doc);
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 2 } }"), logDoc);
+}
+
+TEST(ExistingDate, MaxDate) {
+ Document doc(fromjson("{a: {$date: 0} }"));
+ Mod mod(fromjson("{$max: {a: {$date: 123123123}} }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+
+ ASSERT_OK(mod.apply());
+ ASSERT_EQUALS(fromjson("{a: {$date: 123123123}}"), doc);
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{$set: {a: {$date: 123123123}} }"), logDoc);
+}
+
+TEST(ExistingEmbeddedDoc, MaxDoc) {
+ Document doc(fromjson("{a: {b: 2}}"));
+ Mod mod(fromjson("{$max: {a: {b: 3}}}"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+
+ ASSERT_OK(mod.apply());
+ ASSERT_EQUALS(fromjson("{a: {b: 3}}}"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{$set: {a: {b: 3}} }"), logDoc);
+}
+
+TEST(ExistingEmbeddedDoc, MaxNumber) {
+ Document doc(fromjson("{a: {b: 2}}"));
+ Mod mod(fromjson("{$max: {a: 3}}"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+ ASSERT_EQUALS("a", execInfo.fieldRef[0]->dottedField());
+}
+
+} // namespace