aboutsummaryrefslogtreecommitdiff
path: root/c/test.cpp
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2022-08-20 12:45:46 +0200
committerJohn Ankarström <john@ankarstrom.se>2022-08-20 12:45:46 +0200
commit3add6b2f9e87258e06ecdf0120529a096e9ea8d3 (patch)
tree8d8cbd11eb91c80e1a9375c7164ebe016b26d028 /c/test.cpp
parentc501708dcd7a87e632c3db95bb4ffadadd847eb2 (diff)
downloadEpisodeBrowser-3add6b2f9e87258e06ecdf0120529a096e9ea8d3.tar.gz
Test XML parsing.
Diffstat (limited to 'c/test.cpp')
-rw-r--r--c/test.cpp58
1 files changed, 55 insertions, 3 deletions
diff --git a/c/test.cpp b/c/test.cpp
index 8d43a46..78f7017 100644
--- a/c/test.cpp
+++ b/c/test.cpp
@@ -1,5 +1,8 @@
#include <windows.h>
#include <wininet.h>
+#include <libxml/HTMLparser.h>
+#include <libxml/HTMLtree.h>
+#include <libxml/xpath.h>
#include "data.h"
#include "episodelistview.h"
@@ -226,9 +229,10 @@ TESTS
TEST(Internet)
{
HINTERNET hi, hiUrl;
- unsigned char buf[2048];
+ static unsigned char buf[8'388'608] = {0};
DWORD cbRead;
+ /* Download HTML. */
hi = InternetOpen(L"Episode Browser",
INTERNET_OPEN_TYPE_DIRECT, nullptr, nullptr,
/*INTERNET_FLAG_ASYNC*/0);
@@ -240,10 +244,58 @@ TESTS
if (!hiUrl)
goto b;
- if (!InternetReadFile(hiUrl, &buf, sizeof(buf), &cbRead))
- goto c;
+ cbRead = 1;
+ while (cbRead)
+ if (!InternetReadFile(hiUrl, &buf, sizeof(buf), &cbRead))
+ goto c;
+ //printf("%s\n", buf);
+
+ InternetCloseHandle(hiUrl);
+ InternetCloseHandle(hi);
+
+ /* Parse HTML. */
+ LIBXML_TEST_VERSION;
+ htmlDocPtr doc;
+ doc = htmlReadMemory(reinterpret_cast<const char*>(buf), sizeof(buf),
+ "https://www.detectiveconanworld.com/wiki/Anime", nullptr,
+ HTML_PARSE_RECOVER|HTML_PARSE_NOERROR|HTML_PARSE_NOWARNING);
+ if (!doc)
+ goto z;
+
+ xmlXPathContextPtr xpathCtx;
+ xmlXPathObjectPtr xpathObj;
+
+ xpathCtx = xmlXPathNewContext(doc);
+ if (!xpathCtx)
+ goto y;
+
+ xpathObj = xmlXPathEvalExpression(
+ reinterpret_cast<const xmlChar*>("//tr"),
+ xpathCtx);
+ if (!xpathObj)
+ goto x;
+
+ xmlNodeSetPtr nodes;
+ int cNodes;
+ nodes = xpathObj->nodesetval;
+ cNodes = nodes? nodes->nodeNr: 0;
+
+ printf("%d nodes\n", cNodes);
+ for (int i = 0; i < cNodes; i++) {
+ xmlNodePtr node = nodes->nodeTab[i];
+ printf("node \"%s\": type %d\n", node->name, node->type);
+ }
+
+ xmlXPathFreeObject(xpathObj);
+ xmlXPathFreeContext(xpathCtx);
+ xmlFreeDoc(doc);
return;
+
+ x: xmlXPathFreeContext(xpathCtx);
+ y: xmlFreeDoc(doc);
+ z: FAIL(xmlGetLastError()->message);
+
c: InternetCloseHandle(hiUrl);
b: InternetCloseHandle(hi);
a: FAIL(Win32Error{}.what());