5
#include "grt_test_utility.h"
8
#include "grts/structs.db.mgmt.h"
9
#include "util_functions.h"
10
#include "grtdb/diff_dbobjectmatch.h"
15
BEGIN_TEST_DATA_CLASS(grt_diff)
18
db_mgmt_RdbmsRef rdbms;
21
BEGIN_TEST_DATA_CLASS(grt_diff_suite)
24
BEGIN_TEST_DATA_CLASS(grt_diff_omf_suite)
27
struct DiffSubSuiteParam
30
std::string source_file;
31
std::string target_file;
35
typedef std::map<std::string, std::vector<DiffSubSuiteParam> > DiffTestsParams;
36
DiffTestsParams tests_params;
38
void test_files(GRT& grt, std::string source_file, std::string target_file, bool logging= false, grt::Omf* omf= NULL);
40
void test_suites(GRT& grt,
43
const char *single_suite,
44
const char *single_test,
47
TEST_MODULE(grt_diff, "GRT: diff");
51
grt.scan_metaclasses_in("../../res/grt/");
52
grt.scan_metaclasses_in("data");
53
grt.end_loading_metaclasses();
55
rdbms= db_mgmt_RdbmsRef::cast_from(grt.unserialize("../../modules/db.mysql/res/mysql_rdbms_info.xml"));
56
ensure("db_mgmt_RdbmsRef initialization", rdbms.is_valid());
63
const bool run_single_test= false;
64
const char *single_suite= "list-reorder-simple-type";
65
const char *single_test= "s04_order_end_beg.xml";
67
std::string rootpath= "data/diff";
69
test_suites(grt, rootpath.c_str(), run_single_test, single_suite, single_test);
74
const bool run_single_test= false;
75
const char *single_suite= "";
76
const char *single_test= "";
78
std::string rootpath= "data/diff-omf";
80
test_suites(grt, rootpath.c_str(), run_single_test, single_suite, single_test);
91
const char *single_suite,
92
const char *single_test,
97
GDir *root= g_dir_open(rootpath, 0, &err);
100
std::cout << ((err->message)? (const char*)err->message: (const char*)"unknown error") << std::endl;
105
const char* suite_name= single_suite;
107
while (suite_name= g_dir_read_name(root))
110
suite_name= single_suite;
112
// Filter out unwanted folders (e.g. from version control or disabled test cases).
113
// TODO: x_integration and x_sakira-db must be fixed yet (xml recreated from model). They are disabled currently in file system.
114
if (strlen(suite_name) < 1 || suite_name[0] == '.')
117
GDir *test_suite= g_dir_open((rootpath +std::string("/")+ suite_name).c_str(), 0, &err);
125
std::string test_group_name= std::string("grt_diff::") + suite_name;
127
DiffTestsParams::iterator iter= tests_params.insert(std::make_pair(test_group_name, std::vector<DiffSubSuiteParam>())).first;
128
//Test_group<testsuite> *group= new Test_group<testsuite>(&test_params, iter->first.c_str(), iter->first.c_str());
130
std::string initial_object;
131
const char* test_name= single_test;
133
while (test_name= g_dir_read_name(test_suite))
135
// Let's assume that initial_object goes first - TODO!!
136
if (initial_object.empty())
138
initial_object= test_name;
139
if (!run_single_test)
144
p.source_file= rootpath + std::string("/") + suite_name + "/" + initial_object;
145
p.target_file= rootpath + std::string("/") + suite_name + "/" + (run_single_test? single_test: test_name);
146
p.logging= run_single_test;
148
test_files(grt, p.source_file, p.target_file, p.logging, omf);
155
g_dir_close(test_suite);
164
void test_files(GRT& grt, std::string source_file, std::string target_file, bool logging, grt::Omf* omf)
166
ValueRef v(source_file.size() > 0 ? grt.unserialize(source_file) : ValueRef());
167
ValueRef target(grt.unserialize(target_file));
168
ValueRef target1(grt.unserialize(target_file));
170
assure(v.is_valid());
171
assure(target.is_valid());
174
// std::ofstream target_log(target_file + ".old.log");
175
// std::cout << myx_grt_value_to_xml(grt.grt(), v) << std::endl;
176
// target_log << myx_grt_value_to_xml(grt.grt(), target) << std::endl;
180
DiffChange* change= diff_make(v, target, omf, grt::NormalizedComparer(&grt));
184
double time_rate= test_time_point(t2 - t1).get_ticks()/1000.;
185
std::cout << "Xmldiff: " << time_rate << " [sec]" << std::endl;
186
std::cout << std::endl;
191
ValueRef source_bkup= copy_value(v, true);
192
ValueRef source_to_change= copy_value(v, true);
195
// diff_apply(source_to_change, *change);
200
double time_rate= (t4 - t3).get_ticks()/1000.;
201
std::cout << "Xmlapply: " << time_rate << " [sec]" << std::endl;
203
grt.serialize(source_to_change, target_file + ".log");
206
// QQQ Likely will fail due to diff_apply removal
207
DiffChange* zero_change= diff_make(source_to_change, target1, omf, grt::NormalizedComparer<grt::GRT*>(&grt));
209
ensure("unexpected change", zero_change == NULL);
212
// Must be fixed as the diff code uses pointer invariance for grt::Object values to determine changed entries.
213
assure_grt_values_equal(source_bkup, v);