From 5997c39189620452169b1b07aad32e6dd716e986 Mon Sep 17 00:00:00 2001
From: Tobias Knopff <t.knopff@fz-juelich.de>
Date: Tue, 27 Apr 2021 08:46:21 +0200
Subject: [PATCH] Make MaterialItem::P_MATERIAL_DATA private

---
 GUI/coregui/Models/MaterialItem.cpp       | 35 +++++++++++++++++
 GUI/coregui/Models/MaterialItem.h         | 14 ++++++-
 Tests/UnitTests/GUI/TestMaterialModel.cpp | 46 ++++++++++++++++++-----
 3 files changed, 83 insertions(+), 12 deletions(-)

diff --git a/GUI/coregui/Models/MaterialItem.cpp b/GUI/coregui/Models/MaterialItem.cpp
index 407aa4ebc5e..3aec3fe6a79 100644
--- a/GUI/coregui/Models/MaterialItem.cpp
+++ b/GUI/coregui/Models/MaterialItem.cpp
@@ -59,6 +59,41 @@ void MaterialItem::setSLDData(double sld_real, double sld_imag)
     sldData->setItemValue(MaterialSLDDataItem::P_SLD_IMAG, sld_imag);
 }
 
+bool MaterialItem::isRefractive() const
+{
+    SessionItem* data = getGroupItem(P_MATERIAL_DATA);
+    ASSERT(data);
+    return dynamic_cast<MaterialRefractiveDataItem*>(data) != nullptr;
+}
+
+double MaterialItem::refractiveDataDelta() const
+{
+    ASSERT(isRefractive());
+    return getGroupItem(P_MATERIAL_DATA)
+        ->getItemValue(MaterialRefractiveDataItem::P_DELTA).toDouble();
+}
+
+double MaterialItem::refractiveDataBeta() const
+{
+    ASSERT(isRefractive());
+    return getGroupItem(P_MATERIAL_DATA)
+        ->getItemValue(MaterialRefractiveDataItem::P_BETA).toDouble();
+}
+
+double MaterialItem::SLDDataReal() const
+{
+    ASSERT(!isRefractive());
+    return getGroupItem(P_MATERIAL_DATA)
+        ->getItemValue(MaterialSLDDataItem::P_SLD_REAL).toDouble();
+}
+
+double MaterialItem::SLDDataImag() const
+{
+    ASSERT(!isRefractive());
+    return getGroupItem(P_MATERIAL_DATA)
+        ->getItemValue(MaterialSLDDataItem::P_SLD_IMAG).toDouble();
+}
+
 QString MaterialItem::identifier() const
 {
     return getItemValue(P_IDENTIFIER).toString();
diff --git a/GUI/coregui/Models/MaterialItem.h b/GUI/coregui/Models/MaterialItem.h
index c837ac2ce6b..687b6bcf839 100644
--- a/GUI/coregui/Models/MaterialItem.h
+++ b/GUI/coregui/Models/MaterialItem.h
@@ -22,8 +22,8 @@ class Material;
 class BA_CORE_API_ MaterialItem : public SessionItem {
 private:
     static const QString P_COLOR;
-public:
     static const QString P_MATERIAL_DATA;
+public:
     static const QString P_MAGNETIZATION;
 private:
     static const QString P_IDENTIFIER;
@@ -33,7 +33,17 @@ public:
 
     void setRefractiveData(double delta, double beta);
     void setSLDData(double sld_real, double sld_imag);
-
+    /// \return true iff material is refractive, and SLD otherwise
+    bool isRefractive() const;
+    /// \pre isRefractive
+    double refractiveDataDelta() const;
+    /// \pre isRefractive
+    double refractiveDataBeta() const;
+    /// \pre ! isRefractive
+    double SLDDataReal() const;
+    /// \pre ! isRefractive
+    double SLDDataImag() const;
+    
     QString identifier() const;
     void setIdentifier(const QString& id);
     
diff --git a/Tests/UnitTests/GUI/TestMaterialModel.cpp b/Tests/UnitTests/GUI/TestMaterialModel.cpp
index 1aae2389cb5..6a65f498089 100644
--- a/Tests/UnitTests/GUI/TestMaterialModel.cpp
+++ b/Tests/UnitTests/GUI/TestMaterialModel.cpp
@@ -22,9 +22,9 @@ TEST_F(TestMaterialModel, addRefractiveMaterial)
     EXPECT_EQ(model->rowCount(QModelIndex()), 1);
 
     EXPECT_EQ(material->itemName(), name);
-    auto materialData = material->getGroupItem(MaterialItem::P_MATERIAL_DATA);
-    EXPECT_EQ(materialData->getItemValue(MaterialRefractiveDataItem::P_DELTA), delta);
-    EXPECT_EQ(materialData->getItemValue(MaterialRefractiveDataItem::P_BETA), beta);
+    EXPECT_TRUE(material->isRefractive());
+    EXPECT_EQ(material->refractiveDataDelta(), delta);
+    EXPECT_EQ(material->refractiveDataBeta(), beta);
 }
 
 TEST_F(TestMaterialModel, addSLDMaterial)
@@ -42,12 +42,12 @@ TEST_F(TestMaterialModel, addSLDMaterial)
     EXPECT_EQ(model->rowCount(QModelIndex()), 1);
 
     EXPECT_EQ(material->itemName(), name);
-    auto materialData = material->getGroupItem(MaterialItem::P_MATERIAL_DATA);
-    EXPECT_EQ(materialData->getItemValue(MaterialSLDDataItem::P_SLD_REAL), sld_real);
-    EXPECT_EQ(materialData->getItemValue(MaterialSLDDataItem::P_SLD_IMAG), sld_imag);
+    EXPECT_FALSE(material->isRefractive());
+    EXPECT_EQ(material->SLDDataReal(), sld_real);
+    EXPECT_EQ(material->SLDDataImag(), sld_imag);
 }
 
