xtc/tests/unit/test_next_daw.c

67 lines
4.1 KiB
C
Raw Normal View History

#define _POSIX_C_SOURCE 200809L
#include "xtc/xtc_editing.h"
#include "xtc/xtc_mixer.h"
#include "xtc/xtc_audio.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static void markers(void)
{
xtc_project *p=NULL,*q=NULL;xtc_marker m;size_t count;char path[]="/tmp/xtc-sections-XXXXXX";
int fd=mkstemp(path);assert(fd>=0 && close(fd)==0);
assert(xtc_project_create(&p)==XTC_OK && xtc_project_create(&q)==XTC_OK);
assert(xtc_project_set_marker(p,3840,"Chorus")==XTC_OK);
assert(xtc_project_set_marker(p,0,"Intro")==XTC_OK);
assert(xtc_project_set_marker(p,0,"Intro ä")==XTC_OK);
assert(xtc_project_get_marker(p,0,&m)==XTC_OK && !strcmp(m.name,"Intro ä"));
assert(xtc_project_set_marker(p,1,"Bad\n")==XTC_ERR_INVALID_ARGUMENT);
assert(xtc_project_save(p,path)==XTC_OK && xtc_project_load(q,path)==XTC_OK);
assert(xtc_project_marker_count(q,&count)==XTC_OK && count==2);
assert(xtc_project_get_marker(q,1,&m)==XTC_OK && m.tick==3840 && !strcmp(m.name,"Chorus"));
assert(xtc_project_remove_marker(q,0)==XTC_OK && xtc_project_remove_marker(q,0)==XTC_ERR_NOT_FOUND);
for(size_t i=1;i<127;++i)assert(xtc_project_set_marker(p,i,"M")==XTC_OK);
assert(xtc_project_set_marker(p,999,"Full")==XTC_ERR_CAPACITY);
/* Malformed marker ordering rejects transactionally. */
{FILE *f=fopen(path,"r");char data[32768];size_t n;assert(f);n=fread(data,1,sizeof(data)-1,f);data[n]=0;fclose(f);
char *at=strstr(data,"MARKER 3840");assert(at);memcpy(at+7,"0000",4);
f=fopen(path,"w");assert(f && fwrite(data,1,n,f)==n && fclose(f)==0);
assert(xtc_project_load(q,path)==XTC_ERR_FORMAT);assert(xtc_project_marker_count(q,&count)==XTC_OK && count==1);}
xtc_project_destroy(p);xtc_project_destroy(q);assert(unlink(path)==0);
}
static void sections(void)
{
xtc_project *p=NULL;uint64_t t,c,begin=999,end=999;xtc_marker m={0};
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Track",&t)==XTC_OK);
assert(xtc_project_add_clip(p,t,"Song",0,7680,&c)==XTC_OK);
assert(xtc_project_set_marker(p,960,"A")==XTC_OK && xtc_project_set_marker(p,3840,"B")==XTC_OK);
assert(xtc_project_section(p,0,&begin,&end)==XTC_ERR_NOT_FOUND && begin==999);
assert(xtc_project_section(p,960,&begin,&end)==XTC_OK && begin==960 && end==3840);
assert(xtc_project_section(p,5000,&begin,&end)==XTC_OK && begin==3840 && end==7680);
assert(xtc_project_adjacent_marker(p,960,1,&m)==XTC_OK && m.tick==3840);
assert(xtc_project_adjacent_marker(p,3840,-1,&m)==XTC_OK && m.tick==960);
assert(xtc_project_adjacent_marker(p,960,-1,&m)==XTC_ERR_NOT_FOUND && m.tick==960);
assert(xtc_project_set_marker(p,9000,"Empty")==XTC_OK && xtc_project_section(p,9000,&begin,&end)==XTC_ERR_INVALID_STATE);
xtc_project_destroy(p);
}
static void ripple(void)
{
xtc_project *p=NULL;uint64_t t,c,a;xtc_clip_info clip;xtc_marker m;xtc_automation_point point;
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Track",&t)==XTC_OK);
assert(xtc_project_add_clip(p,t,"A",0,960,&a)==XTC_OK && xtc_project_add_clip(p,t,"B",1920,960,&c)==XTC_OK);
point=(xtc_automation_point){t,1920,XTC_AUTOMATION_GAIN,.5f,0};assert(xtc_project_set_automation(p,&point)==XTC_OK);
assert(xtc_project_set_marker(p,1920,"B")==XTC_OK);
assert(xtc_project_ripple_time(p,480,960,0)==XTC_ERR_INVALID_STATE);
assert(xtc_project_ripple_time(p,960,960,0)==XTC_OK);
assert(xtc_project_find_clip(p,c,&clip)==XTC_OK && clip.start_tick==2880);
assert(xtc_project_get_marker(p,0,&m)==XTC_OK && m.tick==2880);
assert(xtc_project_get_automation(p,0,&point)==XTC_OK && point.tick==2880);
assert(xtc_project_ripple_time(p,960,1920,1)==XTC_OK);
assert(xtc_project_find_clip(p,c,&clip)==XTC_OK && clip.start_tick==960);
assert(xtc_project_ripple_time(p,0,960,1)==XTC_OK && xtc_project_find_clip(p,a,&clip)==XTC_ERR_NOT_FOUND);
assert(xtc_project_find_clip(p,c,&clip)==XTC_OK && clip.start_tick==0);
xtc_project_destroy(p);
}
int main(void){markers();sections();ripple();puts("Next DAW workflow tests passed.");return 0;}