summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2017-12-12 14:56:42 -0500
committerMark Benvenuto <mark.benvenuto@mongodb.com>2017-12-12 14:56:42 -0500
commit143093d6a23b1b84274461bebb9e88e11b4f2a2f (patch)
tree59719b22d7ea4a66fad03744708768e123b534e7 /src
parent1cb47465e4d460a0a76ba9985d6adec4bc09cb38 (diff)
downloadmongo-143093d6a23b1b84274461bebb9e88e11b4f2a2f.tar.gz
SERVER-31705 IDL Generate Equality and Less than comparison operators
Diffstat (limited to 'src')
-rw-r--r--src/mongo/idl/idl_test.cpp104
-rw-r--r--src/mongo/idl/unittest.idl25
-rw-r--r--src/mongo/idl/unittest_import.idl13
3 files changed, 142 insertions, 0 deletions
diff --git a/src/mongo/idl/idl_test.cpp b/src/mongo/idl/idl_test.cpp
index fe2a845aa3d..4c871112b1b 100644
--- a/src/mongo/idl/idl_test.cpp
+++ b/src/mongo/idl/idl_test.cpp
@@ -174,6 +174,10 @@ void TestLoopback(TestT test_value) {
auto serializedDoc = builder.obj();
ASSERT_BSONOBJ_EQ(testDoc, serializedDoc);
+
+ // Validate the operator == works
+ // Use ASSERT instead of ASSERT_EQ to avoid operator<<
+ ASSERT(one_new == testStruct);
}
}
@@ -482,6 +486,102 @@ TEST(IDLStructTests, TestNonStrictStruct) {
}
}
+/// Struct default comparison tests
+TEST(IDLCompareTests, TestAllFields) {
+ IDLParserErrorContext ctxt("root");
+
+ // Positive: equality works
+ {
+ CompareAllField3 origStruct;
+ origStruct.setField1(12);
+ origStruct.setField2(123);
+ origStruct.setField3(1234);
+
+ auto testDoc = BSON("field1" << 12 << "field2" << 123 << "field3" << 1234);
+ auto parsedStruct = CompareAllField3::parse(ctxt, testDoc);
+
+ // Avoid ASSET_<RelOp> to avoid operator <<
+ ASSERT_TRUE(origStruct == parsedStruct);
+ ASSERT_FALSE(origStruct != parsedStruct);
+ ASSERT_FALSE(origStruct < parsedStruct);
+ ASSERT_FALSE(parsedStruct < origStruct);
+ }
+
+ // Positive: not equality works in field 3
+ {
+ CompareAllField3 origStruct;
+ origStruct.setField1(12);
+ origStruct.setField2(123);
+ origStruct.setField3(12345);
+
+ auto testDoc = BSON("field1" << 12 << "field2" << 123 << "field3" << 1234);
+ auto parsedStruct = CompareAllField3::parse(ctxt, testDoc);
+
+ // Avoid ASSET_<RelOp> to avoid operator <<
+ ASSERT_FALSE(origStruct == parsedStruct);
+ ASSERT_TRUE(origStruct != parsedStruct);
+ ASSERT_FALSE(origStruct < parsedStruct);
+ ASSERT_TRUE(parsedStruct < origStruct);
+ }
+}
+
+
+/// Struct partial comparison tests
+TEST(IDLCompareTests, TestSomeFields) {
+ IDLParserErrorContext ctxt("root");
+
+ // Positive: partial equality works when field 2 is different
+ {
+ CompareSomeField3 origStruct;
+ origStruct.setField1(12);
+ origStruct.setField2(12345);
+ origStruct.setField3(1234);
+
+ auto testDoc = BSON("field1" << 12 << "field2" << 123 << "field3" << 1234);
+ auto parsedStruct = CompareSomeField3::parse(ctxt, testDoc);
+
+ // Avoid ASSET_<RelOp> to avoid operator <<
+ ASSERT_TRUE(origStruct == parsedStruct);
+ ASSERT_FALSE(origStruct != parsedStruct);
+ ASSERT_FALSE(origStruct < parsedStruct);
+ ASSERT_FALSE(parsedStruct < origStruct);
+ }
+
+ // Positive: partial equality works when field 3 is different
+ {
+ CompareSomeField3 origStruct;
+ origStruct.setField1(12);
+ origStruct.setField2(1);
+ origStruct.setField3(12345);
+
+ auto testDoc = BSON("field1" << 12 << "field2" << 123 << "field3" << 1234);
+ auto parsedStruct = CompareSomeField3::parse(ctxt, testDoc);
+
+ // Avoid ASSET_<RelOp> to avoid operator <<
+ ASSERT_FALSE(origStruct == parsedStruct);
+ ASSERT_TRUE(origStruct != parsedStruct);
+ ASSERT_FALSE(origStruct < parsedStruct);
+ ASSERT_TRUE(parsedStruct < origStruct);
+ }
+
+ // Positive: partial equality works when field 1 is different
+ {
+ CompareSomeField3 origStruct;
+ origStruct.setField1(123);
+ origStruct.setField2(1);
+ origStruct.setField3(1234);
+
+ auto testDoc = BSON("field1" << 12 << "field2" << 123 << "field3" << 1234);
+ auto parsedStruct = CompareSomeField3::parse(ctxt, testDoc);
+
+ // Avoid ASSET_<RelOp> to avoid operator <<
+ ASSERT_FALSE(origStruct == parsedStruct);
+ ASSERT_TRUE(origStruct != parsedStruct);
+ ASSERT_FALSE(origStruct < parsedStruct);
+ ASSERT_TRUE(parsedStruct < origStruct);
+ }
+}
+
/// Field tests
// Positive: check ignored field is ignored
TEST(IDLFieldTests, TestStrictStructIgnoredField) {
@@ -959,6 +1059,10 @@ void TestBinDataVector() {
auto serializedDoc = builder.obj();
ASSERT_BSONOBJ_EQ(testDoc, serializedDoc);
+
+ // Validate the operator == works
+ // Use ASSERT instead of ASSERT_EQ to avoid operator<<
+ ASSERT(one_new == testStruct);
}
}
diff --git a/src/mongo/idl/unittest.idl b/src/mongo/idl/unittest.idl
index 159977fadeb..f2e43c056c7 100644
--- a/src/mongo/idl/unittest.idl
+++ b/src/mongo/idl/unittest.idl
@@ -165,6 +165,31 @@ structs:
type: int
cpp_name: cppField3
+##################################################################################################
+#
+# Structs to test comparison options
+#
+##################################################################################################
+ CompareAllField3:
+ description: UnitTest for a struct with 3 int fields to test comparison
+ generate_comparison_operators: true
+ fields:
+ field1: int
+ field2: int
+ field3: int
+
+ CompareSomeField3:
+ description: |
+ UnitTest for a struct with 3 int fields to test comparison, but only 2 are compared.
+ generate_comparison_operators: true
+ fields:
+ field3:
+ type: int
+ comparison_order: 3
+ field2: int
+ field1:
+ type: int
+ comparison_order: 1
##################################################################################################
#
diff --git a/src/mongo/idl/unittest_import.idl b/src/mongo/idl/unittest_import.idl
index 9cf75014cd8..4d71bad8ec4 100644
--- a/src/mongo/idl/unittest_import.idl
+++ b/src/mongo/idl/unittest_import.idl
@@ -30,21 +30,25 @@ imports:
structs:
one_string:
description: UnitTest for a single string
+ generate_comparison_operators: true
fields:
value: string
one_int:
description: UnitTest for a single int
+ generate_comparison_operators: true
fields:
value: int
one_long:
description: UnitTest for a single long
+ generate_comparison_operators: true
fields:
value: long
one_double:
description: UnitTest for a single double
+ generate_comparison_operators: true
fields:
value: double
@@ -55,46 +59,55 @@ structs:
one_bool:
description: UnitTest for a single bool
+ generate_comparison_operators: true
fields:
value: bool
one_bindata:
description: UnitTest for a single bindata_generic
+ generate_comparison_operators: true
fields:
value: bindata_generic
one_function:
description: UnitTest for a single bindata_function
+ generate_comparison_operators: true
fields:
value: bindata_function
one_uuid:
description: UnitTest for a single bindata_uuid
+ generate_comparison_operators: true
fields:
value: bindata_uuid
one_md5:
description: UnitTest for a single bindata_md5
+ generate_comparison_operators: true
fields:
value: bindata_md5
one_objectid:
description: UnitTest for a single objectid
+ generate_comparison_operators: true
fields:
value: objectid
one_date:
description: UnitTest for a single date
+ generate_comparison_operators: true
fields:
value: date
one_timestamp:
description: UnitTest for a single timestamp
+ generate_comparison_operators: true
fields:
value: timestamp
one_UUID:
description: UnitTest for a single UUID
+ generate_comparison_operators: true
fields:
value: uuid