From 2abc107b24f73b8c4664189c34196d9a27a3e339 Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Sat, 16 Jun 2018 18:05:00 +0200
Subject: Port the rest of the unittests to DGUnit and remove the CppUnit
 dependency.

---
 configure.ac                       |  10 --
 plugin/Makefile.mingw32.in         |   1 -
 src/memchecker.cc                  | 137 ---------------
 src/memchecker.h                   |  52 ------
 test/Makefile.am                   | 120 +++++++-------
 test/atomictest.cc                 |  94 ++++++-----
 test/audiocacheeventhandlertest.cc |  18 +-
 test/audiocachefiletest.cc         |  50 +++---
 test/audiocacheidmanagertest.cc    |  50 +++---
 test/audiocachetest.cc             |  32 ++--
 test/bytesizeparsertest.cc         |  61 ++++---
 test/configtest.cc                 | 260 ++++++++++++++---------------
 test/dgunit.h                      |   1 +
 test/drumkitcreatortest.cc         |  20 +--
 test/drumkitparsertest.cc          |   4 +-
 test/enginetest.cc                 |  18 +-
 test/imagecachetest.cc             |  44 +++--
 test/instrumentparsertest.cc       |  71 ++++----
 test/lv2.cc                        |  88 +++++-----
 test/memcheckertest.cc             | 121 --------------
 test/notifiertest.cc               |  28 ++--
 test/paintertest.cc                |  18 +-
 test/randomtest.cc                 |  40 ++---
 test/resampler.cc                  | 141 ++++++++--------
 test/resource_test.cc              |  32 ++--
 test/scopedfile.cc                 |   3 +-
 test/semaphoretest.cc              |  25 ++-
 test/syncedsettings.cc             | 329 +++++++++++++++++++------------------
 test/test.cc                       |  53 ------
 29 files changed, 755 insertions(+), 1166 deletions(-)
 delete mode 100644 src/memchecker.cc
 delete mode 100644 src/memchecker.h
 delete mode 100644 test/memcheckertest.cc
 delete mode 100644 test/test.cc

diff --git a/configure.ac b/configure.ac
index f60493c..456cb74 100644
--- a/configure.ac
+++ b/configure.ac
@@ -207,16 +207,6 @@ dnl ======================
 AC_ARG_WITH([test],
 	AS_HELP_STRING([--with-test], [Build unit tests]))
 
-AS_IF([test x$with_test == xyes],
-  [
-    AC_MSG_WARN([*** Building unittests!])
-    PKG_CHECK_MODULES([CPPUNIT], [ cppunit >= 1.9.6 ], [],
-                      [
-                          AC_MSG_ERROR([$CPPUNIT_PKG_ERRORS])
-                      ])
-  ]
-)
-
 AM_CONDITIONAL([ENABLE_TESTS], [test "x$with_test" = "xyes"])
 
 dnl ======================
diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in
index d224bcf..3330e35 100644
--- a/plugin/Makefile.mingw32.in
+++ b/plugin/Makefile.mingw32.in
@@ -29,7 +29,6 @@ DG_SRC = \
 	@top_srcdir@/src/instrument.cc \
 	@top_srcdir@/src/instrumentparser.cc \
 	@top_srcdir@/src/latencyfilter.cc \
-	@top_srcdir@/src/memchecker.cc \
 	@top_srcdir@/src/midimapparser.cc \
 	@top_srcdir@/src/midimapper.cc \
 	@top_srcdir@/src/path.cc \
diff --git a/src/memchecker.cc b/src/memchecker.cc
deleted file mode 100644
index ec0c9df..0000000
--- a/src/memchecker.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- *            memchecker.cc
- *
- *  Sat Jan 16 18:27:52 CET 2016
- *  Copyright 2016 Andr� Nusser
- *  andre.nusser@googlemail.com
- ****************************************************************************/
-
-/*
- *  This file is part of DrumGizmo.
- *
- *  DrumGizmo is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser 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 "memchecker.h"
-
-#include "platform.h"
-
-#if DG_PLATFORM == DG_PLATFORM_LINUX
-#include <sys/sysinfo.h>
-#elif DG_PLATFORM == DG_PLATFORM_OSX
-#include <mach/vm_statistics.h>
-#include <mach/mach_types.h>
-#include <mach/mach_init.h>
-#include <mach/mach_host.h>
-#elif DG_PLATFORM == DG_PLATFORM_FREEBSD
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/vmmeter.h>
-#endif
-
-#include <sndfile.h>
-#include <hugin.hpp>
-
-bool MemChecker::enoughFreeMemory(const DrumKit& drumkit) const
-{
-	uint64_t free_memory = calcFreeMemory();
-	uint64_t needed_memory = calcNeededMemory(drumkit);
-
-	return free_memory >= needed_memory;
-}
-
-uint64_t MemChecker::calcFreeMemory() const
-{
-	uint64_t free_memory = 0;
-
-	// Platform specific calculation of the amount of free memory.
-#if DG_PLATFORM == DG_PLATFORM_LINUX
-	struct sysinfo sys_info;
-	sysinfo(&sys_info);
-	free_memory = (uint64_t)sys_info.freeram * (uint64_t)sys_info.mem_unit;
-#elif DG_PLATFORM == DG_PLATFORM_WINDOWS
-	MEMORYSTATUSEX status;
-	status.dwLength = sizeof(status);
-	GlobalMemoryStatusEx(&status);
-	free_memory = status.ullAvailPhys;
-#elif DG_PLATFORM == DG_PLATFORM_OSX
-	vm_size_t page_size;
-	vm_statistics64_data_t vm_stats;
-	mach_port_t mach_port = mach_host_self();
-	mach_msg_type_number_t count = sizeof(vm_stats) / sizeof(natural_t);
-
-	if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
-	    KERN_SUCCESS == host_statistics64(mach_port, HOST_VM_INFO, (host_info64_t)&vm_stats, &count))
-	{
-		free_memory = (uint64_t)vm_stats.free_count * (uint64_t)page_size;
-	}
-#elif DG_PLATFORM == DG_PLATFORM_FREEBSD
-	u_int page_size;
-	struct vmtotal vmt;
-	size_t vmt_size, uint_size;
-
-	vmt_size = sizeof(vmt);
-	uint_size = sizeof(page_size);
-
-	sysctlbyname("vm.vmtotal", &vmt, &vmt_size, NULL, 0);
-	sysctlbyname("vm.stats.vm.v_page_size", &page_size, &uint_size, NULL, 0);
-
-	free_memory = vmt.t_free * (u_int64_t)page_size;
-#elif DG_PLATFORM == DG_PLATFORM_UNIX
-	// TODO
-#endif
-
-	DEBUG(memchecker, "Calculated %" PRIu64 " free memory.\n", free_memory);
-
-	return free_memory;
-}
-
-uint64_t MemChecker::calcNeededMemory(const DrumKit& drumkit) const
-{
-	uint64_t needed_memory = 0;
-
-	// Calculate memory usage of all instruments of drumkit.
-	for(auto& instr_ptr: drumkit.instruments)
-	{
-		const auto& audiofiles = instr_ptr->audiofiles;
-
-		// Calculate memory usage of all audiofiles.
-		for(auto& audiofile: audiofiles)
-		{
-			needed_memory += calcBytesPerChannel(audiofile->filename);
-		}
-	}
-
-	DEBUG(memchecker, "Calculated %" PRIu64 " needed memory.\n", needed_memory);
-
-	return needed_memory;
-}
-
-uint64_t MemChecker::calcBytesPerChannel(const std::string& filename) const
-{
-	SF_INFO sf_info{};
-
-	SNDFILE* f = sf_open(filename.c_str(), SFM_READ, &sf_info);
-	if(!f)
-	{
-		ERR(memchecker, "SNDFILE Error (%s): %s\n",
-		    filename.c_str(), sf_strerror(f));
-		return 0;
-	}
-
-	sf_close(f);
-
-	return sf_info.frames * sizeof(sample_t);
-}
diff --git a/src/memchecker.h b/src/memchecker.h
deleted file mode 100644
index aeefb3a..0000000
--- a/src/memchecker.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- *            memchecker.h
- *
- *  Sat Jan 16 18:27:52 CET 2016
- *  Copyright 2016 Andr� Nusser
- *  andre.nusser@googlemail.com
- ****************************************************************************/
-
-/*
- *  This file is part of DrumGizmo.
- *
- *  DrumGizmo is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser 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.
- */
-#pragma once
-
-#include "drumkit.h"
-
-#include <string>
-// includes cstdint automatically and is needed for the PRIu64 macro
-#include <cinttypes>
-
-class MemChecker
-{
-public:
-	//! Checks if there is enough memory left to load drumkit into RAM.
-	//! \param drumkit The drumkit for which it is checked if there's enough memory left.
-	//! \return True iff there is enough memory left.
-	bool enoughFreeMemory(const DrumKit& drumkit) const;
-
-protected:
-	// Computes how much RAM (in bytes) is left.
-	uint64_t calcFreeMemory() const;
-
-	// Computes how much memory the drumkit takes when loaded into RAM (in bytes).
-	uint64_t calcNeededMemory(const DrumKit& drumkit) const;
-
-	// Computes the number of bytes per channel of <filename> using libsnd.
-	uint64_t calcBytesPerChannel(const std::string& filename) const;
-};
diff --git a/test/Makefile.am b/test/Makefile.am
index 56b7f72..6a7d244 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -15,23 +15,23 @@ endif
 
 check_PROGRAMS = $(TESTS)
 
-resource_CXXFLAGS = -DOUTPUT=\"resource\" $(CPPUNIT_CFLAGS) \
+resource_CXXFLAGS = -DOUTPUT=\"resource\" \
 	-I$(top_srcdir)/src \
 	-I$(top_srcdir)/hugin
-resource_LDFLAGS = $(CPPUNIT_LIBS) $(SNDFILE_LIBS)
+resource_LDFLAGS = $(SNDFILE_LIBS)
 resource_SOURCES = \
 	$(top_srcdir)/plugingui/resource.cc \
 	$(top_srcdir)/plugingui/resource_data.cc \
 	$(top_srcdir)/hugin/hugin.c \
 	$(top_srcdir)/src/random.cc \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	resource_test.cc
 
-audiocache_CXXFLAGS = -DOUTPUT=\"audiocache\" $(CPPUNIT_CFLAGS) \
+audiocache_CXXFLAGS = -DOUTPUT=\"audiocache\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(PTHREAD_CFLAGS) $(SNDFILE_CFLAGS)
-audiocache_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS)
+audiocache_LDFLAGS = $(PTHREAD_LIBS) $(SNDFILE_LIBS)
 audiocache_SOURCES = \
 	$(top_srcdir)/src/audiocache.cc \
 	$(top_srcdir)/src/audiocacheeventhandler.cc \
@@ -41,187 +41,187 @@ audiocache_SOURCES = \
 	$(top_srcdir)/src/semaphore.cc \
 	$(top_srcdir)/src/audiofile.cc \
 	$(top_srcdir)/src/random.cc \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	audiocachetest.cc
 
