diff options
| -rw-r--r-- | src/audiofile.h | 2 | ||||
| -rw-r--r-- | src/instrument.h | 9 | ||||
| -rw-r--r-- | src/rangemap.h | 1 | ||||
| -rw-r--r-- | src/sample.h | 6 | ||||
| -rw-r--r-- | test/Makefile.am | 13 | ||||
| -rw-r--r-- | test/instrumentparsertest.cc | 165 | ||||
| -rw-r--r-- | test/scopedfile.cc | 58 | ||||
| -rw-r--r-- | test/scopedfile.h | 42 | 
8 files changed, 291 insertions, 5 deletions
| diff --git a/src/audiofile.h b/src/audiofile.h index d73dad8..3bc1ac0 100644 --- a/src/audiofile.h +++ b/src/audiofile.h @@ -68,6 +68,8 @@ public:  	std::size_t filechannel;  private: +	friend class InstrumentParserTest; +  	void* magic{nullptr};  	volatile bool is_loaded{false};  	InstrumentChannel* instrument_channel; diff --git a/src/instrument.h b/src/instrument.h index 0441ed4..e18c14a 100644 --- a/src/instrument.h +++ b/src/instrument.h @@ -42,8 +42,6 @@  class Instrument  { -	friend class InstrumentParser; -	friend class DrumKitParser;  public:  	Instrument(Settings& settings, Random& rand);  	~Instrument(); @@ -66,6 +64,13 @@ public:  	std::size_t getNumberOfFiles() const;  private: +	// For parser: +	friend class InstrumentParser; +	friend class DrumKitParser; + +	// For unit-tests: +	friend class InstrumentParserTest; +  	void* magic;  	std::string _group; diff --git a/src/rangemap.h b/src/rangemap.h index 4c427e7..e53cbe8 100644 --- a/src/rangemap.h +++ b/src/rangemap.h @@ -37,6 +37,7 @@ public:  	std::vector<T2> get(T1 at);  private: +	friend class InstrumentParserTest;  	std::multimap<std::pair<T1, T1>, T2> values;  }; diff --git a/src/sample.h b/src/sample.h index e9cbf18..7eb4076 100644 --- a/src/sample.h +++ b/src/sample.h @@ -36,8 +36,6 @@ using AudioFiles = std::map<const InstrumentChannel*, AudioFile*>;  class Sample  { -	friend class InstrumentParser; -	friend class PowerList;  public:  	Sample(const std::string& name, float power);  	~Sample(); @@ -45,6 +43,10 @@ public:  	AudioFile* getAudioFile(const Channel& channel);  private: +	friend class InstrumentParser; +	friend class PowerList; +	friend class InstrumentParserTest; +  	void addAudioFile(InstrumentChannel* instrument_channel,  	                  AudioFile* audio_file); diff --git a/test/Makefile.am b/test/Makefile.am index f72e694..26ffa81 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -6,7 +6,8 @@ if ENABLE_TESTS  TESTS = resource enginetest paintertest resampler configfile audiocache \  	audiocachefile audiocacheidmanager audiocacheeventhandler \  	randomtest atomictest syncedsettingstest imagecachetest \ -	semaphoretest drumkitcreatortest bytesizeparsertest notifiertest +	semaphoretest drumkitcreatortest bytesizeparsertest notifiertest \ +	instrumentparsertest  if ENABLE_LV2  TESTS += lv2 @@ -212,4 +213,14 @@ notifiertest_SOURCES = \  	notifiertest.cc \  	test.cc +instrumentparsertest_CXXFLAGS = -DOUTPUT=\"instrumentparsertest\" $(CPPUNIT_CFLAGS) \ +	-I$(top_srcdir)/src -I$(top_srcdir)/include +instrumentparsertest_LDFLAGS = $(CPPUNIT_LIBS) \ +	 $(top_srcdir)/src/libdg.la +instrumentparsertest_SOURCES = \ +	$(top_srcdir)/hugin/hugin.c \ +	instrumentparsertest.cc \ +	scopedfile.cc \ +	test.cc +  endif diff --git a/test/instrumentparsertest.cc b/test/instrumentparsertest.cc new file mode 100644 index 0000000..8b4c18b --- /dev/null +++ b/test/instrumentparsertest.cc @@ -0,0 +1,165 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + *            instrumentparsertest.cc + * + *  Wed Jun  6 12:11:16 CEST 2018 + *  Copyright 2018 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/extensions/HelperMacros.h> + +#include <instrumentparser.h> +#include "scopedfile.h" + +class InstrumentParserTest +	: public CppUnit::TestFixture +{ +	CPPUNIT_TEST_SUITE(InstrumentParserTest); +	CPPUNIT_TEST(testTest); +	CPPUNIT_TEST_SUITE_END(); + +	Settings settings; +	Random rand; + +public: +	void setUp() +	{ +	} + +	void tearDown() +	{ +	} + +	//! This just creates some drumkit. +	void testTest() +	{ +		ScopedFile scoped_file( +			"<?xml version='1.0' encoding='UTF-8'?>\n" \ +			"<instrument version=\"2.0\" name=\"Snare\">\n" \ +			" <samples>\n" \ +			"  <sample name=\"Snare-1\" power=\"0.00985718\">\n" \ +			"   <audiofile channel=\"AmbLeft\" file=\"1-Snare.wav\" filechannel=\"1\"/>\n" \ +			"   <audiofile channel=\"AmbRight\" file=\"1-Snare.wav\" filechannel=\"2\"/>\n" \ +			"   <audiofile channel=\"SnareBottom\" file=\"1-Snare.wav\" filechannel=\"12\"/>\n" \ +			"   <audiofile channel=\"SnareTop\" file=\"1-Snare.wav\" filechannel=\"13\"/>\n" \ +			"  </sample>\n" \ +			"  <sample name=\"Snare-2\" power=\"0.0124808\">\n" \ +			"   <audiofile channel=\"AmbLeft\" file=\"2-Snare.wav\" filechannel=\"1\"/>\n" \ +			"   <audiofile channel=\"AmbRight\" file=\"2-Snare.wav\" filechannel=\"2\"/>\n" \ +			"   <audiofile channel=\"SnareBottom\" file=\"2-Snare.wav\" filechannel=\"12\"/>\n" \ +			"   <audiofile channel=\"SnareTop\" file=\"2-Snare.wav\" filechannel=\"13\"/>\n" \ +			"  </sample>\n" \ +			" </samples>\n" \ +			"</instrument>"); +		Instrument instrument(settings, rand); +		InstrumentParser parser(instrument); +		CPPUNIT_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); + +		CPPUNIT_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()); +		{ +			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()); +			for(const auto& audiofile : sample.audiofiles) +			{ +				CPPUNIT_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"), +					                     audiofile.second->instrument_channel->name); +					break; +				case 1: +					CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"), +					                     audiofile.second->instrument_channel->name); +					break; +				case 11: +					CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), +					                     audiofile.second->instrument_channel->name); +					break; +				case 12: +					CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), +					                     audiofile.second->instrument_channel->name); +					break; +				default: +					CPPUNIT_ASSERT(false); +					break; +				} +			} +		} + +		{ +			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()); +			for(const auto& audiofile : sample.audiofiles) +			{ +				CPPUNIT_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"), +					                     audiofile.second->instrument_channel->name); +					break; +				case 1: +					CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"), +					                     audiofile.second->instrument_channel->name); +					break; +				case 11: +					CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), +					                     audiofile.second->instrument_channel->name); +					break; +				case 12: +					CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), +					                     audiofile.second->instrument_channel->name); +					break; +				default: +					CPPUNIT_ASSERT(false); +					break; +				} +			} +		} + +//CPPUNIT_ASSERT(ref.samples.values == instrument.samples.values); +		//std::vector<Sample*> samplelist; +		//std::deque<InstrumentChannel> instrument_channels; +		// +		//size_t lastpos; +		//float mod; +		//Settings& settings; +		//Random& rand; +		//PowerList powerlist; +	} +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(InstrumentParserTest); diff --git a/test/scopedfile.cc b/test/scopedfile.cc new file mode 100644 index 0000000..02af3f8 --- /dev/null +++ b/test/scopedfile.cc @@ -0,0 +1,58 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + *            scopedfile.cc + * + *  Wed Jun  6 15:15:31 CEST 2018 + *  Copyright 2018 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 "scopedfile.h" + +#include <cstdlib> +#include <unistd.h> + +#include <cpp11fix.h> + +struct Pimpl +{ +	std::string filename; +	int fd; +}; + +ScopedFile::ScopedFile(const std::string& data) +	: pimpl(std::make_unique<struct Pimpl>()) +{ +	char templ[] = "/tmp/dg-scoped-file-XXXXXX"; // buffer for filename +	pimpl->fd = mkstemp(templ); +	pimpl->filename = templ; +	write(pimpl->fd, data.data(), data.size()); +	close(pimpl->fd); +} + +ScopedFile::~ScopedFile() +{ +	unlink(pimpl->filename.data()); +} + +std::string ScopedFile::filename() const +{ +	return pimpl->filename; +} diff --git a/test/scopedfile.h b/test/scopedfile.h new file mode 100644 index 0000000..d66eac4 --- /dev/null +++ b/test/scopedfile.h @@ -0,0 +1,42 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + *            scopedfile.h + * + *  Wed Jun  6 15:15:31 CEST 2018 + *  Copyright 2018 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. + */ +#pragma once + +#include <string> +#include <memory> + +class ScopedFile +{ +public: +	ScopedFile(const std::string& data); +	~ScopedFile(); + +	std::string filename() const; + +private: +	std::unique_ptr<struct Pimpl> pimpl; +}; | 
