libxmljs
Version:
libxml bindings for v8 javascript engine
278 lines (227 loc) • 9.56 kB
text/typescript
import * as libxml from "../index";
import { XMLElement } from "../index";
module.exports.new = function (assert: any) {
var doc = libxml.Document();
var elem = libxml.Element(doc, "name1");
doc.root(elem);
assert.equal("name1", elem.name());
assert.equal("name1", doc.root()?.name());
assert.done();
};
module.exports.newWithContent = function (assert: any) {
var doc = libxml.Document();
var elem = libxml.Element(doc, "name1", "content && more content <>");
doc.root(elem);
assert.equal("name1", elem.name());
assert.equal("name1", doc.root()?.name());
assert.equal("content && more content <>", elem.text());
assert.done();
};
module.exports.setters = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
// change content
assert.equal("", elem.text());
elem.text("content && more content <>");
assert.equal("content && more content <>", elem.text());
// change name
assert.equal("name1", elem.name());
elem.name("newname");
assert.equal("newname", elem.name());
assert.done();
};
module.exports.getters = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
assert.equal("element", elem.type());
//TODO assert.equal(doc, elem.doc());
assert.done();
};
module.exports.remove = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
var child = elem.node("child");
assert.ok(doc.get("/name1/child"));
child.remove();
assert.ok(!doc.get("/name1/child"));
assert.done();
};
module.exports.toString = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
assert.equal("<name1/>", elem.toString());
elem.node("child");
assert.equal("<name1><child/></name1>", elem.toString());
assert.equal("<name1><child></child></name1>", elem.toString({ selfCloseEmpty: false }));
assert.equal("<name1><child></child></name1>", elem.toString({ type: "html" }));
assert.equal("<name1\n ><child\n /></name1\n>", elem.toString({ whitespace: true }));
assert.equal("<name1>\n <child/>\n</name1>", elem.toString({ format: true }));
assert.done();
};
module.exports.toStringWithEncoding = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
assert.equal("<name1></name1>", elem.toString({ type: "xhtml" }));
elem.node("child1").text("Something\xA0with a non-breaking space");
assert.equal("<name1><child1>Something\xA0with a non-breaking space</child1></name1>", elem.toString({ type: "xhtml" }));
assert.equal("<name1><child1>Something\xA0with a non-breaking space</child1></name1>", elem.toString({ type: "xhtml", encoding: "UTF-8" }));
assert.equal("<name1><child1>Something with a non-breaking space</child1></name1>", elem.toString({ type: "xhtml", encoding: "HTML" }));
assert.equal("<name1><child1>Something with a non-breaking space</child1></name1>", elem.toString({ type: "xhtml", encoding: "ASCII" }));
elem.node("child2").text("😀");
assert.equal("<name1><child1>Something\xA0with a non-breaking space</child1><child2>😀</child2></name1>", elem.toString({ type: "xhtml" }));
assert.equal("<name1><child1>Something\xA0with a non-breaking space</child1><child2>😀</child2></name1>", elem.toString({ type: "xhtml", encoding: "UTF-8" }));
assert.equal("<name1><child1>Something with a non-breaking space</child1><child2>😀</child2></name1>", elem.toString({ type: "xhtml", encoding: "HTML" }));
assert.equal("<name1><child1>Something with a non-breaking space</child1><child2>😀</child2></name1>", elem.toString({ type: "xhtml", encoding: "ASCII" }));
assert.done();
};
module.exports.path = function (assert: any) {
var doc = libxml.Document();
var root = doc.node("root");
var gchild = root.node("child").node("grandchild");
var sibling = root.node("child");
assert.equal("/root/child[1]/grandchild", gchild.path());
assert.equal("/root/child[2]", sibling.path());
assert.done();
};
module.exports.move = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
var child = elem.node("child");
assert.ok(doc.get("/name1/child"));
child.remove();
var name2 = elem.node("name2");
name2.addChild(child);
assert.ok(!doc.get("/name1/child"));
assert.ok(doc.get("/name1/name2/child"));
assert.done();
};
module.exports.addChild = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
var newChild = libxml.Element(doc, "new-child");
elem.addChild(newChild);
assert.ok(doc.get("/name1/new-child"));
assert.done();
};
module.exports.add_prev_sibling = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
var child1 = elem.node("child1");
var child2 = elem.node("child2");
assert.equal(elem.childNodes().length, 2);
var prevSibling = libxml.Element(doc, "prev-sibling");
var addedSibling = child2.addPrevSibling(prevSibling);
var children = elem.childNodes();
assert.equal(3, children.length);
assert.equal("prev-sibling", children[1]?.name());
assert.done();
};
module.exports.add_next_sibling = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
var child1 = elem.node("child1");
var child2 = elem.node("child2");
assert.equal(elem.childNodes().length, 2);
var nextSibling = libxml.Element(elem.doc()!, "next-sibling");
var addedSibling = child1.addNextSibling(nextSibling);
var children = elem.childNodes();
assert.equal(3, children.length);
assert.equal("next-sibling", children[1]?.name());
assert.done();
};
module.exports.import = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("name1");
var child1 = elem.node("child1");
doc = child1.doc()!;
var newdoc = libxml.Document();
newdoc.node("newdoc");
newdoc.root()?.addChild(child1);
assert.ok(newdoc);
assert.notEqual(doc, newdoc, true);
assert.equal("child1", newdoc.root()?.childNodes()[0]?.name());
assert.equal(child1, elem.childNodes()[0]); // child1 is the the first child of elem
assert.done();
};
module.exports.clone = function (assert: any) {
var doc = libxml.Document();
var elem = doc.node("child");
var elem2 = elem.clone();
assert.equal(elem2 instanceof XMLElement, true);
if (elem2 instanceof XMLElement) {
assert.equal(elem.name(), elem2.name());
assert.equal(elem.text(), elem2.text());
assert.equal(elem.toString(), elem2.toString());
}
assert.done();
};
module.exports.namespace = function (assert: any) {
var str =
'<?xml version="1.0" encoding="UTF-8"?>\n' +
'<root xmlns:bacon="http://www.example.com/fake/uri"><node bacon:attr-with-ns="attr-with-ns-value" attr-without-ns="attr-withoug-ns-vavlue" /></root>';
var doc = libxml.parseXml(str);
var node = doc.get("node");
assert.equal(node instanceof XMLElement, true);
if (node instanceof XMLElement) {
var attrs = node?.attrs();
attrs.forEach(function (attr: any) {
var name = attr.name();
var ns = attr.namespace();
if (name === "attr-with-ns") {
assert.equal(ns.prefix(), "bacon");
assert.equal(ns.href(), "http://www.example.com/fake/uri");
} else {
assert.equal(name, "attr-without-ns");
assert.equal(ns, null);
}
});
}
assert.done();
};
module.exports.replace = function (assert: any) {
var str = "<foo>some <bar/> evening</foo>";
var doc = libxml.parseXml(str);
var bar = doc.get("bar");
assert.equal(bar instanceof XMLElement, true);
if (bar instanceof XMLElement) {
bar.replace("enchanted");
}
assert.equal(doc.root()?.text(), "some enchanted evening");
doc = libxml.parseXml(str);
bar = doc.get("bar");
assert.equal(bar instanceof XMLElement, true);
if (bar instanceof XMLElement) {
bar.replace("<>");
}
assert.equal(doc.root()?.toString(), "<foo>some <> evening</foo>");
doc = libxml.parseXml(str);
bar = doc.get("bar");
var enchant = libxml.parseXml("<enchanted/>");
assert.equal(bar instanceof XMLElement, true);
if (bar instanceof XMLElement) {
assert.equal(!!enchant.root(), true);
bar.replace(enchant.root()!);
}
assert.equal(doc.root()?.toString(), "<foo>some <enchanted/> evening</foo>");
assert.equal(doc.root()?.childNodes().length, 3);
assert.equal(doc.root()?.childNodes()[1]?.name(), "enchanted");
assert.done();
};
module.exports.add_child_merge_text = function (assert: any) {
var str = "<foo>bar</foo>";
var doc = libxml.parseXml(str);
var foo = doc.root();
var baz = libxml.Text(doc, "baz");
assert.equal(foo instanceof XMLElement, true);
if (foo instanceof XMLElement) {
foo.addChild(baz);
// added text is merged into existing child node
assert.strictEqual("barbaz", foo.text());
assert.strictEqual(foo.childNodes().length, 1);
assert.ok(foo.childNodes()[0] != baz);
// passed node is not changed
assert.strictEqual(doc, baz.parent());
assert.strictEqual("baz", baz.text());
}
assert.done();
};