shithub: xml-9atom

ref: ce4a8027322c53b2832f221e2956c90dcd65fd1a
dir: /libxpath/test/t.c/

View raw version
#include <u.h>
#include <libc.h>
#include <xml.h>
#include <xpath.h>

char *tests[] = {
	"/path//to[2]/node[@a='b']/@attr",
	"/path/text()",
	"/html/a",
	"/html/a[2]/text()",
	"/html//e",
	"/html/a[@href='p.php']/text()",
	"/html/a[position()='2']/text()", /* should error */
	"/html/a[position()=2]/text()",
	"/html/'2'",
	"/html/2",
	"/html/'hello'",
	"/[inval]",
	nil
};

Xml *x;

void
printelem(Elem *e)
{
	Attr *a;
	
	print("el: <%s", e->name);
	for (a = e->attrs; a; a = a->next)
		print(" %s='%s'", a->name, a->value);
	print(" />\n");
}

void
printstring(char *s)
{
	print("st: %s\n", s);
}

void
printnum(int n)
{
	print("nr: %d\n", n);
}

void
runtest(char *s)
{
	XpResult r;
	
	print("====== test ======\n - %s\n", s);
	r = xmllookpath(x->root, s);
	print("===== result =====\n");
	
	print("found %d results:\n", r.num);
	
	if (r.error) {
		fprint(2, "err: %r\n");
		werrstr("");
	}
	
	for (int i = 0; i < r.num; i++) {
		switch (r.type) {
		case Xelem:
			if (!r.elems)
				sysfatal("elems not set");
			printelem(r.elems[i]);
			break;
		case Xstring:
			if (!r.strings)
				sysfatal("strings not set");
			printstring(r.strings[i]);
			break;
		case Xnum:
			if (!r.numbers)
				sysfatal("numbers not set");
			printnum(r.numbers[i]);
			break;
		}
	}
	
	switch (r.type) {
	case Xelem:
		if (r.num && r.elems)
			free(r.elems);
		break;
	case Xstring:
		if (r.num && r.strings)
			free(r.strings);
		break;
	case Xnum:
		if (r.num && r.numbers)
			free(r.numbers);
		break;
	}
}

void
main(int argc, char **argv)
{
	USED(argc, argv);
	char **s;
	int fd;
	
	fd = open("test.xml", OREAD);
	if (fd < 0)
		sysfatal("unable to test: %r");
	
	x = xmlparse(fd, 8192, 0);
	
	close(fd);
	
//	xmldebug = 1;
	
	for (s = tests; *s; s++) {
		runtest(*s);
	}
	
	exits(nil);
}