#include <stdlib.h>

#include "temporal/tempo.h"

#include "TempoMapTest.h"

CPPUNIT_TEST_SUITE_REGISTRATION(TempoMapTest);

using namespace Temporal;

void
TempoMapTest::createTest()
{
	CPPUNIT_ASSERT (TempoMap::use() != 0);
}

void
TempoMapTest::addTest()
{
	TempoMap::WritableSharedPtr tmap (new TempoMap(Tempo (120,4), Meter (4,4))); // TempoMap::write_copy());
	TempoPoint& tp = tmap->set_tempo (Tempo (180, 4), BBT_Argument (6, 1, 0));
	tmap->set_meter (Meter (6, 8), BBT_Argument (3, 1, 0));

	/* tp is at 6|1|0 which is 3|0|0 after the 6/8 meter at ((3-1) * 4 =) 8
	 * quarter notes), so 3 bars of 6
	 * 8th notes, or 18 8 notes, or 9 4th notes. So its quarter time should
	 * be 8 + 9 = 17
	 */

	std::cout << "\n\n\n ***************** tp = " << tp.beats() << std::endl;

	CPPUNIT_ASSERT (tp.beats() == Beats (17,0));


	tmap->abort_update ();
}

void
TempoMapTest::addRemoveTest()
{
	TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());

	tmap->set_tempo (Tempo (120, 4), BBT_Argument (5, 1, 0));
	tmap->set_meter (Meter (2, 4), BBT_Argument (5, 1, 0));

	TempoPoint& tp = tmap->set_tempo (Tempo (120, 4), BBT_Argument (7, 1, 0));
	tmap->set_meter (Meter (4, 4), BBT_Argument (7, 1, 0));

	tmap->replace_tempo (tp, Tempo (64, 4), timepos_t (tp.beats()));
	tmap->dump (std::cout);

	CPPUNIT_ASSERT (tmap->tempo_at (BBT_Argument (8, 1, 0)).note_types_per_minute() == Tempo (64, 4).note_types_per_minute());
	CPPUNIT_ASSERT (tmap->count_tempos_in_points () == 3);
	CPPUNIT_ASSERT (tmap->count_meters_in_points () == 3);

	tmap->abort_update ();
}

void
TempoMapTest::subtractTest()
{
}

void
TempoMapTest::multiplyTest()
{
}

void
TempoMapTest::roundTest()
{
}

void
TempoMapTest::convertTest()
{
}


