/*      $NetBSD: refidsmear.c,v 1.2 2020/05/25 20:47:36 christos Exp $  */

#include "config.h"

#include <ntp.h>
#include <ntp_fp.h>
#include <refidsmear.h>

//#include "ntp_stdlib.h"
//#include "ntp_calendar.h"

#include "unity.h"

#include <stdio.h>

/*
* we want to test a refid format of:
* 254.x.y.x
*
* where x.y.z are 24 bits containing 2 (signed) integer bits
* and 22 fractional bits.
*
* we want functions to convert to/from this format, with unit tests.
*
* Interesting test cases include:
* 254.0.0.0
* 254.0.0.1
* 254.127.255.255
* 254.128.0.0
* 254.255.255.255
*/


void setUp(void);
void rtol(uint32_t r, char *es);
void rtoltor(uint32_t er, char *es);
void ltor(l_fp l, char *er);
void test_refidsmear(void);


void
setUp(void)
{
       init_lib();

       return;
}

void
rtol(uint32_t r, char *es)
{
       l_fp l;
       char *as;
       char msg[100];

       TEST_ASSERT_NOT_NULL(es);

       snprintf(msg, 100, "rtol was called with r=%#.8x, es=%s", r, es);

       l = convertRefIDToLFP(htonl(r));
       as = lfptoa(&l, 8);

       //printf("refid %#x, smear %s\n", r, as);

       TEST_ASSERT_NOT_NULL_MESSAGE(as, msg);
       TEST_ASSERT_EQUAL_STRING_MESSAGE(es, as, msg);

       return;
}


void
rtoltor(uint32_t er, char *es)
{
       l_fp l;
       char *as;
       uint32_t ar;
       char msg[100];

       TEST_ASSERT_NOT_NULL(es);

       snprintf(msg, 100, "rtoltor was called with er=%#.8x, es=%s", er, es);

       l = convertRefIDToLFP(htonl(er));
       as = lfptoa(&l, 8);

       ar = convertLFPToRefID(l);

       //printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(ar));

       TEST_ASSERT_NOT_NULL_MESSAGE(as, msg);
       TEST_ASSERT_EQUAL_STRING_MESSAGE(es, as, msg);
       TEST_ASSERT_EQUAL_UINT_MESSAGE(er, ntohl(ar), msg);

       return;
}


void
ltor(l_fp l, char *er)
{
       uint32_t r;

       printf("ltor: ");

       r = convertLFPToRefID(l);
       printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(r));

       return;
}


void test_refidsmear(void)
{

       rtol(0xfe800000, "-2.00000000");
       rtol(0xfe800001, "-1.99999976");
       rtol(0xfe8ffffe, "-1.75000048");
       rtol(0xfe8fffff, "-1.75000024");
       rtol(0xfef00000, "-0.25000000");
       rtol(0xfef00001, "-0.24999976");
       rtol(0xfefffffe, "-0.00000048");
       rtol(0xfeffffff, "-0.00000024");

       rtol(0xfe000000, "+0.00000000");
       rtol(0xfe000001, "+0.00000024");
       rtol(0xfe6ffffe, "+1.74999952");
       rtol(0xfe6fffff, "+1.74999976");
       rtol(0xfe700000, "+1.75000000");
       rtol(0xfe700001, "+1.75000024");
       rtol(0xfe7ffffe, "+1.99999952");
       rtol(0xfe7fffff, "+1.99999976");

       rtoltor(0xfe800000, "-2.00000000");
       rtoltor(0xfe800001, "-1.99999976");
       rtoltor(0xfe8ffffe, "-1.75000048");
       rtoltor(0xfe8fffff, "-1.75000024");
       rtoltor(0xfef00000, "-0.25000000");
       rtoltor(0xfef00001, "-0.24999976");
       rtoltor(0xfefffffe, "-0.00000048");
       rtoltor(0xfeffffff, "-0.00000024");

       rtoltor(0xfe000000, "+0.00000000");
       rtoltor(0xfe000001, "+0.00000024");
       rtoltor(0xfe6ffffe, "+1.74999952");
       rtoltor(0xfe6fffff, "+1.74999976");
       rtoltor(0xfe700000, "+1.75000000");
       rtoltor(0xfe700001, "+1.75000024");
       rtoltor(0xfe7ffffe, "+1.99999952");
       rtoltor(0xfe7fffff, "+1.99999976");

       return;
}