Initial commit

This commit is contained in:
Luis Fernando Molina committed 2018-02-07 21:05:26 +01:00
commit ec49fedc45
1288 files changed
+226749

No files matched your search

+33
View File
@@ -0,0 +1,33 @@
require(__dirname).test(
{ xml: "<root length='12345'></root>"
, expect: [
["attribute", {
name: "length"
, value: "12345"
, prefix: ""
, local: "length"
, uri: ""
}]
, ["opentag", {
name: "root"
, prefix: ""
, local: "root"
, uri: ""
, attributes: {
length: {
name: "length"
, value: "12345"
, prefix: ""
, local: "length"
, uri: ""
}
}
, ns: {}
, isSelfClosing: false
}]
, ["closetag", "root"]
]
, strict: true
, opt: { xmlns: true }
}
)
+75
View File
@@ -0,0 +1,75 @@
// non-strict: no error
require(__dirname).test
( { xml : '<root attr1="first"attr2="second"/>'
, expect :
[ [ "attribute", { name: 'attr1', value: 'first' } ]
, [ "attribute", { name: 'attr2', value: 'second' } ]
, [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
, [ "closetag", "root" ]
]
, strict : false
, opt : { lowercase: true }
}
)
// strict: should give an error, but still parse
require(__dirname).test
( { xml : '<root attr1="first"attr2="second"/>'
, expect :
[ [ "attribute", { name: 'attr1', value: 'first' } ]
, [ "error", "No whitespace between attributes\nLine: 0\nColumn: 20\nChar: a" ]
, [ "attribute", { name: 'attr2', value: 'second' } ]
, [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
, [ "closetag", "root" ]
]
, strict : true
, opt : { }
}
)
// strict: other cases should still pass
require(__dirname).test
( { xml : '<root attr1="first" attr2="second"/>'
, expect :
[ [ "attribute", { name: 'attr1', value: 'first' } ]
, [ "attribute", { name: 'attr2', value: 'second' } ]
, [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
, [ "closetag", "root" ]
]
, strict : true
, opt : { }
}
)
// strict: other cases should still pass
require(__dirname).test
( { xml : '<root attr1="first"\nattr2="second"/>'
, expect :
[ [ "attribute", { name: 'attr1', value: 'first' } ]
, [ "attribute", { name: 'attr2', value: 'second' } ]
, [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
, [ "closetag", "root" ]
]
, strict : true
, opt : { }
}
)
// strict: other cases should still pass
require(__dirname).test
( { xml : '<root attr1="first" attr2="second"/>'
, expect :
[ [ "attribute", { name: 'attr1', value: 'first' } ]
, [ "attribute", { name: 'attr2', value: 'second' } ]
, [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
, [ "closetag", "root" ]
]
, strict : true
, opt : { }
}
)
+26
View File
@@ -0,0 +1,26 @@
// set this really low so that I don't have to put 64 MB of xml in here.
var sax = require("../lib/sax")
var bl = sax.MAX_BUFFER_LENGTH
sax.MAX_BUFFER_LENGTH = 5;
require(__dirname).test({
expect : [
["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: "],
["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: "],
["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: "],
["opentag", {
"name": "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ",
"attributes": {},
"isSelfClosing": false
}],
["text", "yo"],
["closetag", "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"]
]
}).write("<abcdefghijklmn")
.write("opqrstuvwxyzABC")
.write("DEFGHIJKLMNOPQR")
.write("STUVWXYZ>")
.write("yo")
.write("</abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ>")
.close();
sax.MAX_BUFFER_LENGTH = bl
+50
View File
@@ -0,0 +1,50 @@
// default to uppercase
require(__dirname).test
( { xml :
"<span class=\"test\" hello=\"world\"></span>"
, expect :
[ [ "attribute", { name: "CLASS", value: "test" } ]
, [ "attribute", { name: "HELLO", value: "world" } ]
, [ "opentag", { name: "SPAN",
attributes: { CLASS: "test", HELLO: "world" },
isSelfClosing: false } ]
, [ "closetag", "SPAN" ]
]
, strict : false
, opt : {}
}
)
// lowercase option : lowercase tag/attribute names
require(__dirname).test
( { xml :
"<span class=\"test\" hello=\"world\"></span>"
, expect :
[ [ "attribute", { name: "class", value: "test" } ]
, [ "attribute", { name: "hello", value: "world" } ]
, [ "opentag", { name: "span",
attributes: { class: "test", hello: "world" },
isSelfClosing: false } ]
, [ "closetag", "span" ]
]
, strict : false
, opt : {lowercase:true}
}
)
// backward compatibility with old lowercasetags opt
require(__dirname).test
( { xml :
"<span class=\"test\" hello=\"world\"></span>"
, expect :
[ [ "attribute", { name: "class", value: "test" } ]
, [ "attribute", { name: "hello", value: "world" } ]
, [ "opentag", { name: "span",
attributes: { class: "test", hello: "world" },
isSelfClosing: false } ]
, [ "closetag", "span" ]
]
, strict : false
, opt : {lowercasetags:true}
}
)
+11
View File
@@ -0,0 +1,11 @@
require(__dirname).test({
expect : [
["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
["opencdata", undefined],
["cdata", " this is character data  "],
["closecdata", undefined],
["closetag", "R"]
]
}).write("<r><![CDATA[ this is ").write("character data  ").write("]]></r>").close();
+15
View File
@@ -0,0 +1,15 @@
require(__dirname).test({
expect : [
["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
["opencdata", undefined],
["cdata", " this is "],
["closecdata", undefined],
["closetag", "R"]
]
})
.write("<r><![CDATA[ this is ]")
.write("]>")
.write("</r>")
.close();
+28
View File
@@ -0,0 +1,28 @@
var p = require(__dirname).test({
expect : [
["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
["opencdata", undefined],
["cdata", "[[[[[[[[]]]]]]]]"],
["closecdata", undefined],
["closetag", "R"]
]
})
var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
for (var i = 0; i < x.length ; i ++) {
p.write(x.charAt(i))
}
p.close();
var p2 = require(__dirname).test({
expect : [
["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
["opencdata", undefined],
["cdata", "[[[[[[[[]]]]]]]]"],
["closecdata", undefined],
["closetag", "R"]
]
})
var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
p2.write(x).close();
+15
View File
@@ -0,0 +1,15 @@
require(__dirname).test({
expect : [
["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
["opencdata", undefined],
["cdata", " this is "],
["closecdata", undefined],
["opencdata", undefined],
["cdata", "character data  "],
["closecdata", undefined],
["closetag", "R"]
]
}).write("<r><![CDATA[ this is ]]>").write("<![CDA").write("T").write("A[")
.write("character data  ").write("]]></r>").close();
+10
View File
@@ -0,0 +1,10 @@
require(__dirname).test({
xml : "<r><![CDATA[ this is character data  ]]></r>",
expect : [
["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
["opencdata", undefined],
["cdata", " this is character data  "],
["closecdata", undefined],
["closetag", "R"]
]
});
+8
View File
@@ -0,0 +1,8 @@
require(__dirname).test({
xml: '<Р>тест</Р>',
expect: [
['opentag', {'name':'Р', attributes:{}, isSelfClosing: false}],
['text', 'тест'],
['closetag', 'Р']
]
});
+13
View File
@@ -0,0 +1,13 @@
require(__dirname).test
( { xml :
"<span id=\"hello\" id=\"there\"></span>"
, expect :
[ [ "attribute", { name: "ID", value: "hello" } ]
, [ "opentag", { name: "SPAN",
attributes: { ID: "hello" }, isSelfClosing: false } ]
, [ "closetag", "SPAN" ]
]
, strict : false
, opt : {}
}
)
+5
View File
@@ -0,0 +1,5 @@
var assert = require('assert');
var saxStream = require('../lib/sax').createStream();
assert.doesNotThrow(function() {
saxStream.end();
});
+10
View File
@@ -0,0 +1,10 @@
require(__dirname).test({
xml: '<r>&rfloor; ' +
'&spades; &copy; &rarr; &amp; ' +
'&lt; < < < < &gt; &real; &weierp; &euro;</r>',
expect: [
['opentag', {'name':'R', attributes:{}, isSelfClosing: false}],
['text', '⌋ ♠ © → & < < < < < > ℜ ℘ €'],
['closetag', 'R']
]
});
+16
View File
@@ -0,0 +1,16 @@
var sax = require('../');
var xml = '<r>';
var text = '';
for (var i in sax.ENTITIES) {
xml += '&' + i + ';'
text += sax.ENTITIES[i]
}
xml += '</r>'
require(__dirname).test({
xml: xml,
expect: [
['opentag', {'name':'R', attributes:{}, isSelfClosing: false}],
['text', text],
['closetag', 'R']
]
});
+13
View File
@@ -0,0 +1,13 @@
var parser = require(__dirname).test({
expect: [
['opentag', {'name':'T', attributes:{}, isSelfClosing: false}],
['text', 'flush'],
['text', 'rest'],
['closetag', 'T'],
]
});
parser.write('<T>flush');
parser.flush();
parser.write('rest</T>');
parser.close();
+86
View File
@@ -0,0 +1,86 @@
var globalsBefore = JSON.stringify(Object.keys(global))
, util = require("util")
, assert = require("assert")
, fs = require("fs")
, path = require("path")
, sax = require("../lib/sax")
exports.sax = sax
// handy way to do simple unit tests
// if the options contains an xml string, it'll be written and the parser closed.
// otherwise, it's assumed that the test will write and close.
exports.test = function test (options) {
var xml = options.xml
, parser = sax.parser(options.strict, options.opt)
, expect = options.expect
, e = 0
sax.EVENTS.forEach(function (ev) {
parser["on" + ev] = function (n) {
if (process.env.DEBUG) {
console.error({ expect: expect[e]
, actual: [ev, n] })
}
if (e >= expect.length && (ev === "end" || ev === "ready")) return
assert.ok( e < expect.length,
"expectation #"+e+" "+util.inspect(expect[e])+"\n"+
"Unexpected event: "+ev+" "+(n ? util.inspect(n) : ""))
var inspected = n instanceof Error ? "\n"+ n.message : util.inspect(n)
assert.equal(ev, expect[e][0],
"expectation #"+e+"\n"+
"Didn't get expected event\n"+
"expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
"actual: "+ev+" "+inspected+"\n")
if (ev === "error") assert.equal(n.message, expect[e][1])
else assert.deepEqual(n, expect[e][1],
"expectation #"+e+"\n"+
"Didn't get expected argument\n"+
"expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
"actual: "+ev+" "+inspected+"\n")
e++
if (ev === "error") parser.resume()
}
})
if (xml) parser.write(xml).close()
return parser
}
if (module === require.main) {
var running = true
, failures = 0
function fail (file, er) {
util.error("Failed: "+file)
util.error(er.stack || er.message)
failures ++
}
fs.readdir(__dirname, function (error, files) {
files = files.filter(function (file) {
return (/\.js$/.exec(file) && file !== 'index.js')
})
var n = files.length
, i = 0
console.log("0.." + n)
files.forEach(function (file) {
// run this test.
try {
require(path.resolve(__dirname, file))
var globalsAfter = JSON.stringify(Object.keys(global))
if (globalsAfter !== globalsBefore) {
var er = new Error("new globals introduced\n"+
"expected: "+globalsBefore+"\n"+
"actual: "+globalsAfter)
globalsBefore = globalsAfter
throw er
}
console.log("ok " + (++i) + " - " + file)
} catch (er) {
console.log("not ok "+ (++i) + " - " + file)
fail(file, er)
}
})
if (!failures) return console.log("#all pass")
else return console.error(failures + " failure" + (failures > 1 ? "s" : ""))
})
}
+43
View File
@@ -0,0 +1,43 @@
require(__dirname).test
( { xml :
"<compileClassesResponse>"+
"<result>"+
"<bodyCrc>653724009</bodyCrc>"+
"<column>-1</column>"+
"<id>01pG0000002KoSUIA0</id>"+
"<line>-1</line>"+
"<name>CalendarController</name>"+
"<success>true</success>"+
"</result>"+
"</compileClassesResponse>"
, expect :
[ [ "opentag", { name: "COMPILECLASSESRESPONSE", attributes: {}, isSelfClosing: false } ]
, [ "opentag", { name : "RESULT", attributes: {}, isSelfClosing: false } ]
, [ "opentag", { name: "BODYCRC", attributes: {}, isSelfClosing: false } ]
, [ "text", "653724009" ]
, [ "closetag", "BODYCRC" ]
, [ "opentag", { name: "COLUMN", attributes: {}, isSelfClosing: false } ]
, [ "text", "-1" ]
, [ "closetag", "COLUMN" ]
, [ "opentag", { name: "ID", attributes: {}, isSelfClosing: false } ]
, [ "text", "01pG0000002KoSUIA0" ]
, [ "closetag", "ID" ]
, [ "opentag", {name: "LINE", attributes: {}, isSelfClosing: false } ]
, [ "text", "-1" ]
, [ "closetag", "LINE" ]
, [ "opentag", {name: "NAME", attributes: {}, isSelfClosing: false } ]
, [ "text", "CalendarController" ]
, [ "closetag", "NAME" ]
, [ "opentag", {name: "SUCCESS", attributes: {}, isSelfClosing: false } ]
, [ "text", "true" ]
, [ "closetag", "SUCCESS" ]
, [ "closetag", "RESULT" ]
, [ "closetag", "COMPILECLASSESRESPONSE" ]
]
, strict : false
, opt : {}
}
)
+24
View File
@@ -0,0 +1,24 @@
// https://github.com/isaacs/sax-js/issues/33
require(__dirname).test
( { xml : "<xml>\n"+
"<!-- \n"+
" comment with a single dash- in it\n"+
"-->\n"+
"<data/>\n"+
"</xml>"
, expect :
[ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
, [ "text", "\n" ]
, [ "comment", " \n comment with a single dash- in it\n" ]
, [ "text", "\n" ]
, [ "opentag", { name: "data", attributes: {}, isSelfClosing: true } ]
, [ "closetag", "data" ]
, [ "text", "\n" ]
, [ "closetag", "xml" ]
]
, strict : true
, opt : {}
}
)
+15
View File
@@ -0,0 +1,15 @@
// https://github.com/isaacs/sax-js/issues/35
require(__dirname).test
( { xml : "<xml>&#Xd;&#X0d;\n"+
"</xml>"
, expect :
[ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
, [ "text", "\r\r\n" ]
, [ "closetag", "xml" ]
]
, strict : true
, opt : {}
}
)
+12
View File
@@ -0,0 +1,12 @@
// https://github.com/isaacs/sax-js/issues/47
require(__dirname).test
( { xml : '<a href="query.svc?x=1&y=2&z=3"/>'
, expect : [
[ "attribute", { name:'HREF', value:"query.svc?x=1&y=2&z=3"} ],
[ "opentag", { name: "A", attributes: { HREF:"query.svc?x=1&y=2&z=3"}, isSelfClosing: true } ],
[ "closetag", "A" ]
]
, opt : {}
}
)
+31
View File
@@ -0,0 +1,31 @@
// https://github.com/isaacs/sax-js/issues/49
require(__dirname).test
( { xml : "<xml><script>hello world</script></xml>"
, expect :
[ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
, [ "opentag", { name: "script", attributes: {}, isSelfClosing: false } ]
, [ "text", "hello world" ]
, [ "closetag", "script" ]
, [ "closetag", "xml" ]
]
, strict : false
, opt : { lowercasetags: true, noscript: true }
}
)
require(__dirname).test
( { xml : "<xml><script><![CDATA[hello world]]></script></xml>"
, expect :
[ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
, [ "opentag", { name: "script", attributes: {}, isSelfClosing: false } ]
, [ "opencdata", undefined ]
, [ "cdata", "hello world" ]
, [ "closecdata", undefined ]
, [ "closetag", "script" ]
, [ "closetag", "xml" ]
]
, strict : false
, opt : { lowercasetags: true, noscript: true }
}
)
+13
View File
@@ -0,0 +1,13 @@
// https://github.com/isaacs/sax-js/issues/49
require(__dirname).test
( { xml : "<?has unbalanced \"quotes?><xml>body</xml>"
, expect :
[ [ "processinginstruction", { name: "has", body: "unbalanced \"quotes" } ],
[ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
, [ "text", "body" ]
, [ "closetag", "xml" ]
]
, strict : false
, opt : { lowercasetags: true, noscript: true }
}
)
+28
View File
@@ -0,0 +1,28 @@
var sax = require("../lib/sax"),
assert = require("assert")
function testPosition(chunks, expectedEvents) {
var parser = sax.parser();
expectedEvents.forEach(function(expectation) {
parser['on' + expectation[0]] = function() {
for (var prop in expectation[1]) {
assert.equal(parser[prop], expectation[1][prop]);
}
}
});
chunks.forEach(function(chunk) {
parser.write(chunk);
});
};
testPosition(['<div>abcdefgh</div>'],
[ ['opentag', { position: 5, startTagPosition: 1 }]
, ['text', { position: 19, startTagPosition: 14 }]
, ['closetag', { position: 19, startTagPosition: 14 }]
]);
testPosition(['<div>abcde','fgh</div>'],
[ ['opentag', { position: 5, startTagPosition: 1 }]
, ['text', { position: 19, startTagPosition: 14 }]
, ['closetag', { position: 19, startTagPosition: 14 }]
]);
+12
View File
@@ -0,0 +1,12 @@
require(__dirname).test({
xml : "<html><head><script>'<div>foo</div></'</script></head></html>",
expect : [
["opentag", {"name": "HTML","attributes": {}, isSelfClosing: false}],
["opentag", {"name": "HEAD","attributes": {}, isSelfClosing: false}],
["opentag", {"name": "SCRIPT","attributes": {}, isSelfClosing: false}],
["script", "'<div>foo</div></'"],
["closetag", "SCRIPT"],
["closetag", "HEAD"],
["closetag", "HTML"]
]
});
+12
View File
@@ -0,0 +1,12 @@
require(__dirname).test({
xml : "<html><head><script>if (1 < 0) { console.log('elo there'); }</script></head></html>",
expect : [
["opentag", {"name": "HTML","attributes": {}, "isSelfClosing": false}],
["opentag", {"name": "HEAD","attributes": {}, "isSelfClosing": false}],
["opentag", {"name": "SCRIPT","attributes": {}, "isSelfClosing": false}],
["script", "if (1 < 0) { console.log('elo there'); }"],
["closetag", "SCRIPT"],
["closetag", "HEAD"],
["closetag", "HTML"]
]
});
+44
View File
@@ -0,0 +1,44 @@
require(__dirname).test({
xml :
"<root>"+
"<child>" +
"<haha />" +
"</child>" +
"<monkey>" +
"=(|)" +
"</monkey>" +
"</root>",
expect : [
["opentag", {
"name": "root",
"attributes": {},
"isSelfClosing": false
}],
["opentag", {
"name": "child",
"attributes": {},
"isSelfClosing": false
}],
["opentag", {
"name": "haha",
"attributes": {},
"isSelfClosing": true
}],
["closetag", "haha"],
["closetag", "child"],
["opentag", {
"name": "monkey",
"attributes": {},
"isSelfClosing": false
}],
["text", "=(|)"],
["closetag", "monkey"],
["closetag", "root"],
["end"],
["ready"]
],
strict : true,
opt : {}
});
+44
View File
@@ -0,0 +1,44 @@
require(__dirname).test({
xml :
"<root>"+
"<child>" +
"<haha />" +
"</child>" +
"<monkey>" +
"=(|)" +
"</monkey>" +
"</root>",
expect : [
["opentag", {
"name": "ROOT",
"attributes": {},
"isSelfClosing": false
}],
["opentag", {
"name": "CHILD",
"attributes": {},
"isSelfClosing": false
}],
["opentag", {
"name": "HAHA",
"attributes": {},
"isSelfClosing": true
}],
["closetag", "HAHA"],
["closetag", "CHILD"],
["opentag", {
"name": "MONKEY",
"attributes": {},
"isSelfClosing": false
}],
["text", "=(|)"],
["closetag", "MONKEY"],
["closetag", "ROOT"],
["end"],
["ready"]
],
strict : false,
opt : {}
});
+25
View File
@@ -0,0 +1,25 @@
require(__dirname).test({
xml :
"<root> "+
"<haha /> "+
"<haha/> "+
"<monkey> "+
"=(|) "+
"</monkey>"+
"</root> ",
expect : [
["opentag", {name:"ROOT", attributes:{}, isSelfClosing: false}],
["opentag", {name:"HAHA", attributes:{}, isSelfClosing: true}],
["closetag", "HAHA"],
["opentag", {name:"HAHA", attributes:{}, isSelfClosing: true}],
["closetag", "HAHA"],
// ["opentag", {name:"HAHA", attributes:{}}],
// ["closetag", "HAHA"],
["opentag", {name:"MONKEY", attributes:{}, isSelfClosing: false}],
["text", "=(|)"],
["closetag", "MONKEY"],
["closetag", "ROOT"]
],
opt : { trim : true }
});
+17
View File
@@ -0,0 +1,17 @@
// stray ending tags should just be ignored in non-strict mode.
// https://github.com/isaacs/sax-js/issues/32
require(__dirname).test
( { xml :
"<a><b></c></b></a>"
, expect :
[ [ "opentag", { name: "A", attributes: {}, isSelfClosing: false } ]
, [ "opentag", { name: "B", attributes: {}, isSelfClosing: false } ]
, [ "text", "</c>" ]
, [ "closetag", "B" ]
, [ "closetag", "A" ]
]
, strict : false
, opt : {}
}
)
+10
View File
@@ -0,0 +1,10 @@
require(__dirname).test({
xml :
"<root attrib>",
expect : [
["attribute", {name:"ATTRIB", value:"attrib"}],
["opentag", {name:"ROOT", attributes:{"ATTRIB":"attrib"}, isSelfClosing: false}]
],
opt : { trim : true }
});
+18
View File
@@ -0,0 +1,18 @@
require(__dirname).test({
xml : "<span>Welcome,</span> to monkey land",
expect : [
["opentag", {
"name": "SPAN",
"attributes": {},
isSelfClosing: false
}],
["text", "Welcome,"],
["closetag", "SPAN"],
["text", " to monkey land"],
["end"],
["ready"]
],
strict : false,
opt : {}
});
+11
View File
@@ -0,0 +1,11 @@
require(__dirname).test
( { xml : "<root>"
, expect :
[ [ "opentag", { name: "root", attributes: {}, isSelfClosing: false } ]
, [ "error", "Unclosed root tag\nLine: 0\nColumn: 6\nChar: " ]
]
, strict : true
, opt : {}
}
)
+18
View File
@@ -0,0 +1,18 @@
// unquoted attributes should be ok in non-strict mode
// https://github.com/isaacs/sax-js/issues/31
require(__dirname).test
( { xml :
"<span class=test hello=world></span>"
, expect :
[ [ "attribute", { name: "CLASS", value: "test" } ]
, [ "attribute", { name: "HELLO", value: "world" } ]
, [ "opentag", { name: "SPAN",
attributes: { CLASS: "test", HELLO: "world" },
isSelfClosing: false } ]
, [ "closetag", "SPAN" ]
]
, strict : false
, opt : {}
}
)
+32
View File
@@ -0,0 +1,32 @@
var assert = require('assert')
var saxStream = require('../lib/sax').createStream()
var b = new Buffer('误')
saxStream.on('text', function(text) {
assert.equal(text, b.toString())
})
saxStream.write(new Buffer('<test><a>'))
saxStream.write(b.slice(0, 1))
saxStream.write(b.slice(1))
saxStream.write(new Buffer('</a><b>'))
saxStream.write(b.slice(0, 2))
saxStream.write(b.slice(2))
saxStream.write(new Buffer('</b><c>'))
saxStream.write(b)
saxStream.write(new Buffer('</c>'))
saxStream.write(Buffer.concat([new Buffer('<d>'), b.slice(0, 1)]))
saxStream.end(Buffer.concat([b.slice(1), new Buffer('</d></test>')]))
var saxStream2 = require('../lib/sax').createStream()
saxStream2.on('text', function(text) {
assert.equal(text, '�')
});
saxStream2.write(new Buffer('<e>'));
saxStream2.write(new Buffer([0xC0]));
saxStream2.write(new Buffer('</e>'));
saxStream2.write(Buffer.concat([new Buffer('<f>'), b.slice(0,1)]));
saxStream2.end();
+15
View File
@@ -0,0 +1,15 @@
require(__dirname).test
( { xml :
"<xmlns/>"
, expect :
[ [ "opentag", { name: "xmlns", uri: "", prefix: "", local: "xmlns",
attributes: {}, ns: {},
isSelfClosing: true}
],
["closetag", "xmlns"]
]
, strict : true
, opt : { xmlns: true }
}
);
+68
View File
@@ -0,0 +1,68 @@
var t = require(__dirname)
, xmls = // should be the same both ways.
[ "<parent xmlns:a='http://ATTRIBUTE' a:attr='value' />"
, "<parent a:attr='value' xmlns:a='http://ATTRIBUTE' />" ]
, ex1 =
[ [ "opennamespace"
, { prefix: "a"
, uri: "http://ATTRIBUTE"
}
]
, [ "attribute"
, { name: "xmlns:a"
, value: "http://ATTRIBUTE"
, prefix: "xmlns"
, local: "a"
, uri: "http://www.w3.org/2000/xmlns/"
}
]
, [ "attribute"
, { name: "a:attr"
, local: "attr"
, prefix: "a"
, uri: "http://ATTRIBUTE"
, value: "value"
}
]
, [ "opentag"
, { name: "parent"
, uri: ""
, prefix: ""
, local: "parent"
, attributes:
{ "a:attr":
{ name: "a:attr"
, local: "attr"
, prefix: "a"
, uri: "http://ATTRIBUTE"
, value: "value"
}
, "xmlns:a":
{ name: "xmlns:a"
, local: "a"
, prefix: "xmlns"
, uri: "http://www.w3.org/2000/xmlns/"
, value: "http://ATTRIBUTE"
}
}
, ns: {"a": "http://ATTRIBUTE"}
, isSelfClosing: true
}
]
, ["closetag", "parent"]
, ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }]
]
// swap the order of elements 2 and 1
, ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3))
, expected = [ex1, ex2]
xmls.forEach(function (x, i) {
t.test({ xml: x
, expect: expected[i]
, strict: true
, opt: { xmlns: true }
})
})
+63
View File
@@ -0,0 +1,63 @@
require(__dirname).test
( { xml :
"<root xmlns:x='x1' xmlns:y='y1' x:a='x1' y:a='y1'>"+
"<rebind xmlns:x='x2'>"+
"<check x:a='x2' y:a='y1'/>"+
"</rebind>"+
"<check x:a='x1' y:a='y1'/>"+
"</root>"
, expect :
[ [ "opennamespace", { prefix: "x", uri: "x1" } ]
, [ "opennamespace", { prefix: "y", uri: "y1" } ]
, [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
, [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ]
, [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
, [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
, [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" }
, "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" }
, "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
, "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
ns: { x: 'x1', y: 'y1' },
isSelfClosing: false } ]
, [ "opennamespace", { prefix: "x", uri: "x2" } ]
, [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
, [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind",
attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } },
ns: { x: 'x2' },
isSelfClosing: false } ]
, [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ]
, [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
, [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" }
, "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
ns: { x: 'x2' },
isSelfClosing: true } ]
, [ "closetag", "check" ]
, [ "closetag", "rebind" ]
, [ "closenamespace", { prefix: "x", uri: "x2" } ]
, [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
, [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
, [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
, "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
ns: { x: 'x1', y: 'y1' },
isSelfClosing: true } ]
, [ "closetag", "check" ]
, [ "closetag", "root" ]
, [ "closenamespace", { prefix: "x", uri: "x1" } ]
, [ "closenamespace", { prefix: "y", uri: "y1" } ]
]
, strict : true
, opt : { xmlns: true }
}
)
+74
View File
@@ -0,0 +1,74 @@
require(__dirname).test
( { xml :
"<root>"+
"<plain attr='normal'/>"+
"<ns1 xmlns='uri:default'>"+
"<plain attr='normal'/>"+
"</ns1>"+
"<ns2 xmlns:a='uri:nsa'>"+
"<plain attr='normal'/>"+
"<a:ns a:attr='namespaced'/>"+
"</ns2>"+
"</root>"
, expect :
[ [ "opentag", { name: "root", prefix: "", local: "root", uri: "",
attributes: {}, ns: {}, isSelfClosing: false } ]
, [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
, [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } },
ns: {}, isSelfClosing: true } ]
, [ "closetag", "plain" ]
, [ "opennamespace", { prefix: "", uri: "uri:default" } ]
, [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ]
, [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default",
attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } },
ns: { "": "uri:default" }, isSelfClosing: false } ]
, [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
, [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' },
attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
isSelfClosing: true } ]
, [ "closetag", "plain" ]
, [ "closetag", "ns1" ]
, [ "closenamespace", { prefix: "", uri: "uri:default" } ]
, [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ]
, [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ]
, [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "",
attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } },
ns: { a: "uri:nsa" }, isSelfClosing: false } ]
, [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
, [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
ns: { a: 'uri:nsa' },
isSelfClosing: true } ]
, [ "closetag", "plain" ]
, [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ]
, [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa",
attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } },
ns: { a: 'uri:nsa' },
isSelfClosing: true } ]
, [ "closetag", "a:ns" ]
, [ "closetag", "ns2" ]
, [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ]
, [ "closetag", "root" ]
]
, strict : true
, opt : { xmlns: true }
}
)
+33
View File
@@ -0,0 +1,33 @@
require(__dirname).test(
{ strict : true
, opt : { xmlns: true }
, expect :
[ [ "error", "Unbound namespace prefix: \"unbound:root\"\nLine: 0\nColumn: 15\nChar: >"]
, [ "opentag", { name: "unbound:root", uri: "unbound", prefix: "unbound", local: "root"
, attributes: {}, ns: {}, isSelfClosing: true } ]
, [ "closetag", "unbound:root" ]
]
}
).write("<unbound:root/>");
require(__dirname).test(
{ strict : true
, opt : { xmlns: true }
, expect :
[ [ "opennamespace", { prefix: "unbound", uri: "someuri" } ]
, [ "attribute", { name: 'xmlns:unbound', value: 'someuri'
, prefix: 'xmlns', local: 'unbound'
, uri: 'http://www.w3.org/2000/xmlns/' } ]
, [ "opentag", { name: "unbound:root", uri: "someuri", prefix: "unbound", local: "root"
, attributes: { 'xmlns:unbound': {
name: 'xmlns:unbound'
, value: 'someuri'
, prefix: 'xmlns'
, local: 'unbound'
, uri: 'http://www.w3.org/2000/xmlns/' } }
, ns: { "unbound": "someuri" }, isSelfClosing: true } ]
, [ "closetag", "unbound:root" ]
, [ "closenamespace", { prefix: 'unbound', uri: 'someuri' }]
]
}
).write("<unbound:root xmlns:unbound=\"someuri\"/>");
+15
View File
@@ -0,0 +1,15 @@
require(__dirname).test(
{ strict : true
, opt : { xmlns: true }
, expect :
[ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"]
, [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ]
, [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } },
ns: {}, isSelfClosing: true } ]
, [ "closetag", "root" ]
]
}
).write("<root unbound:attr='value'/>")
+31
View File
@@ -0,0 +1,31 @@
var xmlns_attr =
{
name: "xmlns", value: "http://foo", prefix: "xmlns",
local: "", uri : "http://www.w3.org/2000/xmlns/"
};
var attr_attr =
{
name: "attr", value: "bar", prefix: "",
local : "attr", uri : ""
};
require(__dirname).test
( { xml :
"<elm xmlns='http://foo' attr='bar'/>"
, expect :
[ [ "opennamespace", { prefix: "", uri: "http://foo" } ]
, [ "attribute", xmlns_attr ]
, [ "attribute", attr_attr ]
, [ "opentag", { name: "elm", prefix: "", local: "elm", uri : "http://foo",
ns : { "" : "http://foo" },
attributes: { xmlns: xmlns_attr, attr: attr_attr },
isSelfClosing: true } ]
, [ "closetag", "elm" ]
, [ "closenamespace", { prefix: "", uri: "http://foo"} ]
]
, strict : true
, opt : {xmlns: true}
}
)
+36
View File
@@ -0,0 +1,36 @@
require(__dirname).test(
{ xml : "<root xml:lang='en'/>"
, expect :
[ [ "attribute"
, { name: "xml:lang"
, local: "lang"
, prefix: "xml"
, uri: "http://www.w3.org/XML/1998/namespace"
, value: "en"
}
]
, [ "opentag"
, { name: "root"
, uri: ""
, prefix: ""
, local: "root"
, attributes:
{ "xml:lang":
{ name: "xml:lang"
, local: "lang"
, prefix: "xml"
, uri: "http://www.w3.org/XML/1998/namespace"
, value: "en"
}
}
, ns: {}
, isSelfClosing: true
}
]
, ["closetag", "root"]
]
, strict : true
, opt : { xmlns: true }
}
)
+21
View File
@@ -0,0 +1,21 @@
require(__dirname).test(
{ xml : "<xml:root/>"
, expect :
[
[ "opentag"
, { name: "xml:root"
, uri: "http://www.w3.org/XML/1998/namespace"
, prefix: "xml"
, local: "root"
, attributes: {}
, ns: {}
, isSelfClosing: true
}
]
, ["closetag", "xml:root"]
]
, strict : true
, opt : { xmlns: true }
}
)
+41
View File
@@ -0,0 +1,41 @@
require(__dirname).test(
{ xml : "<xml:root xmlns:xml='ERROR'/>"
, expect :
[ ["error"
, "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n"
+ "Actual: ERROR\n"
+ "Line: 0\nColumn: 27\nChar: '"
]
, [ "attribute"
, { name: "xmlns:xml"
, local: "xml"
, prefix: "xmlns"
, uri: "http://www.w3.org/2000/xmlns/"
, value: "ERROR"
}
]
, [ "opentag"
, { name: "xml:root"
, uri: "http://www.w3.org/XML/1998/namespace"
, prefix: "xml"
, local: "root"
, attributes:
{ "xmlns:xml":
{ name: "xmlns:xml"
, local: "xml"
, prefix: "xmlns"
, uri: "http://www.w3.org/2000/xmlns/"
, value: "ERROR"
}
}
, ns: {}
, isSelfClosing: true
}
]
, ["closetag", "xml:root"]
]
, strict : true
, opt : { xmlns: true }
}
)