File: TestDatafilesSet.cpp

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (144 lines) | stat: -rw-r--r-- 4,744 bytes parent folder | download | duplicates (2)
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);
}