feat: compare mixer A/B snapshots with undo and qualify modern editing workflows

This commit is contained in:
Johannes Findeisen 2026-11-06 00:25:23 +01:00
commit 1b668068de
14 changed files with 261 additions and 34 deletions

View file

@ -1348,6 +1348,15 @@ int main(int argc, char **argv)
CHECK(s->transform_selection(XTC_CLIPS_FADE,10)==XTC_OK);
CHECK(xtc_project_find_clip(s->project(),s->selected_clip(),&moved)==XTC_OK && moved.fade_in_tick==10 && moved.fade_out_tick==10);
CHECK(s->transform_selection(XTC_CLIPS_FADE,0)==XTC_OK);
uint64_t mix_track=s->selected_track();CHECK(s->toggle_clip(first) && s->toggle_clip(first));
CHECK(s->selected_track()==mix_track);
CHECK(window.mix_snapshot(0,true)==XTC_OK);
CHECK(xtc_project_set_mix(s->project(),mix_track,.5f,-.5f,0,0)==XTC_OK);
CHECK(window.mix_snapshot(1,true)==XTC_OK && window.mix_snapshot(0,false)==XTC_OK);
xtc_track_info mix{};xtc_project_get_track(s->project(),1,&mix);CHECK(mix.gain==1);
CHECK(window.mix_snapshot(1,false)==XTC_OK);xtc_project_get_track(s->project(),1,&mix);CHECK(mix.gain==.5f);
CHECK(window.undo()==XTC_OK);xtc_project_get_track(s->project(),1,&mix);CHECK(mix.gain==1);
CHECK(window.new_project()==XTC_OK && window.mix_snapshot(0,false)==XTC_ERR_NOT_FOUND);
window.do_callback();
}
if (failures != 0) return 1;

View file

@ -4,6 +4,7 @@
#include "xtc/xtc_native.h"
#include "xtc/xtc_control.h"
#include "xtc/xtc_plugin.h"
#include "xtc/xtc_editing.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@ -177,8 +178,52 @@ static void builtin_failures(void)
}
}
static void modern_edit_failures(void)
{
xtc_project *p=NULL;xtc_clipboard *board=NULL;xtc_mix_snapshot *mix=NULL;
uint64_t track,clip,note;int operation,failure;
xtc_midi_transform edit={0};edit.grid=240;edit.swing=50;edit.strength=100;
assert(xtc_project_create(&p)==XTC_OK);
assert(xtc_project_add_track(p,"Track",&track)==XTC_OK);
assert(xtc_project_add_midi_clip(p,track,960,1920,&clip)==XTC_OK);
assert(xtc_project_add_note(p,clip,230,120,61,100,0,&note)==XTC_OK);
assert(xtc_clipboard_create(p,&clip,1,&board)==XTC_OK);
assert(xtc_mix_snapshot_create(p,&mix)==XTC_OK);
for(operation=0;operation<7;++operation) {
int succeeded=0;
for(failure=0;failure<32;++failure) {
xtc_project *copy=NULL;xtc_clipboard *created=NULL;xtc_mix_snapshot *captured=NULL;
uint64_t output=999;xtc_clip_info c;xtc_note_info n;size_t tracks,clips;xtc_result r;
assert(xtc_project_clone(p,&copy)==XTC_OK);
fail_after=failure;
switch(operation) {
case 0:r=xtc_project_transform_clips(copy,&clip,1,XTC_CLIPS_DUPLICATE,1920,&output);break;
case 1:r=xtc_clipboard_create(copy,&clip,1,&created);break;
case 2:r=xtc_clipboard_paste(board,copy,track,3840,&output);break;
case 3:r=xtc_project_repeat_clips(copy,&clip,1,2);break;
case 4:r=xtc_project_transform_midi(copy,&clip,1,&edit);break;
case 5:r=xtc_mix_snapshot_create(copy,&captured);break;
default:r=xtc_mix_snapshot_recall(mix,copy);break;
}
fail_after=-1;
if(r==XTC_OK)succeeded=1;
else {
assert(r==XTC_ERR_OUT_OF_MEMORY && output==999 && !created && !captured);
assert(xtc_project_get_counts(copy,&tracks,&clips)==XTC_OK && clips==1);
assert(xtc_project_find_clip(copy,clip,&c)==XTC_OK && c.start_tick==960);
assert(xtc_project_get_note(copy,0,&n)==XTC_OK && n.start_tick==230 && n.id==note);
{uint64_t probe;assert(xtc_project_duplicate_clip(copy,clip,track,3840,&probe)==XTC_OK && probe==clip+1);}
}
xtc_clipboard_destroy(created);xtc_mix_snapshot_destroy(captured);xtc_project_destroy(copy);
if(succeeded)break;
}
assert(succeeded);
}
xtc_clipboard_destroy(board);xtc_mix_snapshot_destroy(mix);xtc_project_destroy(p);
}
int main(void)
{
modern_edit_failures();
builtin_failures();
graph_limits();
history_reservations();