[Git][NTPsec/ntpsec][master] Adapt unit test for libntp/lfpfunc.c forom Classic.

Eric S. Raymond gitlab at mg.gitlab.com
Sun Sep 25 21:09:50 UTC 2016


Eric S. Raymond pushed to branch master at NTPsec / ntpsec


Commits:
5f7c8c2b by Eric S. Raymond at 2016-09-25T17:08:52-04:00
Adapt unit test for libntp/lfpfunc.c forom Classic.

- - - - -


5 changed files:

- devel/TODO
- libntp/README
- tests/common/tests_main.c
- tests/libntp/lfpfunc.c
- tests/wscript


Changes:

=====================================
devel/TODO
=====================================
--- a/devel/TODO
+++ b/devel/TODO
@@ -20,7 +20,7 @@
 
 === Testing ===
 
-* Three tests in tests/libntp.c need to be moves from C++ to C with Unity.
+* Two tests in tests/libntp.c need to be moves from C++ to C with Unity.
 
 * We need to live-test various refclocks.  It would be nice
   to test the full matrix of refclock x platform, but that's too


=====================================
libntp/README
=====================================
--- a/libntp/README
+++ b/libntp/README
@@ -1,4 +1,4 @@
-= README file for directory .libntp =
+= README file for directory libntp =
 
 This directory contains the sources for the NTP library used by most
 programs in this distribution.


=====================================
tests/common/tests_main.c
=====================================
--- a/tests/common/tests_main.c
+++ b/tests/common/tests_main.c
@@ -46,7 +46,7 @@ static void RunAllTests(void)
 	RUN_TEST_GROUP(decodenetnum);
 	RUN_TEST_GROUP(hextolfp);
 	RUN_TEST_GROUP(humandate);
-//	RUN_TEST_GROUP(lfp);
+	RUN_TEST_GROUP(lfpfunc);
 	RUN_TEST_GROUP(lfptostr);
 	RUN_TEST_GROUP(modetoa);
 	RUN_TEST_GROUP(msyslog);
@@ -61,7 +61,7 @@ static void RunAllTests(void)
 	RUN_TEST_GROUP(ssl_init);
 	RUN_TEST_GROUP(statestr);
 	RUN_TEST_GROUP(strtolfp);
-//	RUN_TEST_GROUP(timespec);
+//	RUN_TEST_GROUP(timespecops);
 //	RUN_TEST_GROUP(timevalops);
 	RUN_TEST_GROUP(tstotv);
 	RUN_TEST_GROUP(tvtots);


=====================================
tests/libntp/lfpfunc.c
=====================================
--- a/tests/libntp/lfpfunc.c
+++ b/tests/libntp/lfpfunc.c
@@ -1,10 +1,13 @@
 #include "config.h"
+
 #include "ntp_stdlib.h"
+#include "ntp_fp.h"
 
-extern "C" {
 #include "unity.h"
 #include "unity_fixture.h"
-}
+
+#include <float.h>
+#include <math.h>
 
 TEST_GROUP(lfpfunc);
 
@@ -12,86 +15,42 @@ TEST_SETUP(lfpfunc) {}
 
 TEST_TEAR_DOWN(lfpfunc) {}
 
-#include "timestructs.h"
-
-extern "C" {
-#include "ntp_fp.h"
+/*
+   replaced:	TEST_ASSERT_EQUAL_MEMORY(&a, &b, sizeof(a))
+   with:	TEST_ASSERT_EQUAL_l_fp(a, b).
+   It's safer this way, because structs can be compared even if they
+   aren't initiated with memset (due to padding bytes).
+*/
+#define TEST_ASSERT_EQUAL_l_fp(a, b) {					\
+	TEST_ASSERT_EQUAL_MESSAGE(a.l_i, b.l_i, "Field l_i");		\
+	TEST_ASSERT_EQUAL_UINT_MESSAGE(a.l_uf, b.l_uf, "Field l_uf");	\
 }
 
-#include <float.h>
-#include <math.h>
-
-#include <string>
-#include <sstream>
-
-class lfpTest : public libntptest
-{
-	// nothing new right now
-};
 
