1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
#include "Base/Axis/MakeScale.h"
#include "Base/Math/Numeric.h"
#include "Device/Data/Datafield.h"
#include "Device/IO/IOFactory.h"
#include "GUI/Model/Data/DataItem.h"
#include "GUI/Model/File/DatafileItem.h"
#include "GUI/Model/File/DatafilesSet.h"
#include "Tests/GTestWrapper/google_test.h"
#include "Tests/Unit/GUI/Utils.h"
#include <QTest>
#include <fstream>
namespace {
const QString dir_test_real_model = "TestDatafilesSet";
void checkDataVsData(const Datafield& data1, const Datafield& data2)
{
EXPECT_EQ(data1.size(), data2.size());
bool ok = true;
for (size_t i = 0; i < data1.size(); ++i) {
if (Numeric::relativeDifference(data1[i], data2[i]) > 1e-13) {
std::cout << "file!=data at i=" << i << ": " << data1[i] << " vs " << data2[i]
<< std::endl;
ok = false;
}
}
EXPECT_TRUE(ok);
}
} // namespace
TEST(DatafilesSet, saveNonXMLData)
{
if (!QFile::exists(::dir_test_real_model))
QDir(".").mkdir(::dir_test_real_model);
const QString dir = ::dir_test_real_model + "/saveNonXMLData";
UTest::GUI::create_dir(dir);
DatafilesSet model;
DatafileItem* item1 = UTest::GUI::createRealData2D("data1", model, 101.);
DatafileItem* item2 = UTest::GUI::createRealData2D("data2", model, 102.);
// save first time
model.writeDatafiles(dir);
QTest::qSleep(10);
// check existence of data on disk
QString fname1 = dir + "/realdata_data1.int";
QString fname2 = dir + "/realdata_data2.int";
EXPECT_TRUE(QFile::exists(fname1));
EXPECT_TRUE(QFile::exists(fname2));
// read data from disk, checking it is the same
Datafield dataOnDisk1 = IO::readData2D(fname1.toStdString(), IO::Filetype2D::bornagain2D);
Datafield dataOnDisk2 = IO::readData2D(fname2.toStdString(), IO::Filetype2D::bornagain2D);
::checkDataVsData(dataOnDisk1, *item1->dataItem()->c_field());
::checkDataVsData(dataOnDisk2, *item2->dataItem()->c_field());
// save the project
model.writeDatafiles(dir);
QTest::qSleep(10);
checkDataVsData(dataOnDisk1, *item1->dataItem()->c_field());
checkDataVsData(dataOnDisk2, *item2->dataItem()->c_field());
// check that data on disk has changed
Datafield dataOnDisk3 = IO::readData2D(fname2.toStdString(), IO::Filetype2D::bornagain2D);
::checkDataVsData(dataOnDisk3, *item2->dataItem()->c_field());
// rename RealData and check that file on disk changed the name
item2->setDatafileItemName("data2new");
model.writeDatafiles(dir);
QTest::qSleep(10);
QString fname4 = "./" + dir + "/realdata_data2new.int";
EXPECT_TRUE(QFile::exists(fname4));
Datafield dataOnDisk4 = IO::readData2D(fname4.toStdString(), IO::Filetype2D::bornagain2D);
::checkDataVsData(dataOnDisk4, *item2->dataItem()->c_field());
// check that file with old name was removed
EXPECT_FALSE(QFile::exists(fname2));
}
TEST(DatafilesSet, saveXMLData)
{
if (!QFile::exists(dir_test_real_model))
QDir(".").mkdir(dir_test_real_model);
const QString dir = dir_test_real_model + "/saveXMLData";
UTest::GUI::create_dir(dir);
DatafilesSet model1;
Datafield df1 = UTest::GUI::makeData1D(201.);
Datafield df2 = UTest::GUI::makeData1D(202.);
// add specular DatafileItems with non-default parameters
auto* spec1 = new DatafileItem("spec1", df1);
model1.add_item(spec1);
// add second specular DatafileItem
auto* spec2 = new DatafileItem("spec2", df2);
model1.add_item(spec2);
// add 2D DatafileItems with non-default parameters
auto* intensity1 = new DatafileItem("GISAS", df2);
auto* intensity2 = new DatafileItem("Offspec", df2);
model1.add_item(intensity1);
model1.add_item(intensity2);
// set non-default top-level model parameters
model1.setCurrentIndex(1);
// save data to project files
const QString file1 = dir + "/Project_1.ba";
const QString file2 = dir + "/Project_2.ba";
// write changed model to disk
const QString tag = "DatafilesSet";
UTest::GUI::writeXMLFile<DatafilesSet>(file1, model1, tag);
EXPECT_TRUE(QFile::exists(file1));
// read data to the second model
DatafilesSet model2;
UTest::GUI::readXMLFile<DatafilesSet>(file1, model2, tag);
// write the second model back to disk
UTest::GUI::writeXMLFile<DatafilesSet>(file2, model2, tag);
EXPECT_TRUE(QFile::exists(file2));
// compare files byte-by-byte
std::ifstream f1(file1.toStdString());
std::ifstream f2(file2.toStdString());
using it = std::istreambuf_iterator<char>;
std::vector<char> contents1((it(f1)), it());
std::vector<char> contents2((it(f2)), it());
EXPECT_EQ(contents1, contents2);
}
|