diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index eca62141f..c0f897c06 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -257,3 +257,24 @@ PackageTreeItem::toOperation() const return m_packageName; } } + +bool +PackageTreeItem::operator==( const PackageTreeItem& rhs ) const +{ + if ( isGroup() != rhs.isGroup() ) + { + // Different kinds + return false; + } + + if ( isGroup() ) + { + return name() == rhs.name() && description() == rhs.description() && preScript() == rhs.preScript() + && postScript() == rhs.postScript() && isCritical() == rhs.isCritical() && isHidden() == rhs.isHidden() + && m_showReadOnly == rhs.m_showReadOnly && expandOnStart() == rhs.expandOnStart(); + } + else + { + return packageName() == rhs.packageName(); + } +} diff --git a/src/modules/netinstall/PackageTreeItem.h b/src/modules/netinstall/PackageTreeItem.h index c35b98eea..3f7dcce86 100644 --- a/src/modules/netinstall/PackageTreeItem.h +++ b/src/modules/netinstall/PackageTreeItem.h @@ -116,6 +116,16 @@ public: // QStandardItem methods int type() const override; + /** @brief Are two items equal + * + * This **disregards** parent-item and the child-items, and compares + * only the fields for the items-proper (name, .. expanded). Note + * also that *isSelected()* is a run-time state, and is **not** + * compared either. + */ + bool operator==( const PackageTreeItem& rhs ) const; + bool operator!=( const PackageTreeItem& rhs ) const { return !( *this == rhs ); } + private: PackageTreeItem* m_parentItem; List m_childItems; diff --git a/src/modules/netinstall/Tests.cpp b/src/modules/netinstall/Tests.cpp index 420b690aa..ddcf8076b 100644 --- a/src/modules/netinstall/Tests.cpp +++ b/src/modules/netinstall/Tests.cpp @@ -37,6 +37,7 @@ private Q_SLOTS: void testRoot(); void testPackage(); void testGroup(); + void testCompare(); }; ItemTests::ItemTests() {} @@ -56,6 +57,8 @@ ItemTests::testRoot() QCOMPARE( r.name(), QStringLiteral( "" ) ); QCOMPARE( r.parentItem(), nullptr ); QVERIFY( r.isGroup() ); + + QVERIFY( r == r ); } void @@ -72,6 +75,7 @@ ItemTests::testPackage() QVERIFY( !p.isCritical() ); QVERIFY( !p.isGroup() ); QVERIFY( p.isPackage() ); + QVERIFY( p == p ); // This doesn't happen in normal constructions, // because a package can't have children. @@ -82,6 +86,8 @@ ItemTests::testPackage() QCOMPARE( c.parentItem(), &p ); QVERIFY( !c.isGroup() ); QVERIFY( c.isPackage() ); + QVERIFY( c == c ); + QVERIFY( c != p ); QCOMPARE( p.childCount(), 0 ); // not noticed it has a child } @@ -93,7 +99,13 @@ static const char doc[] = " description: \"Tools for the Chakra Community Repository\"\n" " packages:\n" " - ccr\n" -" - base-devel\n"; +" - base-devel\n" +" - bash\n"; + +static const char doc_no_packages[] = +"- name: \"CCR\"\n" +" description: \"Tools for the Chakra Community Repository\"\n" +" packages: []\n"; // *INDENT-ON* // clang-format on @@ -116,8 +128,72 @@ ItemTests::testGroup() QCOMPARE( p.childCount(), 0 ); QVERIFY( p.isGroup() ); QVERIFY( !p.isPackage() ); + QVERIFY( p == p ); + + PackageTreeItem c( "zsh", nullptr ); + QVERIFY( p != c ); } +void +ItemTests::testCompare() +{ + PackageTreeItem p0( "bash", nullptr ); + PackageTreeItem p1( "bash", &p0 ); + PackageTreeItem p2( "bash", nullptr ); + + QVERIFY( p0 == p1 ); // Parent doesn't matter + QVERIFY( p0 == p2 ); + + p2.setSelected( Qt::Checked ); + p1.setSelected( Qt::Unchecked ); + QVERIFY( p0 == p1 ); // Neither does selected state + QVERIFY( p0 == p2 ); + + PackageTreeItem r0( nullptr ); + QVERIFY( p0 != r0 ); + QVERIFY( p1 != r0 ); + QVERIFY( r0 == r0 ); + PackageTreeItem r1( nullptr ); + QVERIFY( r0 == r1 ); // Different roots are still equal + + PackageTreeItem r2( "", nullptr ); // Fake root + QVERIFY( r0 != r2 ); + QVERIFY( r1 != r2 ); + QVERIFY( p0 != r2 ); + PackageTreeItem r3( "", nullptr ); + QVERIFY( r3 == r2 ); + + YAML::Node yamldoc = YAML::Load( doc ); // See testGroup() + QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc ); + QCOMPARE( yamlContents.length(), 1 ); + + PackageTreeItem p3( yamlContents[ 0 ].toMap(), nullptr ); + QVERIFY( p3 == p3 ); + QVERIFY( p3 != p1 ); + QVERIFY( p1 != p3 ); + QCOMPARE( p3.childCount(), 0 ); // Doesn't load the packages: list + + PackageTreeItem p4( CalamaresUtils::yamlSequenceToVariant( YAML::Load( doc ) )[ 0 ].toMap(), nullptr ); + QVERIFY( p3 == p4 ); + PackageTreeItem p5( CalamaresUtils::yamlSequenceToVariant( YAML::Load( doc_no_packages ) )[ 0 ].toMap(), nullptr ); + QVERIFY( p3 == p5 ); + +#if 0 + // Check that the sub-packages loaded correctly + bool found_one_bash = false; + for ( int i = 0; i < p3.childCount(); ++i ) + { + QVERIFY( p3.child( i )->isPackage() ); + if ( p0 == *p3.child( i ) ) + { + found_one_bash = true; + } + } + QVERIFY( found_one_bash ); +#endif +} + + QTEST_GUILESS_MAIN( ItemTests ) #include "utils/moc-warnings.h"