summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am14
-rw-r--r--test/atomictest.cc135
-rw-r--r--test/engine.cc3
-rw-r--r--test/memcheckertest.cc7
-rw-r--r--test/syncedsettings.cc203
5 files changed, 355 insertions, 7 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index ccb21e6..3633ad8 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -3,7 +3,7 @@ include $(top_srcdir)/src/Makefile.am.drumgizmo
TESTS = resource engine gui resampler lv2 configfile audiocache \
audiocachefile audiocacheidmanager audiocacheeventhandler \
- memchecker random
+ memchecker random atomictest syncedsettingstest
check_PROGRAMS = $(TESTS)
@@ -29,7 +29,6 @@ audiocache_SOURCES = \
$(top_srcdir)/src/thread.cc \
$(top_srcdir)/src/mutex.cc \
$(top_srcdir)/src/semaphore.cc \
- $(top_srcdir)/src/configuration.cc \
$(top_srcdir)/src/audiofile.cc \
test.cc \
audiocachetest.cc
@@ -43,7 +42,6 @@ audiocachefile_SOURCES = \
$(top_srcdir)/src/thread.cc \
$(top_srcdir)/src/mutex.cc \
$(top_srcdir)/src/semaphore.cc \
- $(top_srcdir)/src/configuration.cc \
$(top_srcdir)/src/audiofile.cc \
test.cc \
audiocachefiletest.cc
@@ -138,5 +136,15 @@ random_SOURCES = \
test.cc \
randomtest.cc
+atomictest_CXXFLAGS = -DOUTPUT=\"atomictest\" $(CPPUNIT_CFLAGS) \
+ -I$(top_srcdir)/src -I$(top_srcdir)/hugin
+atomictest_LDFLAGS = $(CPPUNIT_LIBS)
+atomictest_SOURCES = atomictest.cc test.cc
+
+syncedsettingstest_CXXFLAGS = -DOUTPUT=\"syncedsettingstest\" $(CPPUNIT_CFLAGS) \
+ -I$(top_srcdir)/src -I$(top_srcdir)/hugin
+syncedsettingstest_LDFLAGS = $(CPPUNIT_LIBS)
+syncedsettingstest_SOURCES = syncedsettings.cc test.cc
+
EXTRA_DIST = \
lv2_test_host.h
diff --git a/test/atomictest.cc b/test/atomictest.cc
new file mode 100644
index 0000000..1718b33
--- /dev/null
+++ b/test/atomictest.cc
@@ -0,0 +1,135 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * atomic.cc
+ *
+ * Wed Mar 23 09:17:12 CET 2016
+ * Copyright 2016 Christian Glöckner
+ * cgloeckner@freenet.de
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <atomic.h>
+
+class AtomicTest
+ : public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE(AtomicTest);
+ CPPUNIT_TEST(podAtomicsUseStandardImpl);
+ CPPUNIT_TEST(nonPodAtomicsUseOwnImpl);
+ CPPUNIT_TEST(podAtomicCanBeDefaultInitialized);
+ CPPUNIT_TEST(nonPodAtomicCanBeDefaultInitialized);
+ CPPUNIT_TEST(podAtomicCanBeValueInitialized);
+ CPPUNIT_TEST(nonPodAtomicCanBeValueInitialized);
+ CPPUNIT_TEST(podAtomicCanBeValueAssigned);
+ CPPUNIT_TEST(nonPodAtomicCanBeValueAssigned);
+ CPPUNIT_TEST(podAtomicsAreLockFree);
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+ void setUp() {}
+ void tearDown() {}
+
+ void podAtomicsUseStandardImpl() {
+ CPPUNIT_ASSERT(isUsingStandardImpl<bool>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<unsigned short int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<short int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<unsigned int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<unsigned long int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<long int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<unsigned long long int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<long long int>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<float>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<double>());
+ CPPUNIT_ASSERT(isUsingStandardImpl<long double>());
+ }
+
+ void nonPodAtomicsUseOwnImpl() {
+ CPPUNIT_ASSERT(!isUsingStandardImpl<std::string>());
+ }
+
+ void podAtomicCanBeDefaultInitialized() {
+ Atomic<int> i;
+ // note: i is initialized with garbage
+ }
+
+ void nonPodAtomicCanBeDefaultInitialized() {
+ Atomic<std::string> s;
+ CPPUNIT_ASSERT_EQUAL(s.load(), std::string{});
+ }
+
+ void podAtomicCanBeValueInitialized() {
+ Atomic<int> i{5};
+ CPPUNIT_ASSERT_EQUAL(i.load(), 5);
+ }
+
+ void nonPodAtomicCanBeValueInitialized() {
+ Atomic<std::string> s{"hello world"};
+ CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"});
+ }
+
+ void podAtomicCanBeValueAssigned() {
+ Atomic<int> i;
+ i = 5;
+ CPPUNIT_ASSERT_EQUAL(i.load(), 5);
+ }
+
+ void nonPodAtomicCanBeValueAssigned() {
+ Atomic<std::string> s;
+ s = "hello world";
+ CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"});
+ }
+
+ void podAtomicsAreLockFree() {
+ CPPUNIT_ASSERT(isLockFree<bool>());
+ CPPUNIT_ASSERT(isLockFree<unsigned short int>());
+ CPPUNIT_ASSERT(isLockFree<short int>());
+ CPPUNIT_ASSERT(isLockFree<unsigned int>());
+ CPPUNIT_ASSERT(isLockFree<int>());
+ CPPUNIT_ASSERT(isLockFree<unsigned long int>());
+ CPPUNIT_ASSERT(isLockFree<long int>());
+ CPPUNIT_ASSERT(isLockFree<unsigned long long int>());
+ CPPUNIT_ASSERT(isLockFree<long long int>());
+ CPPUNIT_ASSERT(isLockFree<float>());
+ CPPUNIT_ASSERT(isLockFree<double>());
+
+ // compile error: undefined reference to `__atomic_is_lock_free'
+ //CPPUNIT_ASSERT(isLockFree<long double>());
+ }
+
+ // todo: further testing
+
+ private:
+ template <typename T>
+ bool isUsingStandardImpl() {
+ return std::is_base_of<std::atomic<T>, Atomic<T>>::value;
+ }
+
+ template <typename T>
+ bool isLockFree() {
+ Atomic<T> a;
+ return a.is_lock_free();
+ }
+};
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION(AtomicTest);
+
diff --git a/test/engine.cc b/test/engine.cc
index 86f4f4d..89c0158 100644
--- a/test/engine.cc
+++ b/test/engine.cc
@@ -40,9 +40,10 @@ public:
void tearDown() {}
void loading() {
+ Settings settings;
AudioOutputEngine *oe = NULL;
AudioInputEngine *ie = NULL;
- DrumGizmo dg(oe, ie);
+ DrumGizmo dg(settings, oe, ie);
dg.setFrameSize(100);
// Switch kits emmidiately with giving the loader time to work:
diff --git a/test/memcheckertest.cc b/test/memcheckertest.cc
index 90bd254..e312ca7 100644
--- a/test/memcheckertest.cc
+++ b/test/memcheckertest.cc
@@ -52,6 +52,7 @@ class MemCheckerTest
CPPUNIT_TEST(check_free_ram);
CPPUNIT_TEST_SUITE_END();
private:
+ Settings settings;
DrumKit kit;
const std::string small_kit_path = "kit/small_kit.xml";
@@ -70,7 +71,7 @@ public:
void small_drumkit()
{
// load the small kit
- DrumKitParser parser(kit);
+ DrumKitParser parser(settings, kit);
CPPUNIT_ASSERT(!parser.parseFile(small_kit_path));
// check if the memchecker thinks it fits into memory
@@ -80,7 +81,7 @@ public:
void huge_drumkit()
{
// load the huge kit
- DrumKitParser parser(kit);
+ DrumKitParser parser(settings, kit);
CPPUNIT_ASSERT(!parser.parseFile(huge_kit_path));
// check if the memchecker thinks it doesn't fit into memory
@@ -94,7 +95,7 @@ public:
CPPUNIT_ASSERT_EQUAL(bytes_per_channel, calcBytesPerChannel(audiofile));
// load the huge kit
- DrumKitParser parser(kit);
+ DrumKitParser parser(settings, kit);
CPPUNIT_ASSERT(!parser.parseFile(huge_kit_path));
// check if the protected method of the memchecker reports the correct size
diff --git a/test/syncedsettings.cc b/test/syncedsettings.cc
new file mode 100644
index 0000000..62bd8c6
--- /dev/null
+++ b/test/syncedsettings.cc
@@ -0,0 +1,203 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * syncedsettings.cc
+ *
+ * Wed Mar 31 09:32:12 CET 2016
+ * Copyright 2016 Christian Glöckner
+ * cgloeckner@freenet.de
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <syncedsettings.h>
+
+class SyncedSettingsTest
+ : public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE(SyncedSettingsTest);
+ CPPUNIT_TEST(groupCanBeDefaultInitialized);
+ CPPUNIT_TEST(groupDataCanBeCopied);
+
+ CPPUNIT_TEST(accessorCanGetFields);
+ CPPUNIT_TEST(accessorCanSetFields);
+
+ CPPUNIT_TEST(groupHasCopyCtor);
+ CPPUNIT_TEST(groupHasMoveCtor);
+ CPPUNIT_TEST(groupHasCopyAssignOp);
+ CPPUNIT_TEST(groupHasMoveAssignOp);
+
+ CPPUNIT_TEST(mimicRealUse);
+ CPPUNIT_TEST_SUITE_END();
+
+ private:
+ struct TestData {
+ float foo;
+ bool bar;
+ std::string msg;
+ };
+
+ public:
+ void setUp() {}
+ void tearDown() {}
+
+ void groupCanBeDefaultInitialized() {
+ Group<TestData> data;
+ }
+
+ void groupDataCanBeCopied() {
+ Group<TestData> data;
+ (TestData)data; // copies
+ }
+
+ void accessorCanSetFields() {
+ Group<TestData> data;
+ {
+ Accessor<TestData> a{data};
+ a.data.foo = 3.f;
+ a.data.bar = false;
+ a.data.msg = "hello";
+ }
+ TestData copy = data;
+ CPPUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+ CPPUNIT_ASSERT_EQUAL(copy.bar, false);
+ CPPUNIT_ASSERT_EQUAL(copy.msg, std::string{"hello"});
+ }
+
+ void accessorCanGetFields() {
+ Group<TestData> data;
+ {
+ Accessor<TestData> a{data};
+ a.data.foo = 3.f;
+ a.data.bar = false;
+ a.data.msg = "hello";
+ }
+ // now read
+ {
+ Accessor<TestData> a{data};
+ CPPUNIT_ASSERT_EQUAL(a.data.foo, 3.f);
+ CPPUNIT_ASSERT_EQUAL(a.data.bar, false);
+ CPPUNIT_ASSERT_EQUAL(a.data.msg, std::string{"hello"});
+ }
+ }
+
+ void groupHasCopyCtor() {
+ Group<TestData> tmp;
+ {
+ Accessor<TestData> a{tmp};
+ a.data.foo = 3.f;
+ a.data.bar = false;
+ a.data.msg = "hello";
+ }
+ Group<TestData> data{tmp};
+ TestData copy = data;
+ CPPUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+ CPPUNIT_ASSERT_EQUAL(copy.bar, false);
+ CPPUNIT_ASSERT_EQUAL(copy.msg, std::string{"hello"});
+ }
+
+ void groupHasMoveCtor() {
+ Group<TestData> tmp;
+ {
+ Accessor<TestData> a{tmp};
+ a.data.foo = 3.f;
+ a.data.bar = false;
+ a.data.msg = "hello";
+ }
+ Group<TestData> data{std::move(tmp)};
+ TestData copy = data;
+ CPPUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+ CPPUNIT_ASSERT_EQUAL(copy.bar, false);
+ CPPUNIT_ASSERT_EQUAL(copy.msg, std::string{"hello"});
+ }
+
+ void groupHasCopyAssignOp() {
+ Group<TestData> tmp;
+ {
+ Accessor<TestData> a{tmp};
+ a.data.foo = 3.f;
+ a.data.bar = false;
+ a.data.msg = "hello";
+ }
+ Group<TestData> data = tmp;
+ TestData copy = data;
+ CPPUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+ CPPUNIT_ASSERT_EQUAL(copy.bar, false);
+ CPPUNIT_ASSERT_EQUAL(copy.msg, std::string{"hello"});
+ }
+
+ void groupHasMoveAssignOp() {
+ Group<TestData> tmp;
+ {
+ Accessor<TestData> a{tmp};
+ a.data.foo = 3.f;
+ a.data.bar = false;
+ a.data.msg = "hello";
+ }
+ Group<TestData> data = std::move(tmp);
+ TestData copy = data;
+ CPPUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+ CPPUNIT_ASSERT_EQUAL(copy.bar, false);
+ CPPUNIT_ASSERT_EQUAL(copy.msg, std::string{"hello"});
+ }
+
+ void mimicRealUse() {
+ struct Settings {
+ struct Foo {
+ float a{5};
+ float b{3};
+ bool enabled{true};
+ };
+ struct Bar {
+ std::string label{"empty"};
+ float bla{0.f};
+ };
+
+ Group<Foo> foo;
+ Group<Bar> bar;
+ };
+
+ Settings s;
+
+ // set bar settings
+ {
+ Accessor<Settings::Bar> tmp{s.bar};
+ tmp.data.label = "hello world";
+ tmp.data.bla = 3.14f;
+ }
+
+ // read foo settings
+ {
+ Accessor<Settings::Foo> tmp{s.foo};
+ if (tmp.data.enabled) {
+ // do some while locked
+ }
+ }
+ // or:
+ Settings::Foo copy = s.foo;
+ if (copy.enabled) {
+ // do some stuff without locking
+ }
+ CPPUNIT_ASSERT(copy.enabled);
+ }
+};
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION(SyncedSettingsTest);
+