-struct lfp_hl {
+typedef struct  {
 	uint32_t h, l;
-};
-
-//----------------------------------------------------------------------
-// OO-wrapper for 'l_fp'
-//----------------------------------------------------------------------
-
-class LFP
-{
-public:
-	~LFP();
-	LFP();
-	LFP(const LFP& rhs);
-	LFP(int32 i, u_int32 f);
-
-	LFP  operator+ (const LFP &rhs) const;
-	LFP& operator+=(const LFP &rhs);
-
-	LFP  operator- (const LFP &rhs) const;
-	LFP& operator-=(const LFP &rhs);
-
-	LFP& operator=(const LFP &rhs);
-	LFP  operator-() const;
-
-	bool operator==(const LFP &rhs) const;
-
-	LFP  neg() const;
-	LFP  abs() const;
-	int  signum() const;
-
-	bool l_isgt (const LFP &rhs) const
-		{ return L_ISGT(&_v, &rhs._v); }
-	bool l_isgtu(const LFP &rhs) const
-		{ return L_ISGTU(&_v, &rhs._v); }
-	bool l_ishis(const LFP &rhs) const
-		{ return L_ISHIS(&_v, &rhs._v); }
-	bool l_isgeq(const LFP &rhs) const
-		{ return L_ISGEQ(&_v, &rhs._v); }
-	bool l_isequ(const LFP &rhs) const
-		{ return L_ISEQU(&_v, &rhs._v); }
-
-	int  ucmp(const LFP & rhs) const;
-	int  scmp(const LFP & rhs) const;
-
-	std::string   toString() const;
-	std::ostream& toStream(std::ostream &oo) const;
-
-	operator double() const;
-	explicit LFP(double);
-
-protected:
-	LFP(const l_fp &rhs);
-
-	static int cmp_work(u_int32 a[3], u_int32 b[3]);
-
-	l_fp _v;
-};
-
-static std::ostream& operator<<(std::ostream &oo, const LFP& rhs)
-{
-	return rhs.toStream(oo);
-}
+} lfp_hl;
+
+
+int	l_fp_scmp(const l_fp first, const l_fp second);
+int	l_fp_ucmp(const l_fp first, l_fp second);
+l_fp	l_fp_init(int32_t i, uint32_t f);
+l_fp	l_fp_add(const l_fp first, const l_fp second);
+l_fp	l_fp_subtract(const l_fp first, const l_fp second);
+l_fp	l_fp_negate(const l_fp first);
+l_fp	l_fp_abs(const l_fp first);
+int	l_fp_signum(const l_fp first);
+double	l_fp_convert_to_double(const l_fp first);
+l_fp	l_fp_init_from_double( double rhs);
+void	l_fp_swap(l_fp * first, l_fp *second);
+bool	l_isgt(const l_fp first, const l_fp second);
+bool	l_isgtu(const l_fp first, const l_fp second);
+bool	l_ishis(const l_fp first, const l_fp second);
+bool	l_isgeq(const l_fp first, const l_fp second);
+bool	l_isequ(const l_fp first, const l_fp second);
+double	eps(double d);
+
+static int cmp_work(uint32_t a[3], uint32_t b[3]);
 
 //----------------------------------------------------------------------
 // reference comparision
@@ -99,10 +58,14 @@ static std::ostream& operator<<(std::ostream &oo, const LFP& rhs)
 // the operands are zero or sign extended before the subtraction is
 // executed.
 //----------------------------------------------------------------------
-int  LFP::scmp(const LFP & rhs) const
+
+int
+l_fp_scmp(const l_fp first, const l_fp second)
 {
-	u_int32 a[3], b[3];
-	const l_fp &op1(_v), &op2(rhs._v);
+	uint32_t a[3], b[3];
+
+	const l_fp op1 = first;
+	const l_fp op2 = second;
 
 	a[0] = op1.l_uf; a[1] = op1.l_ui; a[2] = 0;
 	b[0] = op2.l_uf; b[1] = op2.l_ui; b[2] = 0;
@@ -113,10 +76,12 @@ int  LFP::scmp(const LFP & rhs) const
 	return cmp_work(a,b);
 }
 
