summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/collation
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2016-12-02 13:48:23 -0500
committerDavid Storch <david.storch@10gen.com>2016-12-06 12:58:40 -0500
commit6f1824c8ff3b211f72e706de32b9637750cccf1e (patch)
tree0a4b2712bad469ace0ccef39b3496fa68ddf8bba /src/mongo/db/query/collation
parent6bee18129c27a82ebcbd316c7900afb04c6f69dc (diff)
downloadmongo-6f1824c8ff3b211f72e706de32b9637750cccf1e.tar.gz
SERVER-27197 fix BSONType::Code comparison to not use collator
Diffstat (limited to 'src/mongo/db/query/collation')
-rw-r--r--src/mongo/db/query/collation/collation_bson_comparison_test.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/mongo/db/query/collation/collation_bson_comparison_test.cpp b/src/mongo/db/query/collation/collation_bson_comparison_test.cpp
index fc07f1ac244..1521af1f146 100644
--- a/src/mongo/db/query/collation/collation_bson_comparison_test.cpp
+++ b/src/mongo/db/query/collation/collation_bson_comparison_test.cpp
@@ -102,5 +102,108 @@ TEST(CollationBSONComparisonTest, HashingCodeWScopeObjWithCollationShouldNotResp
ASSERT_NE(comparator.hash(obj1), comparator.hash(obj2));
}
+TEST(CollationBSONComparisonTest, ElementStringComparisonShouldRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONElementComparator comparator(BSONElementComparator::FieldNamesMode::kConsider,
+ &collator);
+ BSONObj obj1 = BSON("a"
+ << "foo");
+ BSONObj obj2 = BSON("a"
+ << "not foo");
+ ASSERT(comparator.evaluate(obj1["a"] == obj2["a"]));
+}
+
+TEST(CollationBSONComparisonTest, ElementStringHashShouldRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONElementComparator comparator(BSONElementComparator::FieldNamesMode::kConsider,
+ &collator);
+ BSONObj obj1 = BSON("a"
+ << "foo");
+ BSONObj obj2 = BSON("a"
+ << "not foo");
+ ASSERT_EQ(comparator.hash(obj1["a"]), comparator.hash(obj2["a"]));
+}
+
+TEST(CollationBSONComparisonTest, ObjStringComparisonShouldRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONObjComparator comparator(
+ BSONObj(), BSONObjComparator::FieldNamesMode::kConsider, &collator);
+ BSONObj obj1 = BSON("a"
+ << "foo");
+ BSONObj obj2 = BSON("a"
+ << "not foo");
+ ASSERT(comparator.evaluate(obj1 == obj2));
+}
+
+TEST(CollationBSONComparisonTest, ObjStringHashShouldRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONObjComparator comparator(
+ BSONObj(), BSONObjComparator::FieldNamesMode::kConsider, &collator);
+ BSONObj obj1 = BSON("a"
+ << "foo");
+ BSONObj obj2 = BSON("a"
+ << "not foo");
+ ASSERT_EQ(comparator.hash(obj1), comparator.hash(obj2));
+}
+
+TEST(CollationBSONComparisonTest, ElementCodeComparisonShouldNotRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONElementComparator comparator(BSONElementComparator::FieldNamesMode::kConsider,
+ &collator);
+ BSONObj obj1 = BSON("a" << BSONCode("foo"));
+ BSONObj obj2 = BSON("a" << BSONCode("not foo"));
+ ASSERT(comparator.evaluate(obj1["a"] != obj2["a"]));
+}
+
+TEST(CollationBSONComparisonTest, ElementCodeHashShouldNotRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONElementComparator comparator(BSONElementComparator::FieldNamesMode::kConsider,
+ &collator);
+ BSONObj obj1 = BSON("a" << BSONCode("foo"));
+ BSONObj obj2 = BSON("a" << BSONCode("not foo"));
+ ASSERT_NE(comparator.hash(obj1["a"]), comparator.hash(obj2["a"]));
+}
+
+TEST(CollationBSONComparisonTest, ObjCodeComparisonShouldNotRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONObjComparator comparator(
+ BSONObj(), BSONObjComparator::FieldNamesMode::kConsider, &collator);
+ BSONObj obj1 = BSON("a" << BSONCode("foo"));
+ BSONObj obj2 = BSON("a" << BSONCode("not foo"));
+ ASSERT(comparator.evaluate(obj1 != obj2));
+}
+
+TEST(CollationBSONComparisonTest, ObjCodeHashShouldNotRespectCollation) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONObjComparator comparator(
+ BSONObj(), BSONObjComparator::FieldNamesMode::kConsider, &collator);
+ BSONObj obj1 = BSON("a" << BSONCode("foo"));
+ BSONObj obj2 = BSON("a" << BSONCode("not foo"));
+ ASSERT_NE(comparator.hash(obj1), comparator.hash(obj2));
+}
+
+TEST(CollationBSONComparisonTest, IdenticalCodeAndStringValuesAreNotEqual) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONObjComparator comparator(
+ BSONObj(), BSONObjComparator::FieldNamesMode::kConsider, &collator);
+ BSONObj obj1 = BSON("a"
+ << "foo");
+ BSONObj obj2 = BSON("a" << BSONCode("foo"));
+ ASSERT_BSONOBJ_NE(obj1, obj2);
+ ASSERT(comparator.evaluate(obj1 != obj2));
+}
+
+TEST(CollationBSONComparisonTest, IdenticalCodeAndStringValuesDoNotHashEqually) {
+ const CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kAlwaysEqual);
+ const BSONObjComparator comparator(
+ BSONObj(), BSONObjComparator::FieldNamesMode::kConsider, &collator);
+ BSONObj obj1 = BSON("a"
+ << "foo");
+ BSONObj obj2 = BSON("a" << BSONCode("foo"));
+ ASSERT_NE(comparator.hash(obj1), comparator.hash(obj2));
+ ASSERT_NE(SimpleBSONObjComparator::kInstance.hash(obj1),
+ SimpleBSONObjComparator::kInstance.hash(obj2));
+}
+
} // namespace
} // namespace mongo