#include "device_status.h"
#include "monitor_view.h"
#include <cassert>
#include <cstdio>
#include <limits>
using namespace wearable;
int main() {
    assert(battery_percent(3300)==0 && battery_percent(4200)==100);
    assert(battery_percent(3750)==50 && battery_percent(2000)==0 && battery_percent(5000)==100);
    assert(battery_filter(0,3920)==3920 && battery_filter(3920,4000)==3930);
    assert(battery_filter(3920,3921)==3920 && battery_filter(3920,3924)==3921);
    assert(!battery_voltage_valid(0) && !battery_voltage_valid(1999) && !battery_voltage_valid(5001));
    assert(battery_voltage_valid(2000) && battery_voltage_valid(5000));
    BatteryStatus b;b.sample(-8,0);assert(!b.valid && b.failures==1 && b.last_error==-8);
    b.sample(0,0);assert(!b.valid && b.last_error==BatteryStatus::InvalidVoltage && b.failures==2);
    b.sample(0,3750);assert(b.valid && b.percent==50 && b.filtered_millivolts==3750 && b.last_error==0);
    b.sample(-7,0);b.sample(-5,0);b.sample(0,65000);
    assert(b.valid && b.percent==50 && b.filtered_millivolts==3750 && b.failures==5);
    b.sample(0,3830);assert(b.filtered_millivolts==3760 && b.last_error==0 && b.failures==5);
    assert(compact_rate(842)=="842B/s" && compact_rate(10000)=="10KB/s");
    assert(compact_rate(1200000)=="1.2MB/s" && compact_rate(123400000,1)=="123M/s");
    assert(compact_rate(999999)=="1MB/s" && compact_rate(-1)=="0B/s");
    assert(compact_rate(std::numeric_limits<double>::infinity())=="0B/s");
    std::puts("Battery percent/filter/invalid/error retention and compact NET rates PASS");
}
