summaryrefslogtreecommitdiff
path: root/src/mongo/db/ops/modifier_bit_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/ops/modifier_bit_test.cpp')
-rw-r--r--src/mongo/db/ops/modifier_bit_test.cpp1288
1 files changed, 642 insertions, 646 deletions
diff --git a/src/mongo/db/ops/modifier_bit_test.cpp b/src/mongo/db/ops/modifier_bit_test.cpp
index 3d19808757e..59e13f89e24 100644
--- a/src/mongo/db/ops/modifier_bit_test.cpp
+++ b/src/mongo/db/ops/modifier_bit_test.cpp
@@ -40,697 +40,693 @@
namespace {
- using mongo::BSONObj;
- using mongo::LogBuilder;
- using mongo::ModifierBit;
- using mongo::ModifierInterface;
- using mongo::Status;
- using mongo::StringData;
- using mongo::fromjson;
- using mongo::mutablebson::ConstElement;
- using mongo::mutablebson::Document;
- using mongo::mutablebson::Element;
-
- /** Helper to build and manipulate a $bit mod. */
- class Mod {
- public:
- Mod() : _mod() {}
-
- explicit Mod(BSONObj modObj)
- : _modObj(modObj)
- , _mod() {
- ASSERT_OK(_mod.init(_modObj["$bit"].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);
- }
-
- ModifierBit& mod() { return _mod; }
-
- private:
- BSONObj _modObj;
- ModifierBit _mod;
- };
-
-
- TEST(Init, FailToInitWithInvalidValue) {
- BSONObj modObj;
- ModifierBit mod;
-
- // String is an invalid $bit argument
- modObj = fromjson("{ $bit : { a : '' } }");
- ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- // Array is an invalid $bit argument
- modObj = fromjson("{ $bit : { a : [] } }");
- ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- // An object with value not in ('and', 'or') is an invalid $bit argument
- modObj = fromjson("{ $bit : { a : { foo : 4 } } }");
- ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- // The argument to the sub-operator must be numeric
- modObj = fromjson("{ $bit : { a : { or : [] } } }");
- ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- modObj = fromjson("{ $bit : { a : { or : 'foo' } } }");
- ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
-
- // The argument to the sub-operator must be integral
- modObj = fromjson("{ $bit : { a : { or : 1.0 } } }");
- ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
- ModifierInterface::Options::normal()));
- }
+using mongo::BSONObj;
+using mongo::LogBuilder;
+using mongo::ModifierBit;
+using mongo::ModifierInterface;
+using mongo::Status;
+using mongo::StringData;
+using mongo::fromjson;
+using mongo::mutablebson::ConstElement;
+using mongo::mutablebson::Document;
+using mongo::mutablebson::Element;
- TEST(Init, ParsesAndInt) {
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(1)))));
- }
+/** Helper to build and manipulate a $bit mod. */
+class Mod {
+public:
+ Mod() : _mod() {}
- TEST(Init, ParsesOrInt) {
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(1)))));
+ explicit Mod(BSONObj modObj) : _modObj(modObj), _mod() {
+ ASSERT_OK(_mod.init(_modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
}
- TEST(Init, ParsesXorInt) {
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(1)))));
+ Status prepare(Element root, StringData matchedField, ModifierInterface::ExecInfo* execInfo) {
+ return _mod.prepare(root, matchedField, execInfo);
}
- TEST(Init, ParsesAndLong) {
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
+ Status apply() const {
+ return _mod.apply();
}
- TEST(Init, ParsesOrLong) {
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
+ Status log(LogBuilder* logBuilder) const {
+ return _mod.log(logBuilder);
}
- TEST(Init, ParsesXorLong) {
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(1)))));
+ ModifierBit& mod() {
+ return _mod;
}
- TEST(SimpleMod, PrepareOKTargetNotFound) {
- Document doc(fromjson("{}"));
- Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
+private:
+ BSONObj _modObj;
+ ModifierBit _mod;
+};
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- }
+TEST(Init, FailToInitWithInvalidValue) {
+ BSONObj modObj;
+ ModifierBit mod;
- TEST(SimpleMod, PrepareOKTargetFound) {
- Document doc(fromjson("{ a : 1 }"));
- Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
+ // String is an invalid $bit argument
+ modObj = fromjson("{ $bit : { a : '' } }");
+ ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
- ModifierInterface::ExecInfo execInfo;
+ // Array is an invalid $bit argument
+ modObj = fromjson("{ $bit : { a : [] } }");
+ ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
+ // An object with value not in ('and', 'or') is an invalid $bit argument
+ modObj = fromjson("{ $bit : { a : { foo : 4 } } }");
+ ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 1 } }"), logDoc);
- }
+ // The argument to the sub-operator must be numeric
+ modObj = fromjson("{ $bit : { a : { or : [] } } }");
+ ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
- TEST(SimpleMod, PrepareSimpleNonNumericObject) {
- Document doc(fromjson("{ a : {} }"));
- Mod mod(fromjson("{ $bit : { a : { or : 1 } } }"));
+ modObj = fromjson("{ $bit : { a : { or : 'foo' } } }");
+ ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
- ModifierInterface::ExecInfo execInfo;
- ASSERT_NOT_OK(mod.prepare(doc.root(), "", &execInfo));
- }
+ // The argument to the sub-operator must be integral
+ modObj = fromjson("{ $bit : { a : { or : 1.0 } } }");
+ ASSERT_NOT_OK(mod.init(modObj["$bit"].embeddedObject().firstElement(),
+ ModifierInterface::Options::normal()));
+}
- TEST(SimpleMod, PrepareSimpleNonNumericArray) {
+TEST(Init, ParsesAndInt) {
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(1)))));
+}
- Document doc(fromjson("{ a : [] }"));
- Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
+TEST(Init, ParsesOrInt) {
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(1)))));
+}
- ModifierInterface::ExecInfo execInfo;
- ASSERT_NOT_OK(mod.prepare(doc.root(), "", &execInfo));
- }
+TEST(Init, ParsesXorInt) {
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(1)))));
+}
- TEST(SimpleMod, PrepareSimpleNonNumericString) {
- Document doc(fromjson("{ a : '' }"));
- Mod mod(fromjson("{ $bit : { a : { or : 1 } } }"));
+TEST(Init, ParsesAndLong) {
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
+}
- ModifierInterface::ExecInfo execInfo;
- ASSERT_NOT_OK(mod.prepare(doc.root(), "", &execInfo));
- }
+TEST(Init, ParsesOrLong) {
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
+}
- TEST(SimpleMod, ApplyAndLogEmptyDocumentAnd) {
- Document doc(fromjson("{}"));
- Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
+TEST(Init, ParsesXorLong) {
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(1)))));
+}
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
+TEST(SimpleMod, PrepareOKTargetNotFound) {
+ Document doc(fromjson("{}"));
+ Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
- ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 0 }"), doc);
+ ModifierInterface::ExecInfo execInfo;
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
- }
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+}
- TEST(SimpleMod, ApplyAndLogEmptyDocumentOr) {
- Document doc(fromjson("{}"));
- Mod mod(fromjson("{ $bit : { a : { or : 1 } } }"));
+TEST(SimpleMod, PrepareOKTargetFound) {
+ Document doc(fromjson("{ a : 1 }"));
+ Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
+ ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 1 } }"), logDoc);
- }
-
- TEST(SimpleMod, ApplyAndLogEmptyDocumentXor) {
- Document doc(fromjson("{}"));
- Mod mod(fromjson("{ $bit : { a : { xor : 1 } } }"));
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 1 } }"), logDoc);
+}
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
+TEST(SimpleMod, PrepareSimpleNonNumericObject) {
+ Document doc(fromjson("{ a : {} }"));
+ Mod mod(fromjson("{ $bit : { a : { or : 1 } } }"));
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_NOT_OK(mod.prepare(doc.root(), "", &execInfo));
+}
+
+TEST(SimpleMod, PrepareSimpleNonNumericArray) {
+ Document doc(fromjson("{ a : [] }"));
+ Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_NOT_OK(mod.prepare(doc.root(), "", &execInfo));
+}
+
+TEST(SimpleMod, PrepareSimpleNonNumericString) {
+ Document doc(fromjson("{ a : '' }"));
+ Mod mod(fromjson("{ $bit : { a : { or : 1 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_NOT_OK(mod.prepare(doc.root(), "", &execInfo));
+}
+
+TEST(SimpleMod, ApplyAndLogEmptyDocumentAnd) {
+ Document doc(fromjson("{}"));
+ Mod mod(fromjson("{ $bit : { a : { and : 1 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 0 }"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 0 } }"), logDoc);
+}
+
+TEST(SimpleMod, ApplyAndLogEmptyDocumentOr) {
+ Document doc(fromjson("{}"));
+ Mod mod(fromjson("{ $bit : { a : { or : 1 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 1 } }"), logDoc);
+}
+
+TEST(SimpleMod, ApplyAndLogEmptyDocumentXor) {
+ Document doc(fromjson("{}"));
+ Mod mod(fromjson("{ $bit : { a : { xor : 1 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 1 } }"), logDoc);
+}
+
+TEST(SimpleMod, ApplyAndLogSimpleDocumentAnd) {
+ Document doc(fromjson("{ a : 5 }"));
+ Mod mod(fromjson("{ $bit : { a : { and : 6 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 4 }"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 4 } }"), logDoc);
+}
+
+TEST(SimpleMod, ApplyAndLogSimpleDocumentOr) {
+ Document doc(fromjson("{ a : 5 }"));
+ Mod mod(fromjson("{ $bit : { a : { or : 6 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 7 }"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 7 } }"), logDoc);
+}
+
+TEST(SimpleMod, ApplyAndLogSimpleDocumentXor) {
+ Document doc(fromjson("{ a : 5 }"));
+ Mod mod(fromjson("{ $bit : { a : { xor : 6 } } }"));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 3 }"), doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(fromjson("{ $set : { a : 3 } }"), logDoc);
+}
+
+TEST(InPlace, IntToIntAndIsInPlace) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(1))), logDoc);
+}
+
+TEST(InPlace, IntToIntOrIsInPlace) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(1))), logDoc);
+}
+
+TEST(InPlace, IntToIntXorIsInPlace) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0))), logDoc);
+}
+
+TEST(InPlace, LongToLongAndIsInPlace) {
+ Document doc(BSON("a" << static_cast<long long>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(1))), logDoc);
+}
+
+TEST(InPlace, LongToLongOrIsInPlace) {
+ Document doc(BSON("a" << static_cast<long long>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(1))), logDoc);
+}
+
+TEST(InPlace, LongToLongXorIsInPlace) {
+ Document doc(BSON("a" << static_cast<long long>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(0))), logDoc);
+}
+
+TEST(InPlace, IntToLongAndIsNotInPlace) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+}
+
+TEST(InPlace, IntToLongOrIsNotInPlace) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+}
+
+TEST(InPlace, IntToLongXorIsNotInPlace) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+}
+
+TEST(NoOp, IntAnd) {
+ Document doc(BSON("a" << static_cast<int>(0xABCD1234U)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(0xFFFFFFFFU)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0xABCD1234U))), logDoc);
+}
+
+TEST(NoOp, IntOr) {
+ Document doc(BSON("a" << static_cast<int>(0xABCD1234U)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(0x0U)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0xABCD1234U))), logDoc);
+}
+
+TEST(NoOp, IntXor) {
+ Document doc(BSON("a" << static_cast<int>(0xABCD1234U)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(0x0U)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0xABCD1234U))), logDoc);
+}
+
+TEST(NoOp, LongAnd) {
+ Document doc(BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL)));
+ Mod mod(
+ BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(0xFFFFFFFFFFFFFFFFULL)))));
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL))),
+ logDoc);
+}
+
+TEST(NoOp, LongOr) {
+ Document doc(BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(0x0ULL)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL))),
+ logDoc);
+}
+
+TEST(NoOp, LongXor) {
+ Document doc(BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(0x0ULL)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_TRUE(execInfo.noOp);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL))),
+ logDoc);
+}
+
+TEST(Upcasting, UpcastIntToLongAnd) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
+ ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
+}
+
+TEST(Upcasting, UpcastIntToLongOr) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
+ ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
+}
+
+TEST(Upcasting, UpcastIntToLongXor) {
+ Document doc(BSON("a" << static_cast<int>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(0)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
+ ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
+}
+
+TEST(Upcasting, LongsStayLongsAnd) {
+ Document doc(BSON("a" << static_cast<long long>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(2)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 0 }"), doc);
+ ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
+}
+
+TEST(Upcasting, LongsStayLongsOr) {
+ Document doc(BSON("a" << static_cast<long long>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(2)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 3 }"), doc);
+ ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
+}
+
+TEST(Upcasting, LongsStayLongsXor) {
+ Document doc(BSON("a" << static_cast<long long>(1)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(fromjson("{ a : 0 }"), doc);
+ ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
+}
+
+// The following tests are re-created from the previous $bit tests in updatetests.cpp. They
+// are probably redundant with the tests above in various ways.
+
+TEST(DbUpdateTests, BitRewriteExistingField) {
+ Document doc(BSON("a" << static_cast<int>(0)));
+ Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_TRUE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(BSON("a" << static_cast<int>(1)), doc);
+ ASSERT_EQUALS(mongo::NumberInt, doc.root()["a"].getType());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(1))), logDoc);
+}
+
+TEST(DbUpdateTests, BitRewriteNonExistingField) {
+ Document doc(BSON("a" << static_cast<int>(0)));
+ Mod mod(BSON("$bit" << BSON("b" << BSON("or" << static_cast<int>(1)))));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ ASSERT_FALSE(execInfo.noOp);
+
+ ASSERT_OK(mod.apply());
+ ASSERT_FALSE(doc.isInPlaceModeEnabled());
+ ASSERT_EQUALS(BSON("a" << static_cast<int>(0) << "b" << static_cast<int>(1)), doc);
+ ASSERT_EQUALS(mongo::NumberInt, doc.root()["a"].getType());
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("b" << static_cast<int>(1))), logDoc);
+}
+
+TEST(DbUpdateTests, Bit1_1) {
+ Document doc(BSON("_id" << 1 << "x" << 3));
+ Mod mod(BSON("$bit" << BSON("x" << BSON("and" << 2))));
+ const BSONObj result(BSON("_id" << 1 << "x" << (3 & 2)));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ if (!execInfo.noOp)
ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 1 } }"), logDoc);
- }
+ ASSERT_EQUALS(result, doc);
- TEST(SimpleMod, ApplyAndLogSimpleDocumentAnd) {
- Document doc(fromjson("{ a : 5 }"));
- Mod mod(fromjson("{ $bit : { a : { and : 6 } } }"));
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("x" << (3 & 2))), logDoc);
+}
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
+TEST(DbUpdateTests, Bit1_2) {
+ Document doc(BSON("_id" << 1 << "x" << 1));
+ Mod mod(BSON("$bit" << BSON("x" << BSON("or" << 4))));
+ const BSONObj result(BSON("_id" << 1 << "x" << (1 | 4)));
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ if (!execInfo.noOp)
ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 4 }"), doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 4 } }"), logDoc);
- }
-
- TEST(SimpleMod, ApplyAndLogSimpleDocumentOr) {
- Document doc(fromjson("{ a : 5 }"));
- Mod mod(fromjson("{ $bit : { a : { or : 6 } } }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS(result, doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("x" << (1 | 4))), logDoc);
+}
+
+TEST(DbUpdateTests, Bit1_3) {
+ Document doc(BSON("_id" << 1 << "x" << 3));
+ Mod mod1(BSON("$bit" << BSON("x" << BSON("and" << 2))));
+ Mod mod2(BSON("$bit" << BSON("x" << BSON("or" << 8))));
+ const BSONObj result(BSON("_id" << 1 << "x" << ((3 & 2) | 8)));
+
+ ModifierInterface::ExecInfo execInfo1;
+ ASSERT_OK(mod1.prepare(doc.root(), "", &execInfo1));
+ if (!execInfo1.noOp)
+ ASSERT_OK(mod1.apply());
+
+ ModifierInterface::ExecInfo execInfo2;
+ ASSERT_OK(mod2.prepare(doc.root(), "", &execInfo2));
+ if (!execInfo2.noOp)
+ ASSERT_OK(mod2.apply());
+
+ ASSERT_EQUALS(result, doc);
+}
+
+TEST(DbUpdateTests, Bit1_3_Combined) {
+ Document doc(BSON("_id" << 1 << "x" << 3));
+ Mod mod(BSON("$bit" << BSON("x" << BSON("and" << 2 << "or" << 8))));
+ const BSONObj result(BSON("_id" << 1 << "x" << ((3 & 2) | 8)));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ if (!execInfo.noOp)
ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 7 }"), doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 7 } }"), logDoc);
- }
-
- TEST(SimpleMod, ApplyAndLogSimpleDocumentXor) {
- Document doc(fromjson("{ a : 5 }"));
- Mod mod(fromjson("{ $bit : { a : { xor : 6 } } }"));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
+ ASSERT_EQUALS(result, doc);
+
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("x" << ((3 & 2) | 8))), logDoc);
+}
+
+TEST(DbUpdateTests, Bit1_4) {
+ Document doc(BSON("_id" << 1 << "x" << 3));
+ Mod mod1(BSON("$bit" << BSON("x" << BSON("or" << 2))));
+ Mod mod2(BSON("$bit" << BSON("x" << BSON("and" << 8))));
+ const BSONObj result(BSON("_id" << 1 << "x" << ((3 | 2) & 8)));
+
+ ModifierInterface::ExecInfo execInfo1;
+ ASSERT_OK(mod1.prepare(doc.root(), "", &execInfo1));
+ if (!execInfo1.noOp)
+ ASSERT_OK(mod1.apply());
+
+ ModifierInterface::ExecInfo execInfo2;
+ ASSERT_OK(mod2.prepare(doc.root(), "", &execInfo2));
+ if (!execInfo2.noOp)
+ ASSERT_OK(mod2.apply());
+
+ ASSERT_EQUALS(result, doc);
+}
+
+TEST(DbUpdateTests, Bit1_4_Combined) {
+ Document doc(BSON("_id" << 1 << "x" << 3));
+ Mod mod(BSON("$bit" << BSON("x" << BSON("or" << 2 << "and" << 8))));
+ const BSONObj result(BSON("_id" << 1 << "x" << ((3 | 2) & 8)));
+
+ ModifierInterface::ExecInfo execInfo;
+ ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
+ if (!execInfo.noOp)
ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 3 }"), doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(fromjson("{ $set : { a : 3 } }"), logDoc);
- }
-
- TEST(InPlace, IntToIntAndIsInPlace) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(1))), logDoc);
- }
-
- TEST(InPlace, IntToIntOrIsInPlace) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(1))), logDoc);
- }
-
- TEST(InPlace, IntToIntXorIsInPlace) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0))), logDoc);
- }
-
- TEST(InPlace, LongToLongAndIsInPlace) {
- Document doc(BSON("a" << static_cast<long long>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(1))), logDoc);
- }
-
- TEST(InPlace, LongToLongOrIsInPlace) {
- Document doc(BSON("a" << static_cast<long long>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(1))), logDoc);
- }
-
- TEST(InPlace, LongToLongXorIsInPlace) {
- Document doc(BSON("a" << static_cast<long long>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<long long>(0))), logDoc);
- }
-
- TEST(InPlace, IntToLongAndIsNotInPlace) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- }
-
- TEST(InPlace, IntToLongOrIsNotInPlace) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- }
-
- TEST(InPlace, IntToLongXorIsNotInPlace) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
- }
-
- TEST(NoOp, IntAnd) {
- Document doc(BSON("a" << static_cast<int>(0xABCD1234U)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(0xFFFFFFFFU)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0xABCD1234U))), logDoc);
- }
-
- TEST(NoOp, IntOr) {
- Document doc(BSON("a" << static_cast<int>(0xABCD1234U)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(0x0U)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0xABCD1234U))), logDoc);
- }
-
- TEST(NoOp, IntXor) {
- Document doc(BSON("a" << static_cast<int>(0xABCD1234U)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(0x0U)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(0xABCD1234U))), logDoc);
- }
-
- TEST(NoOp, LongAnd) {
- Document doc(BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" <<
- static_cast<long long>(0xFFFFFFFFFFFFFFFFULL)))));
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" <<
- static_cast<long long>(0xABCD1234EF981234ULL))), logDoc);
- }
-
- TEST(NoOp, LongOr) {
- Document doc(BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(0x0ULL)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" <<
- static_cast<long long>(0xABCD1234EF981234ULL))), logDoc);
- }
- TEST(NoOp, LongXor) {
- Document doc(BSON("a" << static_cast<long long>(0xABCD1234EF981234ULL)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(0x0ULL)))));
+ ASSERT_EQUALS(result, doc);
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_TRUE(execInfo.noOp);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" <<
- static_cast<long long>(0xABCD1234EF981234ULL))), logDoc);
- }
-
- TEST(Upcasting, UpcastIntToLongAnd) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
- ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
- }
-
- TEST(Upcasting, UpcastIntToLongOr) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<long long>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
- ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
- }
-
- TEST(Upcasting, UpcastIntToLongXor) {
- Document doc(BSON("a" << static_cast<int>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<long long>(0)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 1 }"), doc);
- ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
- }
-
- TEST(Upcasting, LongsStayLongsAnd) {
- Document doc(BSON("a" << static_cast<long long>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("and" << static_cast<int>(2)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 0 }"), doc);
- ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
- }
-
- TEST(Upcasting, LongsStayLongsOr) {
- Document doc(BSON("a" << static_cast<long long>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(2)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 3 }"), doc);
- ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
- }
-
- TEST(Upcasting, LongsStayLongsXor) {
- Document doc(BSON("a" << static_cast<long long>(1)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("xor" << static_cast<int>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(fromjson("{ a : 0 }"), doc);
- ASSERT_EQUALS(mongo::NumberLong, doc.root()["a"].getType());
- }
-
- // The following tests are re-created from the previous $bit tests in updatetests.cpp. They
- // are probably redundant with the tests above in various ways.
-
- TEST(DbUpdateTests, BitRewriteExistingField) {
- Document doc(BSON("a" << static_cast<int>(0)));
- Mod mod(BSON("$bit" << BSON("a" << BSON("or" << static_cast<int>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_TRUE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(BSON("a" << static_cast<int>(1)), doc);
- ASSERT_EQUALS(mongo::NumberInt, doc.root()["a"].getType());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("a" << static_cast<int>(1))), logDoc);
- }
-
- TEST(DbUpdateTests, BitRewriteNonExistingField) {
- Document doc(BSON("a" << static_cast<int>(0)));
- Mod mod(BSON("$bit" << BSON("b" << BSON("or" << static_cast<int>(1)))));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- ASSERT_FALSE(execInfo.noOp);
-
- ASSERT_OK(mod.apply());
- ASSERT_FALSE(doc.isInPlaceModeEnabled());
- ASSERT_EQUALS(BSON("a" << static_cast<int>(0) << "b" << static_cast<int>(1)), doc);
- ASSERT_EQUALS(mongo::NumberInt, doc.root()["a"].getType());
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("b" << static_cast<int>(1))), logDoc);
- }
-
- TEST(DbUpdateTests, Bit1_1) {
- Document doc(BSON("_id" << 1 << "x" << 3));
- Mod mod(BSON("$bit" << BSON("x" << BSON("and" << 2))));
- const BSONObj result(BSON("_id" << 1 << "x" << (3 & 2)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- if (!execInfo.noOp)
- ASSERT_OK(mod.apply());
-
- ASSERT_EQUALS(result, doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("x" << (3 & 2))), logDoc);
- }
-
- TEST(DbUpdateTests, Bit1_2) {
- Document doc(BSON("_id" << 1 << "x" << 1));
- Mod mod(BSON("$bit" << BSON("x" << BSON("or" << 4))));
- const BSONObj result(BSON("_id" << 1 << "x" << (1 | 4)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- if (!execInfo.noOp)
- ASSERT_OK(mod.apply());
-
- ASSERT_EQUALS(result, doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("x" << (1 | 4))), logDoc);
- }
-
- TEST(DbUpdateTests, Bit1_3) {
- Document doc(BSON("_id" << 1 << "x" << 3));
- Mod mod1(BSON("$bit" << BSON("x" << BSON("and" << 2))));
- Mod mod2(BSON("$bit" << BSON("x" << BSON("or" << 8))));
- const BSONObj result(BSON("_id" << 1 << "x" << ((3 & 2) | 8)));
-
- ModifierInterface::ExecInfo execInfo1;
- ASSERT_OK(mod1.prepare(doc.root(), "", &execInfo1));
- if (!execInfo1.noOp)
- ASSERT_OK(mod1.apply());
-
- ModifierInterface::ExecInfo execInfo2;
- ASSERT_OK(mod2.prepare(doc.root(), "", &execInfo2));
- if (!execInfo2.noOp)
- ASSERT_OK(mod2.apply());
-
- ASSERT_EQUALS(result, doc);
- }
-
- TEST(DbUpdateTests, Bit1_3_Combined) {
- Document doc(BSON("_id" << 1 << "x" << 3));
- Mod mod(BSON("$bit" << BSON("x" << BSON("and" << 2 << "or" << 8))));
- const BSONObj result(BSON("_id" << 1 << "x" << ((3 & 2) | 8)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- if (!execInfo.noOp)
- ASSERT_OK(mod.apply());
-
- ASSERT_EQUALS(result, doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("x" << ((3 & 2) | 8))), logDoc);
- }
-
- TEST(DbUpdateTests, Bit1_4) {
- Document doc(BSON("_id" << 1 << "x" << 3));
- Mod mod1(BSON("$bit" << BSON("x" << BSON("or" << 2))));
- Mod mod2(BSON("$bit" << BSON("x" << BSON("and" << 8))));
- const BSONObj result(BSON("_id" << 1 << "x" << ((3 | 2) & 8)));
-
- ModifierInterface::ExecInfo execInfo1;
- ASSERT_OK(mod1.prepare(doc.root(), "", &execInfo1));
- if (!execInfo1.noOp)
- ASSERT_OK(mod1.apply());
-
- ModifierInterface::ExecInfo execInfo2;
- ASSERT_OK(mod2.prepare(doc.root(), "", &execInfo2));
- if (!execInfo2.noOp)
- ASSERT_OK(mod2.apply());
-
- ASSERT_EQUALS(result, doc);
- }
-
- TEST(DbUpdateTests, Bit1_4_Combined) {
- Document doc(BSON("_id" << 1 << "x" << 3));
- Mod mod(BSON("$bit" << BSON("x" << BSON("or" << 2 << "and" << 8))));
- const BSONObj result(BSON("_id" << 1 << "x" << ((3 | 2) & 8)));
-
- ModifierInterface::ExecInfo execInfo;
- ASSERT_OK(mod.prepare(doc.root(), "", &execInfo));
- if (!execInfo.noOp)
- ASSERT_OK(mod.apply());
-
- ASSERT_EQUALS(result, doc);
-
- Document logDoc;
- LogBuilder logBuilder(logDoc.root());
- ASSERT_OK(mod.log(&logBuilder));
- ASSERT_EQUALS(BSON("$set" << BSON("x" << ((3 | 2) & 8))), logDoc);
- }
+ Document logDoc;
+ LogBuilder logBuilder(logDoc.root());
+ ASSERT_OK(mod.log(&logBuilder));
+ ASSERT_EQUALS(BSON("$set" << BSON("x" << ((3 | 2) & 8))), logDoc);
+}
-} // namespace
+} // namespace