diff --git a/Core/Samples/src/Layer.cpp b/Core/Samples/src/Layer.cpp index 6d7706bf2f540fcd006db672ab6b1ccf0b147b93..3dad82b760e85e4c8495ea8f7af0fa16ef649783 100644 --- a/Core/Samples/src/Layer.cpp +++ b/Core/Samples/src/Layer.cpp @@ -31,9 +31,12 @@ Layer::Layer() } Layer::Layer(const IMaterial* material, double thickness, IDecoration *decoration) - : m_thickness(thickness) + : m_thickness(0) , mp_decoration(0) { + if (thickness < 0.) + throw DomainErrorException("Layer thickness cannot be negative"); + m_thickness = thickness; setName("Layer"); setDecorationPtr(decoration); setMaterial(material); diff --git a/Core/Samples/src/MultiLayer.cpp b/Core/Samples/src/MultiLayer.cpp index f328d228b2da56d43be7bc9d0b17cda9ef06c1bd..71779d669f27deddb4874733e96d317fd391daf5 100644 --- a/Core/Samples/src/MultiLayer.cpp +++ b/Core/Samples/src/MultiLayer.cpp @@ -207,6 +207,9 @@ double MultiLayer::getCrossCorrSpectralFun(const kvector_t& kvec, size_t j, size void MultiLayer::setLayerThickness(size_t i_layer, double thickness) { + if (thickness < 0.) + throw DomainErrorException("Layer thickness cannot be negative"); + m_layers[ check_layer_index(i_layer) ]->setThickness(thickness); // recalculating z-coordinates of layers m_layers_z.clear(); diff --git a/Tests/UnitTests/TestCore/MultiLayerTest.h b/Tests/UnitTests/TestCore/MultiLayerTest.h index 117533e4148dc56dfb46efb5773117343f429efc..ac5578d26f3c160a6a54be415c0d7e2172368b02 100644 --- a/Tests/UnitTests/TestCore/MultiLayerTest.h +++ b/Tests/UnitTests/TestCore/MultiLayerTest.h @@ -15,33 +15,27 @@ protected: virtual ~MultiLayerTest(){} }; -TEST_F(MultiLayerTest, MultiLayerBasicProperty) +TEST_F(MultiLayerTest, BasicProperty) { MultiLayer mLayer; + //check default properties + EXPECT_EQ("MultiLayer", mLayer.getName()); + EXPECT_EQ(0.0, mLayer.getCrossCorrLength()); + EXPECT_EQ(size_t(0), mLayer.getNumberOfLayers()); + EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces()); + //set parameter + mLayer.setParameterValue("crossCorrLength", -2.54); + EXPECT_EQ(-2.54,mLayer.getCrossCorrLength()); + // adding layers const IMaterial *air = MaterialManager::getHomogeneousMaterial("air",0,1.0); const IMaterial *iron = MaterialManager::getHomogeneousMaterial("iron",0,1.51); const IMaterial *chromium = MaterialManager::getHomogeneousMaterial("chromium",0,3.68); const IMaterial *stone = MaterialManager::getHomogeneousMaterial("stone",0,1.6); - Layer airLayer(air, 0*Units::nanometer); Layer ironLayer(iron, 20*Units::nanometer); Layer chromiumLayer(chromium, 40*Units::nanometer); Layer stoneLayer(stone, 0*Units::nanometer); - - //check default properties - EXPECT_EQ("MultiLayer", mLayer.getName()); - EXPECT_EQ(0.0,mLayer.getCrossCorrLength()); - EXPECT_EQ(size_t(0), mLayer.getNumberOfLayers()); - EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces()); - - - //set parameter - mLayer.setParameterValue("crossCorrLength", -2.54); - EXPECT_EQ(-2.54,mLayer.getCrossCorrLength()); - - - mLayer.addLayer(airLayer); EXPECT_EQ(size_t(1), mLayer.getNumberOfLayers()); EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces()); @@ -54,7 +48,7 @@ TEST_F(MultiLayerTest, MultiLayerBasicProperty) } -TEST_F(MultiLayerTest, MultiLayerThickness) +TEST_F(MultiLayerTest, LayerThicknesses) { MultiLayer mLayer; @@ -79,7 +73,6 @@ TEST_F(MultiLayerTest, MultiLayerThickness) EXPECT_EQ(40.0, mLayer.getLayerThickness(2)); EXPECT_EQ(0.0, mLayer.getLayerThickness(3)); - //check bottomZ value EXPECT_EQ(0.0, mLayer.getLayerBottomZ(0)); EXPECT_EQ(-20.0, mLayer.getLayerBottomZ(1)); @@ -94,41 +87,10 @@ TEST_F(MultiLayerTest, MultiLayerThickness) EXPECT_EQ(-45.0, mLayer.getLayerBottomZ(1)); EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(2)); EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(3)); - - - //negative thickness??!! - MultiLayer mLayer2; - - Layer airLayer2(air, 0*Units::nanometer); - Layer ironLayer2(iron, -100*Units::nanometer); - Layer chromiumLayer2(chromium, 40*Units::nanometer); - Layer stoneLayer2(stone, 0*Units::nanometer); - - mLayer2.addLayer(airLayer2); - mLayer2.addLayer(ironLayer2); - mLayer2.addLayer(chromiumLayer2); - mLayer2.addLayer(stoneLayer2); - - //check layer thickness - EXPECT_EQ(0.0, mLayer2.getLayerThickness(0)); - EXPECT_EQ(-100.0, mLayer2.getLayerThickness(1)); - EXPECT_EQ(40.0, mLayer2.getLayerThickness(2)); - EXPECT_EQ(0.0, mLayer2.getLayerThickness(3)); - - - //check bottomZ value - EXPECT_EQ(0.0, mLayer2.getLayerBottomZ(0)); - EXPECT_EQ(100.0, mLayer2.getLayerBottomZ(1)); - EXPECT_EQ(60.0, mLayer2.getLayerBottomZ(2)); - EXPECT_EQ(60.0, mLayer2.getLayerBottomZ(3)); - - //Note: negative thickness is restricted in Multilayer::setLayerThickness() function - - } -TEST_F(MultiLayerTest, MultiLayerCheckAllLayer) +TEST_F(MultiLayerTest, CheckAllLayers) { MultiLayer mLayer; @@ -158,13 +120,11 @@ TEST_F(MultiLayerTest, MultiLayerCheckAllLayer) EXPECT_EQ(20, layer1->getThickness()); EXPECT_EQ(ironLayer.getMaterial()->getName(), layer1->getMaterial()->getName()); - const Layer * layer2 = mLayer.getLayer(2); EXPECT_EQ("Layer", layer2->getName()); EXPECT_EQ(40, layer2->getThickness()); EXPECT_EQ(chromiumLayer.getMaterial()->getName(), layer2->getMaterial()->getName()); - const Layer * layer3 = mLayer.getLayer(3); EXPECT_EQ("Layer", layer3->getName()); EXPECT_EQ(0, layer3->getThickness()); @@ -172,7 +132,7 @@ TEST_F(MultiLayerTest, MultiLayerCheckAllLayer) } -TEST_F(MultiLayerTest, MultiLayerInterfaces) +TEST_F(MultiLayerTest, LayerInterfaces) { MultiLayer mLayer; @@ -229,7 +189,6 @@ TEST_F(MultiLayerTest, MultiLayerInterfaces) EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName()); EXPECT_EQ(layer3.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName()); - //null interface const LayerInterface * interfaceTopNull = mLayer.getLayerTopInterface(0); EXPECT_TRUE(NULL==interfaceTopNull); @@ -239,7 +198,7 @@ TEST_F(MultiLayerTest, MultiLayerInterfaces) } -TEST_F(MultiLayerTest, MultiLayerClone) +TEST_F(MultiLayerTest, Clone) { MultiLayer mLayer; @@ -260,14 +219,12 @@ TEST_F(MultiLayerTest, MultiLayerClone) MultiLayer * mLayerClone = mLayer.clone(); - //check properties EXPECT_EQ("MultiLayer", mLayerClone->getName()); EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength()); EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers()); EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces()); - //check layer thickness EXPECT_EQ(layer0.getThickness(), mLayerClone->getLayerThickness(0)); EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1)); @@ -280,7 +237,6 @@ TEST_F(MultiLayerTest, MultiLayerClone) EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2)); EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3)); - //check individual layer const Layer * layerCopy0 = mLayerClone->getLayer(0); EXPECT_EQ(layer0.getName(), layerCopy0->getName()); @@ -302,7 +258,6 @@ TEST_F(MultiLayerTest, MultiLayerClone) EXPECT_EQ(layer3.getThickness(), layerCopy3->getThickness()); EXPECT_EQ(layer3.getMaterial()->getName(), layerCopy3->getMaterial()->getName()); - //check interfaces const LayerInterface * interface0 = mLayerClone->getLayerInterface(0); EXPECT_TRUE(NULL!=interface0); @@ -348,9 +303,11 @@ TEST_F(MultiLayerTest, MultiLayerClone) const LayerInterface * interfaceBottomNull = mLayerClone->getLayerBottomInterface(3); EXPECT_TRUE(NULL==interfaceBottomNull); + delete mLayerClone; } -TEST_F(MultiLayerTest, MultiLayerCloneInvertB) + +TEST_F(MultiLayerTest, CloneInvertB) { MultiLayer mLayer; @@ -371,14 +328,12 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertB) MultiLayer * mLayerClone = mLayer.cloneInvertB(); - //check properties EXPECT_EQ("MultiLayer", mLayerClone->getName()); EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength()); EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers()); EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces()); - //check layer thickness EXPECT_EQ(layer0.getThickness(), mLayerClone->getLayerThickness(0)); EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1)); @@ -391,7 +346,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertB) EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2)); EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3)); - //check individual layer const Layer * layerCopy0 = mLayerClone->getLayer(0); EXPECT_EQ(layer0.getName()+"_inv", layerCopy0->getName()); @@ -413,7 +367,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertB) EXPECT_EQ(layer3.getThickness(), layerCopy3->getThickness()); EXPECT_EQ(layer3.getMaterial()->getName(), layerCopy3->getMaterial()->getName()); - //check interfaces const LayerInterface * interface0 = mLayerClone->getLayerInterface(0); EXPECT_TRUE(NULL!=interface0); @@ -459,9 +412,10 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertB) const LayerInterface * interfaceBottomNull = mLayerClone->getLayerBottomInterface(3); EXPECT_TRUE(NULL==interfaceBottomNull); + delete mLayerClone; } -TEST_F(MultiLayerTest, MultiLayerWithRoughness) +TEST_F(MultiLayerTest, WithRoughness) { MultiLayer mLayer; @@ -475,12 +429,10 @@ TEST_F(MultiLayerTest, MultiLayerWithRoughness) //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength); LayerRoughness lr(1.1, -7.3, 0.1); - mLayer.addLayer(layer0); mLayer.addLayerWithTopRoughness(layer1,lr); mLayer.addLayer(layer2); - const LayerInterface * interface0 = mLayer.getLayerInterface(0); const LayerInterface * interface1 = mLayer.getLayerInterface(1); @@ -490,15 +442,13 @@ TEST_F(MultiLayerTest, MultiLayerWithRoughness) EXPECT_EQ(1.1, roughness0->getSigma()); EXPECT_EQ(-7.3, roughness0->getHurstParameter()); EXPECT_EQ(0.1, roughness0->getLatteralCorrLength()); - EXPECT_EQ(0.0, roughness1->getSigma()); EXPECT_EQ(0.0, roughness1->getHurstParameter()); EXPECT_EQ(0.0, roughness1->getLatteralCorrLength()); - - } -TEST_F(MultiLayerTest, MultiLayerCloneWithRoughness) + +TEST_F(MultiLayerTest, CloneWithRoughness) { MultiLayer mLayer; @@ -514,7 +464,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneWithRoughness) LayerRoughness lr0(-2.1, 7.3, -12.1); LayerRoughness lr1(1.1, -7.3, 0.1); - mLayer.addLayer(layer0); mLayer.addLayerWithTopRoughness(layer1,lr0); mLayer.addLayerWithTopRoughness(layer2,lr1); @@ -523,7 +472,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneWithRoughness) const LayerInterface * interface0 = mLayerClone->getLayerInterface(0); const LayerInterface * interface1 = mLayerClone->getLayerInterface(1); - const LayerRoughness * roughness0 = interface0->getRoughness(); const LayerRoughness * roughness1 = interface1->getRoughness(); @@ -535,9 +483,11 @@ TEST_F(MultiLayerTest, MultiLayerCloneWithRoughness) EXPECT_EQ(-7.3, roughness1->getHurstParameter()); EXPECT_EQ(0.1, roughness1->getLatteralCorrLength()); + delete mLayerClone; } -TEST_F(MultiLayerTest, MultiLayerCloneInvertBWithRoughness) + +TEST_F(MultiLayerTest, CloneInvertBWithRoughness) { MultiLayer mLayer; @@ -553,7 +503,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertBWithRoughness) LayerRoughness lr0(-2.1, 7.3, -12.1); LayerRoughness lr1(1.1, -7.3, 0.1); - mLayer.addLayer(layer0); mLayer.addLayerWithTopRoughness(layer1,lr0); mLayer.addLayerWithTopRoughness(layer2,lr1); @@ -562,7 +511,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertBWithRoughness) const LayerInterface * interface0 = mLayerClone->getLayerInterface(0); const LayerInterface * interface1 = mLayerClone->getLayerInterface(1); - const LayerRoughness * roughness0 = interface0->getRoughness(); const LayerRoughness * roughness1 = interface1->getRoughness(); @@ -574,9 +522,10 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertBWithRoughness) EXPECT_EQ(-7.3, roughness1->getHurstParameter()); EXPECT_EQ(0.1, roughness1->getLatteralCorrLength()); + delete mLayerClone; } -TEST_F(MultiLayerTest, MultiLayerMagneticMaterial) +TEST_F(MultiLayerTest, WithMagneticMaterial) { MultiLayer mLayer; @@ -597,22 +546,15 @@ TEST_F(MultiLayerTest, MultiLayerMagneticMaterial) mLayer.addLayer(layer0); mLayer.addLayer(layer1); mLayer.addLayer(layer2); - - EXPECT_FALSE(mLayer.getLayer(0)->containsMagneticMaterial()); - EXPECT_FALSE(mLayer.getLayer(1)->containsMagneticMaterial()); - EXPECT_FALSE(mLayer.getLayer(2)->containsMagneticMaterial()); + EXPECT_FALSE(mLayer.containsMagneticMaterial()); mLayer.addLayer(layer3); mLayer.addLayer(layer4); - EXPECT_FALSE(mLayer.getLayer(0)->containsMagneticMaterial()); - EXPECT_FALSE(mLayer.getLayer(1)->containsMagneticMaterial()); - EXPECT_FALSE(mLayer.getLayer(2)->containsMagneticMaterial()); - EXPECT_TRUE(mLayer.getLayer(3)->containsMagneticMaterial()); - EXPECT_TRUE(mLayer.getLayer(4)->containsMagneticMaterial()); - + EXPECT_TRUE(mLayer.containsMagneticMaterial()); } -TEST_F(MultiLayerTest, MultiLayerCloneMagneticMaterial) + +TEST_F(MultiLayerTest, CloneWithMagneticMaterial) { MultiLayer mLayer; @@ -622,24 +564,20 @@ TEST_F(MultiLayerTest, MultiLayerCloneMagneticMaterial) const IMaterial *air = MaterialManager::getHomogeneousMaterial("air",0,1.0); const IMaterial *iron = MaterialManager::getHomogeneousMaterial("iron",0,1.51); - Layer layer0(air, 0*Units::nanometer); Layer layer1(iron, 20*Units::nanometer); Layer layer2(magMaterial0, 20*Units::nanometer); - mLayer.addLayer(layer0); mLayer.addLayer(layer1); mLayer.addLayer(layer2); MultiLayer * mLayerClone = mLayer.clone(); - - EXPECT_FALSE(mLayerClone->getLayer(0)->containsMagneticMaterial()); - EXPECT_FALSE(mLayerClone->getLayer(1)->containsMagneticMaterial()); - EXPECT_TRUE(mLayerClone->getLayer(2)->containsMagneticMaterial()); - + EXPECT_TRUE(mLayerClone->containsMagneticMaterial()); + delete mLayerClone; } -TEST_F(MultiLayerTest, MultiLayerCloneInvertBMagneticMaterial) + +TEST_F(MultiLayerTest, CloneInvertBMagneticMaterial) { MultiLayer mLayer; @@ -649,7 +587,6 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertBMagneticMaterial) const IMaterial *air = MaterialManager::getHomogeneousMaterial("air",0,1.0); const IMaterial *iron = MaterialManager::getHomogeneousMaterial("iron",0,1.51); - Layer layer0(air, 0*Units::nanometer); Layer layer1(iron, 20*Units::nanometer); Layer layer2(magMaterial0, 20*Units::nanometer); @@ -659,13 +596,11 @@ TEST_F(MultiLayerTest, MultiLayerCloneInvertBMagneticMaterial) mLayer.addLayer(layer2); MultiLayer * mLayerClone = mLayer.cloneInvertB(); - - EXPECT_FALSE(mLayerClone->getLayer(0)->containsMagneticMaterial()); - EXPECT_FALSE(mLayerClone->getLayer(1)->containsMagneticMaterial()); - EXPECT_TRUE(mLayerClone->getLayer(2)->containsMagneticMaterial()); - + EXPECT_TRUE(mLayerClone->containsMagneticMaterial()); + delete mLayerClone; } + TEST_F(MultiLayerTest, MultiLayerCompositeTest) { MultiLayer mLayer; @@ -679,10 +614,10 @@ TEST_F(MultiLayerTest, MultiLayerCompositeTest) const IMaterial *stone = MaterialManager::getHomogeneousMaterial("stone",0,1.6); Layer layer0(air, 0*Units::nanometer); - Layer layer1(iron, 100*Units::nanometer); + Layer layer1(iron, 10*Units::nanometer); Layer layer2(magMaterial0, 20*Units::nanometer); - Layer layer3(magMaterial1, 60*Units::nanometer); - Layer layer4(stone, 0*Units::nanometer); + Layer layer3(magMaterial1, 30*Units::nanometer); + Layer layer4(stone, 40*Units::nanometer); mLayer.addLayer(layer0); mLayer.addLayer(layer1); @@ -690,24 +625,32 @@ TEST_F(MultiLayerTest, MultiLayerCompositeTest) mLayer.addLayer(layer3); mLayer.addLayer(layer4); - - int counter = 0; + std::vector<Layer *> layer_buffer; + std::vector<LayerInterface *> interface_buffer; + int counter(0); for(MultiLayer::iterator_t it=mLayer.begin_shallow();it!=mLayer.end_shallow(); ++it) { ISample *sample = *it; if(counter%2 == 1) { - EXPECT_TRUE(NULL != dynamic_cast<LayerInterface*>(sample)); - //EXPECT_EQ("LayerInterface", sample->getName()); + LayerInterface *interface = dynamic_cast<LayerInterface *>(sample); + EXPECT_TRUE(NULL != interface); + interface_buffer.push_back(interface); + } else { + Layer *layer = dynamic_cast<Layer *>(sample); + EXPECT_TRUE(NULL != layer); + layer_buffer.push_back(layer); } - else - { - EXPECT_TRUE(NULL != dynamic_cast<Layer*>(sample)); - //EXPECT_EQ("Layer", sample->getName()); - } - counter++; } + EXPECT_EQ( size_t(5), layer_buffer.size()); + EXPECT_EQ( size_t(4), interface_buffer.size()); + for(size_t i=0; i<layer_buffer.size(); ++i) { + EXPECT_EQ( double(i*10), layer_buffer[i]->getThickness()); + } + for(size_t i=0; i<interface_buffer.size(); ++i) { + EXPECT_EQ( double((i+1)*10), interface_buffer[i]->getLayerBottom()->getThickness()); + } }