13 ProjectImplP project = ProjectImpl::create (
"TestProject");
15 TASSERT (project->name() ==
"TestProject");
17 const double initial_bpm = project->bpm();
18 TASSERT (initial_bpm >= 10.0 && initial_bpm <= 999.0);
20 auto bpm_connection = project->on_event (
"notify:bpm", [&bpm_notifications] (
const Event &event) { bpm_notifications++; });
23 auto name_connection = project->on_event (
"notify:name", [&name_notifications] (
const Event &event) { name_notifications++; });
26 auto volume_connection = project->on_event (
"notify:master_volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
28 const double initial_vol = project->master_volume();
29 TASSERT (initial_vol >= -100.0 && initial_vol <= 20.0);
33 TASSERT (std::abs (project->bpm() - 130.0) < 0.001);
34 uint64_t last_bpm_notifications = bpm_notifications;
36 TASSERT (std::abs (project->bpm() - 123.0) < 0.001);
37 TASSERT (bpm_notifications > last_bpm_notifications);
42 last_bpm_notifications = bpm_notifications;
46 TASSERT (std::abs (project->bpm() - initial_bpm) < 0.001);
47 TASSERT (bpm_notifications > last_bpm_notifications);
49 last_bpm_notifications = bpm_notifications;
53 TASSERT (std::abs (project->bpm() - 123.0) < 0.001);
54 TASSERT (bpm_notifications > last_bpm_notifications);
59 TASSERT (std::abs (project->bpm() - initial_bpm) < 0.001);
62 const String initial_name = project->name();
63 TASSERT (initial_name ==
"TestProject");
64 uint64_t last_name_notifications = name_notifications;
65 project->name (
"NewName");
66 TASSERT (project->name() ==
"NewName");
67 TASSERT (name_notifications > last_name_notifications);
70 last_name_notifications = name_notifications;
72 TASSERT (project->name() == initial_name);
74 TASSERT (name_notifications > last_name_notifications);
76 last_name_notifications = name_notifications;
78 TASSERT (project->name() ==
"NewName");
79 TASSERT (name_notifications > last_name_notifications);
82 uint64_t last_volume_notifications = volume_notifications;
83 project->master_volume (-6.0);
84 TASSERT (std::abs (project->master_volume() - (-6.0)) < 0.01);
85 TASSERT (volume_notifications > last_volume_notifications);
88 last_volume_notifications = volume_notifications;
90 TASSERT (std::abs (project->master_volume() - initial_vol) < 0.01);
92 TASSERT (volume_notifications > last_volume_notifications);
94 last_volume_notifications = volume_notifications;
96 TASSERT (std::abs (project->master_volume() - (-6.0)) < 0.01);
97 TASSERT (volume_notifications > last_volume_notifications);
102 ProjectImplP project2 = ProjectImpl::create (
"TestProject2");
103 project2->name (
"foo");
104 TASSERT (project2->name() ==
"foo");
105 project2->name (
"bar");
106 TASSERT (project2->name() ==
"bar");
114 ProjectImplP project = ProjectImpl::create (
"LengthTest");
117 double len = project->length();
125project_track_management()
127 ProjectImplP project = ProjectImpl::create (
"TrackTest");
130 TrackS tracks = project->all_tracks();
131 const size_t initial_count = tracks.size();
134 TrackP new_track = project->create_track();
137 tracks = project->all_tracks();
138 TASSERT (tracks.size() == initial_count + 1);
145project_playback_state()
147 ProjectImplP project = ProjectImpl::create (
"PlaybackTest");
151 TASSERT (!project->is_playing());
160 ProjectImplP project = ProjectImpl::create (
"TrackMuteSoloTest");
163 TrackP track = project->create_track();
172 auto muted_connection = track->on_event (
"notify:muted", [&muted_notifications] (
const Event &event) { muted_notifications++; });
175 auto solo_connection = track->on_event (
"notify:solo", [&solo_notifications] (
const Event &event) { solo_notifications++; });
178 uint64_t last_muted_notifications = muted_notifications;
179 track->set_muted (
true);
181 TASSERT (muted_notifications > last_muted_notifications);
184 last_muted_notifications = muted_notifications;
185 track->set_muted (
false);
187 TASSERT (muted_notifications > last_muted_notifications);
190 uint64_t last_solo_notifications = solo_notifications;
191 track->set_solo (
true);
193 TASSERT (solo_notifications > last_solo_notifications);
196 last_solo_notifications = solo_notifications;
197 track->set_solo (
false);
199 TASSERT (solo_notifications > last_solo_notifications);
208 ProjectImplP project = ProjectImpl::create (
"TrackHiddenTest");
211 TrackP track = project->create_track();
219 auto hidden_connection = track->on_event (
"notify:hidden", [&hidden_notifications] (
const Event &event) { hidden_notifications++; });
222 uint64_t last_hidden_notifications = hidden_notifications;
223 track->set_hidden (
true);
225 TASSERT (hidden_notifications > last_hidden_notifications);
228 last_hidden_notifications = hidden_notifications;
229 track->set_hidden (
false);
231 TASSERT (hidden_notifications > last_hidden_notifications);
240 ProjectImplP project = ProjectImpl::create (
"TrackUndoRedoTest");
243 TrackP track = project->create_track();
248 auto volume_connection = track->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
251 auto pan_connection = track->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
254 uint64_t last_volume_notifications = volume_notifications;
255 track->volume (-6.0);
256 TASSERT (std::abs (track->volume() - (-6.0)) < 0.01);
257 TASSERT (volume_notifications > last_volume_notifications);
260 last_volume_notifications = volume_notifications;
262 TASSERT (std::abs (track->volume()) < 0.01);
263 TASSERT (volume_notifications > last_volume_notifications);
266 uint64_t last_pan_notifications = pan_notifications;
268 TASSERT (std::abs (track->pan() - 0.5) < 0.01);
269 TASSERT (pan_notifications > last_pan_notifications);
272 last_pan_notifications = pan_notifications;
274 TASSERT (std::abs (track->pan() - (-0.5)) < 0.01);
275 TASSERT (pan_notifications > last_pan_notifications);
284 ProjectImplP project = ProjectImpl::create (
"TrackVolumePanTest");
287 TrackP track = project->create_track();
291 double initial_vol = track->volume();
292 TASSERT (initial_vol >= -100.0 && initial_vol <= 20.0);
296 auto volume_connection = track->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
299 auto pan_connection = track->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
302 uint64_t last_volume_notifications = volume_notifications;
303 track->volume (-6.0);
304 TASSERT (std::abs (track->volume() - (-6.0)) < 0.01);
305 TASSERT (volume_notifications > last_volume_notifications);
308 last_volume_notifications = volume_notifications;
310 TASSERT (std::abs (track->volume()) < 0.01);
311 TASSERT (volume_notifications > last_volume_notifications);
314 double initial_pan = track->pan();
315 TASSERT (initial_pan >= -1.0 && initial_pan <= 1.0);
318 uint64_t last_pan_notifications = pan_notifications;
320 TASSERT (std::abs (track->pan() - 0.5) < 0.01);
321 TASSERT (pan_notifications > last_pan_notifications);
324 last_pan_notifications = pan_notifications;
326 TASSERT (std::abs (track->pan() - (-0.5)) < 0.01);
327 TASSERT (pan_notifications > last_pan_notifications);
336 ProjectImplP project = ProjectImpl::create (
"TrackNameTest");
339 TrackP track = project->create_track();
343 track->name (
"MyTrack");
344 TASSERT (track->name() ==
"MyTrack");
346 track->name (
"AnotherName");
347 TASSERT (track->name() ==
"AnotherName");
356 ProjectImplP project = ProjectImpl::create (
"ClipTest");
359 TrackP track = project->create_track();
365 ClipP clip = trackimpl->create_midi_clip (
"TestClip", 0.0, 4.0);
375 ProjectImplP project = ProjectImpl::create (
"ClipNotesTest");
378 TrackP track = project->create_track();
384 ClipP clip = trackimpl->create_midi_clip (
"NotesClip", 0.0, 4.0);
387 ClipNoteS notes = clip->list_all_notes();
399 batch.push_back (note);
400 clip->change_batch (batch,
"Add Note");
402 notes = clip->list_all_notes();
413 ProjectImplP project = ProjectImpl::create (
"ClipRangeTest");
416 TrackP track = project->create_track();
422 ClipP clip = trackimpl->create_midi_clip (
"RangeClip", 0.0, 4.0);
425 int64 start = clip->start_tick();
426 int64 stop = clip->stop_tick();
430 clip->assign_range (start + 960, stop + 960);
431 TASSERT (clip->start_tick() == start + 960);
438clip_mute_volume_pan()
440 ProjectImplP project = ProjectImpl::create (
"ClipMuteVolPanTest");
443 TrackP track = project->create_track();
450 ClipP mclip = trackimpl->create_midi_clip (
"MidiClip", 0.0, 4.0);
458 auto muted_connection = mclip->on_event (
"notify:muted", [&muted_notifications] (
const Event &event) { muted_notifications++; });
461 uint64_t last_muted_notifications = muted_notifications;
462 mclip->set_muted (
true);
464 TASSERT (muted_notifications > last_muted_notifications);
467 last_muted_notifications = muted_notifications;
468 mclip->set_muted (
false);
470 TASSERT (muted_notifications > last_muted_notifications);
474 auto volume_connection = mclip->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
477 uint64_t last_volume_notifications = volume_notifications;
478 mclip->volume (-6.0);
479 TASSERT (std::abs (mclip->volume() - (-6.0)) < 0.01);
480 TASSERT (volume_notifications > last_volume_notifications);
483 last_volume_notifications = volume_notifications;
485 TASSERT (std::abs (mclip->volume()) < 0.01);
486 TASSERT (volume_notifications > last_volume_notifications);
489 ClipP aclip = trackimpl->create_audio_clip (
"AudioClip", 0.0, 4.0);
494 auto pan_connection = aclip->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
497 TASSERT (std::abs (aclip->pan()) < 0.01);
500 uint64_t last_pan_notifications = pan_notifications;
502 TASSERT (std::abs (aclip->pan() - 0.5) < 0.01);
503 TASSERT (pan_notifications > last_pan_notifications);
506 last_pan_notifications = pan_notifications;
508 TASSERT (std::abs (aclip->pan() - (-0.5)) < 0.01);
509 TASSERT (pan_notifications > last_pan_notifications);
512 uint64_t audio_volume_notifications = 0;
513 auto audio_volume_connection = aclip->on_event (
"notify:volume", [&audio_volume_notifications] (
const Event &event) { audio_volume_notifications++; });
515 last_volume_notifications = audio_volume_notifications;
516 aclip->volume (-3.0);
517 TASSERT (std::abs (aclip->volume() - (-3.0)) < 0.01);
518 TASSERT (audio_volume_notifications > last_volume_notifications);
527 ProjectImplP project = ProjectImpl::create (
"ClipUndoRedoTest");
530 TrackP track = project->create_track();
537 ClipP mclip = trackimpl->create_midi_clip (
"UndoMidiClip", 0.0, 4.0);
541 auto muted_connection = mclip->on_event (
"notify:muted", [&muted_notifications] (
const Event &event) { muted_notifications++; });
544 uint64_t last_muted_notifications = muted_notifications;
545 mclip->set_muted (
true);
547 TASSERT (muted_notifications > last_muted_notifications);
561 auto volume_connection = mclip->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
564 double initial_vol = mclip->volume();
565 uint64_t last_volume_notifications = volume_notifications;
566 mclip->volume (-12.0);
567 TASSERT (std::abs (mclip->volume() - (-12.0)) < 0.01);
568 TASSERT (volume_notifications > last_volume_notifications);
573 TASSERT (std::abs (mclip->volume() - initial_vol) < 0.01);
578 TASSERT (std::abs (mclip->volume() - (-12.0)) < 0.01);
581 ClipP aclip = trackimpl->create_audio_clip (
"UndoAudioClip", 0.0, 4.0);
585 auto pan_connection = aclip->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
588 double initial_pan = aclip->pan();
589 uint64_t last_pan_notifications = pan_notifications;
591 TASSERT (std::abs (aclip->pan() - 0.8) < 0.01);
592 TASSERT (pan_notifications > last_pan_notifications);
597 TASSERT (std::abs (aclip->pan() - initial_pan) < 0.01);
602 TASSERT (std::abs (aclip->pan() - 0.8) < 0.01);
613 batch.push_back (note);
616 auto notes_connection = mclip->on_event (
"notify:notes", [¬es_notifications] (
const Event &event) { notes_notifications++; });
619 uint64_t last_notes_notifications = notes_notifications;
620 mclip->change_batch (batch,
"Add Note");
621 TASSERT (mclip->list_all_notes().size() == 1);
622 TASSERT (notes_notifications > last_notes_notifications);
627 TASSERT (mclip->list_all_notes().empty());
632 TASSERT (mclip->list_all_notes().size() == 1);
635 int64 initial_start = mclip->start_tick();
636 int64 initial_stop = mclip->stop_tick();
640 auto range_connection = mclip->on_event (
"notify:start_tick", [&range_notifications] (
const Event &event) { range_notifications++; });
642 uint64_t last_range_notifications = range_notifications;
643 mclip->assign_range (initial_start + 960, initial_stop + 960);
644 TASSERT (mclip->start_tick() == initial_start + 960);
645 TASSERT (range_notifications > last_range_notifications);
650 TASSERT (mclip->start_tick() == initial_start);
651 TASSERT (mclip->stop_tick() == initial_stop);
656 TASSERT (mclip->start_tick() == initial_start + 960);
657 TASSERT (mclip->stop_tick() == initial_stop + 960);
666 ProjectImplP project = ProjectImpl::create (
"PluginTest");
669 TrackP track = project->create_track();
676 PluginS plugins = trackimpl->list_plugins();
680 if (plugins.size() > 0) {
681 PluginP plugin = plugins[0];
685 TASSERT (!plugin->name().empty());
686 TASSERT (!plugin->plugin_type().empty());
690 auto enabled_connection = plugin->on_event (
"notify:enabled", [&enabled_notifications] (
const Event &event) { enabled_notifications++; });
693 auto frozen_connection = plugin->on_event (
"notify:frozen", [&frozen_notifications] (
const Event &event) { frozen_notifications++; });
696 bool enabled = plugin->is_enabled();
697 TASSERT (enabled ==
true || enabled ==
false);
700 uint64_t last_enabled_notifications = enabled_notifications;
701 plugin->set_enabled (!enabled);
702 TASSERT (plugin->is_enabled() != enabled);
703 TASSERT (enabled_notifications > last_enabled_notifications);
706 bool frozen = plugin->is_frozen();
707 TASSERT (frozen ==
true || frozen ==
false);
710 uint64_t last_frozen_notifications = frozen_notifications;
711 plugin->set_frozen (!frozen);
712 TASSERT (plugin->is_frozen() != frozen);
713 TASSERT (frozen_notifications > last_frozen_notifications);
717 auto removed_connection = plugin->on_event (
"object:removed", [&removed_count] (
const Event &event) { removed_count++; });
718 plugin->remove_self();
The Anklang C++ API namespace.
int64_t int64
A 64-bit unsigned integer, use PRI*64 in format strings.
Part specific note event representation.
int64 tick
UI selection flag.
float velocity
Duration in number of ticks.
int64 duration
Position in ticks.
Structure for callback based notifications.
#define TASSERT(cond)
Unconditional test assertion, enters breakpoint if not fullfilled.
#define TEST_ADD(fun)
Register a function to run as part of the unit test suite.