2017-04-27 18:21:27 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2015-03-10 21:27:14 +00:00
|
|
|
#include "testparse.h"
|
2019-03-04 22:20:29 +00:00
|
|
|
#include "core/divesite.h"
|
2019-08-05 17:41:15 +00:00
|
|
|
#include "core/errorhelper.h"
|
2019-05-31 14:09:14 +00:00
|
|
|
#include "core/trip.h"
|
2018-07-25 19:39:04 +00:00
|
|
|
#include "core/file.h"
|
2018-09-28 10:09:18 +00:00
|
|
|
#include "core/import-csv.h"
|
2018-07-25 19:39:04 +00:00
|
|
|
#include "core/parse.h"
|
2017-05-07 06:41:27 +00:00
|
|
|
#include "core/qthelper.h"
|
2018-07-25 19:39:04 +00:00
|
|
|
#include "core/subsurface-string.h"
|
|
|
|
#include <QTextStream>
|
2015-03-10 21:27:14 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
/* We have to use a macro since QCOMPARE
|
|
|
|
* can only be called from a test method
|
|
|
|
* invoked by the QTest framework
|
|
|
|
*/
|
2018-07-25 19:39:04 +00:00
|
|
|
#define FILE_COMPARE(actual, expected) \
|
|
|
|
QFile org(expected); \
|
|
|
|
org.open(QFile::ReadOnly); \
|
|
|
|
QFile out(actual); \
|
|
|
|
out.open(QFile::ReadOnly); \
|
|
|
|
QTextStream orgS(&org); \
|
|
|
|
QTextStream outS(&out); \
|
|
|
|
QStringList readin = orgS.readAll().split("\n"); \
|
|
|
|
QStringList written = outS.readAll().split("\n"); \
|
|
|
|
while (readin.size() && written.size()) { \
|
|
|
|
QCOMPARE(written.takeFirst().trimmed(), \
|
|
|
|
readin.takeFirst().trimmed()); \
|
|
|
|
}
|
2017-03-04 15:06:52 +00:00
|
|
|
|
2016-12-27 12:31:30 +00:00
|
|
|
void TestParse::initTestCase()
|
|
|
|
{
|
|
|
|
/* we need to manually tell that the resource exists, because we are using it as library. */
|
|
|
|
Q_INIT_RESOURCE(subsurface);
|
|
|
|
}
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
void TestParse::init()
|
|
|
|
{
|
|
|
|
_sqlite3_handle = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TestParse::cleanup()
|
|
|
|
{
|
|
|
|
clear_dive_file_data();
|
|
|
|
|
|
|
|
// Some test use sqlite3, ensure db is closed
|
|
|
|
sqlite3_close(_sqlite3_handle);
|
|
|
|
}
|
|
|
|
|
2017-03-13 19:53:44 +00:00
|
|
|
int TestParse::parseCSV(int units, std::string file)
|
2015-03-10 21:27:14 +00:00
|
|
|
{
|
|
|
|
// some basic file parsing tests
|
|
|
|
//
|
2015-06-16 19:52:39 +00:00
|
|
|
// CSV import should work
|
2015-03-10 21:27:14 +00:00
|
|
|
verbose = 1;
|
2015-08-23 17:56:19 +00:00
|
|
|
char *params[55];
|
|
|
|
int pnr = 0;
|
|
|
|
|
2017-05-04 18:22:41 +00:00
|
|
|
params[pnr++] = strdup("numberField");
|
2015-08-23 17:56:19 +00:00
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("dateField");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = strdup("timeField");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("durationField");
|
|
|
|
params[pnr++] = intdup(3);
|
|
|
|
params[pnr++] = strdup("locationField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("gpsField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("maxDepthField");
|
|
|
|
params[pnr++] = intdup(4);
|
|
|
|
params[pnr++] = strdup("meanDepthField");
|
|
|
|
params[pnr++] = intdup(5);
|
|
|
|
params[pnr++] = strdup("divemasterField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("buddyField");
|
|
|
|
params[pnr++] = intdup(6);
|
|
|
|
params[pnr++] = strdup("suitField");
|
|
|
|
params[pnr++] = intdup(7);
|
|
|
|
params[pnr++] = strdup("notesField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("weightField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("tagsField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("separatorIndex");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("units");
|
2017-03-13 19:53:44 +00:00
|
|
|
params[pnr++] = intdup(units);
|
2015-08-23 17:56:19 +00:00
|
|
|
params[pnr++] = strdup("datefmt");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = strdup("durationfmt");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("cylindersizeField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("startpressureField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("endpressureField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("heField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("airtempField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("watertempField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = NULL;
|
|
|
|
|
2019-02-28 21:45:17 +00:00
|
|
|
return parse_manual_file(file.c_str(), params, pnr - 1, &dive_table, &trip_table, &dive_site_table);
|
2015-03-10 21:27:14 +00:00
|
|
|
}
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
int TestParse::parseDivingLog()
|
2015-07-24 16:53:22 +00:00
|
|
|
{
|
|
|
|
// Parsing of DivingLog import from SQLite database
|
2019-02-26 21:26:11 +00:00
|
|
|
struct dive_site *ds = alloc_or_get_dive_site(0xdeadbeef, &dive_site_table);
|
2015-07-24 16:53:22 +00:00
|
|
|
ds->name = copy_string("Suomi - - Hälvälä");
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
int ret = sqlite3_open(SUBSURFACE_TEST_DATA "/dives/TestDivingLog4.1.1.sql", &_sqlite3_handle);
|
2018-07-25 19:39:04 +00:00
|
|
|
if (ret == 0)
|
2019-02-28 21:45:17 +00:00
|
|
|
ret = parse_divinglog_buffer(_sqlite3_handle, 0, 0, 0, &dive_table, &trip_table, &dive_site_table);
|
2017-03-04 15:06:52 +00:00
|
|
|
else
|
|
|
|
fprintf(stderr, "Can't open sqlite3 db: " SUBSURFACE_TEST_DATA "/dives/TestDivingLog4.1.1.sql");
|
2015-07-24 16:53:22 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
return ret;
|
2015-07-24 16:53:22 +00:00
|
|
|
}
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
int TestParse::parseV2NoQuestion()
|
2015-03-10 21:27:14 +00:00
|
|
|
{
|
2015-06-16 19:52:39 +00:00
|
|
|
// parsing of a V2 file should work
|
2019-02-28 21:45:17 +00:00
|
|
|
return parse_file(SUBSURFACE_TEST_DATA "/dives/test40.xml", &dive_table, &trip_table, &dive_site_table);
|
2015-03-10 21:27:14 +00:00
|
|
|
}
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
int TestParse::parseV3()
|
2015-03-10 21:27:14 +00:00
|
|
|
{
|
2015-06-16 19:52:39 +00:00
|
|
|
// parsing of a V3 files should succeed
|
2019-02-28 21:45:17 +00:00
|
|
|
return parse_file(SUBSURFACE_TEST_DATA "/dives/test42.xml", &dive_table, &trip_table, &dive_site_table);
|
2015-03-10 21:27:14 +00:00
|
|
|
}
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
void TestParse::testParse()
|
2015-03-10 21:27:14 +00:00
|
|
|
{
|
2017-03-13 19:53:44 +00:00
|
|
|
QCOMPARE(parseCSV(0, SUBSURFACE_TEST_DATA "/dives/test41.csv"), 0);
|
2017-03-04 15:06:52 +00:00
|
|
|
fprintf(stderr, "number of dives %d \n", dive_table.nr);
|
2017-05-27 14:21:37 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
QCOMPARE(parseDivingLog(), 0);
|
|
|
|
fprintf(stderr, "number of dives %d \n", dive_table.nr);
|
2015-07-26 12:08:11 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
QCOMPARE(parseV2NoQuestion(), 0);
|
|
|
|
fprintf(stderr, "number of dives %d \n", dive_table.nr);
|
2015-07-26 12:08:11 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
QCOMPARE(parseV3(), 0);
|
|
|
|
fprintf(stderr, "number of dives %d \n", dive_table.nr);
|
2015-07-26 12:08:11 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
QCOMPARE(save_dives("./testout.ssrf"), 0);
|
|
|
|
FILE_COMPARE("./testout.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/test40-42.xml");
|
2015-07-26 12:08:11 +00:00
|
|
|
}
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
void TestParse::testParseDM4()
|
2015-07-26 12:08:11 +00:00
|
|
|
{
|
2017-03-04 15:06:52 +00:00
|
|
|
QCOMPARE(sqlite3_open(SUBSURFACE_TEST_DATA "/dives/TestDiveDM4.db", &_sqlite3_handle), 0);
|
2019-02-28 21:45:17 +00:00
|
|
|
QCOMPARE(parse_dm4_buffer(_sqlite3_handle, 0, 0, 0, &dive_table, &trip_table, &dive_site_table), 0);
|
2017-05-27 14:21:37 +00:00
|
|
|
|
2015-07-26 12:08:11 +00:00
|
|
|
QCOMPARE(save_dives("./testdm4out.ssrf"), 0);
|
2017-03-04 15:06:52 +00:00
|
|
|
FILE_COMPARE("./testdm4out.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/TestDiveDM4.xml");
|
2015-03-10 21:27:14 +00:00
|
|
|
}
|
|
|
|
|
2017-11-26 08:48:03 +00:00
|
|
|
void TestParse::testParseDM5()
|
|
|
|
{
|
|
|
|
QCOMPARE(sqlite3_open(SUBSURFACE_TEST_DATA "/dives/TestDiveDM5.db", &_sqlite3_handle), 0);
|
2019-02-28 21:45:17 +00:00
|
|
|
QCOMPARE(parse_dm5_buffer(_sqlite3_handle, 0, 0, 0, &dive_table, &trip_table, &dive_site_table), 0);
|
2017-11-26 08:48:03 +00:00
|
|
|
|
|
|
|
QCOMPARE(save_dives("./testdm5out.ssrf"), 0);
|
|
|
|
FILE_COMPARE("./testdm5out.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/TestDiveDM5.xml");
|
2017-11-26 08:48:03 +00:00
|
|
|
}
|
|
|
|
|
2015-07-27 13:13:33 +00:00
|
|
|
void TestParse::testParseHUDC()
|
|
|
|
{
|
2015-08-27 14:36:24 +00:00
|
|
|
char *params[37];
|
|
|
|
int pnr = 0;
|
|
|
|
|
|
|
|
params[pnr++] = strdup("timeField");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("depthField");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = strdup("tempField");
|
|
|
|
params[pnr++] = intdup(5);
|
|
|
|
params[pnr++] = strdup("po2Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2sensor1Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2sensor2Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2sensor3Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("cnsField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("ndlField");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("ttsField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("stopdepthField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("pressureField");
|
|
|
|
params[pnr++] = intdup(-1);
|
2018-04-18 17:28:30 +00:00
|
|
|
params[pnr++] = strdup("setpointField");
|
2015-08-27 14:36:24 +00:00
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("separatorIndex");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("units");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("hw");
|
|
|
|
params[pnr++] = strdup("\"DC text\"");
|
|
|
|
params[pnr++] = NULL;
|
|
|
|
|
2017-02-24 06:52:07 +00:00
|
|
|
QCOMPARE(parse_csv_file(SUBSURFACE_TEST_DATA "/dives/TestDiveSeabearHUDC.csv",
|
2019-02-28 21:45:17 +00:00
|
|
|
params, pnr - 1, "csv", &dive_table, &trip_table, &dive_site_table),
|
2018-07-25 19:39:04 +00:00
|
|
|
0);
|
2015-07-27 13:13:33 +00:00
|
|
|
|
2017-02-10 00:54:48 +00:00
|
|
|
QCOMPARE(dive_table.nr, 1);
|
2017-02-06 00:11:20 +00:00
|
|
|
|
2015-07-27 13:13:33 +00:00
|
|
|
/*
|
|
|
|
* CSV import uses time and date stamps relative to current
|
|
|
|
* time, thus we need to use a static (random) timestamp
|
|
|
|
*/
|
2017-02-06 12:49:24 +00:00
|
|
|
if (dive_table.nr > 0) {
|
|
|
|
struct dive *dive = dive_table.dives[dive_table.nr - 1];
|
|
|
|
dive->when = 1255152761;
|
|
|
|
dive->dc.when = 1255152761;
|
|
|
|
}
|
2015-07-27 13:13:33 +00:00
|
|
|
|
|
|
|
QCOMPARE(save_dives("./testhudcout.ssrf"), 0);
|
2017-03-04 15:06:52 +00:00
|
|
|
FILE_COMPARE("./testhudcout.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/TestDiveSeabearHUDC.xml");
|
2015-07-27 13:13:33 +00:00
|
|
|
}
|
|
|
|
|
2015-07-28 04:36:30 +00:00
|
|
|
void TestParse::testParseNewFormat()
|
|
|
|
{
|
|
|
|
QDir dir;
|
|
|
|
QStringList filter;
|
|
|
|
QStringList files;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set the directory location and file filter for H3 CSV files.
|
|
|
|
*/
|
|
|
|
|
2020-01-06 20:51:10 +00:00
|
|
|
dir.setPath(QString::fromLatin1(SUBSURFACE_TEST_DATA "/dives"));
|
2015-07-28 04:36:30 +00:00
|
|
|
filter << "TestDiveSeabearH3*.csv";
|
|
|
|
filter << "TestDiveSeabearT1*.csv";
|
|
|
|
files = dir.entryList(filter, QDir::Files);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Parse all files found matching the filter.
|
|
|
|
*/
|
|
|
|
|
|
|
|
for (int i = 0; i < files.size(); ++i) {
|
|
|
|
|
2017-05-07 13:32:11 +00:00
|
|
|
QCOMPARE(parse_seabear_log(QString::fromLatin1(SUBSURFACE_TEST_DATA
|
2018-07-25 19:39:04 +00:00
|
|
|
"/dives/")
|
|
|
|
.append(files.at(i))
|
|
|
|
.toLatin1()
|
2019-02-28 21:45:17 +00:00
|
|
|
.data(), &dive_table, &trip_table, &dive_site_table),
|
2018-07-25 19:39:04 +00:00
|
|
|
0);
|
2017-02-09 17:41:12 +00:00
|
|
|
QCOMPARE(dive_table.nr, i + 1);
|
2015-07-28 04:36:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stderr, "number of dives %d \n", dive_table.nr);
|
|
|
|
QCOMPARE(save_dives("./testsbnewout.ssrf"), 0);
|
2017-02-07 06:08:56 +00:00
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
// Currently the CSV parse fails
|
|
|
|
FILE_COMPARE("./testsbnewout.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/TestDiveSeabearNewFormat.xml");
|
2015-07-28 04:36:30 +00:00
|
|
|
}
|
|
|
|
|
2015-09-13 18:30:25 +00:00
|
|
|
void TestParse::testParseDLD()
|
|
|
|
{
|
|
|
|
struct memblock mem;
|
2017-02-24 06:52:07 +00:00
|
|
|
QString filename = SUBSURFACE_TEST_DATA "/dives/TestDiveDivelogsDE.DLD";
|
2015-09-13 18:30:25 +00:00
|
|
|
|
|
|
|
QVERIFY(readfile(filename.toLatin1().data(), &mem) > 0);
|
2019-02-28 21:45:17 +00:00
|
|
|
QVERIFY(try_to_open_zip(filename.toLatin1().data(), &dive_table, &trip_table, &dive_site_table) > 0);
|
2015-09-13 18:30:25 +00:00
|
|
|
|
|
|
|
fprintf(stderr, "number of dives from DLD: %d \n", dive_table.nr);
|
|
|
|
|
2017-03-04 15:06:52 +00:00
|
|
|
// Compare output
|
2015-09-13 18:30:27 +00:00
|
|
|
QCOMPARE(save_dives("./testdldout.ssrf"), 0);
|
2017-03-04 15:06:52 +00:00
|
|
|
FILE_COMPARE("./testdldout.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/TestDiveDivelogsDE.xml")
|
2015-09-13 18:30:27 +00:00
|
|
|
}
|
|
|
|
|
2017-02-10 06:16:08 +00:00
|
|
|
void TestParse::testParseMerge()
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* check that we correctly merge mixed cylinder dives
|
|
|
|
*/
|
2019-02-28 21:45:17 +00:00
|
|
|
QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/ostc.xml", &dive_table, &trip_table, &dive_site_table), 0);
|
|
|
|
QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/vyper.xml", &dive_table, &trip_table, &dive_site_table), 0);
|
2017-02-10 06:16:08 +00:00
|
|
|
QCOMPARE(save_dives("./testmerge.ssrf"), 0);
|
2017-03-04 15:06:52 +00:00
|
|
|
FILE_COMPARE("./testmerge.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/mergedVyperOstc.xml");
|
2017-02-10 06:16:08 +00:00
|
|
|
}
|
|
|
|
|
2017-03-14 04:58:59 +00:00
|
|
|
int TestParse::parseCSVmanual(int units, std::string file)
|
|
|
|
{
|
|
|
|
verbose = 1;
|
2020-05-16 10:04:18 +00:00
|
|
|
char *params[59];
|
2017-03-14 04:58:59 +00:00
|
|
|
int pnr = 0;
|
|
|
|
|
2018-03-14 20:38:38 +00:00
|
|
|
// Numbers are column numbers
|
2017-05-04 18:22:41 +00:00
|
|
|
params[pnr++] = strdup("numberField");
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("dateField");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = strdup("timeField");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("durationField");
|
|
|
|
params[pnr++] = intdup(3);
|
2020-05-16 10:04:18 +00:00
|
|
|
// 4 Will be SAC, once we add support for reading it
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = strdup("maxDepthField");
|
|
|
|
params[pnr++] = intdup(5);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("meanDepthField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(6);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("modeField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(7);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("airtempField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(8);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("watertempField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(9);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("cylindersizeField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(10);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("startpressureField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(11);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("endpressureField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(12);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("o2Field");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(13);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("heField");
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = intdup(14);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("locationField");
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = intdup(15);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("gpsField");
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = intdup(16);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("divemasterField");
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = intdup(17);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("buddyField");
|
2020-05-04 05:20:03 +00:00
|
|
|
params[pnr++] = intdup(18);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("suitField");
|
|
|
|
params[pnr++] = intdup(19);
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = strdup("notesField");
|
|
|
|
params[pnr++] = intdup(22);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("weightField");
|
2020-05-04 05:20:03 +00:00
|
|
|
params[pnr++] = intdup(23);
|
2020-05-16 10:04:18 +00:00
|
|
|
params[pnr++] = strdup("tagsField");
|
|
|
|
params[pnr++] = intdup(24);
|
2020-03-11 10:30:51 +00:00
|
|
|
// Numbers are indices of possible options
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = strdup("separatorIndex");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("datefmt");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("durationfmt");
|
|
|
|
params[pnr++] = intdup(2);
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = strdup("units");
|
|
|
|
params[pnr++] = intdup(units);
|
2017-03-14 04:58:59 +00:00
|
|
|
params[pnr++] = NULL;
|
|
|
|
|
2019-02-28 21:45:17 +00:00
|
|
|
return parse_manual_file(file.c_str(), params, pnr - 1, &dive_table, &trip_table, &dive_site_table);
|
2017-03-14 04:58:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TestParse::exportCSVDiveDetails()
|
|
|
|
{
|
2020-05-21 14:57:24 +00:00
|
|
|
int saved_sac = 0;
|
2020-05-17 19:10:40 +00:00
|
|
|
|
2020-05-21 16:15:21 +00:00
|
|
|
parse_file(SUBSURFACE_TEST_DATA "/dives/test25.xml", &dive_table, &trip_table, &dive_site_table);
|
2017-03-14 04:58:59 +00:00
|
|
|
|
2018-09-10 12:47:56 +00:00
|
|
|
export_dives_xslt("testcsvexportmanual.csv", 0, 0, "xml2manualcsv.xslt", false);
|
|
|
|
export_dives_xslt("testcsvexportmanualimperial.csv", 0, 1, "xml2manualcsv.xslt", false);
|
2017-03-14 04:58:59 +00:00
|
|
|
|
2020-05-17 19:10:40 +00:00
|
|
|
if (dive_table.nr > 0) {
|
|
|
|
struct dive *dive = dive_table.dives[dive_table.nr - 1];
|
|
|
|
saved_sac = dive->sac;
|
|
|
|
}
|
2017-03-14 04:58:59 +00:00
|
|
|
clear_dive_file_data();
|
|
|
|
|
|
|
|
parseCSVmanual(1, "testcsvexportmanualimperial.csv");
|
2020-05-16 10:04:18 +00:00
|
|
|
|
|
|
|
// We do not currently support reading SAC, thus faking it
|
|
|
|
if (dive_table.nr > 0) {
|
|
|
|
struct dive *dive = dive_table.dives[dive_table.nr - 1];
|
2020-05-17 19:10:40 +00:00
|
|
|
dive->sac = saved_sac;
|
2020-05-16 10:04:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-09-10 12:47:56 +00:00
|
|
|
export_dives_xslt("testcsvexportmanual2.csv", 0, 0, "xml2manualcsv.xslt", false);
|
2017-03-14 04:58:59 +00:00
|
|
|
|
|
|
|
FILE_COMPARE("testcsvexportmanual2.csv",
|
2018-07-25 19:39:04 +00:00
|
|
|
"testcsvexportmanual.csv");
|
2017-03-29 17:33:52 +00:00
|
|
|
|
|
|
|
clear_dive_file_data();
|
2017-03-14 04:58:59 +00:00
|
|
|
}
|
|
|
|
|
2020-05-24 13:50:56 +00:00
|
|
|
void TestParse::exportSubsurfaceCSV()
|
|
|
|
{
|
|
|
|
int saved_sac = 0;
|
|
|
|
char *params[59];
|
|
|
|
int pnr = 0;
|
|
|
|
|
|
|
|
/* Test SubsurfaceCSV with multiple cylinders */
|
|
|
|
parse_file(SUBSURFACE_TEST_DATA "/dives/test40.xml", &dive_table, &trip_table, &dive_site_table);
|
|
|
|
|
|
|
|
export_dives_xslt("testcsvexportmanual-cyl.csv", 0, 0, "xml2manualcsv.xslt", false);
|
|
|
|
export_dives_xslt("testcsvexportmanualimperial-cyl.csv", 0, 1, "xml2manualcsv.xslt", false);
|
|
|
|
|
|
|
|
if (dive_table.nr > 0) {
|
|
|
|
struct dive *dive = dive_table.dives[dive_table.nr - 1];
|
|
|
|
saved_sac = dive->sac;
|
|
|
|
}
|
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
|
|
|
|
params[pnr++] = strdup("separatorIndex");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("units");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = 0;
|
|
|
|
parse_csv_file("testcsvexportmanualimperial-cyl.csv", params, pnr - 1, "SubsurfaceCSV", &dive_table, &trip_table, &dive_site_table);
|
|
|
|
|
|
|
|
// We do not currently support reading SAC, thus faking it
|
|
|
|
if (dive_table.nr > 0) {
|
|
|
|
struct dive *dive = dive_table.dives[dive_table.nr - 1];
|
|
|
|
dive->sac = saved_sac;
|
|
|
|
}
|
|
|
|
|
|
|
|
export_dives_xslt("testcsvexportmanual2-cyl.csv", 0, 0, "xml2manualcsv.xslt", false);
|
|
|
|
|
|
|
|
FILE_COMPARE("testcsvexportmanual2-cyl.csv",
|
|
|
|
"testcsvexportmanual-cyl.csv");
|
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
}
|
|
|
|
|
2017-05-09 19:28:04 +00:00
|
|
|
int TestParse::parseCSVprofile(int units, std::string file)
|
|
|
|
{
|
|
|
|
verbose = 1;
|
|
|
|
char *params[55];
|
|
|
|
int pnr = 0;
|
|
|
|
|
2018-03-14 20:38:38 +00:00
|
|
|
// Numbers are column numbers
|
|
|
|
params[pnr++] = strdup("numberField");
|
|
|
|
params[pnr++] = intdup(0);
|
2017-05-09 19:28:04 +00:00
|
|
|
params[pnr++] = strdup("dateField");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = strdup("starttimeField");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("timeField");
|
|
|
|
params[pnr++] = intdup(3);
|
|
|
|
params[pnr++] = strdup("depthField");
|
|
|
|
params[pnr++] = intdup(4);
|
|
|
|
params[pnr++] = strdup("tempField");
|
|
|
|
params[pnr++] = intdup(5);
|
|
|
|
params[pnr++] = strdup("pressureField");
|
|
|
|
params[pnr++] = intdup(6);
|
2020-03-11 10:30:51 +00:00
|
|
|
// Numbers are indices of possible options
|
2018-03-14 20:38:38 +00:00
|
|
|
params[pnr++] = strdup("datefmt");
|
|
|
|
params[pnr++] = intdup(2);
|
2017-05-09 19:28:04 +00:00
|
|
|
params[pnr++] = strdup("units");
|
|
|
|
params[pnr++] = intdup(units);
|
|
|
|
params[pnr++] = NULL;
|
|
|
|
|
2019-02-28 21:45:17 +00:00
|
|
|
return parse_csv_file(file.c_str(), params, pnr - 1, "csv", &dive_table, &trip_table, &dive_site_table);
|
2017-05-09 19:28:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TestParse::exportCSVDiveProfile()
|
|
|
|
{
|
2019-02-28 21:45:17 +00:00
|
|
|
parse_file(SUBSURFACE_TEST_DATA "/dives/test40.xml", &dive_table, &trip_table, &dive_site_table);
|
2017-05-09 19:28:04 +00:00
|
|
|
|
2018-09-10 12:47:56 +00:00
|
|
|
export_dives_xslt("testcsvexportprofile.csv", 0, 0, "xml2csv.xslt", false);
|
|
|
|
export_dives_xslt("testcsvexportprofileimperial.csv", 0, 1, "xml2csv.xslt", false);
|
2017-05-09 19:28:04 +00:00
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
|
|
|
|
parseCSVprofile(1, "testcsvexportprofileimperial.csv");
|
2018-09-10 12:47:56 +00:00
|
|
|
export_dives_xslt("testcsvexportprofile2.csv", 0, 0, "xml2csv.xslt", false);
|
2017-05-09 19:28:04 +00:00
|
|
|
|
|
|
|
FILE_COMPARE("testcsvexportprofile2.csv",
|
2018-07-25 19:39:04 +00:00
|
|
|
"testcsvexportprofile.csv");
|
2017-05-09 19:28:04 +00:00
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
}
|
|
|
|
|
2017-05-04 19:10:35 +00:00
|
|
|
void TestParse::exportUDDF()
|
|
|
|
{
|
2019-02-28 21:45:17 +00:00
|
|
|
parse_file(SUBSURFACE_TEST_DATA "/dives/test40.xml", &dive_table, &trip_table, &dive_site_table);
|
2017-05-04 19:10:35 +00:00
|
|
|
|
2018-09-10 12:47:56 +00:00
|
|
|
export_dives_xslt("testuddfexport.uddf", 0, 1, "uddf-export.xslt", false);
|
2017-05-04 19:10:35 +00:00
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
|
2019-02-28 21:45:17 +00:00
|
|
|
parse_file("testuddfexport.uddf", &dive_table, &trip_table, &dive_site_table);
|
2018-09-10 12:47:56 +00:00
|
|
|
export_dives_xslt("testuddfexport2.uddf", 0, 1, "uddf-export.xslt", false);
|
2017-05-04 19:10:35 +00:00
|
|
|
|
|
|
|
FILE_COMPARE("testuddfexport.uddf",
|
2018-07-25 19:39:04 +00:00
|
|
|
"testuddfexport2.uddf");
|
2017-05-04 19:10:35 +00:00
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
}
|
|
|
|
|
2017-03-14 04:58:59 +00:00
|
|
|
void TestParse::testExport()
|
|
|
|
{
|
|
|
|
exportCSVDiveDetails();
|
2020-05-24 13:50:56 +00:00
|
|
|
exportSubsurfaceCSV();
|
2017-05-09 19:28:04 +00:00
|
|
|
exportCSVDiveProfile();
|
2017-05-04 19:10:35 +00:00
|
|
|
exportUDDF();
|
2017-03-14 04:58:59 +00:00
|
|
|
}
|
|
|
|
|
2018-01-06 19:16:53 +00:00
|
|
|
void TestParse::parseDL7()
|
|
|
|
{
|
2018-01-07 13:25:14 +00:00
|
|
|
char *params[51];
|
2018-01-06 19:16:53 +00:00
|
|
|
int pnr = 0;
|
|
|
|
|
|
|
|
params[pnr++] = strdup("dateField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("datefmt");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("starttimeField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("numberField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("timeField");
|
|
|
|
params[pnr++] = intdup(1);
|
|
|
|
params[pnr++] = strdup("depthField");
|
|
|
|
params[pnr++] = intdup(2);
|
|
|
|
params[pnr++] = strdup("tempField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("po2Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2sensor1Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2sensor2Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("o2sensor3Field");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("cnsField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("ndlField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("ttsField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("stopdepthField");
|
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("pressureField");
|
|
|
|
params[pnr++] = intdup(-1);
|
2018-04-18 17:28:30 +00:00
|
|
|
params[pnr++] = strdup("setpointField");
|
2018-01-06 19:16:53 +00:00
|
|
|
params[pnr++] = intdup(-1);
|
|
|
|
params[pnr++] = strdup("separatorIndex");
|
|
|
|
params[pnr++] = intdup(3);
|
|
|
|
params[pnr++] = strdup("units");
|
|
|
|
params[pnr++] = intdup(0);
|
|
|
|
params[pnr++] = strdup("hw");
|
|
|
|
params[pnr++] = strdup("DL7");
|
|
|
|
params[pnr++] = 0;
|
|
|
|
|
|
|
|
clear_dive_file_data();
|
|
|
|
QCOMPARE(parse_csv_file(SUBSURFACE_TEST_DATA "/dives/DL7.zxu",
|
2019-02-28 21:45:17 +00:00
|
|
|
params, pnr - 1, "DL7", &dive_table, &trip_table, &dive_site_table),
|
2018-07-25 19:39:04 +00:00
|
|
|
0);
|
2018-01-07 07:42:04 +00:00
|
|
|
QCOMPARE(dive_table.nr, 3);
|
2018-01-06 19:16:53 +00:00
|
|
|
|
2018-01-06 21:09:34 +00:00
|
|
|
QCOMPARE(save_dives("./testdl7out.ssrf"), 0);
|
|
|
|
FILE_COMPARE("./testdl7out.ssrf",
|
2018-07-25 19:39:04 +00:00
|
|
|
SUBSURFACE_TEST_DATA "/dives/DL7.xml");
|
2018-01-06 19:16:53 +00:00
|
|
|
clear_dive_file_data();
|
|
|
|
}
|
|
|
|
|
2017-03-14 04:58:59 +00:00
|
|
|
|
2017-02-05 22:26:51 +00:00
|
|
|
QTEST_GUILESS_MAIN(TestParse)
|