summaryrefslogtreecommitdiff
path: root/misc/openlayers/tests/Test.AnotherWay.xml_eq.js
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/tests/Test.AnotherWay.xml_eq.js')
-rw-r--r--misc/openlayers/tests/Test.AnotherWay.xml_eq.js311
1 files changed, 311 insertions, 0 deletions
diff --git a/misc/openlayers/tests/Test.AnotherWay.xml_eq.js b/misc/openlayers/tests/Test.AnotherWay.xml_eq.js
new file mode 100644
index 0000000..8c24566
--- /dev/null
+++ b/misc/openlayers/tests/Test.AnotherWay.xml_eq.js
@@ -0,0 +1,311 @@
+/**
+ * File: Test.AnotherWay.xml_eq.js
+ * Adds a xml_eq method to AnotherWay test objects.
+ *
+ */
+
+(function() {
+
+ /**
+ * Function: createNode
+ * Given a string, try to create an XML DOM node. Throws string messages
+ * on failure.
+ *
+ * Parameters:
+ * text - {String} An XML string.
+ *
+ * Returns:
+ * {DOMElement} An element node.
+ */
+ function createNode(text) {
+
+ var index = text.indexOf('<');
+ if(index > 0) {
+ text = text.substring(index);
+ }
+
+ var doc;
+ if(window.ActiveXObject && !this.xmldom) {
+ doc = new ActiveXObject("Microsoft.XMLDOM");
+ try {
+ doc.loadXML(text);
+ } catch(err) {
+ throw "ActiveXObject loadXML failed: " + err;
+ }
+ } else if(window.DOMParser) {
+ try {
+ doc = new DOMParser().parseFromString(text, 'text/xml');
+ } catch(err) {
+ throw "DOMParser.parseFromString failed";
+ }
+ if(doc.documentElement && doc.documentElement.nodeName == "parsererror") {
+ throw "DOMParser.parseFromString returned parsererror";
+ }
+ } else {
+ var req = new XMLHttpRequest();
+ req.open("GET", "data:text/xml;charset=utf-8," +
+ encodeURIComponent(text), false);
+ if(req.overrideMimeType) {
+ req.overrideMimeType("text/xml");
+ }
+ req.send(null);
+ doc = req.responseXML;
+ }
+
+ var root = doc.documentElement;
+ if(!root) {
+ throw "no documentElement";
+ }
+ return root;
+ }
+
+ /**
+ * Function assertEqual
+ * Test two objects for equivalence (based on ==). Throw an exception
+ * if not equivalent.
+ *
+ * Parameters:
+ * got - {Object}
+ * expected - {Object}
+ * msg - {String} The message to be thrown. This message will be appended
+ * with ": got {got} but expected {expected}" where got and expected are
+ * replaced with string representations of the above arguments.
+ */
+ function assertEqual(got, expected, msg) {
+ if(got === undefined) {
+ got = "undefined";
+ } else if (got === null) {
+ got = "null";
+ }
+ if(expected === undefined) {
+ expected = "undefined";
+ } else if (expected === null) {
+ expected = "null";
+ }
+ if(got != expected) {
+ throw msg + ": got '" + got + "' but expected '" + expected + "'";
+ }
+ }
+
+ /**
+ * Function assertElementNodesEqual
+ * Test two element nodes for equivalence. Nodes are considered equivalent
+ * if they are of the same type, have the same name, have the same
+ * namespace prefix and uri, and if all child nodes are equivalent.
+ * Throws a message as exception if not equivalent.
+ *
+ * Parameters:
+ * got - {DOMElement}
+ * expected - {DOMElement}
+ * options - {Object} Optional object for configuring test options.
+ *
+ * Valid options:
+ * prefix - {Boolean} Compare element and attribute
+ * prefixes (namespace uri always tested). Default is false.
+ * includeWhiteSpace - {Boolean} Include whitespace only nodes when
+ * comparing child nodes. Default is false.
+ */
+ function assertElementNodesEqual(got, expected, options) {
+ var testPrefix = (options && options.prefix === true);
+
+ // compare types
+ assertEqual(got.nodeType, expected.nodeType, "Node type mismatch");
+
+ // compare names
+ var gotName = testPrefix ?
+ got.nodeName : got.nodeName.split(":").pop();
+ var expName = testPrefix ?
+ expected.nodeName : expected.nodeName.split(":").pop();
+ assertEqual(gotName, expName, "Node name mismatch");
+
+ // for text nodes compare value
+ if(got.nodeType == 3) {
+ assertEqual(
+ got.nodeValue, expected.nodeValue, "Node value mismatch"
+ );
+ }
+ // for element type nodes compare namespace, attributes, and children
+ else if(got.nodeType == 1) {
+
+ // test namespace alias and uri
+ if(got.prefix || expected.prefix) {
+ if(testPrefix) {
+ assertEqual(
+ got.prefix, expected.prefix,
+ "Bad prefix for " + got.nodeName
+ );
+ }
+ }
+ if(got.namespaceURI || expected.namespaceURI) {
+ assertEqual(
+ got.namespaceURI, expected.namespaceURI,
+ "Bad namespaceURI for " + got.nodeName
+ );
+ }
+
+ // compare attributes - disregard xmlns given namespace handling above
+ var gotAttrLen = 0;
+ var gotAttr = {};
+ var expAttrLen = 0;
+ var expAttr = {};
+ var ga, ea, gn, en;
+ for(var i=0; i<got.attributes.length; ++i) {
+ ga = got.attributes[i];
+ if(ga.specified === undefined || ga.specified === true) {
+ if(ga.name.split(":").shift() != "xmlns") {
+ gn = testPrefix ? ga.name : ga.name.split(":").pop();
+ gotAttr[gn] = ga;
+ ++gotAttrLen;
+ }
+ }
+ }
+ for(var i=0; i<expected.attributes.length; ++i) {
+ ea = expected.attributes[i];
+ if(ea.specified === undefined || ea.specified === true) {
+ if(ea.name.split(":").shift() != "xmlns") {
+ en = testPrefix ? ea.name : ea.name.split(":").pop();
+ expAttr[en] = ea;
+ ++expAttrLen;
+ }
+ }
+ }
+ assertEqual(
+ gotAttrLen, expAttrLen,
+ "Attributes length mismatch for " + got.nodeName
+ );
+ var gv, ev;
+ for(var name in gotAttr) {
+ if(expAttr[name] == undefined) {
+ throw "Attribute name " + gotAttr[name].name + " expected for element " + got.nodeName;
+ }
+ // test attribute namespace
+ assertEqual(
+ gotAttr[name].namespaceURI, expAttr[name].namespaceURI,
+ "Attribute namespace mismatch for element " +
+ got.nodeName + " attribute name " + gotAttr[name].name
+ );
+ // test attribute value
+ assertEqual(
+ gotAttr[name].value, expAttr[name].value,
+ "Attribute value mismatch for element " + got.nodeName +
+ " attribute name " + gotAttr[name].name
+ );
+ }
+
+ // compare children
+ var gotChildNodes = getChildNodes(got, options);
+ var expChildNodes = getChildNodes(expected, options);
+
+ assertEqual(
+ gotChildNodes.length, expChildNodes.length,
+ "Children length mismatch for " + got.nodeName
+ );
+ for(var j=0; j<gotChildNodes.length; ++j) {
+ try {
+ assertElementNodesEqual(
+ gotChildNodes[j], expChildNodes[j], options
+ );
+ } catch(err) {
+ throw "Bad child " + j + " for element " + got.nodeName + ": " + err;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Function getChildNodes
+ * Returns the child nodes of the specified nodes. By default this method
+ * will ignore child text nodes which are made up of whitespace content.
+ * The 'includeWhiteSpace' option is used to control this behaviour.
+ *
+ * Parameters:
+ * node - {DOMElement}
+ * options - {Object} Optional object for test configuration.
+ *
+ * Valid options:
+ * includeWhiteSpace - {Boolean} Include whitespace only nodes when
+ * comparing child nodes. Default is false.
+ *
+ * Returns:
+ * {Array} of {DOMElement}
+ */
+ function getChildNodes(node, options) {
+ //check whitespace
+ if (options && options.includeWhiteSpace) {
+ return node.childNodes;
+ }
+ else {
+ nodes = [];
+ for (var i = 0; i < node.childNodes.length; i++ ) {
+ var child = node.childNodes[i];
+ if (child.nodeType == 1) {
+ //element node, add it
+ nodes.push(child);
+ }
+ else if (child.nodeType == 3) {
+ //text node, add if non empty
+ if (child.nodeValue &&
+ child.nodeValue.replace(/^\s*(.*?)\s*$/, "$1") != "" ) {
+
+ nodes.push(child);
+ }
+ }
+ }
+
+ return nodes;
+ }
+ }
+
+ /**
+ * Function: Test.AnotherWay._test_object_t.xml_eq
+ * Test if two XML nodes are equivalent. Tests for same node types, same
+ * node names, same namespace URI, same attributes, and recursively
+ * tests child nodes for same criteria.
+ *
+ * (code)
+ * t.xml_eq(got, expected, message);
+ * (end)
+ *
+ * Parameters:
+ * got - {DOMElement | String} A DOM node or XML string to test.
+ * expected - {DOMElement | String} The expected DOM node or XML string.
+ * msg - {String} A message to print with test output.
+ * options - {Object} Optional object for configuring test.
+ *
+ * Valid options:
+ * prefix - {Boolean} Compare element and attribute
+ * prefixes (namespace uri always tested). Default is false.
+ * includeWhiteSpace - {Boolean} Include whitespace only nodes when
+ * comparing child nodes. Default is false.
+ */
+ var proto = Test.AnotherWay._test_object_t.prototype;
+ proto.xml_eq = function(got, expected, msg, options) {
+ // convert arguments to nodes if string
+ if(typeof got == "string") {
+ try {
+ got = createNode(got);
+ } catch(err) {
+ this.fail(msg + ": got argument could not be converted to an XML node: " + err);
+ return;
+ }
+ }
+ if(typeof expected == "string") {
+ try {
+ expected = createNode(expected);
+ } catch(err) {
+ this.fail(msg + ": expected argument could not be converted to an XML node: " + err);
+ return;
+ }
+ }
+
+ // test nodes for equivalence
+ try {
+ assertElementNodesEqual(got, expected, options);
+ this.ok(true, msg);
+ } catch(err) {
+ this.fail(msg + ": " + err);
+ }
+ }
+
+})();