123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // parse.js
- // Tests parse(). See readme.txt for details.
- var assert = require('assert');
- var FS = require('fs');
- var JSON5 = require('..');
- var Path = require('path');
- // Test JSON5.parse() by comparing its output for each case with either the
- // native JSON.parse() or ES5 strict-mode eval(). See readme.txt for details.
- // For eval(), remember to wrap the input in parentheses before eval()'ing,
- // since {...} is ambiguous in JavaScript. Also ensure the parentheses are on
- // lines of their own, to support inline comments.
- // TODO More test cases, and ones that test specific features and edge cases.
- // Mozilla's test cases are a great inspiration and reference here:
- // http://mxr.mozilla.org/mozilla-central/source/js/src/tests/ecma_5/JSON/
- var dirsPath = Path.resolve(__dirname, 'parse-cases');
- var dirs = FS.readdirSync(dirsPath);
- function createTest(fileName, dir) {
- var ext = Path.extname(fileName);
- var filePath = Path.join(dirsPath, dir, fileName);
- var str = FS.readFileSync(filePath, 'utf8');
- function parseJSON5() {
- return JSON5.parse(str);
- }
- function parseJSON() {
- return JSON.parse(str);
- }
- function parseES5() {
- return eval('"use strict"; (\n' + str + '\n)');
- }
- exports[dir][fileName] = function test() {
- switch (ext) {
- case '.json':
- assert.deepEqual(parseJSON5(), parseJSON(),
- 'Expected parsed JSON5 to equal parsed JSON.');
- break;
- case '.json5':
- assert.throws(parseJSON, // test validation
- 'Test case bug: expected JSON parsing to fail.');
- // Need special case for NaN as NaN != NaN
- if ( fileName === 'nan.json5' ) {
- assert.equal( isNaN( parseJSON5() ), isNaN( parseES5() ),
- 'Expected parsed JSON5 to equal parsed ES5.');
- }
- else {
- assert.deepEqual( parseJSON5(), parseES5(),
- 'Expected parsed JSON5 to equal parsed ES5.');
- }
- break;
- case '.js':
- assert.throws(parseJSON, // test validation
- 'Test case bug: expected JSON parsing to fail.');
- assert.doesNotThrow(parseES5, // test validation
- 'Test case bug: expected ES5 parsing not to fail.');
- assert.throws(parseJSON5,
- 'Expected JSON5 parsing to fail.');
- break;
- case '.txt':
- assert.throws(parseES5, // test validation
- 'Test case bug: expected ES5 parsing to fail.');
- assert.throws(parseJSON5,
- 'Expected JSON5 parsing to fail.');
- break;
- }
- };
- }
- dirs.forEach(function (dir) {
- // create a test suite for this group of tests:
- exports[dir] = {};
- // skip the TODO directory -- these tests are expected to fail:
- if (dir === 'todo') {
- return;
- }
- // otherwise create a test for each file in this group:
- FS.readdirSync(Path.join(dirsPath, dir)).forEach(function (file) {
- createTest(file, dir);
- });
- });
|