@@ -1912,6 +1912,91 @@ TEST(MessageDifferencerTest, RepeatedFieldSetTest_Combination) {
19121912 EXPECT_TRUE (differencer2.Compare (msg1, msg2));
19131913}
19141914
1915+ // This class is a comparator that uses the default comparator, but counts how
1916+ // many times it was called.
1917+ class CountingComparator : public util ::SimpleFieldComparator {
1918+ public:
1919+ ComparisonResult Compare (const Message& message_1, const Message& message_2,
1920+ const FieldDescriptor* field, int index_1,
1921+ int index_2,
1922+ const util::FieldContext* field_context) override {
1923+ ++compare_count_;
1924+ return SimpleCompare (message_1, message_2, field, index_1, index_2,
1925+ field_context);
1926+ }
1927+
1928+ int compare_count () const { return compare_count_; }
1929+
1930+ private:
1931+ int compare_count_ = 0 ;
1932+ };
1933+
1934+ TEST (MessageDifferencerTest, RepeatedFieldSet_RecursivePerformance) {
1935+ constexpr int kDepth = 20 ;
1936+
1937+ protobuf_unittest::TestField left;
1938+ protobuf_unittest::TestField* p = &left;
1939+ for (int i = 0 ; i < kDepth ; ++i) {
1940+ p = p->add_rm ();
1941+ }
1942+
1943+ protobuf_unittest::TestField right = left;
1944+ util::MessageDifferencer differencer;
1945+ differencer.set_repeated_field_comparison (
1946+ util::MessageDifferencer::RepeatedFieldComparison::AS_SET);
1947+ CountingComparator comparator;
1948+ differencer.set_field_comparator (&comparator);
1949+ std::string report;
1950+ differencer.ReportDifferencesToString (&report);
1951+ differencer.Compare (left, right);
1952+
1953+ EXPECT_LE (comparator.compare_count (), kDepth * kDepth );
1954+ }
1955+
1956+ TEST (MessageDifferencerTest, RepeatedFieldSmartSet_RecursivePerformance) {
1957+ constexpr int kDepth = 20 ;
1958+
1959+ protobuf_unittest::TestField left;
1960+ protobuf_unittest::TestField* p = &left;
1961+ for (int i = 0 ; i < kDepth ; ++i) {
1962+ p = p->add_rm ();
1963+ }
1964+
1965+ protobuf_unittest::TestField right = left;
1966+ util::MessageDifferencer differencer;
1967+ differencer.set_repeated_field_comparison (
1968+ util::MessageDifferencer::RepeatedFieldComparison::AS_SMART_SET);
1969+ CountingComparator comparator;
1970+ differencer.set_field_comparator (&comparator);
1971+ std::string report;
1972+ differencer.ReportDifferencesToString (&report);
1973+ differencer.Compare (left, right);
1974+
1975+ EXPECT_LE (comparator.compare_count (), kDepth * kDepth );
1976+ }
1977+
1978+ TEST (MessageDifferencerTest, RepeatedFieldSmartList_RecursivePerformance) {
1979+ constexpr int kDepth = 20 ;
1980+
1981+ protobuf_unittest::TestField left;
1982+ protobuf_unittest::TestField* p = &left;
1983+ for (int i = 0 ; i < kDepth ; ++i) {
1984+ p = p->add_rm ();
1985+ }
1986+
1987+ protobuf_unittest::TestField right = left;
1988+ util::MessageDifferencer differencer;
1989+ differencer.set_repeated_field_comparison (
1990+ util::MessageDifferencer::RepeatedFieldComparison::AS_SMART_LIST);
1991+ CountingComparator comparator;
1992+ differencer.set_field_comparator (&comparator);
1993+ std::string report;
1994+ differencer.ReportDifferencesToString (&report);
1995+ differencer.Compare (left, right);
1996+
1997+ EXPECT_LE (comparator.compare_count (), kDepth * kDepth );
1998+ }
1999+
19152000TEST (MessageDifferencerTest, RepeatedFieldMapTest_Partial) {
19162001 protobuf_unittest::TestDiffMessage msg1;
19172002 // message msg1 {
0 commit comments