jaxon
Version:
Jaxon is a sequential access, event-driven JSON parser developed specifically to deal with streams.
168 lines (155 loc) • 6.09 kB
JavaScript
/**
* Copyright (c) 2013, Dan Eyles (dan@irlgaming.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of IRL Gaming nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL IRL Gaming BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
var jaxon = require('../lib/jaxon');
exports['test StringChunk'] = function(beforeExit, assert) {
var chunk = jaxon.factoryChunk(2);
assert.equal(2, chunk.getType());
assert.equal(0, chunk.buffer.length);
assert.equal('', chunk.toString());
chunk.append('a');
assert.equal(1, chunk.buffer.length);
assert.equal('a', chunk.toString());
chunk.append('b');
assert.equal(2, chunk.buffer.length);
assert.equal('ab', chunk.toString());
chunk.append('c');
assert.equal(3, chunk.buffer.length);
assert.equal('abc', chunk.toString());
};
exports['test IntegerChunk'] = function(beforeExit, assert) {
var chunk = jaxon.factoryChunk(4);
assert.equal(4, chunk.getType());
chunk.append(2);
chunk.append(0);
chunk.append(0);
assert.equal(200, chunk.getValue());
};
exports['test LongNumberChunk'] = function(beforeExit, assert) {
var chunk = jaxon.factoryChunk(4);
assert.equal(4, chunk.getType());
chunk.append(2);
chunk.append(0);
chunk.append('.');
chunk.append(3);
chunk.append(1);
assert.equal(20.31, chunk.getValue());
};
exports['test ScientificNotationChunk'] = function(beforeExit, assert) {
var chunk = jaxon.factoryChunk(4);
assert.equal(4, chunk.getType());
chunk.append(1);
chunk.append('e');
chunk.append(3);
assert.equal(1000, chunk.getValue());
chunk = jaxon.factoryChunk(4);
[1, '.', 5, 1, 'e', '-', 6].forEach(function(c) {
chunk.append(c);
});
assert.equal(0.00000151, chunk.getValue());
};
exports['test BooleanChunk'] = function(beforeExit, assert) {
var chunk = jaxon.factoryChunk(5);
['t', 'r', 'u', 'e'].forEach(function(c) {
chunk.append(c);
});
assert.equal(true, chunk.getValue());
chunk = jaxon.factoryChunk(5);
['f', 'a', 'l', 's', 'e'].forEach(function(c) {
chunk.append(c);
});
assert.equal(false, chunk.getValue());
var exception = false;
try {
chunk = jaxon.factoryChunk(6);
['b', 'a', 'r'].forEach(function(c) {
chunk.append(c);
});
chunk.getValue();
} catch (e) {
exception = true;
}
assert.equal(true, exception);
};
exports['test NullChunk'] = function(beforeExit, assert) {
var chunk = jaxon.factoryChunk(6);
['n', 'u', 'l', 'l'].forEach(function(c) {
chunk.append(c);
});
assert.isNull(chunk.getValue());
var exception = false;
try {
chunk = jaxon.factoryChunk(6);
['f', 'a', 'l', 's', 'e'].forEach(function(c) {
chunk.append(c);
});
chunk.getValue();
} catch (e) {
exception = true;
}
assert.equal(true, exception);
};
exports['test TokenHandler'] = function(beforeExit, assert) {
var parser = jaxon.factoryStreamParser();
var handler = jaxon.factoryTokenHandler(parser);
parser.onParse('bar', function(o) {
assert.equal(5, o.length);
assert.equal(true, (Object.prototype.toString.call(o) === '[object Array]'));
for (var i=1; i <= 5; i++) {
assert.equal(i, o[i-1]);
}
});
parser.onParse('foo2', function(o) {
assert.equal('bar2', o);
});
parser.onFind('symbol', function(o) {
assert.equal('symbol', o.key);
});
parser.onError(function(e) {
assert.equal('Cannot read property \'key\' of null', e.message);
});
parser.onMatch(/^(foo|bar)$/, function(o) {
assert.equal('bar', o.key);
assert.equal(true, (Object.prototype.toString.call(o.value) === '[object Array]'));
});
parser.consume('{"symbol":"YHOO", "foo2":"bar2", "bar":[1, 2, 3, 4, 5], "blah":[1, 2, 3}');
};
exports['test TokenHandlerExtras'] = function(beforeExit, assert) {
var parser = jaxon.factoryStreamParser();
var handler = jaxon.factoryTokenHandler(parser);
assert.equal(parser, handler.parser);
assert.equal(false, handler.determineClass(null));
assert.equal(1, handler.determineClass([]));
assert.equal(0, handler.determineClass({}));
assert.equal(2, handler.determineClass('test'));
assert.equal(false, handler.determineType(null));
assert.equal(4, handler.determineType('2'));
assert.equal(4, handler.determineType('.'));
assert.equal(4, handler.determineType('-'));
assert.equal(5, handler.determineType('t'));
assert.equal(5, handler.determineType('f'));
assert.equal(6, handler.determineType('n'));
};