rushabhcodes/desk-fidget-counter

A desk knob assembly combining a circuit board with PETG-printed mechanical parts and vendor CAD-modeled hardware.

Version
5.6.1
License
MIT
Stars
0

tests/test_counter.c

// SPDX-License-Identifier: MIT
#include "counter.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
static unsigned ms;
static void move(Counter *c, int steps, int delta, bool scroll) {
  for (int i = 0; i < steps; i++) {
    uint16_t a = (uint16_t)(c->previous + delta);
    counter_sample(c, a, true, ++ms, scroll);
  }
}
int main(void) {
  Counter c;
  counter_init(&c, 0);
  counter_sample(&c, 65530, true, ++ms, false);
  move(&c, 32, 6, false);
  assert(c.turns == 1 && c.progress == 0);
  move(&c, 32, -6, false);
  assert(c.turns == 2);
  move(&c, 16, 6, false);
  move(&c, 16, -6, false);
  assert(c.turns == 2 && c.progress == 0);
  move(&c, 16, 6, false);
  move(&c, 48, -6, false);
  assert(c.turns == 3 && c.progress == 0);
  move(&c, 8, 6, true);
  assert(counter_report(&c) == 8);
  move(&c, 4, 6, true);
  move(&c, 1, 6, false);
  assert(counter_report(&c) == 0);
  move(&c, 19, 6, false);
  assert(c.turns == 4);
  move(&c, 1, 6, true);
  assert(counter_report(&c) == 1);
  counter_sample(&c, 1234, false, ++ms, true);
  assert(!c.baseline && c.progress == 0 && counter_report(&c) == 0);
  counter_sample(&c, 65530, true, ++ms, true);
  counter_sample(&c, 10, true, ++ms, true);
  assert(c.progress == 16);
  counter_sample(&c, 1000, true, ms += 21, true);
  assert(c.progress == 0);
  counter_sample(&c, 2500, true, ++ms, true);
  assert(!c.baseline);
  counter_init(&c, UINT64_MAX);
  counter_sample(&c, 0, true, ++ms, false);
  move(&c, 32, 6, false);
  assert(c.turns == UINT64_MAX);
  counter_init(&c, 0);
  counter_sample(&c, 0, true, ++ms, false);
  move(&c, 192, 1, false);
  assert(c.turns == 1);
  move(&c, 40, 1, false);
  move(&c, 40, -1, false);
  assert(c.turns == 1 && c.progress == 0);
  uint8_t a[32], b[32];
  uint32_t seq;
  uint64_t turns;
  record_encode(a, 42, 0x123456789abcdef0ULL);
  assert(record_decode(a, &seq, &turns) && seq == 42 &&
         turns == 0x123456789abcdef0ULL);
  for (unsigned i = 0; i < 32; i++) {
    memcpy(b, a, 32);
    b[i] ^= 1;
    assert(!record_decode(b, &seq, &turns));
  }
  // Every interrupted prefix of the next journal record must leave the previous
  // slot usable.
  record_encode(b, 43, 11);
  for (unsigned n = 0; n < 32; n++) {
    uint8_t partial[32] = {0};
    memcpy(partial, b, n);
    assert(!record_decode(partial, &seq, &turns));
    assert(record_decode(a, &seq, &turns) && seq == 42);
  }
  char decimal[21];
  counter_format_total(0, decimal);
  assert(strcmp(decimal, "0") == 0);
  counter_format_total(4294967296ULL, decimal);
  assert(strcmp(decimal, "4294967296") == 0);
  counter_format_total(UINT64_MAX, decimal);
  assert(strcmp(decimal, "18446744073709551615") == 0);
  puts("counter tests: CW, CCW, wraps, reversals, slow motion, gates, "
       "stale/invalid/jump samples, saturation, CRC, 32 torn writes and "
       "64-bit decimal console formatting passed");
}