Spaces:
Sleeping
Sleeping
| var fs = require("fs"), | |
| libxmljs = require("libxmljs"), | |
| test = require("tap").test; | |
| var addrs = require("../lib/email-addresses"); | |
| var TESTS_FILE = "tests.xml", | |
| TESTS_FILE_ENCODING = "utf8"; | |
| var ISEMAIL_ERR = "ISEMAIL_ERR", | |
| ISEMAIL_ERR_DOMAINHYPHENSTART = "ISEMAIL_ERR_DOMAINHYPHENSTART", | |
| ISEMAIL_ERR_DOMAINHYPHENEND = "ISEMAIL_ERR_DOMAINHYPHENEND"; | |
| function isEmailTest(t, data) { | |
| var nodes = getNodes(data, "//test"); | |
| nodes.forEach(function (node) { | |
| var id = getAttr(node, "id"), | |
| address = getChildValue(node, "address"), | |
| diagnosis = getChildValue(node, "diagnosis"); | |
| var result = addrs(convertAddress(address)), | |
| ast = null; | |
| if (result !== null) { | |
| ast = result.addresses[0].node; | |
| } | |
| var isValid = ast !== null, | |
| expectedToBeValid = shouldParse(diagnosis); | |
| t.equal(isValid, expectedToBeValid, | |
| "[test " + id + "] address: " + address + ", expects: " + expectedToBeValid); | |
| }); | |
| t.end(); | |
| } | |
| function shouldParse(diagnosis) { | |
| var isOk = !startsWith(diagnosis, ISEMAIL_ERR) || | |
| // is_email considers address with a domain beginning | |
| // or ending with "-" to be incorrect because they are not | |
| // valid domains, but we are only concerned with rfc5322. | |
| // From rfc5322's perspective, this is OK. | |
| diagnosis === ISEMAIL_ERR_DOMAINHYPHENSTART || | |
| diagnosis === ISEMAIL_ERR_DOMAINHYPHENEND; | |
| return isOk; | |
| } | |
| // the is_email tests encode control characters | |
| // in the U+2400 block for display purposes | |
| function convertAddress(s) { | |
| var chars = []; | |
| for (var i = 0; i < s.length; i += 1) { | |
| var code = s.charCodeAt(i); | |
| if (code >= 0x2400) { | |
| code -= 0x2400; | |
| } | |
| chars.push(String.fromCharCode(code)); | |
| } | |
| return chars.join(''); | |
| } | |
| function getChildValue(parent, nodeName) { | |
| return parent.find(nodeName)[0].text(); | |
| } | |
| function getAttr(node, attrName) { | |
| return node.attr(attrName).value(); | |
| } | |
| function getNodes(xml, xpath) { | |
| var doc = libxmljs.parseXml(xml); | |
| return doc.find(xpath); | |
| } | |
| function startsWith(s, t) { | |
| return s.substring(0, t.length) === t; | |
| } | |
| test("isemail tests", function (t) { | |
| fs.readFile(TESTS_FILE, TESTS_FILE_ENCODING, function (err, data) { | |
| if (err) { | |
| t.end(); | |
| return console.error(err); | |
| } | |
| isEmailTest(t, data); | |
| }); | |
| }); | |