-TEST_F(TestMaterialModel, cloneMaterial)
+TEST_F(TestMaterialModel, cloneMaterialRefractive)
 {
     std::unique_ptr<MaterialModel> model(new MaterialModel);
 
@@ -69,10 +69,36 @@ TEST_F(TestMaterialModel, cloneMaterial)
 
     // checking name of cloned material
     EXPECT_EQ(material->itemName() + " (clone)", clonedMaterial->itemName());
+    EXPECT_EQ(material->isRefractive(), clonedMaterial->isRefractive());
+    EXPECT_EQ(material->refractiveDataDelta(), delta);
+    EXPECT_EQ(material->refractiveDataBeta(), beta);
+}
+
+TEST_F(TestMaterialModel, cloneMaterialSLD)
+{
+    std::unique_ptr<MaterialModel> model(new MaterialModel);
+
+    EXPECT_EQ(model->rowCount(QModelIndex()), 0);
+
+    const double real(0.7), imag(0.5);
+    const QString name("MaterialName");
+    auto material = model->addSLDMaterial(name, real, imag);
+    const QString origIdentifier = material->identifier();
+
+    auto clonedMaterial = model->cloneMaterial(material->index());
+    EXPECT_EQ(model->rowCount(QModelIndex()), 2);
+
+    // clone should not change identifier of original material (as it once happened)
+    EXPECT_EQ(material->identifier(), origIdentifier);
 
-    auto materialData = clonedMaterial->getGroupItem(MaterialItem::P_MATERIAL_DATA);
-    EXPECT_EQ(materialData->getItemValue(MaterialRefractiveDataItem::P_DELTA), delta);
-    EXPECT_EQ(materialData->getItemValue(MaterialRefractiveDataItem::P_BETA), beta);
+    // cloned material should have different identifier
+    EXPECT_TRUE(clonedMaterial->identifier() != material->identifier());
+
+    // checking name of cloned material
+    EXPECT_EQ(material->itemName() + " (clone)", clonedMaterial->itemName());
+    EXPECT_EQ(material->isRefractive(), clonedMaterial->isRefractive());
+    EXPECT_EQ(material->SLDDataReal(), real);
+    EXPECT_EQ(material->SLDDataImag(), imag);
 }
 
 //! Checks the method which returns MaterialItem from known identifier.
-- 
GitLab