-audiocachefile_CXXFLAGS = -DOUTPUT=\"audiocachefile\" $(CPPUNIT_CFLAGS) \
+audiocachefile_CXXFLAGS = -DOUTPUT=\"audiocachefile\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(PTHREAD_CFLAGS) $(SNDFILE_CFLAGS)
-audiocachefile_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS)
+audiocachefile_LDFLAGS = $(PTHREAD_LIBS) $(SNDFILE_LIBS)
 audiocachefile_SOURCES = \
 	$(top_srcdir)/src/audiocachefile.cc \
 	$(top_srcdir)/src/thread.cc \
 	$(top_srcdir)/src/semaphore.cc \
 	$(top_srcdir)/src/audiofile.cc \
 	$(top_srcdir)/src/random.cc \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	audiocachefiletest.cc
 
 audiocacheidmanager_CXXFLAGS = -DOUTPUT=\"audiocacheidmanager\" \
-	$(CPPUNIT_CFLAGS) \
+	\
 	-I$(top_srcdir)/src -I$(top_srcdir)/include \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(SNDFILE_CFLAGS)
-audiocacheidmanager_LDFLAGS = $(CPPUNIT_LIBS) $(SNDFILE_LIBS)
+audiocacheidmanager_LDFLAGS = $(SNDFILE_LIBS)
 audiocacheidmanager_SOURCES = \
 	$(top_srcdir)/src/audiocacheidmanager.cc \
-	test.cc \
+	dgtest.cc \
 	audiocacheidmanagertest.cc
 
 audiocacheeventhandler_CXXFLAGS = -DOUTPUT=\"audiocacheeventhandler\" \
-	$(CPPUNIT_CFLAGS) \
+	\
 	-I$(top_srcdir)/src -I$(top_srcdir)/include \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(PTHREAD_CFLAGS) $(SNDFILE_CFLAGS)
-audiocacheeventhandler_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS)
+audiocacheeventhandler_LDFLAGS = $(PTHREAD_LIBS) $(SNDFILE_LIBS)
 audiocacheeventhandler_SOURCES = \
 	$(top_srcdir)/src/audiocacheeventhandler.cc \
 	$(top_srcdir)/src/audiocacheidmanager.cc \
 	$(top_srcdir)/src/audiocachefile.cc \
 	$(top_srcdir)/src/thread.cc \
 	$(top_srcdir)/src/semaphore.cc \
-	test.cc \
+	dgtest.cc \
 	audiocacheeventhandlertest.cc
 
-enginetest_CXXFLAGS = -DOUTPUT=\"enginetest\" $(CPPUNIT_CFLAGS) \
+enginetest_CXXFLAGS = -DOUTPUT=\"enginetest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include \
 	-I$(top_srcdir)/hugin $(PTHREAD_CFLAGS)
-enginetest_LDFLAGS = $(CPPUNIT_LIBS) $(PTHREAD_LIBS) $(SNDFILE_LIBS) \
+enginetest_LDFLAGS = $(PTHREAD_LIBS) $(SNDFILE_LIBS) \
 	 $(top_srcdir)/src/libdg.la
 enginetest_SOURCES = \
 	$(top_srcdir)/hugin/hugin.c \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	enginetest.cc
 
-paintertest_CXXFLAGS = -DOUTPUT=\"paintertest\" $(CPPUNIT_CFLAGS) \
+paintertest_CXXFLAGS = -DOUTPUT=\"paintertest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include -I$(top_srcdir)/plugingui \
 	-I$(top_srcdir)/hugin $(PTHREAD_CFLAGS)
-paintertest_LDFLAGS = $(CPPUNIT_LIBS) $(top_srcdir)/plugingui/libdggui.la
+paintertest_LDFLAGS = $(top_srcdir)/plugingui/libdggui.la
 paintertest_SOURCES = \
 	$(top_srcdir)/hugin/hugin.c \
-	test.cc \
+	dgtest.cc \
 	paintertest.cc
 
-resampler_CXXFLAGS = -DOUTPUT=\"resampler\" $(CPPUNIT_CFLAGS) \
+resampler_CXXFLAGS = -DOUTPUT=\"resampler\" \
 	$(ZITA_CXXFLAGS) $(SAMPLERATE_CFLAGS) \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN
-resampler_LDFLAGS = $(ZITA_LIBS) $(SAMPLERATE_LIBS) $(CPPUNIT_LIBS)
+resampler_LDFLAGS = $(ZITA_LIBS) $(SAMPLERATE_LIBS)
 resampler_SOURCES = \
 	$(top_srcdir)/src/chresampler.cc \
-	test.cc \
+	dgtest.cc \
 	resampler.cc
 
-lv2_CXXFLAGS = -DOUTPUT=\"lv2\" $(CPPUNIT_CFLAGS) \
+lv2_CXXFLAGS = -DOUTPUT=\"lv2\" \
 	-I$(top_srcdir)/src \
 	 `pkg-config --cflags serd-0` `pkg-config --cflags lilv-0` \
 	-DLV2_PATH=\"@LV2DIR@\"
-lv2_LDFLAGS = $(CPPUNIT_LIBS) `pkg-config --libs serd-0` \
+lv2_LDFLAGS = `pkg-config --libs serd-0` \
 	`pkg-config --libs lilv-0` -lcrypto \
 	$(SNDFILE_LIBS)
 lv2_SOURCES = \
 	$(top_srcdir)/src/random.cc \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	lv2_test_host.cc \
 	lv2.cc
 
-configfile_CXXFLAGS = -DOUTPUT=\"configfile\" $(CPPUNIT_CFLAGS) \
+configfile_CXXFLAGS = -DOUTPUT=\"configfile\" \
 	-I$(top_srcdir)/hugin
-configfile_LDFLAGS = $(CPPUNIT_LIBS)
+configfile_LDFLAGS =
 configfile_SOURCES = \
 	$(top_srcdir)/src/configfile.cc \
 	$(top_srcdir)/hugin/hugin.c \
-	test.cc \
+	dgtest.cc \
 	configtest.cc
 
-memchecker_CXXFLAGS = -DOUTPUT=\"memchecker\" $(CPPUNIT_CFLAGS) \
+memchecker_CXXFLAGS = -DOUTPUT=\"memchecker\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include \
 	-I$(top_srcdir)/hugin $(PTHREAD_CFLAGS)
-memchecker_LDFLAGS = $(CPPUNIT_LIBS) $(PTHREAD_LIBS) \
+memchecker_LDFLAGS = $(PTHREAD_LIBS) \
 	$(top_srcdir)/src/libdg.la
 memchecker_SOURCES = \
 	$(top_srcdir)/hugin/hugin.c \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	memcheckertest.cc
 
-randomtest_CXXFLAGS = -DOUTPUT=\"randomtest\" $(CPPUNIT_CFLAGS) \
+randomtest_CXXFLAGS = -DOUTPUT=\"randomtest\" \
 	-I$(top_srcdir)/src \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN
 randomtest_CFLAGS = -DDISABLE_HUGIN
-randomtest_LDFLAGS = $(CPPUNIT_LIBS)
+randomtest_LDFLAGS =
 randomtest_SOURCES = \
 	$(top_srcdir)/src/random.cc \
-	test.cc \
+	dgtest.cc \
 	randomtest.cc
 
-atomictest_CXXFLAGS = -DOUTPUT=\"atomictest\" $(CPPUNIT_CFLAGS) \
+atomictest_CXXFLAGS = -DOUTPUT=\"atomictest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/hugin
-atomictest_LDFLAGS = $(CPPUNIT_LIBS)
-atomictest_SOURCES = atomictest.cc test.cc
+atomictest_LDFLAGS =
+atomictest_SOURCES = atomictest.cc dgtest.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
+	-I$(top_srcdir)/src -I$(top_srcdir)/hugin
+syncedsettingstest_LDFLAGS =
+syncedsettingstest_SOURCES = syncedsettings.cc dgtest.cc
 
 EXTRA_DIST = \
 	lv2_test_host.h \
 	drumkit_creator.h
 
-imagecachetest_CXXFLAGS = -DOUTPUT=\"imagecachetest\" $(CPPUNIT_CFLAGS) \
+imagecachetest_CXXFLAGS = -DOUTPUT=\"imagecachetest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/plugingui  -I$(top_srcdir)/hugin
-imagecachetest_LDFLAGS = $(CPPUNIT_LIBS) $(top_srcdir)/plugingui/libdggui.la
+imagecachetest_LDFLAGS = $(top_srcdir)/plugingui/libdggui.la
 imagecachetest_SOURCES = \
 	$(top_srcdir)/hugin/hugin.c \
 	imagecachetest.cc \
-	test.cc
+	dgtest.cc
 
-semaphoretest_CXXFLAGS = -DOUTPUT=\"semaphoretest\" $(CPPUNIT_CFLAGS) \
+semaphoretest_CXXFLAGS = -DOUTPUT=\"semaphoretest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/hugin $(PTHREAD_CFLAGS)
-semaphoretest_LDFLAGS = $(CPPUNIT_LIBS) $(PTHREAD_LIBS)
+semaphoretest_LDFLAGS = $(PTHREAD_LIBS)
 semaphoretest_SOURCES = \
 	$(top_srcdir)/hugin/hugin.c \
 	$(top_srcdir)/src/semaphore.cc \
 	semaphoretest.cc \
-	test.cc
+	dgtest.cc
 
-drumkitcreatortest_CXXFLAGS = -DOUTPUT=\"drumkitcreatortest\" $(CPPUNIT_CFLAGS) \
+drumkitcreatortest_CXXFLAGS = -DOUTPUT=\"drumkitcreatortest\" \
 	-I$(top_srcdir)/src \
 	-I$(top_srcdir)/hugin -DDISABLE_HUGIN
 drumkitcreatortest_CFLAGS = -DDISABLE_HUGIN
-drumkitcreatortest_LDFLAGS = $(CPPUNIT_LIBS) $(SNDFILE_LIBS)
+drumkitcreatortest_LDFLAGS = $(SNDFILE_LIBS)
 drumkitcreatortest_SOURCES = \
 	$(top_srcdir)/src/random.cc \
-	test.cc \
+	dgtest.cc \
 	drumkit_creator.cc \
 	drumkitcreatortest.cc
 
-bytesizeparsertest_CXXFLAGS = -DOUTPUT=\"bytesizeparsertest\" $(CPPUNIT_CFLAGS) \
+bytesizeparsertest_CXXFLAGS = -DOUTPUT=\"bytesizeparsertest\" \
 	-I$(top_srcdir)/src
-bytesizeparsertest_LDFLAGS = $(CPPUNIT_LIBS)
+bytesizeparsertest_LDFLAGS =
 bytesizeparsertest_SOURCES = \
 	$(top_srcdir)/src/bytesizeparser.cc \
 	bytesizeparsertest.cc \
-	test.cc
+	dgtest.cc
 
-notifiertest_CXXFLAGS = -DOUTPUT=\"notifiertest\" $(CPPUNIT_CFLAGS) \
+notifiertest_CXXFLAGS = -DOUTPUT=\"notifiertest\" \
 	-I$(top_srcdir)/src
-notifiertest_LDFLAGS = $(CPPUNIT_LIBS)
+notifiertest_LDFLAGS =
 notifiertest_SOURCES = \
 	notifiertest.cc \
-	test.cc
+	dgtest.cc
 
-instrumentparsertest_CXXFLAGS = -DOUTPUT=\"instrumentparsertest\" $(CPPUNIT_CFLAGS) \
+instrumentparsertest_CXXFLAGS = -DOUTPUT=\"instrumentparsertest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include
-instrumentparsertest_LDFLAGS = $(CPPUNIT_LIBS) \
+instrumentparsertest_LDFLAGS = \
 	 $(top_srcdir)/src/libdg.la
 instrumentparsertest_SOURCES = \
 	$(top_srcdir)/hugin/hugin.c \
 	instrumentparsertest.cc \
 	scopedfile.cc \
-	test.cc
+	dgtest.cc
 
 drumkitparsertest_CXXFLAGS = -DOUTPUT=\"drumkitparsertest\" \
 	-I$(top_srcdir)/src -I$(top_srcdir)/include
