wow-toc-parser/test/parse_spec.js
2014-09-29 19:40:13 -04:00

75 lines
2.5 KiB
JavaScript

'use strict';
var fs = require('fs');
var path = require('path');
var should = require('should');
var wowtoc = require('../lib');
describe('wow-toc.parse', function() {
it ('should work on a basic file', function () {
var fixture = fs.readFileSync(path.join(__dirname, 'fixtures', 'basic-file.toc'), { encoding: 'utf8' });
wowtoc.parse(fixture).should.eql({
tags: {
'Interface': '50400',
'Title': 'Waiting for Godot',
'Notes': '"Nothing to be done."',
'Version': '4.2'
},
files: [
'Vladimir.xml',
'Estragon.lua'
]
});
});
it ('should trunicate lines over 1024', function() {
var fixture = fs.readFileSync(path.join(__dirname, 'fixtures', 'trunicate.toc'), { encoding: 'utf8' });
wowtoc.parse(fixture).tags['X-Long'].should.equal('d'.repeat(1024-11));
});
it ('should correctly parse Recount.toc', function() {
/**
* Recount was selected because it's well known has a fairly large toc,
* and it has non-latin characters in some translations.
* I can't find any data on the Recount license, so I'm attributing it
* and leaving it unmodified in test/fixtures/Recount.toc
*/
var fixture = fs.readFileSync(path.join(__dirname, 'fixtures', 'Recount.toc'), { encoding: 'utf8' });
var correct = fs.readFileSync(path.join(__dirname, 'fixtures', 'Recount.json'), { encoding: 'utf8' });
wowtoc.parse(fixture).should.eql(JSON.parse(correct));
});
});
//polyfill from MDN
if (!String.prototype.repeat) {
// jshint ignore:start
String.prototype.repeat = function (count) {
"use strict";
if (this == null)
throw new TypeError("can't convert " + this + " to object");
var str = "" + this;
count = +count;
if (count != count)
count = 0;
if (count < 0)
throw new RangeError("repeat count must be non-negative");
if (count == Infinity)
throw new RangeError("repeat count must be less than infinity");
count = Math.floor(count);
if (str.length == 0 || count == 0)
return "";
// Ensuring count is a 31-bit integer allows us to heavily optimize the
// main part. But anyway, most current (august 2014) browsers can't handle
// strings 1 << 28 chars or longer, so :
if (str.length * count >= 1 << 28)
throw new RangeError("repeat count must not overflow maximum string size");
var rpt = "";
for (;;) {
if ((count & 1) == 1)
rpt += str;
count >>>= 1;
if (count == 0)
break;
str += str;
}
return rpt;
}
// jshint ignore:end
}