Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Implement tests of human_number()
Matthew Seaman committed 12 years ago
commit d663b829e4413fef32174d3b3be2072d2bb5e664
parent 42d6d18
5 files changed +166 -12
modified libpkg/pkg_printf.c
@@ -1256,15 +1256,17 @@ struct sbuf *
human_number(struct sbuf *sbuf, int64_t number, struct percent_esc *p)
{
	double		 num;
+
	int		 sign;
	int		 divisor;
	int		 scale;
+
	int		 precision;
	bool		 bin_scale;

#define MAXSCALE	7

-
	const char	 bin_pfx[MAXSCALE][3] =
+
	const char	 *bin_pfx[MAXSCALE] =
		{ "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" }; 
-
	const char	 si_pfx[MAXSCALE][2] =
+
	const char	 *si_pfx[MAXSCALE] =
		{ "", "k", "M", "G", "T", "P", "E" };
	char		 format[16];

@@ -1272,19 +1274,45 @@ human_number(struct sbuf *sbuf, int64_t number, struct percent_esc *p)

	p->flags &= ~(PP_ALTERNATE_FORM1|PP_ALTERNATE_FORM2);

-
	num = number;
+
	if (gen_format(format, sizeof(format), p->flags, ".*f") == NULL)
+
		return (NULL);
+

+
	if (number >= 0) {
+
		num = number;
+
		sign = 1;
+
	} else {
+
		num = -number;
+
		sign = -1;
+
	}
+

	divisor = bin_scale ? 1024 : 1000;

	for (scale = 0; scale < MAXSCALE; scale++) {
-
		if (num <= divisor)
+
		if (num < divisor)
			break;
		num /= divisor;
	}

-
	if (gen_format(format, sizeof(format), p->flags, ".3f %s") == NULL)
-
		return (NULL);
+
	if (num >= 100)
+
		precision = 0;
+
	else if (num >= 10) {
+
		if (p->width == 0 || p->width > 3)
+
			precision = 1;
+
		else
+
			precision = 0;
+
	} else {
+
		if (p->width == 0 || p->width > 3)
+
			precision = 2;
+
		else if (p->width == 3)
+
			precision = 1;
+
		else
+
			precision = 0;
+
	}
+

+
	sbuf_printf(sbuf, format, p->width, num * sign, precision);

-
	sbuf_printf(sbuf, format, p->width, num,
+
	if (scale > 0)
+
		sbuf_printf(sbuf, "%s", 
		    bin_scale ? bin_pfx[scale] : si_pfx[scale]);

	return (sbuf);
modified libpkg/private/pkg_printf.h
@@ -43,7 +43,7 @@
#define PP_EXPLICIT_PLUS	(1U << 3) /* + */
#define PP_SPACE_FOR_PLUS	(1U << 4) /* SPACE */
#define PP_ZERO_PAD		(1U << 5) /* 0 */
-
#define PP_THOUSANDS_SEP	(1U << 6) /* ' */
+
#define PP_THOUSANDS_SEP	(1U << 6) /* ' (locale dependent) */

/* Contexts for option parsing */
#define PP_PKG	(1U << 0)	/* Any pkg scalar value */
added tests/pkg_printf/Atffile
@@ -0,0 +1,5 @@
+
Content-Type: application/X-atf-atffile; version="1"
+

+
prop: test-suite = pkg_printf
+

+
tp: test

\ No newline at end of file
modified tests/pkg_printf/Makefile
@@ -65,14 +65,12 @@ LDADD+= -ledit \

NO_MAN=	true

-
TESTS=	pkg_printf
+
TESTS=	human_number

pkg_printf.c:	${TOPDIR}/libpkg/pkg_printf.c
	ln -s ${.OODATE} ${.TARGET}

run: ${PROG}
-
.for test in ${TESTS}
-
	@env LD_LIBRARY_PATH=${TOPDIR}/libpkg ./${PROG} ${test}
-
.endfor
+
	atf-run

.include <bsd.prog.mk>
modified tests/pkg_printf/test.c
@@ -24,11 +24,134 @@
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

+
#include <string.h>
+

#include <atf-c.h>
#include <pkg.h>
#include <private/pkg_printf.h>

+
ATF_TC(human_number);
+
ATF_TC_HEAD(human_number, tc)
+
	
+
	
+
{
+
	atf_tc_set_md_var(tc, "descr",
+
			  "Testing human_number() output routine");
+
}
+
ATF_TC_BODY(human_number, tc)
+
{
+
	struct sbuf		*sbuf;
+
	struct percent_esc	*p;
+
	int			 i;
+

+
	struct hn_test_vals {
+
		int64_t	in;
+
		const char *out;
+
		int width;
+
		unsigned flags;
+
	} hn_test_vals[] = {
+
		{ 0,                   "0.00",   0, 0, },
+
		{ 1,                   "1.00",   0, 0, },
+
		{ 10,                  "10.0",   0, 0, },
+
		{ 100,                 "100",    0, 0. },
+
		{ 1000,                "1.00k",  0, 0, },
+
		{ 10000,               "10.0k",  0, 0, },
+
		{ 100000,              "100k",   0, 0, },
+
		{ 1000000,             "1.00M",  0, 0, },
+
		{ 1000000000,          "1.00G",  0, 0, },
+
		{ 1000000000000,       "1.00T",  0, 0, },
+
		{ 1000000000000000,    "1.00P",  0, 0, },
+
		{ 1000000000000000000, "1.00E",  0, 0, },
+

+
		{ 999,                 "999",    0, 0, },
+
		{ 1001,                "1.00k",  0, 0, },
+
		{ 1010,                "1.01k",  0, 0, },
+
		{ 1490,                "1.49k",  0, 0, },
+
		{ 1499,                "1.50k",  0, 0, },
+
		{ 1500,                "1.50k",  0, 0, },
+

+
		{ -1,                  "-1.00",  0, 0, },
+
		{ -1234,               "-1.23k", 0, 0, },
+
		{ -1234567,            "-1.23M", 0, 0, },
+
		{ -1234567890,         "-1.23G", 0, 0, },
+
		{ -1234567890123,      "-1.23T", 0, 0, },
+
		{ -1234567890123456,   "-1.23P", 0, 0, },
+
		{ -1234567890123456789,"-1.23E", 0, 0, },
+

+
		{ 512,                 "512",    0, PP_ALTERNATE_FORM2, },
+
		{ 1024,                "1.00Ki", 0, PP_ALTERNATE_FORM2, },
+
		{ 1536,                "1.50Ki", 0, PP_ALTERNATE_FORM2, },
+
		{ 24576,               "24.0Ki", 0, PP_ALTERNATE_FORM2, },
+
		{ 393216,              "384Ki",  0, PP_ALTERNATE_FORM2, },
+
		{ 2359296,             "2.25Mi", 0, PP_ALTERNATE_FORM2, },
+
		{ 3623878656,          "3.38Gi", 0, PP_ALTERNATE_FORM2, },
+
		{ 5566277615616,       "5.06Ti", 0, PP_ALTERNATE_FORM2, },
+
		{ 8549802417586176,    "7.59Pi", 0, PP_ALTERNATE_FORM2, },
+
		{ 1313249651341236633, "1.14Ei", 0, PP_ALTERNATE_FORM2, },
+

+
		{ 1234567, "1M",           1, 0, },
+
		{ 1234567, " 1M",          2, 0, },
+
		{ 1234567, "1.2M",         3, 0, },
+
		{ 1234567, "1.23M",        4, 0, },
+
		{ 1234567, " 1.23M",       5, 0, },
+
		{ 1234567, "  1.23M",      6, 0, },
+
		{ 1234567, "   1.23M",     7, 0, },
+
		{ 1234567, "    1.23M",    8, 0, },
+
		{ 1234567, "     1.23M",   9, 0, },
+

+
		{ 12345678, "12M",         1, 0, },
+
		{ 12345678, "12M",         2, 0, },
+
		{ 12345678, " 12M",        3, 0, },
+
		{ 12345678, "12.3M",       4, 0, },
+
		{ 12345678, " 12.3M",      5, 0, },
+
		{ 12345678, "  12.3M",     6, 0, },
+
		{ 12345678, "   12.3M",    7, 0, },
+
		{ 12345678, "    12.3M",   8, 0, },
+
		{ 12345678, "     12.3M",  9, 0, },
+

+
		{ 123456789, "123M",       1, 0, },
+
		{ 123456789, "123M",       2, 0, },
+
		{ 123456789, "123M",       3, 0, },
+
		{ 123456789, " 123M",      4, 0, },
+
		{ 123456789, "  123M",     5, 0, },
+
		{ 123456789, "   123M",    6, 0, },
+
		{ 123456789, "    123M",   7, 0, },
+
		{ 123456789, "     123M",  8, 0, },
+
		{ 123456789, "      123M", 9, 0, },
+

+
		{  1234567, "1.23M",   0, PP_ALTERNATE_FORM1, },
+
		{  1234567, "1.18Mi",  0, PP_ALTERNATE_FORM2, },
+
		{  1234567, "1.23  M", 6, PP_LEFT_ALIGN, },
+
		{  1234567, "+1.23M",  0, PP_EXPLICIT_PLUS, },
+
		{ -1234567, "-1.23M",  0, PP_EXPLICIT_PLUS, },
+
		{  1234567, " 1.23M",  0, PP_SPACE_FOR_PLUS, },
+
		{ -1234567, "-1.23M",  0, PP_SPACE_FOR_PLUS, },
+
		{  1234567, "001.23M", 6, PP_ZERO_PAD, },
+
		{  1234567, "1.23M",   0, PP_THOUSANDS_SEP, },
+
		{  1023,"1023", 0, PP_ALTERNATE_FORM2|PP_THOUSANDS_SEP, },
+

+
		{ -1,                  NULL,     0, 0, },
+
	};
+

+
	sbuf = sbuf_new_auto();
+
	p = new_percent_esc(NULL);
+

+
	for (i = 0; hn_test_vals[i].out != NULL; i++) {
+
		p->width = hn_test_vals[i].width;
+
		p->flags = hn_test_vals[i].flags;
+
		sbuf = human_number(sbuf, hn_test_vals[i].in, p);
+
		ATF_CHECK_STREQ(sbuf_data(sbuf), hn_test_vals[i].out);
+
		sbuf_clear(sbuf);
+
	}
+

+
	free_percent_esc(p);
+
	sbuf_delete(sbuf);
+
}
+

+

ATF_TP_ADD_TCS(tp)
{
+
	ATF_TP_ADD_TC(tp, human_number);
+

	return atf_no_error();
}