diff --git a/test/atomictest.cc b/test/atomictest.cc
index 9d2220c..223c6f3 100644
--- a/test/atomictest.cc
+++ b/test/atomictest.cc
@@ -24,48 +24,46 @@
  *  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 "dgunit.h"
 
 #include <atomic.h>
 
 class AtomicTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	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() {}
+	AtomicTest()
+	{
+		DGUNIT_TEST(AtomicTest::podAtomicsUseStandardImpl);
+		DGUNIT_TEST(AtomicTest::nonPodAtomicsUseOwnImpl);
+		DGUNIT_TEST(AtomicTest::podAtomicCanBeDefaultInitialized);
+		DGUNIT_TEST(AtomicTest::nonPodAtomicCanBeDefaultInitialized);
+		DGUNIT_TEST(AtomicTest::podAtomicCanBeValueInitialized);
+		DGUNIT_TEST(AtomicTest::nonPodAtomicCanBeValueInitialized);
+		DGUNIT_TEST(AtomicTest::podAtomicCanBeValueAssigned);
+		DGUNIT_TEST(AtomicTest::nonPodAtomicCanBeValueAssigned);
+		DGUNIT_TEST(AtomicTest::podAtomicsAreLockFree);
+	}
 
 	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>());
+		DGUNIT_ASSERT(isUsingStandardImpl<bool>());
+		DGUNIT_ASSERT(isUsingStandardImpl<unsigned short int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<short int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<unsigned int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<unsigned long int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<long int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<unsigned long long int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<long long int>());
+		DGUNIT_ASSERT(isUsingStandardImpl<float>());
+		DGUNIT_ASSERT(isUsingStandardImpl<double>());
+		DGUNIT_ASSERT(isUsingStandardImpl<long double>());
 	}
 
 	void nonPodAtomicsUseOwnImpl()
 	{
-		CPPUNIT_ASSERT(!isUsingStandardImpl<std::string>());
+		DGUNIT_ASSERT(!isUsingStandardImpl<std::string>());
 	}
 
 	void podAtomicCanBeDefaultInitialized()
@@ -78,52 +76,52 @@ public:
 	void nonPodAtomicCanBeDefaultInitialized()
 	{
 		Atomic<std::string> s;
-		CPPUNIT_ASSERT_EQUAL(s.load(), std::string{});
+		DGUNIT_ASSERT_EQUAL(s.load(), std::string{});
 	}
 
 	void podAtomicCanBeValueInitialized()
 	{
 		Atomic<int> i{5};
-		CPPUNIT_ASSERT_EQUAL(i.load(), 5);
+		DGUNIT_ASSERT_EQUAL(i.load(), 5);
 	}
 
 	void nonPodAtomicCanBeValueInitialized()
 	{
 		Atomic<std::string> s{"hello world"};
-		CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"});
+		DGUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"});
 	}
 
 	void podAtomicCanBeValueAssigned()
 	{
 		Atomic<int> i;
 		i = 5;
-		CPPUNIT_ASSERT_EQUAL(i.load(), 5);
+		DGUNIT_ASSERT_EQUAL(i.load(), 5);
 	}
 
 	void nonPodAtomicCanBeValueAssigned()
 	{
 		Atomic<std::string> s;
 		s = "hello world";
-		CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"});
+		DGUNIT_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<float>());
-		CPPUNIT_ASSERT(isLockFree<std::size_t>());
+		DGUNIT_ASSERT(isLockFree<bool>());
+		DGUNIT_ASSERT(isLockFree<unsigned short int>());
+		DGUNIT_ASSERT(isLockFree<short int>());
+		DGUNIT_ASSERT(isLockFree<unsigned int>());
+		DGUNIT_ASSERT(isLockFree<int>());
+		DGUNIT_ASSERT(isLockFree<unsigned long int>());
+		DGUNIT_ASSERT(isLockFree<long int>());
+		DGUNIT_ASSERT(isLockFree<float>());
+		DGUNIT_ASSERT(isLockFree<std::size_t>());
 
 		// NOTE: Not lock free on small systems
-		//CPPUNIT_ASSERT(isLockFree<unsigned long long int>());
-		//CPPUNIT_ASSERT(isLockFree<long long int>());
-		//CPPUNIT_ASSERT(isLockFree<double>());
-		//CPPUNIT_ASSERT(isLockFree<long double>());
+		//DGUNIT_ASSERT(isLockFree<unsigned long long int>());
+		//DGUNIT_ASSERT(isLockFree<long long int>());
+		//DGUNIT_ASSERT(isLockFree<double>());
+		//DGUNIT_ASSERT(isLockFree<long double>());
 	}
 
 private:
@@ -142,4 +140,4 @@ private:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(AtomicTest);
+static AtomicTest test;
diff --git a/test/audiocacheeventhandlertest.cc b/test/audiocacheeventhandlertest.cc
index 0b408e0..a2639fb 100644
--- a/test/audiocacheeventhandlertest.cc
+++ b/test/audiocacheeventhandlertest.cc
@@ -24,20 +24,22 @@
  *  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 "dgunit.h"
 
 #include <audiocacheeventhandler.h>
 
 class AudioCacheEventHandlerTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(AudioCacheEventHandlerTest);
-	CPPUNIT_TEST(threadedTest);
-	CPPUNIT_TEST_SUITE_END();
+public:
+	AudioCacheEventHandlerTest()
+	{
+		DGUNIT_TEST(AudioCacheEventHandlerTest::threadedTest);
+	}
 
 public:
-	void setUp() {}
-	void tearDown() {}
+	void setup() override {}
+	void teardown() override {}
 
 	void threadedTest()
 	{
@@ -49,4 +51,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheEventHandlerTest);
+static AudioCacheEventHandlerTest test;
diff --git a/test/audiocachefiletest.cc b/test/audiocachefiletest.cc
index 83aece8..267d787 100644
--- a/test/audiocachefiletest.cc
+++ b/test/audiocachefiletest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <cstring>
 
@@ -53,20 +53,18 @@ public:
 };
 
 class AudioCacheFileTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(AudioCacheFileTest);
-	CPPUNIT_TEST(refTest);
-	CPPUNIT_TEST(readTest);
-	CPPUNIT_TEST(noFileTest);
-	CPPUNIT_TEST_SUITE_END();
+public:
+	AudioCacheFileTest()
+	{
+		DGUNIT_TEST(AudioCacheFileTest::refTest);
+		DGUNIT_TEST(AudioCacheFileTest::readTest);
+		DGUNIT_TEST(AudioCacheFileTest::noFileTest);
+	}
 
 	DrumkitCreator drumkit_creator;
 
-public:
-	void setUp() {}
-	void tearDown() {}
-
 	void refTest()
 	{
 		// Create the audio file
@@ -74,19 +72,19 @@ public:
 
 		// Conduct tests
 		TestableAudioCacheFiles audiofiles;
-		CPPUNIT_ASSERT_EQUAL(-1, audiofiles.getRef(filename));
+		DGUNIT_ASSERT_EQUAL(-1, audiofiles.getRef(filename));
 
 		audiofiles.getFile(filename);
-		CPPUNIT_ASSERT_EQUAL(1, audiofiles.getRef(filename));
+		DGUNIT_ASSERT_EQUAL(1, audiofiles.getRef(filename));
 
 		audiofiles.getFile(filename);
-		CPPUNIT_ASSERT_EQUAL(2, audiofiles.getRef(filename));
+		DGUNIT_ASSERT_EQUAL(2, audiofiles.getRef(filename));
 
 		audiofiles.releaseFile(filename);
-		CPPUNIT_ASSERT_EQUAL(1, audiofiles.getRef(filename));
+		DGUNIT_ASSERT_EQUAL(1, audiofiles.getRef(filename));
 
 		audiofiles.releaseFile(filename);
-		CPPUNIT_ASSERT_EQUAL(-1, audiofiles.getRef(filename));
+		DGUNIT_ASSERT_EQUAL(-1, audiofiles.getRef(filename));
 	}
 
 	void readTestHelper(size_t buffer_size)
@@ -107,8 +105,8 @@ public:
 		std::vector<sample_t> read_buffer;
 
 		AudioCacheFile file(filename, read_buffer);
-		CPPUNIT_ASSERT_EQUAL(filename, file.getFilename());
-		CPPUNIT_ASSERT_EQUAL(13, (int)file.getChannelCount()); // Sanity check
+		DGUNIT_ASSERT_EQUAL(filename, file.getFilename());
+		DGUNIT_ASSERT_EQUAL(13, (int)file.getChannelCount()); // Sanity check
 
 		CacheChannels channels;
 
@@ -152,7 +150,7 @@ public:
 
 			for(size_t c = 0; c < 13; ++c)
 			{
-				CPPUNIT_ASSERT_EQUAL(true, ready[c]?true:false);
+				DGUNIT_ASSERT_EQUAL(true, ready[c]?true:false);
 			}
 
 			sample_t diff[13] = {0.0};
@@ -166,7 +164,7 @@ public:
 
 			for(int c = 0; c < 13; ++c)
 			{
-				CPPUNIT_ASSERT_EQUAL((sample_t)0.0, diff[c]);
+				DGUNIT_ASSERT_EQUAL((sample_t)0.0, diff[c]);
 			}
 		}
 
@@ -205,9 +203,9 @@ public:
 		std::vector<sample_t> read_buffer;
 
 		AudioCacheFile file(filename, read_buffer);
-		CPPUNIT_ASSERT_EQUAL(filename, file.getFilename());
-		CPPUNIT_ASSERT_EQUAL(0u, (unsigned int)file.getSize());
-		CPPUNIT_ASSERT_EQUAL(0u, (unsigned int)file.getChannelCount());
+		DGUNIT_ASSERT_EQUAL(filename, file.getFilename());
+		DGUNIT_ASSERT_EQUAL(0u, (unsigned int)file.getSize());
+		DGUNIT_ASSERT_EQUAL(0u, (unsigned int)file.getChannelCount());
 
 		CacheChannels channels;
 
@@ -239,18 +237,18 @@ public:
 
 		for(size_t c = 0; c < 13; ++c)
 		{
-			CPPUNIT_ASSERT_EQUAL(false, ready[c]?true:false);
+			DGUNIT_ASSERT_EQUAL(false, ready[c]?true:false);
 		}
 
 		for(size_t c = 0; c < 13; ++c)
 		{
 			for(size_t i = 0; i < buffer_size; ++i)
 			{
-				CPPUNIT_ASSERT_EQUAL(42.0f, samples[c][i]);
+				DGUNIT_ASSERT_EQUAL(42.0f, samples[c][i]);
 			}
 		}
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheFileTest);
+static AudioCacheFileTest test;
diff --git a/test/audiocacheidmanagertest.cc b/test/audiocacheidmanagertest.cc
index 74aaaf6..75a7c51 100644
--- a/test/audiocacheidmanagertest.cc
+++ b/test/audiocacheidmanagertest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <audiocacheidmanager.h>
 
@@ -39,15 +39,13 @@ public:
 };
 
 class AudioCacheIDManagerTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(AudioCacheIDManagerTest);
