#include "lamp_ntc.h"
#include <math.h>
#include <assert.h>
#include <stdio.h>
int main(void) {
 double max_error=0.;int32_t prior=12600;unsigned valid=0;
 for(unsigned raw=0;raw<=4095;raw++) {
  int32_t out=77777;bool ok=lamp_ntc_candidate_temperature((uint16_t)raw,&out);
  if(raw<134 || raw>3975){assert(!ok && out==77777);continue;}
  assert(ok && out<=prior && out>=-4000 && out<=12500);prior=out;
  /* Independent inverse material9 equation, rather than interpolated table. */
  double ratio=(double)raw/(4095.-raw),l=log(ratio);
  double ref=1./(.003354016+.000256985*l+.000002620131*l*l+.00000006383091*l*l*l)-273.15;
  double error=fabs(out/100.-ref);if(error>max_error)max_error=error;
  assert(error<0.35);++valid;
 }
 int32_t result;assert(!lamp_ntc_candidate_temperature(65535,&result));
 assert(!lamp_ntc_candidate_temperature(2048,NULL));
 assert(lamp_ntc_candidate_temperature(2048,&result) && result>=2490 && result<=2510);
 printf("PASS: all4096 ADC codes; %u nominal curve codes; monotonicity/range/null/rejected-output preservation; independent inverse equation max error %.6fC. Math approximation, not sensor accuracy.\n",valid,max_error);
}
