diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-04-16 13:33:53 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-04-16 13:33:53 +0200 | 
| commit | 4eb252df04ab237c8638d45bcbf028859dc6a110 (patch) | |
| tree | 8bffddf62b4271336a6e0121fef8133327654000 /test | |
| parent | ef68248bf70a027595803b08433a7a2c74e20fd0 (diff) | |
| parent | 35e804b984c28131fe13d229c5a0867762c6e8cf (diff) | |
Merge branch 'settings'
Diffstat (limited to 'test')
| -rw-r--r-- | test/Makefile.am | 14 | ||||
| -rw-r--r-- | test/atomictest.cc | 135 | ||||
| -rw-r--r-- | test/engine.cc | 3 | ||||
| -rw-r--r-- | test/memcheckertest.cc | 7 | ||||
| -rw-r--r-- | test/syncedsettings.cc | 203 | 
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); + | 
