aboutsummaryrefslogtreecommitdiff
path: root/node_modules/sax/test
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/sax/test')
-rw-r--r--node_modules/sax/test/attribute-name.js33
-rw-r--r--node_modules/sax/test/attribute-no-space.js75
-rw-r--r--node_modules/sax/test/buffer-overrun.js26
-rw-r--r--node_modules/sax/test/case.js50
-rw-r--r--node_modules/sax/test/cdata-chunked.js11
-rw-r--r--node_modules/sax/test/cdata-end-split.js15
-rw-r--r--node_modules/sax/test/cdata-fake-end.js28
-rw-r--r--node_modules/sax/test/cdata-multiple.js15
-rw-r--r--node_modules/sax/test/cdata.js10
-rw-r--r--node_modules/sax/test/cyrillic.js8
-rw-r--r--node_modules/sax/test/duplicate-attribute.js13
-rw-r--r--node_modules/sax/test/emoji.js12
-rw-r--r--node_modules/sax/test/end_empty_stream.js5
-rw-r--r--node_modules/sax/test/entities.js10
-rw-r--r--node_modules/sax/test/entity-mega.js16
-rw-r--r--node_modules/sax/test/flush.js13
-rw-r--r--node_modules/sax/test/index.js86
-rw-r--r--node_modules/sax/test/issue-23.js43
-rw-r--r--node_modules/sax/test/issue-30.js24
-rw-r--r--node_modules/sax/test/issue-35.js15
-rw-r--r--node_modules/sax/test/issue-47.js12
-rw-r--r--node_modules/sax/test/issue-49.js31
-rw-r--r--node_modules/sax/test/issue-84.js13
-rw-r--r--node_modules/sax/test/parser-position.js28
-rw-r--r--node_modules/sax/test/script-close-better.js12
-rw-r--r--node_modules/sax/test/script.js12
-rw-r--r--node_modules/sax/test/self-closing-child-strict.js44
-rw-r--r--node_modules/sax/test/self-closing-child.js44
-rw-r--r--node_modules/sax/test/self-closing-tag.js25
-rw-r--r--node_modules/sax/test/stray-ending.js17
-rw-r--r--node_modules/sax/test/trailing-attribute-no-value.js10
-rw-r--r--node_modules/sax/test/trailing-non-whitespace.js18
-rw-r--r--node_modules/sax/test/unclosed-root.js11
-rw-r--r--node_modules/sax/test/unquoted.js18
-rw-r--r--node_modules/sax/test/utf8-split.js32
-rw-r--r--node_modules/sax/test/xmlns-as-tag-name.js15
-rw-r--r--node_modules/sax/test/xmlns-issue-41.js68
-rw-r--r--node_modules/sax/test/xmlns-rebinding.js63
-rw-r--r--node_modules/sax/test/xmlns-strict.js74
-rw-r--r--node_modules/sax/test/xmlns-unbound-element.js33
-rw-r--r--node_modules/sax/test/xmlns-unbound.js15
-rw-r--r--node_modules/sax/test/xmlns-xml-default-ns.js31
-rw-r--r--node_modules/sax/test/xmlns-xml-default-prefix-attribute.js36
-rw-r--r--node_modules/sax/test/xmlns-xml-default-prefix.js21
-rw-r--r--node_modules/sax/test/xmlns-xml-default-redefine.js41
45 files changed, 1232 insertions, 0 deletions
diff --git a/node_modules/sax/test/attribute-name.js b/node_modules/sax/test/attribute-name.js
new file mode 100644
index 000000000..9ebbe58e7
--- /dev/null
+++ b/node_modules/sax/test/attribute-name.js
@@ -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 }
+ }
+)
diff --git a/node_modules/sax/test/attribute-no-space.js b/node_modules/sax/test/attribute-no-space.js
new file mode 100644
index 000000000..fe9aa465a
--- /dev/null
+++ b/node_modules/sax/test/attribute-no-space.js
@@ -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 : { }
+ }
+ )
diff --git a/node_modules/sax/test/buffer-overrun.js b/node_modules/sax/test/buffer-overrun.js
new file mode 100644
index 000000000..57d3c41fa
--- /dev/null
+++ b/node_modules/sax/test/buffer-overrun.js
@@ -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
diff --git a/node_modules/sax/test/case.js b/node_modules/sax/test/case.js
new file mode 100644
index 000000000..9da78aba4
--- /dev/null
+++ b/node_modules/sax/test/case.js
@@ -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}
+ }
+ )
diff --git a/node_modules/sax/test/cdata-chunked.js b/node_modules/sax/test/cdata-chunked.js
new file mode 100644
index 000000000..e3362bc8d
--- /dev/null
+++ b/node_modules/sax/test/cdata-chunked.js
@@ -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();
+
diff --git a/node_modules/sax/test/cdata-end-split.js b/node_modules/sax/test/cdata-end-split.js
new file mode 100644
index 000000000..34f34500d
--- /dev/null
+++ b/node_modules/sax/test/cdata-end-split.js
@@ -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();
+
diff --git a/node_modules/sax/test/cdata-fake-end.js b/node_modules/sax/test/cdata-fake-end.js
new file mode 100644
index 000000000..ccafa1b91
--- /dev/null
+++ b/node_modules/sax/test/cdata-fake-end.js
@@ -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();
diff --git a/node_modules/sax/test/cdata-multiple.js b/node_modules/sax/test/cdata-multiple.js
new file mode 100644
index 000000000..8e2f9112b
--- /dev/null
+++ b/node_modules/sax/test/cdata-multiple.js
@@ -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();
+
diff --git a/node_modules/sax/test/cdata.js b/node_modules/sax/test/cdata.js
new file mode 100644
index 000000000..31a8a304f
--- /dev/null
+++ b/node_modules/sax/test/cdata.js
@@ -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"]
+ ]
+});
diff --git a/node_modules/sax/test/cyrillic.js b/node_modules/sax/test/cyrillic.js
new file mode 100644
index 000000000..f05dd1b23
--- /dev/null
+++ b/node_modules/sax/test/cyrillic.js
@@ -0,0 +1,8 @@
+require(__dirname).test({
+ xml: '<Р>тест</Р>',
+ expect: [
+ ['opentag', {'name':'Р', attributes:{}, isSelfClosing: false}],
+ ['text', 'тест'],
+ ['closetag', 'Р']
+ ]
+});
diff --git a/node_modules/sax/test/duplicate-attribute.js b/node_modules/sax/test/duplicate-attribute.js
new file mode 100644
index 000000000..a21eb4191
--- /dev/null
+++ b/node_modules/sax/test/duplicate-attribute.js
@@ -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 : {}
+ }
+ )
diff --git a/node_modules/sax/test/emoji.js b/node_modules/sax/test/emoji.js
new file mode 100644
index 000000000..aa63a21ed
--- /dev/null
+++ b/node_modules/sax/test/emoji.js
@@ -0,0 +1,12 @@
+// split high-order numeric attributes into surrogate pairs
+require(__dirname).test
+ ( { xml : '<a>&#x1f525;</a>'
+ , expect :
+ [ [ 'opentag', { name: 'A', attributes: {}, isSelfClosing: false } ]
+ , [ 'text', '\ud83d\udd25' ]
+ , [ 'closetag', 'A' ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
diff --git a/node_modules/sax/test/end_empty_stream.js b/node_modules/sax/test/end_empty_stream.js
new file mode 100644
index 000000000..f01cc8430
--- /dev/null
+++ b/node_modules/sax/test/end_empty_stream.js
@@ -0,0 +1,5 @@
+var assert = require('assert');
+var saxStream = require('../lib/sax').createStream();
+assert.doesNotThrow(function() {
+ saxStream.end();
+});
diff --git a/node_modules/sax/test/entities.js b/node_modules/sax/test/entities.js
new file mode 100644
index 000000000..490166785
--- /dev/null
+++ b/node_modules/sax/test/entities.js
@@ -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']
+ ]
+});
diff --git a/node_modules/sax/test/entity-mega.js b/node_modules/sax/test/entity-mega.js
new file mode 100644
index 000000000..4759a0224
--- /dev/null
+++ b/node_modules/sax/test/entity-mega.js
@@ -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']
+ ]
+});
diff --git a/node_modules/sax/test/flush.js b/node_modules/sax/test/flush.js
new file mode 100644
index 000000000..20f15e02e
--- /dev/null
+++ b/node_modules/sax/test/flush.js
@@ -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();
diff --git a/node_modules/sax/test/index.js b/node_modules/sax/test/index.js
new file mode 100644
index 000000000..d4e1ef4f9
--- /dev/null
+++ b/node_modules/sax/test/index.js
@@ -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" : ""))
+ })
+}
diff --git a/node_modules/sax/test/issue-23.js b/node_modules/sax/test/issue-23.js
new file mode 100644
index 000000000..ccbdc3512
--- /dev/null
+++ b/node_modules/sax/test/issue-23.js
@@ -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 : {}
+ }
+ )
+
diff --git a/node_modules/sax/test/issue-30.js b/node_modules/sax/test/issue-30.js
new file mode 100644
index 000000000..771b14e92
--- /dev/null
+++ b/node_modules/sax/test/issue-30.js
@@ -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 : {}
+ }
+ )
+
diff --git a/node_modules/sax/test/issue-35.js b/node_modules/sax/test/issue-35.js
new file mode 100644
index 000000000..64d67b3f6
--- /dev/null
+++ b/node_modules/sax/test/issue-35.js
@@ -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 : {}
+ }
+ )
+
diff --git a/node_modules/sax/test/issue-47.js b/node_modules/sax/test/issue-47.js
new file mode 100644
index 000000000..661584ab1
--- /dev/null
+++ b/node_modules/sax/test/issue-47.js
@@ -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 : {}
+ }
+ )
+
diff --git a/node_modules/sax/test/issue-49.js b/node_modules/sax/test/issue-49.js
new file mode 100644
index 000000000..ff2fbf750
--- /dev/null
+++ b/node_modules/sax/test/issue-49.js
@@ -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 }
+ }
+ )
+
diff --git a/node_modules/sax/test/issue-84.js b/node_modules/sax/test/issue-84.js
new file mode 100644
index 000000000..0e7ee699a
--- /dev/null
+++ b/node_modules/sax/test/issue-84.js
@@ -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 }
+ }
+ )
diff --git a/node_modules/sax/test/parser-position.js b/node_modules/sax/test/parser-position.js
new file mode 100644
index 000000000..e4a68b1e9
--- /dev/null
+++ b/node_modules/sax/test/parser-position.js
@@ -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 }]
+ ]);
diff --git a/node_modules/sax/test/script-close-better.js b/node_modules/sax/test/script-close-better.js
new file mode 100644
index 000000000..f4887b9a0
--- /dev/null
+++ b/node_modules/sax/test/script-close-better.js
@@ -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"]
+ ]
+});
diff --git a/node_modules/sax/test/script.js b/node_modules/sax/test/script.js
new file mode 100644
index 000000000..fbda1f6c6
--- /dev/null
+++ b/node_modules/sax/test/script.js
@@ -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"]
+ ]
+});
diff --git a/node_modules/sax/test/self-closing-child-strict.js b/node_modules/sax/test/self-closing-child-strict.js
new file mode 100644
index 000000000..3d6e98520
--- /dev/null
+++ b/node_modules/sax/test/self-closing-child-strict.js
@@ -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 : {}
+});
+
diff --git a/node_modules/sax/test/self-closing-child.js b/node_modules/sax/test/self-closing-child.js
new file mode 100644
index 000000000..f31c36646
--- /dev/null
+++ b/node_modules/sax/test/self-closing-child.js
@@ -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 : {}
+});
+
diff --git a/node_modules/sax/test/self-closing-tag.js b/node_modules/sax/test/self-closing-tag.js
new file mode 100644
index 000000000..d1d8b7c82
--- /dev/null
+++ b/node_modules/sax/test/self-closing-tag.js
@@ -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 }
+}); \ No newline at end of file
diff --git a/node_modules/sax/test/stray-ending.js b/node_modules/sax/test/stray-ending.js
new file mode 100644
index 000000000..bec467b22
--- /dev/null
+++ b/node_modules/sax/test/stray-ending.js
@@ -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 : {}
+ }
+ )
+
diff --git a/node_modules/sax/test/trailing-attribute-no-value.js b/node_modules/sax/test/trailing-attribute-no-value.js
new file mode 100644
index 000000000..222837f8f
--- /dev/null
+++ b/node_modules/sax/test/trailing-attribute-no-value.js
@@ -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 }
+});
diff --git a/node_modules/sax/test/trailing-non-whitespace.js b/node_modules/sax/test/trailing-non-whitespace.js
new file mode 100644
index 000000000..619578b17
--- /dev/null
+++ b/node_modules/sax/test/trailing-non-whitespace.js
@@ -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 : {}
+});
diff --git a/node_modules/sax/test/unclosed-root.js b/node_modules/sax/test/unclosed-root.js
new file mode 100644
index 000000000..f4eeac61b
--- /dev/null
+++ b/node_modules/sax/test/unclosed-root.js
@@ -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 : {}
+ }
+ )
diff --git a/node_modules/sax/test/unquoted.js b/node_modules/sax/test/unquoted.js
new file mode 100644
index 000000000..b3a9a8122
--- /dev/null
+++ b/node_modules/sax/test/unquoted.js
@@ -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 : {}
+ }
+ )
+
diff --git a/node_modules/sax/test/utf8-split.js b/node_modules/sax/test/utf8-split.js
new file mode 100644
index 000000000..e22bc1004
--- /dev/null
+++ b/node_modules/sax/test/utf8-split.js
@@ -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();
diff --git a/node_modules/sax/test/xmlns-as-tag-name.js b/node_modules/sax/test/xmlns-as-tag-name.js
new file mode 100644
index 000000000..99142ca69
--- /dev/null
+++ b/node_modules/sax/test/xmlns-as-tag-name.js
@@ -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 }
+ }
+ );
diff --git a/node_modules/sax/test/xmlns-issue-41.js b/node_modules/sax/test/xmlns-issue-41.js
new file mode 100644
index 000000000..17ab45a0f
--- /dev/null
+++ b/node_modules/sax/test/xmlns-issue-41.js
@@ -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 }
+ })
+})
diff --git a/node_modules/sax/test/xmlns-rebinding.js b/node_modules/sax/test/xmlns-rebinding.js
new file mode 100644
index 000000000..07e042553
--- /dev/null
+++ b/node_modules/sax/test/xmlns-rebinding.js
@@ -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 }
+ }
+ )
+
diff --git a/node_modules/sax/test/xmlns-strict.js b/node_modules/sax/test/xmlns-strict.js
new file mode 100644
index 000000000..b5e3e5188
--- /dev/null
+++ b/node_modules/sax/test/xmlns-strict.js
@@ -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 }
+ }
+ )
+
diff --git a/node_modules/sax/test/xmlns-unbound-element.js b/node_modules/sax/test/xmlns-unbound-element.js
new file mode 100644
index 000000000..9d031a2bd
--- /dev/null
+++ b/node_modules/sax/test/xmlns-unbound-element.js
@@ -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\"/>");
diff --git a/node_modules/sax/test/xmlns-unbound.js b/node_modules/sax/test/xmlns-unbound.js
new file mode 100644
index 000000000..b740e2612
--- /dev/null
+++ b/node_modules/sax/test/xmlns-unbound.js
@@ -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'/>")
diff --git a/node_modules/sax/test/xmlns-xml-default-ns.js b/node_modules/sax/test/xmlns-xml-default-ns.js
new file mode 100644
index 000000000..b1984d255
--- /dev/null
+++ b/node_modules/sax/test/xmlns-xml-default-ns.js
@@ -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}
+ }
+ )
diff --git a/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
new file mode 100644
index 000000000..e41f21875
--- /dev/null
+++ b/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
@@ -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 }
+ }
+)
+
diff --git a/node_modules/sax/test/xmlns-xml-default-prefix.js b/node_modules/sax/test/xmlns-xml-default-prefix.js
new file mode 100644
index 000000000..a85b4787f
--- /dev/null
+++ b/node_modules/sax/test/xmlns-xml-default-prefix.js
@@ -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 }
+ }
+)
+
diff --git a/node_modules/sax/test/xmlns-xml-default-redefine.js b/node_modules/sax/test/xmlns-xml-default-redefine.js
new file mode 100644
index 000000000..d35d5a0cb
--- /dev/null
+++ b/node_modules/sax/test/xmlns-xml-default-redefine.js
@@ -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 }
+ }
+)
+