aboutsummaryrefslogtreecommitdiff
path: root/src/lib9
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-05-22 14:56:13 +0000
committerrsc <devnull@localhost>2006-05-22 14:56:13 +0000
commit4b65e43c54c2ca1394babed18cc02f4fffc22e16 (patch)
tree67a95b4e2d6861019fd9dd4e1253fb6a1e1ec20f /src/lib9
parente17e1a71c2923717723f7038d6e123b6452e0b13 (diff)
downloadplan9port-4b65e43c54c2ca1394babed18cc02f4fffc22e16.tar.gz
plan9port-4b65e43c54c2ca1394babed18cc02f4fffc22e16.tar.bz2
plan9port-4b65e43c54c2ca1394babed18cc02f4fffc22e16.zip
more tests
Diffstat (limited to 'src/lib9')
-rw-r--r--src/lib9/mkfile21
-rw-r--r--src/lib9/testfltfmt.c31
-rw-r--r--src/lib9/testfmt.c34
-rw-r--r--src/lib9/testprint.c14
4 files changed, 93 insertions, 7 deletions
diff --git a/src/lib9/mkfile b/src/lib9/mkfile
index a244dd3c..143ca7db 100644
--- a/src/lib9/mkfile
+++ b/src/lib9/mkfile
@@ -13,7 +13,9 @@ FMTOFILES=\
fmt.$O\
fmtfd.$O\
fmtfdflush.$O\
+ fmtlocale.$O\
fmtlock2.$O\
+ fmtnull.$O\
fmtprint.$O\
fmtquote.$O\
fmtrune.$O\
@@ -170,3 +172,22 @@ HFILES=\
%.$O: utf/%.c
$CC $CFLAGS utf/$stem.c
+
+XLIB=$PLAN9/lib/$LIB
+
+testfmt: testfmt.$O $XLIB
+ $LD -o $target testfmt.$O
+
+testfltfmt: testfltfmt.$O $XLIB
+ $LD -o $target testfltfmt.$O
+
+testprint: testprint.$O $XLIB
+ $LD -o $target testprint.$O
+
+# debugging only - should go away (5/22/2006)
+testgoogfmt: testfltfmt.$O googfmt.$O $XLIB
+ $LD -o $target testfltfmt.$O googfmt.$O
+
+testgoogprint: testprint.$O googfmt.$O $XLIB
+ $LD -o $target testprint.$O googfmt.$O
+
diff --git a/src/lib9/testfltfmt.c b/src/lib9/testfltfmt.c
index 54050422..06ab5a60 100644
--- a/src/lib9/testfltfmt.c
+++ b/src/lib9/testfltfmt.c
@@ -58,8 +58,14 @@ static int
numclose(char *num1, char *num2)
{
int ndig;
+ double d1, d2;
enum { MAXDIG = 15 };
+ d1 = fmtstrtod(num1, 0);
+ d2 = fmtstrtod(num2, 0);
+ if(d1 != d2)
+ return 0;
+
ndig = 0;
while (*num1) {
if (*num1 >= '0' && *num1 <= '9') {
@@ -126,24 +132,35 @@ doit(int just, int plus, int alt, int zero, int width, int prec, int spec)
*p = '\0';
for (i = 0; i < sizeof(fmtvals) / sizeof(fmtvals[0]); i++) {
- char ref[256], buf[256];
- Rune rbuf[256];
+ char ref[1024], buf[1024];
+ Rune rbuf[1024];
+ double d1, d2;
sprintf(ref, format, fmtvals[i]);
snprint(buf, sizeof(buf), format, fmtvals[i]);
if (strcmp(ref, buf) != 0
&& !numclose(ref, buf)) {
- fprintf(stderr, "%s: ref='%s' fmt='%s'\n", format, ref, buf);
- exit(1);
+ d1 = fmtstrtod(ref, 0);
+ d2 = fmtstrtod(buf, 0);
+ fprintf(stderr, "%s: ref='%s'%s fmt='%s'%s\n",
+ format,
+ ref, d1==fmtvals[i] ? "" : " (ref is inexact!)",
+ buf, d2==fmtvals[i] ? "" : " (fmt is inexact!)");
+ // exits("oops");
}
/* Check again with output to rune string */
- runesnprint(rbuf, 256, format, fmtvals[i]);
+ runesnprint(rbuf, 1024, format, fmtvals[i]);
snprint(buf, sizeof(buf), "%S", rbuf);
if (strcmp(ref, buf) != 0
&& !numclose(ref, buf)) {
- fprintf(stderr, "%s: rune ref='%s' fmt='%s'\n", format, ref, buf);
- exits("oops");
+ d1 = fmtstrtod(ref, 0);
+ d2 = fmtstrtod(buf, 0);
+ fprintf(stderr, "%s: ref='%s'%s fmt='%s'%s\n",
+ format,
+ ref, d1==fmtvals[i] ? "" : " (ref is inexact!)",
+ buf, d2==fmtvals[i] ? "" : " (fmt is inexact!)");
+ // exits("oops");
}
}
}
diff --git a/src/lib9/testfmt.c b/src/lib9/testfmt.c
index c1a91400..fd2b7039 100644
--- a/src/lib9/testfmt.c
+++ b/src/lib9/testfmt.c
@@ -44,13 +44,31 @@ mysmprint(char *fmt, ...)
return fmtstrflush(&f);
}
+double near1[] = {
+ 0.5,
+ 0.95,
+ 0.995,
+ 0.9995,
+ 0.99995,
+ 0.999995,
+ 0.9999995,
+ 0.99999995,
+ 0.999999995,
+};
void
main(int argc, char **argv)
{
+ int i, j;
+
quotefmtinstall();
fmtinstall('Z', Zflag);
fmtinstall(L'\x263a', Zflag);
+#ifdef PLAN9PORT
+{ extern int __ifmt(Fmt*);
+ fmtinstall('i', __ifmt);
+}
+#endif
verify(smprint("hello world"), "hello world");
#ifdef PLAN9PORT
@@ -72,6 +90,21 @@ main(int argc, char **argv)
verify(smprint("%d", 23), "23");
verify(smprint("%i", 23), "23");
verify(smprint("%Zi", 1234, 23), "23");
+
+ /* ANSI and their wacky corner cases */
+ verify(smprint("%.0d", 0), "");
+ verify(smprint("%.0o", 0), "");
+ verify(smprint("%.0x", 0), "");
+ verify(smprint("%#.0o", 0), "0");
+ verify(smprint("%#.0x", 0), "");
+
+ /* difficult floating point tests that many libraries get wrong */
+ verify(smprint("%.100f", 1.0), "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
+ verify(smprint("%.100g", 1.0), "1");
+ verify(smprint("%0100f", 1.0), "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001.000000");
+ for(i=1; i<9; i++)
+ for(j=0; j<=i; j++)
+ verify(smprint("%.*g", j, near1[i]), "1");
/* test $ reorderings */
verify(smprint("%3$d %4$06d %2$d %1$d", 444, 333, 111, 222), "111 000222 333 444");
@@ -107,6 +140,7 @@ main(int argc, char **argv)
#endif
verify(mysmprint("%'lld %'lld %'lld", 1LL, 222222222LL, 3333333333333LL), "1 222\xe2\x98\xbb""222\xe2\x98\xbb""22\xe2\x98\xbb""2 333\xe2\x98\xbb""3333\xe2\x98\xbb""333\xe2\x98\xbb""33\xe2\x98\xbb""3");
verify(mysmprint("%'llx %'llX %'llb", 0x111111111111LL, 0xabcd12345678LL, 112342345LL), "1111:1111:1111 ABCD:1234:5678 110:1011:0010:0011:0101:0100:1001");
+ verify(mysmprint("%.4f", 3.14159), "3\xe2\x98\xba""1416");
if(failed)
sysfatal("tests failed");
diff --git a/src/lib9/testprint.c b/src/lib9/testprint.c
new file mode 100644
index 00000000..242befb4
--- /dev/null
+++ b/src/lib9/testprint.c
@@ -0,0 +1,14 @@
+#include <u.h>
+#include <libc.h>
+
+void
+main(int argc, char **argv)
+{
+ char c;
+
+ c = argv[1][strlen(argv[1])-1];
+ if(c == 'f' || c == 'e' || c == 'g' || c == 'F' || c == 'E' || c == 'G')
+ print(argv[1], atof(argv[2]));
+ else if(c == 'x' || c == 'u' || c == 'd' || c == 'c' || c == 'C' || c == 'X')
+ print(argv[1], atoi(argv[2]));
+}