75 lines
2.5 KiB
JavaScript
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
|
|
} |