diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2017-12-12 14:56:42 -0500 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2017-12-12 14:56:42 -0500 |
commit | 143093d6a23b1b84274461bebb9e88e11b4f2a2f (patch) | |
tree | 59719b22d7ea4a66fad03744708768e123b534e7 /src | |
parent | 1cb47465e4d460a0a76ba9985d6adec4bc09cb38 (diff) | |
download | mongo-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.cpp | 104 | ||||
-rw-r--r-- | src/mongo/idl/unittest.idl | 25 | ||||
-rw-r--r-- | src/mongo/idl/unittest_import.idl | 13 |
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 |