-
Wuttke, Joachim authoredWuttke, Joachim authored
StandardTests.h 28.16 KiB
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file Tests/Functional/Std/StandardTests.h
//! @brief Provides TEST_F stances that define the BornAgain standard tests.
//!
//! Each of these stances runs one standard test.
//! The function run, defined in file Run.cpp, is the same for Core/Py/GUI std tests.
//! It calls a function checkSimulation that is different for those three test suites.
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************************************
#ifndef BORNAGAIN_TESTS_FUNCTIONAL_STD_STANDARDTESTS_H
#define BORNAGAIN_TESTS_FUNCTIONAL_STD_STANDARDTESTS_H
#include "Core/Background/ConstantBackground.h"
#include "Core/Simulation/includeSimulations.h"
#include "Sample/ComponentBuilder/FTDistribution2DComponents.h"
#include "Sample/ComponentBuilder/FormFactorComponents.h"
#include "Sample/Multilayer/MultiLayer.h"
#include "Sample/StandardSamples/ExemplarySamples.h"
#include "Tests/Functional/ProStd/MakeSimulations.h"
#include "Tests/GTestWrapper/google_test.h"
#include <iostream>
// By defining DISABLE_DISTRIBUTION_TESTS in the project, tests which contain particle distributions
// can be set do DISABLED. This is useful since the tests in here are the same for Core/Py/GUI, but
// the particle distributions have been removed from GUI.
#ifdef DISABLE_DISTRIBUTION_TESTS
#define DISTRIBUTION_TEST_F(test_fixture, test_name) TEST_F(test_fixture, DISABLED_##test_name)
#else
#define DISTRIBUTION_TEST_F(test_fixture, test_name) TEST_F(test_fixture, test_name)
#endif
class Std : public ::testing::Test {
};
TEST_F(Std, FormFactors)
{
for (const std::string& ffname : FormFactorComponents().keys()) {
const IFormFactor* ff = FormFactorComponents().getItem(ffname)->clone();
ASSERT(ff);
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createParticleInVacuumWithFF(ff));
ASSERT(sample);
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("FormFactors_" + ff->shapeName(), *sim, 2e-10));
}
}
TEST_F(Std, GISASAbsorptiveSLDLayers)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createLayersWithAbsorptionBySLD());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("GISASAbsorptiveSLDLayers", *sim, 2e-10));
}
TEST_F(Std, CylindersAndPrisms)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersAndPrisms());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CylindersAndPrisms", *sim, 2e-10));
}
TEST_F(Std, RadialParaCrystal)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createRadialParaCrystal());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("RadialParaCrystal", *sim, 2e-10));
}
TEST_F(Std, HardDisk)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createHardDisk());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("HardDisk", *sim, 2e-10));
}
TEST_F(Std, Basic2DParaCrystal)
{
for (const std::string& pdfname : FTDistribution2DComponents().keys()) {
const IFTDistribution2D* pdf2 = FTDistribution2DComponents().getItem(pdfname)->clone();
ASSERT(pdf2);
std::cout << pdf2->pythonConstructor() << std::endl;
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createBasic2DParaCrystalWithFTDis(pdf2));
ASSERT(sample);
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("Basic2DParaCrystal_" + pdf2->className(), *sim, 2e-10));
}
}
TEST_F(Std, HexParaCrystal)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createHexParaCrystal());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("HexParaCrystal", *sim, 2e-10));
}
TEST_F(Std, Lattice1D)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createLattice1D());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("Lattice1D", *sim, 2e-10));
}
TEST_F(Std, RectParaCrystal)
{
// TODO: investigate numeric integration, which has become problematic under Windows
// after moving code from Core/Tools to Base/Utils
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createRectParaCrystal());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("RectParaCrystal", *sim, 1e-9));
}
TEST_F(Std, CoreShellParticle)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCoreShellParticle());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CoreShellParticle", *sim, 2e-10));
}
TEST_F(Std, CoreShellBoxRotateZandY)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCoreShellBoxRotateZandY());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CoreShellBoxRotateZandY", *sim, 2e-10));
}
TEST_F(Std, MultiLayerWithRoughness)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMultiLayerWithRoughness());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("MultiLayerWithRoughness", *sim, 2e-10));
}
TEST_F(Std, SquareLattice2D)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSquareLattice2D());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("SquareLattice2D", *sim, 2e-10));
}
TEST_F(Std, CenteredSquareLattice2D)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCenteredSquareLattice2D());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CenteredSquareLattice2D", *sim, 2e-10));
}
TEST_F(Std, RotatedSquareLattice2D)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createRotatedSquareLattice2D());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("RotatedSquareLattice2D", *sim, 2e-10));
}
TEST_F(Std, FiniteSquareLattice2D)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFiniteSquareLattice2D());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("FiniteSquareLattice2D", *sim, 2e-10));
}
TEST_F(Std, RotatedPyramids)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createRotatedPyramids());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("RotatedPyramids", *sim, 2e-10));
}
TEST_F(Std, ThickAbsorptiveSampleWithRoughness)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createThickAbsorptiveSample());
auto sim = test::makeSimulation::ExtraLongWavelengthGISAS(*sample);
EXPECT_TRUE(run("ThickAbsorptiveSampleWithRoughness", *sim, 2e-10));
}
TEST_F(Std, ParticleComposition)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createParticleComposition());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("ParticleComposition", *sim, 2e-10));
}
TEST_F(Std, BoxCompositionRotateX)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createBoxCompositionRotateX());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("BoxCompositionRotateX", *sim, 2e-10));
}
TEST_F(Std, BoxCompositionRotateY)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createBoxCompositionRotateY());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("BoxCompositionRotateY", *sim, 2e-10));
}
TEST_F(Std, BoxCompositionRotateZ)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createBoxCompositionRotateZ());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("BoxCompositionRotateZ", *sim, 2e-10));
}
TEST_F(Std, BoxCompositionRotateZandY)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createBoxCompositionRotateZandY());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("BoxCompositionRotateZandY", *sim, 2e-10));
}
TEST_F(Std, BoxStackComposition)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createBoxStackComposition());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("BoxStackComposition", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, CylindersWithSizeDistribution)
{
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createCylindersWithSizeDistribution());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CylindersWithSizeDistribution", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, TwoTypesCylindersDistribution)
{
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createTwoTypesCylindersDistribution());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("TwoTypesCylindersDistribution", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, RotatedPyramidsDistribution)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createRotatedPyramidsDistribution());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("RotatedPyramidsDistribution", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, SpheresWithLimitsDistribution)
{
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createSpheresWithLimitsDistribution());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("SpheresWithLimitsDistribution", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, ConesWithLimitsDistribution)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createConesWithLimitsDistribution());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("ConesWithLimitsDistribution", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, LinkedBoxDistribution)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createLinkedBoxDistribution());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("LinkedBoxDistribution", *sim, 2e-10));
}
TEST_F(Std, MultipleLayout)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMultipleLayout());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("MultipleLayout", *sim, 2e-10));
}
TEST_F(Std, ApproximationDA)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSizeDistributionDAModel());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("ApproximationDA", *sim, 2e-10));
}
TEST_F(Std, ApproximationLMA)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSizeDistributionLMAModel());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("ApproximationLMA", *sim, 2e-10));
}
TEST_F(Std, ApproximationSSCA)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSizeDistributionSSCAModel());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("ApproximationSSCA", *sim, 2e-10));
}
DISTRIBUTION_TEST_F(Std, CylindersInSSCA)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInSSCA());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CylindersInSSCA", *sim, 2e-10));
}
TEST_F(Std, CosineRipple)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCosineRipple());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CosineRipple", *sim, 2e-10));
}
TEST_F(Std, TriangularRipple)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createTriangularRipple());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("TriangularRipple", *sim, 2e-10));
}
TEST_F(Std, AsymRipple)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createAsymRipple());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("AsymRipple", *sim, 2e-10));
}
TEST_F(Std, MesoCrystal)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMesoCrystal());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("MesoCrystal", *sim, 2e-10));
}
TEST_F(Std, CustomMorphology)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCustomMorphology());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("CustomMorphology", *sim, 2e-10));
}
TEST_F(Std, TransformBox)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createTransformBox());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("TransformBox", *sim, 1e-10));
}
TEST_F(Std, MagneticParticleZeroField)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMagneticParticleZeroField());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("MagneticParticleZeroField", *sim, 2e-10));
}
TEST_F(Std, RotatedCylinder)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createRotatedCylinders());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("RotatedCylinder", *sim, 1e-10));
}
TEST_F(Std, SlicedComposition)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSlicedComposition());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("SlicedComposition", *sim, 1e-10));
}
TEST_F(Std, MagneticSubstrateZeroField)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMagneticSubstrateZeroField());
auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PP");
EXPECT_TRUE(run("MagneticSubstrateZeroField", *sim, 2e-10));
}
TEST_F(Std, MagneticRotation)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMagneticRotation());
auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PM");
EXPECT_TRUE(run("MagneticRotationZPM", *sim, 2e-10));
}
TEST_F(Std, MagneticSpheres)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMagneticSpheres());
auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PM");
EXPECT_TRUE(run("MagneticSpheres", *sim, 2e-10));
}
TEST_F(Std, MagneticCylinders)
{
for (const auto polCase : {"PP", "MP", "PM", "MM"}) {
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMagneticCylinders());
auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, polCase);
EXPECT_TRUE(run("MagneticCylinders" + polCase, *sim, 2e-10));
}
}
TEST_F(Std, MagneticSpheresInMagLayer)
{
for (const auto polCase : {"PP", "MP"}) {
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createMagneticLayer());
auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, polCase);
EXPECT_TRUE(run("MagneticSpheresInMagLayer" + polCase, *sim, 2e-10));
}
}
TEST_F(Std, BeamDivergence)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::MiniGISASBeamDivergence(*sample);
EXPECT_TRUE(run("BeamDivergence", *sim, 2e-10));
}
TEST_F(Std, DetectorResolution)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::MiniGISASDetectorResolution(*sample);
EXPECT_TRUE(run("DetectorResolution", *sim, 2e-10));
}
TEST_F(Std, SimulationWithMasks)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersAndPrisms());
auto sim = test::makeSimulation::GISASWithMasks(*sample);
EXPECT_TRUE(run("SimulationWithMasks", *sim, 1e-10));
}
TEST_F(Std, RectDetectorGeneric)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::RectDetectorGeneric(*sample);
EXPECT_TRUE(run("RectDetectorGeneric", *sim, 1e-10));
}
TEST_F(Std, RectDetectorPerpToSample)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::RectDetectorPerpToSample(*sample);
EXPECT_TRUE(run("RectDetectorPerpToSample", *sim, 1e-10));
}
TEST_F(Std, RectDetectorPerpToDirectBeam)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::RectDetectorPerpToDirectBeam(*sample);
EXPECT_TRUE(run("RectDetectorPerpToDirectBeam", *sim, 1e-10));
}
TEST_F(Std, RectDetectorPerpToReflectedBeam)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::RectDetectorPerpToReflectedBeam(*sample);
EXPECT_TRUE(run("RectDetectorPerpToReflectedBeam", *sim, 1e-10));
}
TEST_F(Std, RectDetectorPerpToReflectedBeamDpos)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersInBA());
auto sim = test::makeSimulation::RectDetectorPerpToReflectedBeamDpos(*sample);
EXPECT_TRUE(run("RectDetectorPerpToReflectedBeamDpos", *sim, 1e-10));
}
TEST_F(Std, LargeCylindersMonteCarlo)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createLargeCylindersInDWBA());
auto sim = test::makeSimulation::MiniGISASMonteCarlo(*sample);
EXPECT_TRUE(run("LargeCylindersMonteCarlo", *sim, 5e-1));
}
TEST_F(Std, SphericalDetWithRoi)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersAndPrisms());
auto sim = test::makeSimulation::SphericalDetWithRoi(*sample);
EXPECT_TRUE(run("SphericalDetWithRoi", *sim, 1e-10));
}
TEST_F(Std, RectDetWithRoi)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createCylindersAndPrisms());
auto sim = test::makeSimulation::RectDetWithRoi(*sample);
EXPECT_TRUE(run("RectDetWithRoi", *sim, 1e-10));
}
TEST_F(Std, BoxesWithSpecular)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createBoxesSquareLattice2D());
auto sim = test::makeSimulation::MiniGISASSpecularPeak(*sample);
EXPECT_TRUE(run("BoxesWithSpecular", *sim, 1e-10));
}
TEST_F(Std, ConstantBackground)
{
auto sample = ExemplarySamples::createCylindersInBA();
auto sim = test::makeSimulation::MiniGISAS(*sample);
sim->setBackground(ConstantBackground(1e3));
EXPECT_TRUE(run("ConstantBackground", *sim, 1e-10));
}
TEST_F(Std, HomogeneousTiNiSample)
{
auto sample = ExemplarySamples::createHomogeneousMultilayer();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("HomogeneousTiNiSample", *sim, 1e-10));
}
TEST_F(Std, HomogeneousTiNiSampleWithAbsorption)
{
auto sample = ExemplarySamples::createPlainMultiLayerBySLD();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("HomogeneousTiNiSampleWithAbsorption", *sim, 1e-10));
}
TEST_F(Std, RoughnessInSpecular)
{
auto sample = ExemplarySamples::createMultiLayerWithRoughness();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("RoughnessInSpecular", *sim, 2e-9));
}
TEST_F(Std, GaussianBeamFootprint)
{
auto sample = ExemplarySamples::createHomogeneousMultilayer();
auto sim = test::makeSimulation::SpecularWithGaussianBeam(*sample);
EXPECT_TRUE(run("GaussianBeamFootprint", *sim, 1e-10));
}
TEST_F(Std, SquareBeamFootprint)
{
auto sample = ExemplarySamples::createHomogeneousMultilayer();
auto sim = test::makeSimulation::SpecularWithSquareBeam(*sample);
EXPECT_TRUE(run("SquareBeamFootprint", *sim, 1e-10));
}
TEST_F(Std, SpecularDivergentBeam)
{
auto sample = ExemplarySamples::createHomogeneousMultilayer();
auto sim = test::makeSimulation::SpecularDivergentBeam(*sample);
EXPECT_TRUE(run("SpecularDivergentBeam", *sim, 1e-10));
}
// ************************************************************************************************
// TODO: broken under GUI
// ************************************************************************************************
#ifndef GUI_STD_TEST
TEST_F(Std, RelativeResolutionTOF)
{
auto sample = ExemplarySamples::createPlainMultiLayerBySLD();
auto sim = test::makeSimulation::TOFRWithRelativeResolution(*sample);
EXPECT_TRUE(run("RelativeResolutionTOF", *sim, 1e-10));
}
#endif // GUI_STD_TEST
// ************************************************************************************************
// TODO: broken under Python
// ************************************************************************************************
#ifndef PYTHON_STD_TEST
TEST_F(Std, OffSpecularResonator)
{
auto sample = ExemplarySamples::createResonator();
auto sim = test::makeSimulation::MiniOffSpecular(*sample);
EXPECT_TRUE(run("OffSpecularResonator", *sim, 1e-10));
}
TEST_F(Std, FormFactorsWithAbsorption)
{
for (const std::string& ffname : FormFactorComponents().keys()) {
const IFormFactor* ff = FormFactorComponents().getItem(ffname)->clone();
ASSERT(ff);
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createLayersWithAbsorptionWithFF(ff));
ASSERT(sample);
auto sim = test::makeSimulation::MiniGISAS_v2(*sample);
EXPECT_TRUE(run("FormFactorsWithAbsorption_" + ff->shapeName(), *sim, 2e-10));
}
}
#endif // PYTHON_STD_TEST
// ************************************************************************************************
// TODO: broken under GUI and Python
// ************************************************************************************************
#ifndef PYTHON_STD_TEST
#ifndef GUI_STD_TEST
TEST_F(Std, NCRoughnessInSpecular)
{
auto sample = ExemplarySamples::createMultiLayerWithNCRoughness();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("NCRoughnessInSpecular", *sim, 2e-9));
}
TEST_F(Std, SuperLattice)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSuperLattice());
auto sim = test::makeSimulation::MiniGISAS(*sample);
EXPECT_TRUE(run("SuperLattice", *sim, 2e-10));
}
TEST_F(Std, SpecularWithSlicing1)
{
// data almost fully agree with SpecularWithSlicing2, as verified by ConsistenceTest
auto sample = ExemplarySamples::createSlicedCylinders();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("SpecularWithSlicing1", *sim, 1e-10));
}
TEST_F(Std, SpecularWithSlicing2)
{
auto sample = ExemplarySamples::createSLDSlicedCylinders();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("SpecularWithSlicing2", *sim, 1e-10));
auto simQ = test::makeSimulation::BasicSpecular(*sample, true);
EXPECT_TRUE(run("SpecularWithSlicing2Q", *simQ, 1e-10));
}
TEST_F(Std, SpecularWithSlicing3)
{
// data fully agree with SpecularWithSlicing2, as verified by ConsistenceTest
auto sample = ExemplarySamples::createAveragedSlicedCylinders();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("SpecularWithSlicing3", *sim, 1e-10));
}
TEST_F(Std, InstrumentDefinitionComparison)
{
auto sample = ExemplarySamples::createPlainMultiLayerBySLD();
auto sim = test::makeSimulation::BasicSpecular(*sample, false);
EXPECT_TRUE(run("InstrumentDefinitionComparison_0", *sim, 1e-10));
auto simQ = test::makeSimulation::BasicSpecular(*sample, true);
EXPECT_TRUE(run("InstrumentDefinitionComparison_Q", *simQ, 1e-10));
}
TEST_F(Std, TOFResolutionComparison)
{
auto sample = ExemplarySamples::createPlainMultiLayerBySLD();
auto sim1 = test::makeSimulation::TOFRWithRelativeResolution(*sample);
EXPECT_TRUE(run("TOFResolutionComparison_TR", *sim1, 1e-10));
auto sim2 = test::makeSimulation::TOFRWithPointwiseResolution(*sample);
EXPECT_TRUE(run("TOFResolutionComparison_TP", *sim2, 1e-10));
}
TEST_F(Std, BasicSpecular)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSimpleMagneticLayer());
for (const auto polCase : {"PP", "MM"}) {
auto sim = test::makeSimulation::BasicYPolarizedSpecular(*sample, polCase, false);
EXPECT_TRUE(run("BasicSpecular" + polCase, *sim, 1e-10));
}
}
TEST_F(Std, PolarizedQAngleReflectivity)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createSimpleMagneticLayer());
for (const auto polKey : {"PP", "MM"}) {
auto sim = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedQAngleReflectivity" + polKey + "_Q", *sim, 1e-10));
}
}
TEST_F(Std, MagneticRotationReflectivity)
{
for (const auto roughnessKey : {"Flat", "Tanh", "NevotCroce"}) {
std::unique_ptr<const MultiLayer> sample(
ExemplarySamples::createSimpleMagneticRotationWithRoughness(roughnessKey));
for (const auto polKey : {"PP", "PM", "MP", "MM"}) {
auto sim = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(
run("MagneticRotationReflectivity" + polKey + "_" + roughnessKey, *sim, 1e-10));
}
}
}
TEST_F(Std, PolarizedFeNiBilayer)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFeNiBilayer());
for (const auto polKey : {"PP", "MM"}) {
auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(run("PolarizedFeNiBilayer" + polKey, *sim1, 1e-7));
auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedFeNiBilayer" + polKey + "_Q", *sim2, 1e-7));
}
}
TEST_F(Std, PolarizedFeNiBilayerTanh)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFeNiBilayerTanh());
for (const auto polKey : {"PP", "MM"}) {
auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(run("PolarizedFeNiBilayerTanh" + polKey, *sim1, 1e-7));
auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedFeNiBilayerTanh" + polKey + "_Q", *sim2, 1e-7));
}
}
TEST_F(Std, PolarizedFeNiBilayerNC)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFeNiBilayerNC());
for (const auto polKey : {"PP", "MM"}) {
auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(run("PolarizedFeNiBilayerNC" + polKey, *sim1, 1e-7));
auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedFeNiBilayerNC" + polKey + "_Q", *sim2, 1e-7));
}
}
TEST_F(Std, PolarizedFeNiBilayerSpinFlip)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFeNiBilayerSpinFlip());
for (const auto polKey : {"PP", "PM", "MP", "MM"}) {
auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlip" + polKey, *sim1, 1e-7));
auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlip" + polKey + "_Q", *sim2, 1e-7));
}
}
TEST_F(Std, PolarizedFeNiBilayerSpinFlipTanh)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFeNiBilayerSpinFlipTanh());
for (const auto polKey : {"PP", "PM", "MP", "MM"}) {
auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipTanh" + polKey, *sim1, 1e-7));
auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipTanh" + polKey + "_Q", *sim2, 1e-7));
}
}
TEST_F(Std, PolarizedFeNiBilayerSpinFlipNC)
{
std::unique_ptr<const MultiLayer> sample(ExemplarySamples::createFeNiBilayerSpinFlipNC());
for (const auto polKey : {"PP", "PM", "MP", "MM"}) {
auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipNC" + polKey, *sim1, 1e-7));
auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipNC" + polKey + "_Q", *sim2, 1e-7));
}
}
TEST_F(Std, DepthProbeTest)
{
auto sample = ExemplarySamples::createHomogeneousMultilayer();
auto sim = test::makeSimulation::BasicDepthProbe(*sample);
EXPECT_TRUE(run("DepthProbeTest", *sim, 1e-10));
}
#endif // GUI_STD_TEST
#endif // PYTHON_STD_TEST
#endif // BORNAGAIN_TESTS_FUNCTIONAL_STD_STANDARDTESTS_H