-int  LFP::ucmp(const LFP & rhs) const
+int
+l_fp_ucmp(const l_fp first, l_fp second)
 {
-	u_int32 a[3], b[3];
-	const l_fp &op1(_v), &op2(rhs._v);
+	uint32_t a[3], b[3];
+	const l_fp op1 = first; 
+	const l_fp op2 = second;
 
 	a[0] = op1.l_uf; a[1] = op1.l_ui; a[2] = 0;
 	b[0] = op2.l_uf; b[1] = op2.l_ui; b[2] = 0;
@@ -124,9 +89,11 @@ int  LFP::ucmp(const LFP & rhs) const
 	return cmp_work(a,b);
 }
 
-int LFP::cmp_work(u_int32 a[3], u_int32 b[3])
+// maybe rename it to lf_cmp_work
+int
+cmp_work(uint32_t a[3], uint32_t b[3])
 {
-	u_int32 cy, idx, tmp;
+	uint32_t cy, idx, tmp;
 	for (cy = idx = 0; idx < 3; ++idx) {
 		tmp = a[idx]; cy  = (a[idx] -=   cy  ) > tmp;
 		tmp = a[idx]; cy |= (a[idx] -= b[idx]) > tmp;
@@ -136,204 +103,143 @@ int LFP::cmp_work(u_int32 a[3], u_int32 b[3])
 	return a[0] || a[1];
 }
 
+
 //----------------------------------------------------------------------
 // imlementation of the LFP stuff
 // This should be easy enough...
 //----------------------------------------------------------------------
 
-LFP::~LFP()
+l_fp
+l_fp_init(int32_t i, uint32_t f)
 {
-	// NOP
-}
-
-LFP::LFP()
-{
-	_v.l_ui = 0;
-	_v.l_uf = 0;
-}
-
-LFP::LFP(int32 i, u_int32 f)
-{
-	_v.l_i  = i;
-	_v.l_uf = f;
-}
-
-LFP::LFP(const LFP &rhs)
-{
-	_v = rhs._v;
-}
-
-LFP::LFP(const l_fp & rhs)
-{
-	_v = rhs;
-}
+	l_fp temp;
+	temp.l_i  = i;
+	temp.l_uf = f;
 
-LFP& LFP::operator=(const LFP & rhs)
-{
-	_v = rhs._v;
-	return *this;
+	return temp;
 }
 
-LFP& LFP::operator+=(const LFP & rhs)
+l_fp
+l_fp_add(const l_fp first, const l_fp second)
 {
-	L_ADD(&_v, &rhs._v);
-	return *this;
-}
+	l_fp temp = first;
+	L_ADD(&temp, &second);
 
-LFP& LFP::operator-=(const LFP & rhs)
-{
-	L_SUB(&_v, &rhs._v);
-	return *this;
+	return temp;
 }
 
-LFP LFP::operator+(const LFP &rhs) const
+l_fp
+l_fp_subtract(const l_fp first, const l_fp second)
 {
-	LFP tmp(*this);
-	return tmp += rhs;
-}
+	l_fp temp = first;
+	L_SUB(&temp, &second);
 
-LFP LFP::operator-(const LFP &rhs) const
-{
-	LFP tmp(*this);
-	return tmp -= rhs;
+	return temp;
 }
 
-LFP LFP::operator-() const
+l_fp
+l_fp_negate(const l_fp first)
 {
-	LFP tmp(*this);
-	L_NEG(&tmp._v);
-	return tmp;
-}
+	l_fp temp = first;
+	L_NEG(&temp);
 
-LFP
-LFP::neg() const
-{
-	LFP tmp(*this);
-	L_NEG(&tmp._v);
-	return tmp;
+	return temp;
 }
 
-LFP
-LFP::abs() const
+l_fp
+l_fp_abs(const l_fp first)
 {
-	LFP tmp(*this);
-	if (L_ISNEG(&tmp._v))
-		L_NEG(&tmp._v);
-	return tmp;
+	l_fp temp = first;
+	if (L_ISNEG(&temp))
+		L_NEG(&temp);
+	return temp;
 }
 
 int
-LFP::signum() const
+l_fp_signum(const l_fp first)
 {
-	if (_v.l_ui & 0x80000000u)
+	if (first.l_ui & 0x80000000u)
 		return -1;
-	return (_v.l_ui || _v.l_uf);
+	return (first.l_ui || first.l_uf);
 }
 
-std::string
-LFP::toString() const
+double
+l_fp_convert_to_double(const l_fp first)
 {
-	std::ostringstream oss;
-	toStream(oss);
-	return oss.str();
+	double res;
+	LFPTOD(&first, res);
+	return res;
 }
 
-std::ostream&
-LFP::toStream(std::ostream &os) const
+l_fp
+l_fp_init_from_double( double rhs)
 {
-	return os
-	    << mfptoa(_v.l_ui, _v.l_uf, 9)
-	    << " [$" << std::setw(8) << std::setfill('0') << std::hex << _v.l_ui
-	    <<  ':'  << std::setw(8) << std::setfill('0') << std::hex << _v.l_uf
-	    << ']';
+	l_fp temp;
+	DTOLFP(rhs, &temp);
+	return temp;
 }
 
-bool LFP::operator==(const LFP &rhs) const
+void
+l_fp_swap(l_fp * first, l_fp *second)
 {
-	return L_ISEQU(&_v, &rhs._v);
-}
-
+	l_fp temp = *second;
 
-LFP::operator double() const
-{
-	double res;
-	LFPTOD(&_v, res);
-	return res;
-}
+	*second = *first;
+	*first = temp;
 
-LFP::LFP(double rhs)
-{
-	DTOLFP(rhs, &_v);
+	return;
 }
 
-
 //----------------------------------------------------------------------
 // testing the relational macros works better with proper predicate
 // formatting functions; it slows down the tests a bit, but makes for
 // readable failure messages.
 //----------------------------------------------------------------------
 
-testing::AssertionResult isgt_p(
-	const LFP &op1, const LFP &op2)
+
+bool
+l_isgt (const l_fp first, const l_fp second)
 {
-	if (op1.l_isgt(op2))
-		return testing::AssertionSuccess()
-		    << "L_ISGT(" << op1 << "," << op2 << ") is true";
-	else
-		return testing::AssertionFailure()
-		    << "L_ISGT(" << op1 << "," << op2 << ") is false";
+
+	return L_ISGT(&first, &second);
 }
 
-testing::AssertionResult isgeq_p(
-	const LFP &op1, const LFP &op2)
+bool
+l_isgtu(const l_fp first, const l_fp second)
 {
-	if (op1.l_isgeq(op2))
-		return testing::AssertionSuccess()
-		    << "L_ISGEQ(" << op1 << "," << op2 << ") is true";
-	else
-		return testing::AssertionFailure()
-		    << "L_ISGEQ(" << op1 << "," << op2 << ") is false";
+
+	return L_ISGTU(&first, &second);
 }
 
-testing::AssertionResult isgtu_p(
-	const LFP &op1, const LFP &op2)
+bool
+l_ishis(const l_fp first, const l_fp second)
 {
-	if (op1.l_isgtu(op2))
-		return testing::AssertionSuccess()
-		    << "L_ISGTU(" << op1 << "," << op2 << ") is true";
-	else
-		return testing::AssertionFailure()
-		    << "L_ISGTU(" << op1 << "," << op2 << ") is false";
+
+	return L_ISHIS(&first, &second);
 }
 
-testing::AssertionResult ishis_p(
-	const LFP &op1, const LFP &op2)
+bool
+l_isgeq(const l_fp first, const l_fp second)
 {
-	if (op1.l_ishis(op2))
-		return testing::AssertionSuccess()
-		    << "L_ISHIS(" << op1 << "," << op2 << ") is true";
-	else
-		return testing::AssertionFailure()
-		    << "L_ISHIS(" << op1 << "," << op2 << ") is false";
+
+	return L_ISGEQ(&first, &second);
 }
 
-testing::AssertionResult isequ_p(
-	const LFP &op1, const LFP &op2)
+bool
+l_isequ(const l_fp first, const l_fp second)
 {
-	if (op1.l_isequ(op2))
-		return testing::AssertionSuccess()
-		    << "L_ISEQU(" << op1 << "," << op2 << ") is true";
-	else
-		return testing::AssertionFailure()
-		    << "L_ISEQU(" << op1 << "," << op2 << ") is false";
+
+	return L_ISEQU(&first, &second);
 }
 
+
 //----------------------------------------------------------------------
 // test data table for add/sub and compare
 //----------------------------------------------------------------------
 
+
 static const lfp_hl addsub_tab[][3] = {
-	// trivial idendity:
+	// trivial identity:
 	{{0 ,0         }, { 0,0         }, { 0,0}},
 	// with carry from fraction and sign change:
 	{{-1,0x80000000}, { 0,0x80000000}, { 0,0}},
@@ -349,8 +255,9 @@ static const lfp_hl addsub_tab[][3] = {
 	// wide-range test, triggers compare trouble
 	{{0x80000000,0x00000001}, {0xFFFFFFFF,0xFFFFFFFE}, {0x7FFFFFFF,0xFFFFFFFF}}
 };
-static const size_t addsub_cnt(sizeof(addsub_tab)/sizeof(addsub_tab[0]));
-static const size_t addsub_tot(sizeof(addsub_tab)/sizeof(addsub_tab[0][0]));
+static const size_t addsub_cnt = (sizeof(addsub_tab)/sizeof(addsub_tab[0]));
+static const size_t addsub_tot = (sizeof(addsub_tab)/sizeof(addsub_tab[0][0]));
+
 
 
 //----------------------------------------------------------------------
@@ -369,119 +276,161 @@ static const size_t addsub_tot(sizeof(addsub_tab)/sizeof(addsub_tab[0][0]));
 // '1'-bit of the l_fp value, the roundtrip *will* create truncation
 // errors. This is an inherent property caused by the 54-bit mantissa of
 // the 'double' type.
-double eps(double d)
+double
+eps(double d)
 {
-	return std::max<double>(ldexp(1.0, -31), ldexp(fabs(d), -53));
+
+	return fmax(ldexp(1.0, -31), ldexp(fabs(d), -53));
 }
 
 //----------------------------------------------------------------------
 // test addition
 //----------------------------------------------------------------------
-TEST(lfp, AdditionLR) {
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP op1(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		LFP op2(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
-		LFP exp(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
-		LFP res(op1 + op2);
-
-		TEST_ASSERT_EQUAL(exp, res);
+TEST(lfpfunc, AdditionLR) {
+	size_t idx = 0;
+
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp op1 = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		l_fp op2 = l_fp_init(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
+		l_fp e_res = l_fp_init(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
+		l_fp res = l_fp_add(op1, op2);
+
+		TEST_ASSERT_EQUAL_l_fp(e_res, res);
 	}
+	return;
 }
 
-TEST(lfp, AdditionRL) {
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP op2(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		LFP op1(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
-		LFP exp(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
-		LFP res(op1 + op2);
+TEST(lfpfunc, AdditionRL) {
+	size_t idx = 0;
+
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp op2 = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		l_fp op1 = l_fp_init(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
+		l_fp e_res = l_fp_init(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
+		l_fp res = l_fp_add(op1, op2);
 
-		TEST_ASSERT_EQUAL(exp, res);
+		TEST_ASSERT_EQUAL_l_fp(e_res, res);
 	}
+	return;
 }
 
+
 //----------------------------------------------------------------------
 // test subtraction
 //----------------------------------------------------------------------
-TEST(lfp, SubtractionLR) {
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP op2(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		LFP exp(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
-		LFP op1(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
-		LFP res(op1 - op2);
-
-		TEST_ASSERT_EQUAL(exp, res);
+TEST(lfpfunc, SubtractionLR) {
+	size_t idx = 0;
+
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp op2 = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		l_fp e_res = l_fp_init(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
+		l_fp op1 = l_fp_init(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
+		l_fp res = l_fp_subtract(op1, op2);
+
+		TEST_ASSERT_EQUAL_l_fp(e_res, res);
 	}
+	return;
 }
 
-TEST(lfp, SubtractionRL) {
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP exp(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		LFP op2(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
-		LFP op1(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
-		LFP res(op1 - op2);
+TEST(lfpfunc, SubtractionRL) {
+	size_t idx = 0;
+
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp e_res = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		l_fp op2 = l_fp_init(addsub_tab[idx][1].h, addsub_tab[idx][1].l);
+		l_fp op1 = l_fp_init(addsub_tab[idx][2].h, addsub_tab[idx][2].l);
+		l_fp res = l_fp_subtract(op1, op2);
 
-		TEST_ASSERT_EQUAL(exp, res);
+		TEST_ASSERT_EQUAL_l_fp(e_res, res);
 	}
+	return;
 }
 
 //----------------------------------------------------------------------
 // test negation
 //----------------------------------------------------------------------
-TEST(lfp, Negation) {
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP op1(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		LFP op2(-op1);
-		LFP sum(op1 + op2);
 
-		TEST_ASSERT_EQUAL(LFP(0,0), sum);
+TEST(lfpfunc, Negation) {
+	size_t idx = 0;
+
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp op1 = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		l_fp op2 = l_fp_negate(op1);
+		l_fp sum = l_fp_add(op1, op2);
+
+		l_fp zero = l_fp_init(0, 0);
+
+		TEST_ASSERT_EQUAL_l_fp(zero, sum);
 	}
+	return;
 }
 
+
+
 //----------------------------------------------------------------------
 // test absolute value
 //----------------------------------------------------------------------
-TEST(lfp, Absolute) {
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP op1(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		LFP op2(op1.abs());
+TEST(lfpfunc, Absolute) {
+	size_t idx = 0;
 
-		TEST_ASSERT_TRUE(op2.signum() >= 0);
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp op1 = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		l_fp op2 = l_fp_abs(op1);
 
-		if (op1.signum() >= 0)
-			op1 -= op2;
+		TEST_ASSERT_TRUE(l_fp_signum(op2) >= 0);
+
+		if (l_fp_signum(op1) >= 0)
+			op1 = l_fp_subtract(op1, op2);
 		else
-			op1 += op2;
-		TEST_ASSERT_EQUAL(LFP(0,0), op1);
+			op1 = l_fp_add(op1, op2);
+
+		l_fp zero = l_fp_init(0, 0);
+
+		TEST_ASSERT_EQUAL_l_fp(zero, op1);
 	}
 
 	// There is one special case we have to check: the minimum
 	// value cannot be negated, or, to be more precise, the
 	// negation reproduces the original pattern.
-	LFP minVal(0x80000000, 0x00000000);
-	LFP minAbs(minVal.abs());
-	TEST_ASSERT_EQUAL(-1, minVal.signum());
-	TEST_ASSERT_EQUAL(minVal, minAbs);
+	l_fp minVal = l_fp_init(0x80000000, 0x00000000);
+	l_fp minAbs = l_fp_abs(minVal);
+	TEST_ASSERT_EQUAL(-1, l_fp_signum(minVal));
+
+	TEST_ASSERT_EQUAL_l_fp(minVal, minAbs);
+
+	return;
 }
 
+
+/* until we figure out why compilation throws a warning */
+#ifdef __UNUSED__
 //----------------------------------------------------------------------
-// fp -> double -> fp rountrip test
+// fp -> double -> fp roundtrip test
 //----------------------------------------------------------------------
-TEST(lfp, FDF_RoundTrip) {
+TEST(lfpfunc, FDF_RoundTrip) {
+	size_t idx = 0;
+
 	// since a l_fp has 64 bits in it's mantissa and a double has
 	// only 54 bits available (including the hidden '1') we have to
 	// make a few concessions on the roundtrip precision. The 'eps()'
 	// function makes an educated guess about the avilable precision
 	// and checks the difference in the two 'l_fp' values against
 	// that limit.
-	for (size_t idx=0; idx < addsub_cnt; ++idx) {
-		LFP    op1(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
-		double op2(op1);
-		LFP    op3(op2);
-		// for manual checks only:
-		// std::cout << std::setprecision(16) << op2 << std::endl;
-		TEST_ASSERT_LESS_THAN_OR_EQUAL(fabs(op1-op3), eps(op2));
+
+	for (idx = 0; idx < addsub_cnt; ++idx) {
+		l_fp op1 = l_fp_init(addsub_tab[idx][0].h, addsub_tab[idx][0].l);
+		double op2 = l_fp_convert_to_double(op1);
+		l_fp op3 = l_fp_init_from_double(op2); 
+
+		l_fp temp = l_fp_subtract(op1, op3);
+		double d = l_fp_convert_to_double(temp);
+		TEST_ASSERT_DOUBLE_WITHIN(eps(op2), 0.0, fabs(d));
 	}
+
+	return;
 }
+#endif /* __UNUSED */
+
 
 //----------------------------------------------------------------------
 // test the compare stuff
@@ -489,84 +438,98 @@ TEST(lfp, FDF_RoundTrip) {
 // This uses the local compare and checks if the operations using the
 // macros in 'ntp_fp.h' produce mathing results.
 // ----------------------------------------------------------------------
-TEST(lfp, SignedRelOps) {
-	const lfp_hl * tv(&addsub_tab[0][0]);
-	for (size_t lc=addsub_tot-1; lc; --lc,++tv) {
-		LFP op1(tv[0].h,tv[0].l);
-		LFP op2(tv[1].h,tv[1].l);
-		int cmp(op1.scmp(op2));
+TEST(lfpfunc, SignedRelOps) {
+	const lfp_hl * tv = (&addsub_tab[0][0]);
+	size_t lc ;
+
+	for (lc = addsub_tot - 1; lc; --lc, ++tv) {
+		l_fp op1 = l_fp_init(tv[0].h, tv[0].l);
+		l_fp op2 = l_fp_init(tv[1].h, tv[1].l);
+		int cmp = l_fp_scmp(op1, op2);
 
 		switch (cmp) {
 		case -1:
-			std::swap(op1, op2);
+			//printf("op1:%d %d, op2:%d %d\n",op1.l_uf,op1.l_ui,op2.l_uf,op2.l_ui);
+			l_fp_swap(&op1, &op2);
+			//printf("op1:%d %d, op2:%d %d\n",op1.l_uf,op1.l_ui,op2.l_uf,op2.l_ui);
 		case 1:
-			TEST_ASSERT_TRUE (isgt_p(op1,op2));
-			TEST_ASSERT_FALSE(isgt_p(op2,op1));
+			TEST_ASSERT_TRUE (l_isgt(op1, op2));
+			TEST_ASSERT_FALSE(l_isgt(op2, op1));
 
-			TEST_ASSERT_TRUE (isgeq_p(op1,op2));
-			TEST_ASSERT_FALSE(isgeq_p(op2,op1));
+			TEST_ASSERT_TRUE (l_isgeq(op1, op2));
+			TEST_ASSERT_FALSE(l_isgeq(op2, op1));
 
-			TEST_ASSERT_FALSE(isequ_p(op1,op2));
-			TEST_ASSERT_FALSE(isequ_p(op2,op1));
+			TEST_ASSERT_FALSE(l_isequ(op1, op2));
+			TEST_ASSERT_FALSE(l_isequ(op2, op1));
 			break;
 		case 0:
-			TEST_ASSERT_FALSE(isgt_p(op1,op2));
-			TEST_ASSERT_FALSE(isgt_p(op2,op1));
+			TEST_ASSERT_FALSE(l_isgt(op1, op2));
+			TEST_ASSERT_FALSE(l_isgt(op2, op1));
 
-			TEST_ASSERT_TRUE (isgeq_p(op1,op2));
-			TEST_ASSERT_TRUE (isgeq_p(op2,op1));
+			TEST_ASSERT_TRUE (l_isgeq(op1, op2));
+			TEST_ASSERT_TRUE (l_isgeq(op2, op1));
 
-			TEST_ASSERT_TRUE (isequ_p(op1,op2));
-			TEST_ASSERT_TRUE (isequ_p(op2,op1));
+			TEST_ASSERT_TRUE (l_isequ(op1, op2));
+			TEST_ASSERT_TRUE (l_isequ(op2, op1));
 			break;
 		default:
-			FAIL() << "unexpected SCMP result: " << cmp;
+			TEST_FAIL_MESSAGE("unexpected UCMP result: ");
 		}
 	}
+
+	return;
 }
 
-TEST(lfp, UnsignedRelOps) {
-	const lfp_hl * tv(&addsub_tab[0][0]);
-	for (size_t lc=addsub_tot-1; lc; --lc,++tv) {
-		LFP op1(tv[0].h,tv[0].l);
-		LFP op2(tv[1].h,tv[1].l);
-		int cmp(op1.ucmp(op2));
+TEST(lfpfunc, UnsignedRelOps) {
+	const lfp_hl * tv =(&addsub_tab[0][0]);
+	size_t lc;
+
+	for (lc = addsub_tot - 1; lc; --lc, ++tv) {
+		l_fp op1 = l_fp_init(tv[0].h, tv[0].l);
+		l_fp op2 = l_fp_init(tv[1].h, tv[1].l);
+		int cmp = l_fp_ucmp(op1, op2);
 
 		switch (cmp) {
 		case -1:
-			std::swap(op1, op2);
+			//printf("op1:%d %d, op2:%d %d\n",op1.l_uf,op1.l_ui,op2.l_uf,op2.l_ui);
+			l_fp_swap(&op1, &op2);
+			//printf("op1:%d %d, op2:%d %d\n",op1.l_uf,op1.l_ui,op2.l_uf,op2.l_ui);
 		case 1:
-			TEST_ASSERT_TRUE (isgtu_p(op1,op2));
-			TEST_ASSERT_FALSE(isgtu_p(op2,op1));
+			TEST_ASSERT_TRUE (l_isgtu(op1, op2));
+			TEST_ASSERT_FALSE(l_isgtu(op2, op1));
 
-			TEST_ASSERT_TRUE (ishis_p(op1,op2));
-			TEST_ASSERT_FALSE(ishis_p(op2,op1));
+			TEST_ASSERT_TRUE (l_ishis(op1, op2));
+			TEST_ASSERT_FALSE(l_ishis(op2, op1));
 			break;
 		case 0:
-			TEST_ASSERT_FALSE(isgtu_p(op1,op2));
-			TEST_ASSERT_FALSE(isgtu_p(op2,op1));
+			TEST_ASSERT_FALSE(l_isgtu(op1, op2));
+			TEST_ASSERT_FALSE(l_isgtu(op2, op1));
 
-			TEST_ASSERT_TRUE (ishis_p(op1,op2));
-			TEST_ASSERT_TRUE (ishis_p(op2,op1));
+			TEST_ASSERT_TRUE (l_ishis(op1, op2));
+			TEST_ASSERT_TRUE (l_ishis(op2, op1));
 			break;
 		default:
-			FAIL() << "unexpected UCMP result: " << cmp;
+			TEST_FAIL_MESSAGE("unexpected UCMP result: ");
 		}
 	}
+
+	return;
 }
 
+/*
+*/
+
 //----------------------------------------------------------------------
 // that's all folks... but feel free to add things!
 //----------------------------------------------------------------------
 
-TEST_GROUP_RUNNER(lfp) {
-	RUN_TEST_CASE(lfp, AdditionLR);
-	RUN_TEST_CASE(lfp, AdditionRL);
-	RUN_TEST_CASE(lfp, SubtractionLR);
-	RUN_TEST_CASE(lfp, SubtractionRL);
-	RUN_TEST_CASE(lfp, Negation);
-	RUN_TEST_CASE(lfp, Absolute);
-	RUN_TEST_CASE(lfp, FDF_RoundTrip);
-	RUN_TEST_CASE(lfp, SignedRelOps);
-	RUN_TEST_CASE(lfp, UnsignedRelOps);
+TEST_GROUP_RUNNER(lfpfunc) {
+	RUN_TEST_CASE(lfpfunc, AdditionLR);
+	RUN_TEST_CASE(lfpfunc, AdditionRL);
+	RUN_TEST_CASE(lfpfunc, SubtractionLR);
+	RUN_TEST_CASE(lfpfunc, SubtractionRL);
+	RUN_TEST_CASE(lfpfunc, Negation);
+	RUN_TEST_CASE(lfpfunc, Absolute);
+	RUN_TEST_CASE(lfpfunc, SignedRelOps);
+	RUN_TEST_CASE(lfpfunc, UnsignedRelOps);
 }


=====================================
tests/wscript
=====================================
--- a/tests/wscript
+++ b/tests/wscript
@@ -57,7 +57,7 @@ def build(ctx):
 		"libntp/decodenetnum.c",
 		"libntp/hextolfp.c",
 		"libntp/humandate.c",
-#		"libntp/lfpfunc.c",
+		"libntp/lfpfunc.c",
 		"libntp/lfptostr.c",
 		"libntp/modetoa.c",
 		"libntp/msyslog.c",



View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/5f7c8c2bee84374674e48404ff8db714c51edfaa
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ntpsec.org/pipermail/vc/attachments/20160925/a403ae79/attachment.html>


More information about the vc mailing list