summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2015-07-04 09:12:54 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-07-05 09:42:38 -0700
commit35dc81410518e6d39ba8b3f99348884778bedc5b (patch)
tree84f0d4c9933bc547d25aa569f717878d805f72da /tests
parent17ef6774e050fd4974d13d1a75d1d8d607de34c0 (diff)
downloadsubsurface-35dc81410518e6d39ba8b3f99348884778bedc5b.tar.gz
Add simple test for the dive planner
This sets up a standard dive scenario (30 minutes at 260ft/79m, EAN36 and Oxygen as deco gases, last stop at 20ft/6m) and calls the planner to set up a dive plan given certain standard gases. Instead of trying to verify the complete plans it checks that we switch to the deco gases at the right depth and the complete duration of the dive matches our expectation. The test intentionally fails right now for imperial as we have the wrong switch depth for Oxygen. See how useful tests are? On the downside, the test does NOT produce the same plan as Subsurface when I try to create a consistent setup for both - and I have not been able to figure out why. There must be some other parameters that I'm not setting, but I haven't identified them, yet. It's very small differences, for example in the metric case the stops at 21m, 9m, and 6m are each one minute shorter in the test than it what Subsurface calculates. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/testplan.cpp119
-rw-r--r--tests/testplan.h13
2 files changed, 132 insertions, 0 deletions
diff --git a/tests/testplan.cpp b/tests/testplan.cpp
new file mode 100644
index 000000000..f08cfdeeb
--- /dev/null
+++ b/tests/testplan.cpp
@@ -0,0 +1,119 @@
+#include "dive.h"
+#include "testplan.h"
+#include "planner.h"
+#include "units.h"
+#include <QDebug>
+
+// testing the dive plan algorithm
+extern bool plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool show_disclaimer);
+
+void setupPrefs()
+{
+ prefs = default_prefs;
+ prefs.ascrate50 = feet_to_mm(30) / 60;
+ prefs.ascrate75 = prefs.ascrate50;
+ prefs.ascratestops = prefs.ascrate50;
+ prefs.ascratelast6m = feet_to_mm(10) / 60;
+ prefs.last_stop = true;
+
+}
+
+void setupPlan(struct diveplan *dp)
+{
+ dp->salinity = 10030;
+ dp->surface_pressure = 1013;
+ dp->gfhigh = 100;
+ dp->gflow = 100;
+ dp->bottomsac = 0;
+ dp->decosac = 0;
+
+ struct gasmix bottomgas = { {150}, {450} };
+ struct gasmix ean36 = { {360}, {0} };
+ struct gasmix oxygen = { {1000}, {0} };
+ pressure_t po2 = { 1600 };
+ displayed_dive.cylinder[0].gasmix = bottomgas;
+ displayed_dive.cylinder[1].gasmix = ean36;
+ displayed_dive.cylinder[2].gasmix = oxygen;
+ reset_cylinders(&displayed_dive, true);
+ free_dps(dp);
+
+ int droptime = M_OR_FT(79, 260) * 60 / M_OR_FT(23, 75);
+ plan_add_segment(dp, droptime, M_OR_FT(79, 260), bottomgas, 0, 1);
+ plan_add_segment(dp, 30*60 - droptime, M_OR_FT(79, 260), bottomgas, 0, 1);
+ plan_add_segment(dp, 0, gas_mod(&ean36, po2, M_OR_FT(3,10)).mm, ean36, 0, 1);
+ plan_add_segment(dp, 0, gas_mod(&oxygen, po2, M_OR_FT(3,10)).mm, oxygen, 0, 1);
+}
+
+void TestPlan::testMetric()
+{
+ char *cache = NULL;
+
+ setupPrefs();
+ prefs.unit_system = METRIC;
+ prefs.units.length = units::METERS;
+ prefs.deco_mode = BUEHLMANN;
+
+ struct diveplan testPlan = { 0 };
+ setupPlan(&testPlan);
+
+ plan(&testPlan, &cache, 1, 0);
+
+#if DEBUG
+ free(displayed_dive.notes);
+ displayed_dive.notes = NULL;
+ save_dive(stdout, &displayed_dive);
+#endif
+
+ // check first gas change to EAN36 at 33m
+ struct event *ev = displayed_dive.dc.events;
+ QVERIFY(ev != NULL);
+ QCOMPARE(ev->gas.index, 1);
+ QCOMPARE(ev->value, 36);
+ QCOMPARE(get_depth_at_time(&displayed_dive.dc, ev->time.seconds), 33000);
+ // check second gas change to Oxygen at 6m
+ ev = ev->next;
+ QVERIFY(ev != NULL);
+ QCOMPARE(ev->gas.index, 2);
+ QCOMPARE(ev->value, 100);
+ QCOMPARE(get_depth_at_time(&displayed_dive.dc, ev->time.seconds), 6000);
+ // check expected run time of 105 minutes
+ QCOMPARE(displayed_dive.dc.duration.seconds, 104u * 60u);
+}
+
+void TestPlan::testImperial()
+{
+ char *cache = NULL;
+
+ setupPrefs();
+ prefs.unit_system = IMPERIAL;
+ prefs.units.length = units::FEET;
+ prefs.deco_mode = BUEHLMANN;
+
+ struct diveplan testPlan = { 0 };
+ setupPlan(&testPlan);
+
+ plan(&testPlan, &cache, 1, 0);
+
+#if DEBUG
+ free(displayed_dive.notes);
+ displayed_dive.notes = NULL;
+ save_dive(stdout, &displayed_dive);
+#endif
+
+ // check first gas change to EAN36 at 33m
+ struct event *ev = displayed_dive.dc.events;
+ QVERIFY(ev != NULL);
+ QCOMPARE(ev->gas.index, 1);
+ QCOMPARE(ev->value, 36);
+ QCOMPARE(get_depth_at_time(&displayed_dive.dc, ev->time.seconds), 33528);
+ // check second gas change to Oxygen at 6m
+ ev = ev->next;
+ QVERIFY(ev != NULL);
+ QCOMPARE(ev->gas.index, 2);
+ QCOMPARE(ev->value, 100);
+ QCOMPARE(get_depth_at_time(&displayed_dive.dc, ev->time.seconds), 6096);
+ // check expected run time of 105 minutes
+ QCOMPARE(displayed_dive.dc.duration.seconds, 105u * 60u);
+}
+
+QTEST_MAIN(TestPlan)
diff --git a/tests/testplan.h b/tests/testplan.h
new file mode 100644
index 000000000..b35cd75c6
--- /dev/null
+++ b/tests/testplan.h
@@ -0,0 +1,13 @@
+#ifndef TESTPLAN_H
+#define TESTPLAN_H
+
+#include <QTest>
+
+class TestPlan : public QObject {
+ Q_OBJECT
+private slots:
+ void testImperial();
+ void testMetric();
+};
+
+#endif // TESTPLAN_H