summaryrefslogtreecommitdiff
path: root/libs/ardour/test/playlist_overlap_cache_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/test/playlist_overlap_cache_test.cc')
-rw-r--r--libs/ardour/test/playlist_overlap_cache_test.cc119
1 files changed, 119 insertions, 0 deletions
diff --git a/libs/ardour/test/playlist_overlap_cache_test.cc b/libs/ardour/test/playlist_overlap_cache_test.cc
new file mode 100644
index 0000000000..9263d80d3b
--- /dev/null
+++ b/libs/ardour/test/playlist_overlap_cache_test.cc
@@ -0,0 +1,119 @@
+#include "pbd/compose.h"
+#include "ardour/playlist.h"
+#include "ardour/playlist_factory.h"
+#include "ardour/source_factory.h"
+#include "ardour/region.h"
+#include "ardour/region_sorters.h"
+#include "ardour/region_factory.h"
+#include "playlist_overlap_cache_test.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+
+CPPUNIT_TEST_SUITE_REGISTRATION (PlaylistOverlapCacheTest);
+
+void
+PlaylistOverlapCacheTest::tearDown ()
+{
+ _playlist.reset ();
+ _source.reset ();
+
+ TestNeedingSession::tearDown ();
+}
+
+void
+PlaylistOverlapCacheTest::basicTest ()
+{
+ string const test_wav_path = "libs/ardour/test/test.wav";
+
+ _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
+ _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, 44100);
+
+ PropertyList plist;
+ plist.add (Properties::length, 256);
+
+ boost::shared_ptr<Region> regionA = RegionFactory::create (_source, plist);
+ regionA->set_name ("A");
+ _playlist->add_region (regionA, 0);
+
+
+ {
+ Playlist::OverlapCache cache (_playlist.get ());
+ Playlist::RegionList rl = cache.get (Evoral::Range<framepos_t> (0, 256));
+ CPPUNIT_ASSERT_EQUAL (size_t (1), rl.size ());
+ CPPUNIT_ASSERT_EQUAL (regionA, rl.front ());
+
+ rl = cache.get (Evoral::Range<framepos_t> (-1000, 1000));
+ CPPUNIT_ASSERT_EQUAL (size_t (1), rl.size ());
+ CPPUNIT_ASSERT_EQUAL (regionA, rl.front ());
+ }
+
+ boost::shared_ptr<Region> regionB = RegionFactory::create (_source, plist);
+ regionA->set_name ("B");
+ _playlist->add_region (regionB, 53);
+
+ {
+ Playlist::OverlapCache cache (_playlist.get ());
+ Playlist::RegionList rl = cache.get (Evoral::Range<framepos_t> (0, 256));
+ CPPUNIT_ASSERT_EQUAL (size_t (2), rl.size ());
+ rl.sort (RegionSortByPosition ());
+ CPPUNIT_ASSERT_EQUAL (regionA, rl.front ());
+ CPPUNIT_ASSERT_EQUAL (regionB, rl.back ());
+
+ rl = cache.get (Evoral::Range<framepos_t> (260, 274));
+ CPPUNIT_ASSERT_EQUAL (size_t (1), rl.size ());
+ CPPUNIT_ASSERT_EQUAL (regionB, rl.front ());
+ }
+}
+
+void
+PlaylistOverlapCacheTest::stressTest ()
+{
+ string const test_wav_path = "libs/ardour/test/test.wav";
+
+ _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
+ _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, 44100);
+
+ srand (42);
+
+ int const num_regions = rand () % 256;
+
+ for (int i = 0; i < num_regions; ++i) {
+ PropertyList plist;
+ plist.add (Properties::length, rand () % 32768);
+ boost::shared_ptr<Region> r = RegionFactory::create (_source, plist);
+ r->set_name (string_compose ("%1", i));
+ _playlist->add_region (r, rand() % 32768);
+ }
+
+ Playlist::OverlapCache cache (_playlist.get ());
+
+ int const tests = rand () % 256;
+
+ for (int i = 0; i < tests; ++i) {
+ framepos_t const start = rand () % 32768;
+ framepos_t const length = rand () % 32768;
+ framepos_t const end = start + length;
+
+ Playlist::RegionList cached = cache.get (Evoral::Range<framepos_t> (start, end));
+
+ Playlist::RegionList actual;
+ Playlist::RegionList regions = _playlist->region_list().rlist();
+ for (Playlist::RegionList::iterator j = regions.begin(); j != regions.end(); ++j) {
+ if ((*j)->coverage (start, end) != OverlapNone) {
+ actual.push_back (*j);
+ }
+ }
+
+ cached.sort (RegionSortByPosition ());
+ actual.sort (RegionSortByPosition ());
+
+ CPPUNIT_ASSERT_EQUAL (actual.size (), cached.size ());
+ Playlist::RegionList::iterator j = actual.begin ();
+ Playlist::RegionList::iterator k = cached.begin ();
+ for (; j != actual.end(); ++j, ++k) {
+ CPPUNIT_ASSERT_EQUAL (*j, *k);
+ }
+ }
+}