#include "drill_click.h"
#include <assert.h>
#include <stdio.h>
int main(void) {
 dc_decoder d;
 assert(!dc_init(0,450)); assert(!dc_init(&d,99)); assert(!dc_init(&d,1001));
 assert(dc_init(&d,450));
 for(int s=0;s<2;s++) for(int n=1;n<=5;n++) {
  dc_cancel(&d);
  for(int i=0;i<n;i++) assert(dc_release(&d,(dc_source)s,100u+(uint32_t)i*100u));
  uint32_t last=100u+(uint32_t)(n-1)*100u;
  assert(dc_poll(&d,(dc_source)s,last+449u)==DC_NONE);
  dc_command expected=n==1?DC_TOGGLE_RUN_REQUEST:n==2?DC_REVERSE_REQUEST:n==3&&s==0?DC_MODE_REQUEST:DC_REJECTED;
  assert(dc_poll(&d,(dc_source)s,last+450u)==expected);
  assert(dc_poll(&d,(dc_source)s,last+451u)==DC_NONE);
 }
 assert(!dc_release(&d,(dc_source)2,0));
 assert(dc_release(&d,DC_MAIN_KEY,100));
 assert(!dc_release(&d,DC_MAIN_KEY,550));
 assert(dc_poll(&d,DC_MAIN_KEY,550)==DC_TOGGLE_RUN_REQUEST);
 assert(dc_release(&d,DC_MAIN_KEY,550));
 dc_cancel(&d); assert(dc_poll(&d,DC_MAIN_KEY,1000)==DC_NONE);
 assert(dc_release(&d,DC_MAIN_KEY,UINT32_MAX-100u));
 assert(dc_poll(&d,DC_MAIN_KEY,348u)==DC_NONE);
 assert(dc_poll(&d,DC_MAIN_KEY,349u)==DC_TOGGLE_RUN_REQUEST);
 assert(dc_release(&d,DC_MAIN_KEY,2000)); assert(dc_release(&d,DC_HANDPIECE_KEY,2100));
 assert(dc_release(&d,DC_MAIN_KEY,2200));
 assert(dc_poll(&d,DC_HANDPIECE_KEY,2550)==DC_TOGGLE_RUN_REQUEST);
 assert(dc_poll(&d,DC_MAIN_KEY,2650)==DC_REVERSE_REQUEST);
 puts("PASS: vendor click mapping, boundaries, invalid sequences, cancellation, wraparound, independent sources");
}