-	CPPUNIT_TEST(registerReleaseTest);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() {}
-	void tearDown() {}
+	AudioCacheIDManagerTest()
+	{
+		DGUNIT_TEST(AudioCacheIDManagerTest::registerReleaseTest);
+	}
 
 	void registerReleaseTest()
 	{
@@ -56,46 +54,46 @@ public:
 
 		cache_t c1; c1.afile = (AudioCacheFile*)1;
 		auto id1 = manager.registerID(c1);
-		CPPUNIT_ASSERT(id1 != CACHE_DUMMYID);
-		CPPUNIT_ASSERT(id1 != CACHE_NOID);
-		CPPUNIT_ASSERT_EQUAL(1, manager.getAvailableIDs());
+		DGUNIT_ASSERT(id1 != CACHE_DUMMYID);
+		DGUNIT_ASSERT(id1 != CACHE_NOID);
+		DGUNIT_ASSERT_EQUAL(1, manager.getAvailableIDs());
 
 		cache_t c2; c2.afile = (AudioCacheFile*)2;
 		auto id2 = manager.registerID(c2);
-		CPPUNIT_ASSERT(id2 != CACHE_DUMMYID);
-		CPPUNIT_ASSERT(id2 != CACHE_NOID);
-		CPPUNIT_ASSERT_EQUAL(0, manager.getAvailableIDs());
+		DGUNIT_ASSERT(id2 != CACHE_DUMMYID);
+		DGUNIT_ASSERT(id2 != CACHE_NOID);
+		DGUNIT_ASSERT_EQUAL(0, manager.getAvailableIDs());
 
 		cache_t c3; c3.afile = (AudioCacheFile*)3;
 		auto id3 = manager.registerID(c3);
-		CPPUNIT_ASSERT(id3 == CACHE_DUMMYID);
-		CPPUNIT_ASSERT_EQUAL(0, manager.getAvailableIDs());
+		DGUNIT_ASSERT(id3 == CACHE_DUMMYID);
+		DGUNIT_ASSERT_EQUAL(0, manager.getAvailableIDs());
 
 		cache_t& tc1 = manager.getCache(id1);
-		CPPUNIT_ASSERT_EQUAL(c1.afile, tc1.afile);
+		DGUNIT_ASSERT_EQUAL(c1.afile, tc1.afile);
 
 		cache_t& tc2 = manager.getCache(id2);
-		CPPUNIT_ASSERT_EQUAL(c2.afile, tc2.afile);
+		DGUNIT_ASSERT_EQUAL(c2.afile, tc2.afile);
 
 		manager.releaseID(id1);
-		CPPUNIT_ASSERT_EQUAL(1, manager.getAvailableIDs());
+		DGUNIT_ASSERT_EQUAL(1, manager.getAvailableIDs());
 
 		cache_t c4; c4.afile = (AudioCacheFile*)4;
 		auto id4 = manager.registerID(c4);
-		CPPUNIT_ASSERT(id4 != CACHE_DUMMYID);
-		CPPUNIT_ASSERT(id4 != CACHE_NOID);
-		CPPUNIT_ASSERT_EQUAL(0, manager.getAvailableIDs());
+		DGUNIT_ASSERT(id4 != CACHE_DUMMYID);
+		DGUNIT_ASSERT(id4 != CACHE_NOID);
+		DGUNIT_ASSERT_EQUAL(0, manager.getAvailableIDs());
 
 		cache_t& tc4 = manager.getCache(id4);
-		CPPUNIT_ASSERT_EQUAL(c4.afile, tc4.afile);
+		DGUNIT_ASSERT_EQUAL(c4.afile, tc4.afile);
 
 		manager.releaseID(id2);
-		CPPUNIT_ASSERT_EQUAL(1, manager.getAvailableIDs());
+		DGUNIT_ASSERT_EQUAL(1, manager.getAvailableIDs());
 
 		manager.releaseID(id4);
-		CPPUNIT_ASSERT_EQUAL(2, manager.getAvailableIDs());
+		DGUNIT_ASSERT_EQUAL(2, manager.getAvailableIDs());
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheIDManagerTest);
+static AudioCacheIDManagerTest test;
diff --git a/test/audiocachetest.cc b/test/audiocachetest.cc
index c03bee4..9f5a858 100644
--- a/test/audiocachetest.cc
+++ b/test/audiocachetest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <thread>
 #include <chrono>
@@ -38,21 +38,19 @@
 #define FRAMESIZE 64
 
 class AudioCacheTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(AudioCacheTest);
-	CPPUNIT_TEST(singleChannelNonThreaded);
-	CPPUNIT_TEST(singleChannelThreaded);
-	CPPUNIT_TEST(multiChannelNonThreaded);
-	CPPUNIT_TEST(multiChannelThreaded);
-	CPPUNIT_TEST_SUITE_END();
+public:
+	AudioCacheTest()
+	{
+		DGUNIT_TEST(AudioCacheTest::singleChannelNonThreaded);
+		DGUNIT_TEST(AudioCacheTest::singleChannelThreaded);
+		DGUNIT_TEST(AudioCacheTest::multiChannelNonThreaded);
+		DGUNIT_TEST(AudioCacheTest::multiChannelThreaded);
+	}
 
 	DrumkitCreator drumkit_creator;
 
-public:
-	void setUp() {}
-	void tearDown() {}
-
 	//! Test runner.
 	//! \param filename The name of the file to read.
 	//! \param channel The channel number to do comparison on.
@@ -97,7 +95,7 @@ public:
 			// Test pre cache:
 			for(size_t i = 0; i < size; ++i)
 			{
-				CPPUNIT_ASSERT_EQUAL(audio_file_ref.data[offset], samples[i]);
+				DGUNIT_ASSERT_EQUAL(audio_file_ref.data[offset], samples[i]);
 				++offset;
 			}
 
@@ -113,14 +111,14 @@ public:
 						std::this_thread::sleep_for(std::chrono::milliseconds(1));
 						if(--timeout == 0)
 						{
-							CPPUNIT_ASSERT(false); // timeout
+							DGUNIT_ASSERT(false); // timeout
 						}
 					}
 				}
 
 				samples = audio_cache.next(id, size);
 
-				CPPUNIT_ASSERT_EQUAL(std::size_t(0), settings.number_of_underruns.load());
+				DGUNIT_ASSERT_EQUAL(std::size_t(0), settings.number_of_underruns.load());
 
 				for(size_t i = 0; (i < size) && (offset < audio_file_ref.size); ++i)
 				{
@@ -132,7 +130,7 @@ public:
 						       (int)(audio_file_ref.size - offset),
 						       (int)i, (int)size, (int)(size - i));
 					}
-					CPPUNIT_ASSERT_EQUAL(audio_file_ref.data[offset], samples[i]);
+					DGUNIT_ASSERT_EQUAL(audio_file_ref.data[offset], samples[i]);
 					++offset;
 				}
 			}
@@ -202,4 +200,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheTest);
+static AudioCacheTest test;
diff --git a/test/bytesizeparsertest.cc b/test/bytesizeparsertest.cc
index e4776fe..ea082e2 100644
--- a/test/bytesizeparsertest.cc
+++ b/test/bytesizeparsertest.cc
@@ -24,25 +24,22 @@
  *  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 "dgunit.h"
 
 #include "bytesizeparser.h"
 
 
 class ByteSizeParserTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(ByteSizeParserTest);
-	CPPUNIT_TEST(suffixTest);
-	CPPUNIT_TEST(falseSuffixTest);
-	CPPUNIT_TEST(falseNumberTest);
-	CPPUNIT_TEST(tooBigNumberTest);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() {}
-
-	void tearDown() {}
+	ByteSizeParserTest()
+	{
+		DGUNIT_TEST(ByteSizeParserTest::suffixTest);
+		DGUNIT_TEST(ByteSizeParserTest::falseSuffixTest);
+		DGUNIT_TEST(ByteSizeParserTest::falseNumberTest);
+		DGUNIT_TEST(ByteSizeParserTest::tooBigNumberTest);
+	}
 
 	void suffixTest()
 	{
@@ -50,78 +47,78 @@ public:
 		std::size_t kilo = 1024, mega = kilo * 1024, giga = mega * 1024;
 		computed_size = byteSizeParser("3");
 		expected_size = 3;
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3k");
 		expected_size = 3 * kilo;
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3M");
 		expected_size = 3 * mega;
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3G");
 		expected_size = 3 * giga;
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 	}
 
 	void falseSuffixTest()
 	{
 		std::size_t computed_size, expected_size = 0;
 		computed_size = byteSizeParser("3K");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3m");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3g");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3ddDD");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 	}
 
 	void falseNumberTest()
 	{
 		std::size_t computed_size, expected_size = 0;
 		computed_size = byteSizeParser("K3k");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("-3");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("-3k");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("-3M");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("-3G");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3-");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3-k");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("k-3");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("3-1");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 
 		computed_size = byteSizeParser("   -3");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 	}
 
 	void tooBigNumberTest()
 	{
 		std::size_t computed_size, expected_size = 0;
 		computed_size = byteSizeParser("999999999999999999999999999999999999G");
-		CPPUNIT_ASSERT_EQUAL(expected_size, computed_size);
+		DGUNIT_ASSERT_EQUAL(expected_size, computed_size);
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(ByteSizeParserTest);
+static ByteSizeParserTest test;
diff --git a/test/configtest.cc b/test/configtest.cc
index 1b8b265..a4d5228 100644
--- a/test/configtest.cc
+++ b/test/configtest.cc
@@ -24,196 +24,196 @@
  *  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 "dgunit.h"
 
 #include <unistd.h>
 #include <stdio.h>
 
 #include "../src/configfile.h"
 
-class TestConfigFile : public ConfigFile {
+class TestConfigFile
+	: public ConfigFile {
 public:
-  TestConfigFile() : ConfigFile("") {}
+	TestConfigFile()
+		: ConfigFile("")
+	{
+	}
 
 protected:
-  // Overload the built-in open method to use local file instead of homedir.
-  virtual bool open(std::string mode)
-  {
-    fp = fopen("test.conf", mode.c_str());
-    return fp != NULL;
-  }
+	// Overload the built-in open method to use local file instead of homedir.
+	virtual bool open(std::string mode)
+	{
+		fp = fopen("test.conf", mode.c_str());
+		return fp != NULL;
+	}
 };
 
-class test_configtest : public CppUnit::TestFixture
+class test_configtest
+	: public DGUnit
 {
-  CPPUNIT_TEST_SUITE(test_configtest);
-	CPPUNIT_TEST(loading_no_newline);
-	CPPUNIT_TEST(loading_equal_sign);
-	CPPUNIT_TEST(loading_newline);
-	CPPUNIT_TEST(loading_padding_space);
-	CPPUNIT_TEST(loading_padding_space_newline);
-	CPPUNIT_TEST(loading_padding_tab);
-	CPPUNIT_TEST(loading_padding_tab_newline);
-	CPPUNIT_TEST(loading_comment);
-	CPPUNIT_TEST(loading_inline_comment);
-	CPPUNIT_TEST(loading_single_quoted_string);
-	CPPUNIT_TEST(loading_double_quoted_string);
-	CPPUNIT_TEST(loading_error_no_key);
-	CPPUNIT_TEST(loading_error_no_value);
-	CPPUNIT_TEST(loading_error_string_not_terminated_single);
-	CPPUNIT_TEST(loading_error_string_not_terminated_double);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp()
-  {
-  }
+	test_configtest()
+	{
+		DGUNIT_TEST(test_configtest::loading_no_newline);
+		DGUNIT_TEST(test_configtest::loading_equal_sign);
+		DGUNIT_TEST(test_configtest::loading_newline);
+		DGUNIT_TEST(test_configtest::loading_padding_space);
+		DGUNIT_TEST(test_configtest::loading_padding_space_newline);
+		DGUNIT_TEST(test_configtest::loading_padding_tab);
+		DGUNIT_TEST(test_configtest::loading_padding_tab_newline);
+		DGUNIT_TEST(test_configtest::loading_comment);
+		DGUNIT_TEST(test_configtest::loading_inline_comment);
+		DGUNIT_TEST(test_configtest::loading_single_quoted_string);
+		DGUNIT_TEST(test_configtest::loading_double_quoted_string);
+		DGUNIT_TEST(test_configtest::loading_error_no_key);
+		DGUNIT_TEST(test_configtest::loading_error_no_value);
+		DGUNIT_TEST(test_configtest::loading_error_string_not_terminated_single);
+		DGUNIT_TEST(test_configtest::loading_error_string_not_terminated_double);
+	}
 
-	void tearDown()
-  {
-    unlink("test.conf");
-  }
+	void teardown() override
+	{
+		unlink("test.conf");
+	}
 
-  void writeFile(const char* str)
-  {
-    FILE* fp = fopen("test.conf", "w");
-    fprintf(fp, "%s", str);
-    fclose(fp);
-  }
+	void writeFile(const char* str)
+	{
+		FILE* fp = fopen("test.conf", "w");
+		fprintf(fp, "%s", str);
+		fclose(fp);
+	}
 
-  void loading_no_newline()
-  {
-    writeFile("a:b");
+	void loading_no_newline()
+	{
+		writeFile("a:b");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_equal_sign()
-  {
-    writeFile(" a =\tb\t\n");
+	void loading_equal_sign()
+	{
+		writeFile(" a =\tb\t\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_newline()
-  {
-    writeFile("a:b\n");
+	void loading_newline()
+	{
+		writeFile("a:b\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_padding_space()
-  {
-    writeFile(" a : b ");
+	void loading_padding_space()
+	{
+		writeFile(" a : b ");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_padding_tab()
-  {
-    writeFile("\ta\t:\tb\t");
+	void loading_padding_tab()
+	{
+		writeFile("\ta\t:\tb\t");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_padding_space_newline()
-  {
-    writeFile(" a : b \n");
+	void loading_padding_space_newline()
+	{
+		writeFile(" a : b \n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_padding_tab_newline()
-  {
-    writeFile("\ta\t:\tb\t\n");
+	void loading_padding_tab_newline()
+	{
+		writeFile("\ta\t:\tb\t\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_comment()
-  {
-    writeFile("# comment\na:b\n");
+	void loading_comment()
+	{
+		writeFile("# comment\na:b\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_inline_comment()
-  {
-    writeFile("a:b #comment\n");
+	void loading_inline_comment()
+	{
+		writeFile("a:b #comment\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("b"), cf.getValue("a"));
 	}
 
-  void loading_single_quoted_string()
-  {
-    writeFile("a: '#\"b\" ' \n");
+	void loading_single_quoted_string()
+	{
+		writeFile("a: '#\"b\" ' \n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("#\"b\" "), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT(cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("#\"b\" "), cf.getValue("a"));
 	}
 
-  void loading_double_quoted_string()
-  {
-    writeFile("a: \"#'b' \" \n");
+	void loading_double_quoted_string()
+	{
+		writeFile("a: \"#'b' \" \n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(true, cf.load());
-    CPPUNIT_ASSERT_EQUAL(std::string("#'b' "), cf.getValue("a"));
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(true, cf.load());
+		DGUNIT_ASSERT_EQUAL(std::string("#'b' "), cf.getValue("a"));
 	}
 
-  void loading_error_no_key()
-  {
-    writeFile(":foo");
+	void loading_error_no_key()
+	{
+		writeFile(":foo");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(false, cf.load());
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(false, cf.load());
 	}
 
-  void loading_error_no_value()
-  {
-    writeFile("key");
+	void loading_error_no_value()
+	{
+		writeFile("key");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(false, cf.load());
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(false, cf.load());
 	}
 
-  void loading_error_string_not_terminated_single()
-  {
-    writeFile("a:'b\n");
+	void loading_error_string_not_terminated_single()
+	{
+		writeFile("a:'b\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(false, cf.load());
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(false, cf.load());
 	}
 
-  void loading_error_string_not_terminated_double()
-  {
-    writeFile("a:\"b\n");
+	void loading_error_string_not_terminated_double()
+	{
+		writeFile("a:\"b\n");
 
-    TestConfigFile cf;
-    CPPUNIT_ASSERT_EQUAL(false, cf.load());
+		TestConfigFile cf;
+		DGUNIT_ASSERT_EQUAL(false, cf.load());
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(test_configtest);
-
-
+static test_configtest test;
diff --git a/test/dgunit.h b/test/dgunit.h
index 5bb47bb..a010092 100644
--- a/test/dgunit.h
+++ b/test/dgunit.h
@@ -98,6 +98,7 @@ public:
 					result.id = test_num;
 					result.func = test.second;
 					failed_tests.push_back(result);
+					++failed;
 					continue;
 				}
 				catch(...)
diff --git a/test/drumkitcreatortest.cc b/test/drumkitcreatortest.cc
index 1b6321b..bde58ef 100644
--- a/test/drumkitcreatortest.cc
+++ b/test/drumkitcreatortest.cc
@@ -24,28 +24,20 @@
  *  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 "dgunit.h"
 
 #include "drumkit_creator.h"
 
 class DrumkitcreatorTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(DrumkitcreatorTest);
-	CPPUNIT_TEST(testTest);
-	CPPUNIT_TEST_SUITE_END();
-
-	DrumkitCreator drumkit_creator;
-
 public:
-	void setUp()
+	DrumkitcreatorTest()
 	{
+		DGUNIT_TEST(DrumkitcreatorTest::testTest);
 	}
 
-	void tearDown()
-	{
-	
-	}
+	DrumkitCreator drumkit_creator;
 
 	//! This just creates some drumkit.
 	void testTest()
@@ -55,4 +47,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(DrumkitcreatorTest);
+static DrumkitcreatorTest test;
diff --git a/test/drumkitparsertest.cc b/test/drumkitparsertest.cc
index e2d30fc..10ffeb3 100644
--- a/test/drumkitparsertest.cc
+++ b/test/drumkitparsertest.cc
@@ -36,9 +36,7 @@ class DrumkitParserTest
 {
 public:
 	DrumkitParserTest()
-		: DGUnit()
 	{
-		std::cout << __PRETTY_FUNCTION__ << "\n";
 		DGUNIT_TEST(DrumkitParserTest::testTest);
 	}
 
@@ -134,4 +132,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-DrumkitParserTest drumkit_parser_test;
+static DrumkitParserTest test;
diff --git a/test/enginetest.cc b/test/enginetest.cc
index ad4315d..cb21609 100644
--- a/test/enginetest.cc
+++ b/test/enginetest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <thread>
 #include <chrono>
@@ -67,18 +67,16 @@ public:
 	bool isFreewheeling() const { return true; }
 };
 
-class test_engine : public CppUnit::TestFixture
+class test_engine : public DGUnit
 {
-	CPPUNIT_TEST_SUITE(test_engine);
-	CPPUNIT_TEST(loading);
-	CPPUNIT_TEST_SUITE_END();
+public:
+	test_engine()
+	{
+		DGUNIT_TEST(test_engine::loading);
+	}
 
 	DrumkitCreator drumkit_creator;
 
-public:
-	void setUp() {}
-	void tearDown() {}
-
 	void loading()
 	{
 		Settings settings;
@@ -119,4 +117,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(test_engine);
+static test_engine test;
diff --git a/test/imagecachetest.cc b/test/imagecachetest.cc
index 9321cf0..ea2c99d 100644
--- a/test/imagecachetest.cc
+++ b/test/imagecachetest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <cassert>
 
@@ -49,50 +49,48 @@ public:
 };
 
 class ImageCacheTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(ImageCacheTest);
-	CPPUNIT_TEST(refCountTest);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() {}
-	void tearDown() {}
+	ImageCacheTest()
+	{
+		DGUNIT_TEST(ImageCacheTest::refCountTest);
+	}
 
 	void refCountTest()
 	{
 		TestableImageCache imageCache;
-		CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(0u));
-		CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(0u));
+		DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(0u));
+		DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(0u));
 
 		{
 			auto image1{imageCache.getImage("foo")};
 			(void)image1;
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(1u));
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(0u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(1u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(0u));
 
 			auto image2 = imageCache.getImage("bar");
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(1u));
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(1u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
 
 			auto image3 = imageCache.getImage("foo");
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(2u));
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(2u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
 
 			{
 				auto image4 = imageCache.getImage("foo");
-				CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(3u));
-				CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
+				DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(3u));
+				DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
 			}
 
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(2u));
-			CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(2u));
+			DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(1u));
 		}
 
-		CPPUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(0u));
-		CPPUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(0u));
+		DGUNIT_ASSERT_EQUAL(imageCache.count("foo"), std::size_t(0u));
+		DGUNIT_ASSERT_EQUAL(imageCache.count("bar"), std::size_t(0u));
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(ImageCacheTest);
+static ImageCacheTest test;
diff --git a/test/instrumentparsertest.cc b/test/instrumentparsertest.cc
index 44011e1..2fb81d0 100644
--- a/test/instrumentparsertest.cc
+++ b/test/instrumentparsertest.cc
@@ -24,29 +24,22 @@
  *  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 "dgunit.h"
 
 #include <instrumentparser.h>
 #include "scopedfile.h"
 
 class InstrumentParserTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(InstrumentParserTest);
-	CPPUNIT_TEST(testTest);
-	CPPUNIT_TEST_SUITE_END();
-
-	Settings settings;
-	Random rand;
-
 public:
-	void setUp()
+	InstrumentParserTest()
 	{
+		DGUNIT_TEST(InstrumentParserTest::testTest);
 	}
 
-	void tearDown()
-	{
-	}
+	Settings settings;
+	Random rand;
 
 	//! This just creates some drumkit.
 	void testTest()
@@ -71,45 +64,45 @@ public:
 			"</instrument>");
 		Instrument instrument(settings, rand);
 		InstrumentParser parser(instrument, settings);
-		CPPUNIT_ASSERT_EQUAL(0, parser.parseFile(scoped_file.filename()));
+		DGUNIT_ASSERT_EQUAL(0, parser.parseFile(scoped_file.filename()));
 
-		CPPUNIT_ASSERT_EQUAL(std::string(""), instrument._group);
-		CPPUNIT_ASSERT_EQUAL(std::string("Snare"), instrument._name);
-		CPPUNIT_ASSERT_EQUAL(std::string(""), instrument._description);
+		DGUNIT_ASSERT_EQUAL(std::string(""), instrument._group);
+		DGUNIT_ASSERT_EQUAL(std::string("Snare"), instrument._name);
+		DGUNIT_ASSERT_EQUAL(std::string(""), instrument._description);
 
-		CPPUNIT_ASSERT(VersionStr("2.0.0") == instrument.version);
+		DGUNIT_ASSERT(VersionStr("2.0.0") == instrument.version);
 
 		// NOTE: instrument.samples are the sample map belonging to version 1.0
-		CPPUNIT_ASSERT_EQUAL(std::size_t(2), instrument.samplelist.size());
+		DGUNIT_ASSERT_EQUAL(std::size_t(2), instrument.samplelist.size());
 		{
 			const auto& sample = *instrument.samplelist[0];
-			CPPUNIT_ASSERT_EQUAL(std::string("Snare-1"), sample.name);
-			CPPUNIT_ASSERT_EQUAL(0.00985718f, sample.power);
-			CPPUNIT_ASSERT_EQUAL(std::size_t(4), sample.audiofiles.size());
+			DGUNIT_ASSERT_EQUAL(std::string("Snare-1"), sample.name);
+			DGUNIT_ASSERT_EQUAL(0.00985718f, sample.power);
+			DGUNIT_ASSERT_EQUAL(std::size_t(4), sample.audiofiles.size());
 			for(const auto& audiofile : sample.audiofiles)
 			{
-				CPPUNIT_ASSERT_EQUAL(std::string("/tmp/1-Snare.wav"), audiofile.second->filename);
+				DGUNIT_ASSERT_EQUAL(std::string("/tmp/1-Snare.wav"), audiofile.second->filename);
 				switch(audiofile.second->filechannel)
 				{
 					// NOTE: Channel numbers are zero based - they are 1 based in the xml
 				case 0:
-					CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft"),
+					DGUNIT_ASSERT_EQUAL(std::string("AmbLeft"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				case 1:
-					CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"),
+					DGUNIT_ASSERT_EQUAL(std::string("AmbRight"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				case 11:
-					CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"),
+					DGUNIT_ASSERT_EQUAL(std::string("SnareBottom"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				case 12:
-					CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"),
+					DGUNIT_ASSERT_EQUAL(std::string("SnareTop"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				default:
-					CPPUNIT_ASSERT(false);
+					DGUNIT_ASSERT(false);
 					break;
 				}
 			}
@@ -117,39 +110,39 @@ public:
 
 		{
 			const auto& sample = *instrument.samplelist[1];
-			CPPUNIT_ASSERT_EQUAL(std::string("Snare-2"), sample.name);
-			CPPUNIT_ASSERT_EQUAL(0.0124808f, sample.power);
-			CPPUNIT_ASSERT_EQUAL(std::size_t(4), sample.audiofiles.size());
+			DGUNIT_ASSERT_EQUAL(std::string("Snare-2"), sample.name);
+			DGUNIT_ASSERT_EQUAL(0.0124808f, sample.power);
+			DGUNIT_ASSERT_EQUAL(std::size_t(4), sample.audiofiles.size());
 			for(const auto& audiofile : sample.audiofiles)
 			{
-				CPPUNIT_ASSERT_EQUAL(std::string("/tmp/2-Snare.wav"), audiofile.second->filename);
+				DGUNIT_ASSERT_EQUAL(std::string("/tmp/2-Snare.wav"), audiofile.second->filename);
 				switch(audiofile.second->filechannel)
 				{
 					// NOTE: Channel numbers are zero based - they are 1 based in the xml
 				case 0:
-					CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft"),
+					DGUNIT_ASSERT_EQUAL(std::string("AmbLeft"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				case 1:
-					CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"),
+					DGUNIT_ASSERT_EQUAL(std::string("AmbRight"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				case 11:
-					CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"),
+					DGUNIT_ASSERT_EQUAL(std::string("SnareBottom"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				case 12:
-					CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"),
+					DGUNIT_ASSERT_EQUAL(std::string("SnareTop"),
 					                     audiofile.second->instrument_channel->name);
 					break;
 				default:
-					CPPUNIT_ASSERT(false);
+					DGUNIT_ASSERT(false);
 					break;
 				}
 			}
 		}
 
-//CPPUNIT_ASSERT(ref.samples.values == instrument.samples.values);
+//DGUNIT_ASSERT(ref.samples.values == instrument.samples.values);
 		//std::vector<Sample*> samplelist;
 		//std::deque<InstrumentChannel> instrument_channels;
 		//
@@ -162,4 +155,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(InstrumentParserTest);
+static InstrumentParserTest test;
diff --git a/test/lv2.cc b/test/lv2.cc
index a386b7d..0f80dea 100644
--- a/test/lv2.cc
+++ b/test/lv2.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <thread>
 #include <chrono>
@@ -54,21 +54,19 @@ enum class Ports {
  * - Run with buffer size a prime number (and thereby not power of 2)
  * - Run with HUGE number of midi events in one buffer (10000)
  */
-class test_lv2 : public CppUnit::TestFixture
+class test_lv2 : public DGUnit
 {
-	CPPUNIT_TEST_SUITE(test_lv2);
-	CPPUNIT_TEST(open_and_verify);
-	CPPUNIT_TEST(run_no_ports_connected);
-	CPPUNIT_TEST(run_no_output_ports_connected);
-	CPPUNIT_TEST(test1);
-	CPPUNIT_TEST_SUITE_END();
+public:
+	test_lv2()
+	{
+		DGUNIT_TEST(test_lv2::open_and_verify);
+		DGUNIT_TEST(test_lv2::run_no_ports_connected);
+		DGUNIT_TEST(test_lv2::run_no_output_ports_connected);
+		DGUNIT_TEST(test_lv2::test1);
+	}
 
 	DrumkitCreator drumkit_creator;
 
-public:
-	void setUp() {}
-	void tearDown() {}
-
 	void open_and_verify()
 	{
 		int res;
@@ -76,13 +74,13 @@ public:
 		LV2TestHost h(LV2_PATH);
 
 		res = h.open(DG_URI);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.verify();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.close();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 	}
 
 	void run_no_ports_connected()
@@ -92,13 +90,13 @@ public:
 		LV2TestHost h(LV2_PATH);
 
 		res = h.open(DG_URI);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.verify();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.createInstance(44100);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		const char config_fmt[] =
 			"<config>\n"
@@ -167,21 +165,21 @@ public:
 		        latency_regain);
 
 		res = h.loadConfig(config, strlen(config));
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		// run for 1 samples to trigger kit loading
 		res = h.run(1);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 		std::this_thread::sleep_for(std::chrono::milliseconds(1)); // wait for kit to get loaded (async),
 
 		res = h.run(100);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.destroyInstance();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.close();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 	}
 
 	void run_no_output_ports_connected()
@@ -191,13 +189,13 @@ public:
 		LV2TestHost h(LV2_PATH);
 
 		res = h.open(DG_URI);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.verify();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.createInstance(44100);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		const char config_fmt[] =
 			"<config>\n"
@@ -266,7 +264,7 @@ public:
 		        latency_regain);
 
 		res = h.loadConfig(config, strlen(config));
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		// Port buffers:
 		char sequence_buffer[4096];
@@ -277,22 +275,22 @@ public:
 
 		LV2TestHost::Sequence seq(sequence_buffer, sizeof(sequence_buffer));
 		res = h.connectPort((int)Ports::MidiPort, seq.data());
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		// run for 1 samples to trigger kit loading
 		res = h.run(1);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 		std::this_thread::sleep_for(std::chrono::milliseconds(1)); // wait for kit to get loaded (async),
 
 		seq.addMidiNote(5, 1, 127);
 		res = h.run(100);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.destroyInstance();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.close();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 	}
 
 	void test1()
@@ -302,13 +300,13 @@ public:
 		LV2TestHost h(LV2_PATH);
 
 		res = h.open(DG_URI);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.verify();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.createInstance(44100);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		const char config_fmt[] =
 			"<config>\n"
@@ -377,7 +375,7 @@ public:
 		        latency_regain);
 
 		res = h.loadConfig(config, strlen(config));
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		// Port buffers:
 		char sequence_buffer[4096];
@@ -389,7 +387,7 @@ public:
 
 		LV2TestHost::Sequence seq(sequence_buffer, sizeof(sequence_buffer));
 		res = h.connectPort((int)Ports::MidiPort, seq.data());
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		for(int i = 0; i < 16; ++i)
 		{
@@ -399,11 +397,11 @@ public:
 			}
 			res += h.connectPort((int)Ports::AudioPortOffset + i, pcm_buffer[i]);
 		}
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		// run for 1 samples to trigger kit loading
 		res = h.run(1);
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 		std::this_thread::sleep_for(std::chrono::seconds(1));  // wait for kit to get loaded (async),
 
 		seq.addMidiNote(5, 1, 127);
@@ -411,7 +409,7 @@ public:
 		{
 			res = h.run(10);
 			std::this_thread::sleep_for(std::chrono::milliseconds(1));
-			CPPUNIT_ASSERT_EQUAL(0, res);
+			DGUNIT_ASSERT_EQUAL(0, res);
 
 			//printf("Iteration:\n");
 			//for(int k = 0; k < 16; k++) {
@@ -428,7 +426,7 @@ public:
 		seq.addMidiNote(5, 1, 127);
 		res = h.run(10);
 		std::this_thread::sleep_for(std::chrono::milliseconds(1));
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		/*
 		printf("Iteration:\n");
@@ -451,18 +449,18 @@ public:
 		{
 			for(int j = 0; j < 10; j++)
 			{
-				CPPUNIT_ASSERT_EQUAL(((j==5)?comp_val.f:0), pcm_buffer[k][j]);
+				DGUNIT_ASSERT_EQUAL(((j==5)?comp_val.f:0), pcm_buffer[k][j]);
 			}
 		}
 		seq.clear();
 
 		res = h.destroyInstance();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 
 		res = h.close();
-		CPPUNIT_ASSERT_EQUAL(0, res);
+		DGUNIT_ASSERT_EQUAL(0, res);
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(test_lv2);
+static test_lv2 test;
diff --git a/test/memcheckertest.cc b/test/memcheckertest.cc
deleted file mode 100644
index da5eae6..0000000
--- a/test/memcheckertest.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- *            memcheckertest.cc
- *
- *  Mon Jan 18 15:08:31 CET 2016
- *  Copyright 2016 Andr� Nusser
- *  andre.nusser@googlemail.com
- ****************************************************************************/
-
-/*
- *  This file is part of DrumGizmo.
- *
- *  DrumGizmo is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser 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.
- */
-
-// This test should include:
-// -------------------------
-// * Load a small drumkit and check that the memchecker doesn't warn.
-//	-> this assumes that the system is not already swapping which is sane imo.
-// * Load a huge drumkit and check that the memchecker does warn.
-// * Load a kit where we exactly know the size of the audio files and check if it's correct.
-// * Check if the amount of free ram is in a realistic range.
-//
-// NOTE: This test will fail if your system is currently swapping or has an extremely small amount of RAM.
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "../src/memchecker.h"
-#include "../src/drumkit.h"
-#include "../src/drumkitparser.h"
-
-#include "drumkit_creator.h"
-
-class MemCheckerTest
-	: public CppUnit::TestFixture
-	, public MemChecker
-{
-	CPPUNIT_TEST_SUITE(MemCheckerTest);
-	CPPUNIT_TEST(small_drumkit);
-	CPPUNIT_TEST(huge_drumkit);
-	CPPUNIT_TEST(correct_size);
-	CPPUNIT_TEST(check_free_ram);
-	CPPUNIT_TEST_SUITE_END();
-private:
-	Settings settings;
-	DrumKit kit;
-	Random random;
-	DrumkitCreator drumkit_creator;
-
-	const std::string small_kit_path = drumkit_creator.createSmallKit("small_kit");
-	const std::string huge_kit_path = drumkit_creator.createHugeKit("huge_kit");
-	const std::string audiofile = drumkit_creator.createMultiChannelWav("multi_channel.wav");
-public:
-	void setUp()
-	{
-		// just to be sure
-		kit.clear();
-	}
-
-	void tearDown()
-	{}
-
-	void small_drumkit()
-	{
-		// load the small kit
-		DrumKitParser parser(settings, kit, random);
-		CPPUNIT_ASSERT(!parser.parseFile(small_kit_path));
-
-		// check if the memchecker thinks it fits into memory
-		CPPUNIT_ASSERT(enoughFreeMemory(kit));
-	}
-
-	void huge_drumkit()
-	{
-		// load the huge kit
-		DrumKitParser parser(settings, kit, random);
-		CPPUNIT_ASSERT(!parser.parseFile(huge_kit_path));
-
-		// check if the memchecker thinks it doesn't fit into memory
-		CPPUNIT_ASSERT(!enoughFreeMemory(kit));
-	}
-
-	void correct_size()
-	{
-		// check if the memchecker reports the right audiofile size
-		uint64_t bytes_per_channel = 2199332;
-		CPPUNIT_ASSERT_EQUAL(bytes_per_channel, calcBytesPerChannel(audiofile));
-
-		// load the huge kit
-		DrumKitParser parser(settings, kit, random);
-		CPPUNIT_ASSERT(!parser.parseFile(huge_kit_path));
-
-		// check if the protected method of the memchecker reports the correct size
-		uint64_t needed_memory = 71478290000;
-		CPPUNIT_ASSERT_EQUAL(needed_memory, calcNeededMemory(kit));
-	}
-
-	void check_free_ram()
-	{
-		// check if the protected method reports a sane value of free ram
-		uint64_t free_memory = calcFreeMemory();
-		uint64_t min_free_memory = 1000;
-		uint64_t max_free_memory = 50000000000;
-		CPPUNIT_ASSERT(free_memory >= min_free_memory && free_memory <= max_free_memory);
-	}
-};
-
-// Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(MemCheckerTest);
diff --git a/test/notifiertest.cc b/test/notifiertest.cc
index 2b2e92e..fe00597 100644
--- a/test/notifiertest.cc
+++ b/test/notifiertest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <vector>
 
@@ -48,15 +48,13 @@ public:
 };
 
 class NotifierTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(NotifierTest);
-	CPPUNIT_TEST(testTest);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() { }
-	void tearDown() { }
+	NotifierTest()
+	{
+		DGUNIT_TEST(NotifierTest::testTest);
+	}
 
 	//! This just creates some drumkit.
 	void testTest()
@@ -73,9 +71,9 @@ public:
 			std::vector<Probe*> ref;
 			ref.push_back(&foo1);
 			ref.push_back(&foo2);
-			CPPUNIT_ASSERT_EQUAL(ref.size(), triggers.size());
-			CPPUNIT_ASSERT_EQUAL(ref[0], triggers[0]);
-			CPPUNIT_ASSERT_EQUAL(ref[1], triggers[1]);
+			DGUNIT_ASSERT_EQUAL(ref.size(), triggers.size());
+			DGUNIT_ASSERT_EQUAL(ref[0], triggers[0]);
+			DGUNIT_ASSERT_EQUAL(ref[1], triggers[1]);
 			notifier.disconnect(&foo1);
 			notifier.disconnect(&foo2);
 			triggers.clear();
@@ -88,9 +86,9 @@ public:
 			std::vector<Probe*> ref;
 			ref.push_back(&foo2);
 			ref.push_back(&foo1);
-			CPPUNIT_ASSERT_EQUAL(ref.size(), triggers.size());
-			CPPUNIT_ASSERT_EQUAL(ref[0], triggers[0]);
-			CPPUNIT_ASSERT_EQUAL(ref[1], triggers[1]);
+			DGUNIT_ASSERT_EQUAL(ref.size(), triggers.size());
+			DGUNIT_ASSERT_EQUAL(ref[0], triggers[0]);
+			DGUNIT_ASSERT_EQUAL(ref[1], triggers[1]);
 			notifier.disconnect(&foo1);
 			notifier.disconnect(&foo2);
 			triggers.clear();
@@ -100,4 +98,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(NotifierTest);
+static NotifierTest test;
diff --git a/test/paintertest.cc b/test/paintertest.cc
index 75f97fa..c6e8615 100644
--- a/test/paintertest.cc
+++ b/test/paintertest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include "../plugingui/canvas.h"
 #include "../plugingui/painter.h"
@@ -49,16 +49,14 @@ private:
 };
 
 class PainterTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(PainterTest);
-	CPPUNIT_TEST(testDrawImage);
-	CPPUNIT_TEST(testDrawText);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() {}
-	void tearDown() {}
+	PainterTest()
+	{
+		DGUNIT_TEST(PainterTest::testDrawImage);
+		DGUNIT_TEST(PainterTest::testDrawText);
+	}
 
 	void testDrawImage()
 	{
@@ -158,4 +156,4 @@ public:
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(PainterTest);
+static PainterTest test;
diff --git a/test/randomtest.cc b/test/randomtest.cc
index 16a16c4..bc79432 100644
--- a/test/randomtest.cc
+++ b/test/randomtest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <random.h>
 
@@ -32,22 +32,14 @@
 #include <cmath>
 
 class RandomTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(RandomTest);
-	CPPUNIT_TEST(rangeTest);
-	CPPUNIT_TEST(normalTest);
-	CPPUNIT_TEST(chooseTest);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp()
+	RandomTest()
 	{
-	}
-
-	void tearDown()
-	{
-	
+		DGUNIT_TEST(RandomTest::rangeTest);
+		DGUNIT_TEST(RandomTest::normalTest);
+		DGUNIT_TEST(RandomTest::chooseTest);
 	}
 
 	void rangeTest()
@@ -63,16 +55,16 @@ public:
 		{
 			float rand_float = rand.floatInRange(float_lb, float_ub);
 			float rand_int = rand.intInRange(int_lb, int_ub);
-			CPPUNIT_ASSERT(rand_float >= float_lb && rand_float <= float_ub);
-			CPPUNIT_ASSERT(rand_int >= int_lb && rand_int <= int_ub);
+			DGUNIT_ASSERT(rand_float >= float_lb && rand_float <= float_ub);
+			DGUNIT_ASSERT(rand_int >= int_lb && rand_int <= int_ub);
 		}
-		
+
 		// check if the series of random numbers is the one we expect
 		// for a certain seed.
 		rand = Random(666);
-		CPPUNIT_ASSERT_EQUAL(0, rand.intInRange(0,100));
-		CPPUNIT_ASSERT_EQUAL(61, rand.intInRange(0,100));
-		CPPUNIT_ASSERT_EQUAL(23, rand.intInRange(0,100));
+		DGUNIT_ASSERT_EQUAL(0, rand.intInRange(0,100));
+		DGUNIT_ASSERT_EQUAL(61, rand.intInRange(0,100));
+		DGUNIT_ASSERT_EQUAL(23, rand.intInRange(0,100));
 	}
 
 	void normalTest()
@@ -97,8 +89,8 @@ public:
 		float estimated_stddev = sqrt(sum_of_squares/nr_of_samples - estimated_mean*estimated_mean);
 
 		float epsilon = 0.1;
-		CPPUNIT_ASSERT(estimated_mean >= real_mean-epsilon && estimated_mean <= real_mean+epsilon);
-		CPPUNIT_ASSERT(estimated_stddev >= real_stddev-epsilon && estimated_stddev <= real_stddev+epsilon);
+		DGUNIT_ASSERT(estimated_mean >= real_mean-epsilon && estimated_mean <= real_mean+epsilon);
+		DGUNIT_ASSERT(estimated_stddev >= real_stddev-epsilon && estimated_stddev <= real_stddev+epsilon);
 	}
 
 	void chooseTest()
@@ -110,10 +102,10 @@ public:
 
 		for (int i=0; i<nr_of_samples; i++)
 		{
-			CPPUNIT_ASSERT_EQUAL(42, rand.choose(vec));
+			DGUNIT_ASSERT_EQUAL(42, rand.choose(vec));
 		}
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(RandomTest);
+static RandomTest test;
diff --git a/test/resampler.cc b/test/resampler.cc
index 2b6862d..12732c1 100644
--- a/test/resampler.cc
+++ b/test/resampler.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include "../src/chresampler.h"
 
@@ -32,80 +32,79 @@
 
 static float round(float a) { return a<0.5?0:1; }
 
-class test_resampler : public CppUnit::TestFixture
+class test_resampler
+	: public DGUnit
 {
-  CPPUNIT_TEST_SUITE(test_resampler);
-	CPPUNIT_TEST(resampling);
-	CPPUNIT_TEST(resampling_buffer_sizes);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() {}
-	void tearDown() {}
-
-  void resampling()
-  {
-    CHResampler r;
-    CPPUNIT_ASSERT_EQUAL(1.0, r.getRatio());
-    
-    r.setup(44100, 48000);
-    CPPUNIT_ASSERT_EQUAL(44100.0/48000.0, r.getRatio());
-
-    float in[BUFSZ];
-    for(int i = 0; i < BUFSZ; i++) in[i] = 0;//(float)i/(float)BUFSZ;
-    in[100] = 1.0;
-
-    float out[BUFSZ];
-    r.setInputSamples(in, sizeof(in) / sizeof(float));
-    r.setOutputSamples(out, sizeof(out) / sizeof(float));
-    r.process();
-    CPPUNIT_ASSERT_EQUAL((size_t)0, r.getInputSampleCount());
-
-    //    CPPUNIT_ASSERT_EQUAL(, r.getOutputSampleCount());
-
-    int outidx = -1;
-    int inidx = -1;
-    for(int i = 0; i < BUFSZ - (int)r.getOutputSampleCount(); i++) {
-      if(in[i] == 1.0) inidx = i;
-      if(round(out[i]) == 1.0) outidx = i;
-      //printf("in[% 4d]\t= %f\t", i, in[i]);
-      //printf("out[% 4d]\t= %f\n", i, out[i]);
-    }
-
-    CPPUNIT_ASSERT(inidx != -1);
-    CPPUNIT_ASSERT(outidx != -1);
-
-    //printf("inidx: %d - outidx: %d\n", inidx, outidx);
-    //CPPUNIT_ASSERT_EQUAL(71, inidx - outidx); // This does not make sense...
+	test_resampler()
+	{
+		DGUNIT_TEST(test_resampler::resampling);
+		DGUNIT_TEST(test_resampler::resampling_buffer_sizes);
 	}
 
-  void resampling_buffer_sizes()
-  {
-    CHResampler r;
-    CPPUNIT_ASSERT_EQUAL(1.0, r.getRatio());
-    
-    double infs = 24000;
-    double outfs = 48000;
-    r.setup(infs, outfs);
-    CPPUNIT_ASSERT_EQUAL(infs / outfs, r.getRatio());
-
-    float in[BUFSZ];
-    float out[(int)(BUFSZ / r.getRatio())];
-
-    // Preload resampler
-    r.setOutputSamples(out, 1);
-    while(r.getOutputSampleCount()) {
-      r.setInputSamples(in, 1);
-      r.process();
-    }
-
-    r.setInputSamples(in, sizeof(in) / sizeof(float));
-    r.setOutputSamples(out, sizeof(out) / sizeof(float));
-    r.process();
-    CPPUNIT_ASSERT_EQUAL((size_t)0, r.getInputSampleCount());
-    CPPUNIT_ASSERT_EQUAL((size_t)0, r.getOutputSampleCount());
-  }
+	void resampling()
+	{
+		CHResampler r;
+		DGUNIT_ASSERT_EQUAL(1.0, r.getRatio());
+
+		r.setup(44100, 48000);
+		DGUNIT_ASSERT_EQUAL(44100.0/48000.0, r.getRatio());
+
+		float in[BUFSZ];
+		for(int i = 0; i < BUFSZ; i++) in[i] = 0;//(float)i/(float)BUFSZ;
+		in[100] = 1.0;
+
+		float out[BUFSZ];
+		r.setInputSamples(in, sizeof(in) / sizeof(float));
+		r.setOutputSamples(out, sizeof(out) / sizeof(float));
+		r.process();
+		DGUNIT_ASSERT_EQUAL((size_t)0, r.getInputSampleCount());
+
+		//    DGUNIT_ASSERT_EQUAL(, r.getOutputSampleCount());
+
+		int outidx = -1;
+		int inidx = -1;
+		for(int i = 0; i < BUFSZ - (int)r.getOutputSampleCount(); i++) {
+			if(in[i] == 1.0) inidx = i;
+			if(round(out[i]) == 1.0) outidx = i;
+			//printf("in[% 4d]\t= %f\t", i, in[i]);
+			//printf("out[% 4d]\t= %f\n", i, out[i]);
+		}
+
+		DGUNIT_ASSERT(inidx != -1);
+		DGUNIT_ASSERT(outidx != -1);
+
+		//printf("inidx: %d - outidx: %d\n", inidx, outidx);
+		//DGUNIT_ASSERT_EQUAL(71, inidx - outidx); // This does not make sense...
+	}
+
+	void resampling_buffer_sizes()
+	{
+		CHResampler r;
+		DGUNIT_ASSERT_EQUAL(1.0, r.getRatio());
+
+		double infs = 24000;
+		double outfs = 48000;
+		r.setup(infs, outfs);
+		DGUNIT_ASSERT_EQUAL(infs / outfs, r.getRatio());
+
+		float in[BUFSZ];
+		float out[(int)(BUFSZ / r.getRatio())];
+
+		// Preload resampler
+		r.setOutputSamples(out, 1);
+		while(r.getOutputSampleCount()) {
+			r.setInputSamples(in, 1);
+			r.process();
+		}
+
+		r.setInputSamples(in, sizeof(in) / sizeof(float));
+		r.setOutputSamples(out, sizeof(out) / sizeof(float));
+		r.process();
+		DGUNIT_ASSERT_EQUAL((size_t)0, r.getInputSampleCount());
+		DGUNIT_ASSERT_EQUAL((size_t)0, r.getOutputSampleCount());
+	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(test_resampler);
+static test_resampler test;
diff --git a/test/resource_test.cc b/test/resource_test.cc
index 93dae8b..2e88c45 100644
--- a/test/resource_test.cc
+++ b/test/resource_test.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include "../plugingui/resource.h"
 
@@ -42,37 +42,35 @@ public:
 	}
 };
 
-class ResourceTest : public CppUnit::TestFixture
+class ResourceTest : public DGUnit
 {
-	CPPUNIT_TEST_SUITE(ResourceTest);
-	CPPUNIT_TEST(externalReadTest);
-	CPPUNIT_TEST(internalReadTest);
-	CPPUNIT_TEST_SUITE_END();
+public:
+	ResourceTest()
+	{
+		DGUNIT_TEST(ResourceTest::externalReadTest);
+		DGUNIT_TEST(ResourceTest::internalReadTest);
+	}
 
 	DrumkitCreator drumkit_creator;
 
-public:
-	void setUp() {}
-	void tearDown() {}
-
 	void externalReadTest()
 	{
 		auto filename = drumkit_creator.create0000Wav("0000.wav");
 
 		ResourceTester rc(filename);
-		CPPUNIT_ASSERT(!rc.probeIsInternal());
-		CPPUNIT_ASSERT(rc.valid());
-		CPPUNIT_ASSERT_EQUAL((size_t)46, rc.size());
+		DGUNIT_ASSERT(!rc.probeIsInternal());
+		DGUNIT_ASSERT(rc.valid());
+		DGUNIT_ASSERT_EQUAL((size_t)46, rc.size());
 	}
 
 	void internalReadTest()
 	{
 		ResourceTester rc(":resources/bg.png");
-		CPPUNIT_ASSERT(rc.probeIsInternal());
-		CPPUNIT_ASSERT(rc.valid());
-		CPPUNIT_ASSERT_EQUAL((size_t)1123, rc.size());
+		DGUNIT_ASSERT(rc.probeIsInternal());
+		DGUNIT_ASSERT(rc.valid());
+		DGUNIT_ASSERT_EQUAL((size_t)1123, rc.size());
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(ResourceTest);
+static ResourceTest test;
diff --git a/test/scopedfile.cc b/test/scopedfile.cc
index 02af3f8..e63972e 100644
--- a/test/scopedfile.cc
+++ b/test/scopedfile.cc
@@ -43,7 +43,8 @@ ScopedFile::ScopedFile(const std::string& data)
 	char templ[] = "/tmp/dg-scoped-file-XXXXXX"; // buffer for filename
 	pimpl->fd = mkstemp(templ);
 	pimpl->filename = templ;
-	write(pimpl->fd, data.data(), data.size());
+	auto sz = write(pimpl->fd, data.data(), data.size());
+	(void)sz;
 	close(pimpl->fd);
 }
 
diff --git a/test/semaphoretest.cc b/test/semaphoretest.cc
index 1c137c4..c99e9a6 100644
--- a/test/semaphoretest.cc
+++ b/test/semaphoretest.cc
@@ -24,7 +24,7 @@
  *  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 "dgunit.h"
 
 #include <cassert>
 
@@ -45,16 +45,15 @@ std::chrono::nanoseconds dist(const std::chrono::duration<float>& a,
 }
 
 class SemaphoreTest
-	: public CppUnit::TestFixture
+	: public DGUnit
 {
-	CPPUNIT_TEST_SUITE(SemaphoreTest);
-	CPPUNIT_TEST(timeoutTest);
-	CPPUNIT_TEST_SUITE_END();
-
 public:
-	void setUp() {}
-	void tearDown() {}
+	SemaphoreTest()
+	{
+		DGUNIT_TEST(SemaphoreTest::timeoutTest);
+	}
 
+public:
 	void timeoutTest()
 	{
 		Semaphore sem(0);
@@ -62,26 +61,26 @@ public:
 		{ // 1000ms timeout
 			auto start = std::chrono::steady_clock::now();
 			bool res = sem.wait(std::chrono::milliseconds(1000));
-			CPPUNIT_ASSERT(!res); // false means timeout
+			DGUNIT_ASSERT(!res); // false means timeout
 			auto stop = std::chrono::steady_clock::now();
 
 			// Allow +/-1ms skew
-			CPPUNIT_ASSERT(dist((stop - start), std::chrono::milliseconds(1000))
+			DGUNIT_ASSERT(dist((stop - start), std::chrono::milliseconds(1000))
 			               < std::chrono::milliseconds(60));
 		}
 
 		{ // 100ms timeout
 			auto start = std::chrono::steady_clock::now();
 			bool res = sem.wait(std::chrono::milliseconds(100));
-			CPPUNIT_ASSERT(!res); // false means timeout
+			DGUNIT_ASSERT(!res); // false means timeout
 			auto stop = std::chrono::steady_clock::now();
 
 			// Allow +/-1ms skew
-			CPPUNIT_ASSERT(dist((stop - start), std::chrono::milliseconds(100))
+			DGUNIT_ASSERT(dist((stop - start), std::chrono::milliseconds(100))
 			               < std::chrono::milliseconds(60));
 		}
 	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(SemaphoreTest);
+static SemaphoreTest test;
diff --git a/test/syncedsettings.cc b/test/syncedsettings.cc
index 1d8e102..5e1e2fd 100644
--- a/test/syncedsettings.cc
+++ b/test/syncedsettings.cc
@@ -24,180 +24,189 @@
  *  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 "dgunit.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
+	: public DGUnit
+{
+public:
+	SyncedSettingsTest()
+	{
+		DGUNIT_TEST(SyncedSettingsTest::groupCanBeDefaultInitialized);
+		DGUNIT_TEST(SyncedSettingsTest::groupDataCanBeCopied);
+
+		DGUNIT_TEST(SyncedSettingsTest::accessorCanGetFields);
+		DGUNIT_TEST(SyncedSettingsTest::accessorCanSetFields);
+
+		DGUNIT_TEST(SyncedSettingsTest::groupHasCopyCtor);
+		DGUNIT_TEST(SyncedSettingsTest::groupHasMoveCtor);
+		DGUNIT_TEST(SyncedSettingsTest::groupHasCopyAssignOp);
+		DGUNIT_TEST(SyncedSettingsTest::groupHasMoveAssignOp);
+
+		DGUNIT_TEST(SyncedSettingsTest::mimicRealUse);
+	}
+
+private:
+	struct TestData
+	{
+		float foo;
+		bool bar;
+		std::string msg;
+	};
+
+public:
+	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";
 		}
-		
-		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"});
+		TestData copy = data;
+		DGUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+		DGUNIT_ASSERT_EQUAL(copy.bar, false);
+		DGUNIT_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";
 		}
-		
-		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"});
-			}
+		// now read
+		{
+			Accessor<TestData> a{data};
+			DGUNIT_ASSERT_EQUAL(a.data.foo, 3.f);
+			DGUNIT_ASSERT_EQUAL(a.data.bar, false);
+			DGUNIT_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 groupHasCopyCtor()
+	{
+		Group<TestData> tmp;
+		{
+			Accessor<TestData> a{tmp};
+			a.data.foo = 3.f;
+			a.data.bar = false;
+			a.data.msg = "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"});
+		Group<TestData> data{tmp};
+		TestData copy = data;
+		DGUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+		DGUNIT_ASSERT_EQUAL(copy.bar, false);
+		DGUNIT_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";
 		}
-		
-		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"});
+		Group<TestData> data{std::move(tmp)};
+		TestData copy = data;
+		DGUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+		DGUNIT_ASSERT_EQUAL(copy.bar, false);
+		DGUNIT_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";
 		}
-		
-		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"});
+		Group<TestData> data = tmp;
+		TestData copy = data;
+		DGUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+		DGUNIT_ASSERT_EQUAL(copy.bar, false);
+		DGUNIT_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";
 		}
-		
-		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;
+		Group<TestData> data = std::move(tmp);
+		TestData copy = data;
+		DGUNIT_ASSERT_EQUAL(copy.foo, 3.f);
+		DGUNIT_ASSERT_EQUAL(copy.bar, false);
+		DGUNIT_ASSERT_EQUAL(copy.msg, std::string{"hello"});
+	}
+
+	void mimicRealUse()
+	{
+		struct Settings
+		{
+			struct Foo {
+				float a{5};
+				float b{3};
+				bool enabled{true};
 			};
-			
-			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
+			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
 			}
-			CPPUNIT_ASSERT(copy.enabled);
 		}
+		// or:
+		Settings::Foo copy = s.foo;
+		if (copy.enabled) {
+			// do some stuff without locking
+		}
+		DGUNIT_ASSERT(copy.enabled);
+	}
 };
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION(SyncedSettingsTest);
-
+static SyncedSettingsTest test;
diff --git a/test/test.cc b/test/test.cc
deleted file mode 100644
index 925a938..0000000
--- a/test/test.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- *            test.cc
- *
- *  Fri Nov 29 17:45:40 CET 2013
- *  Copyright 2013 Bent Bisballe Nyeng
- *  deva@aasimon.org
- ****************************************************************************/
-
-/*
- *  This file is part of DrumGizmo.
- *
- *  DrumGizmo is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser 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/XmlOutputter.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-#include <fstream>
-
-int main(int argc, char* argv[])
-{
-  // Get the top level suite from the registry
-  CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-
-  // Adds the test to the list of test to run
-  CppUnit::TextUi::TestRunner runner;
-  runner.addTest( suite );
-
-  std::ofstream myfile;
-  myfile.open("result_" OUTPUT ".xml");
-  runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), myfile));
-
-  // Run the tests.
-  bool wasSucessful = runner.run();
-
-  myfile.close();
-
-  // Return error code 1 if the one of test failed.
-  return wasSucessful ? 0 : 1;
-}
-- 
cgit v1.2.3