split-sms
Version:
An SMS message splitter with support for both GSM and Unicode.
915 lines (678 loc) • 27.3 kB
JavaScript
var assert = require('assert'),
random = require('./random');
var splitter = require('../');
function randomGsmString(length) {
var gsm = '@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ\x20!"#¤%&\'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà';
var result = '';
for (var i = 0, max = gsm.length - 1; i < length; i++) {
result += gsm[random.integer(0, max)];
}
return result;
}
function randomGsmExtendedString(length) {
var gsme = '\f^{}\\[~]|€';
var result = '';
for (var i = 0, max = gsme.length - 1; i < length; i++) {
result += gsme[random.integer(0, max)];
}
return result;
}
function randomNonGsmString(length) {
// All symbols known in the BMP above the euro symbol: http://codepoints.net/U+20AC
var min = 0x20AD;
var max = 0x297F;
var result = '';
for (var i = 0; i < length; i++) {
result += String.fromCharCode(random.integer(min, max));
}
return result;
}
function randomSurrogatePairString(length) {
var highMin = 0xD800;
var highMax = 0xDB7F;
var lowMin = 0xDC00;
var lowMax = 0xDFFF;
var result = '';
for (var i = 0; i < length; i++) {
result += String.fromCharCode(random.integer(highMin, highMax));
result += String.fromCharCode(random.integer(lowMin, lowMax));
}
return result;
}
function stringRepeat(string, times) {
return (new Array(times + 1)).join(string);
}
describe('Acceptance Tests', function () {
describe('Single part message of all GSM characters', function () {
var message;
var result;
before(function () {
message = randomGsmString(160);
result = splitter.split(message);
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 160 length', function () {
assert.strictEqual(result.length, 160);
});
it('should return 160 bytes', function () {
assert.strictEqual(result.bytes, 160);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, message);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 160);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 160);
});
});
describe('Multipart message of all GSM characters', function () {
var part1;
var part2;
var result;
before(function () {
part1 = randomGsmString(153);
part2 = randomGsmString(153);
result = splitter.split(part1 + part2);
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 306 length', function () {
assert.strictEqual(result.length, 306);
});
it('should return 306 bytes', function () {
assert.strictEqual(result.bytes, 306);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, part1);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 153);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 153);
});
it('should return the expected content in the second part', function () {
assert.strictEqual(result.parts[1].content, part2);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 153);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 153);
});
});
describe('Multipart message of all GSM characters with summary option', function () {
var result;
before(function () {
var part1 = randomGsmString(153);
var part2 = randomGsmString(153);
result = splitter.split(part1 + part2, { summary: true });
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 306 length', function () {
assert.strictEqual(result.length, 306);
});
it('should return 306 bytes', function () {
assert.strictEqual(result.bytes, 306);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should not return any content in the first part', function () {
assert.strictEqual(result.parts[0].content, undefined);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 153);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 153);
});
it('should not return any content in the second part', function () {
assert.strictEqual(result.parts[1].content, undefined);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 153);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 153);
});
});
describe('Single part message of all GSM Extended characters', function () {
var message;
var result;
before(function () {
message = randomGsmExtendedString(80);
result = splitter.split(message);
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 80 length', function () {
assert.strictEqual(result.length, 80);
});
it('should return 160 bytes', function () {
assert.strictEqual(result.bytes, 160);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, message);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 80);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 160);
});
});
describe('Multipart message of all GSM Extended characters', function () {
var part1;
var part2;
var result;
before(function () {
part1 = randomGsmExtendedString(76);
part2 = randomGsmExtendedString(76);
result = splitter.split(part1 + part2);
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 152 length', function () {
assert.strictEqual(result.length, 152);
});
it('should return 304 bytes', function () {
assert.strictEqual(result.bytes, 304);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 1 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 1);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, part1);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 76);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 152);
});
it('should return the expected content in the second part', function () {
assert.strictEqual(result.parts[1].content, part2);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 76);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 152);
});
});
describe('Single part message of all non-GSM characters', function () {
var message;
var result;
before(function () {
message = randomNonGsmString(70);
result = splitter.split(message);
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 70 length', function () {
assert.strictEqual(result.length, 70);
});
it('should return 140 bytes', function () {
assert.strictEqual(result.bytes, 140);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, message);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 70);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 140);
});
});
describe('Multipart message of all non-GSM characters', function () {
var part1;
var part2;
var result;
before(function () {
part1 = randomNonGsmString(67);
part2 = randomNonGsmString(67);
result = splitter.split(part1 + part2);
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 134 length', function () {
assert.strictEqual(result.length, 134);
});
it('should return 268 bytes', function () {
assert.strictEqual(result.bytes, 268);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, part1);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 67);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 134);
});
it('should return the expected content in the second part', function () {
assert.strictEqual(result.parts[1].content, part2);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 67);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 134);
});
});
describe('Multipart message of all non-GSM characters with summary option', function () {
var result;
before(function () {
var part1 = randomNonGsmString(67);
var part2 = randomNonGsmString(67);
result = splitter.split(part1 + part2, { summary: true });
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 134 length', function () {
assert.strictEqual(result.length, 134);
});
it('should return 268 bytes', function () {
assert.strictEqual(result.bytes, 268);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should not return any content in the first part', function () {
assert.strictEqual(result.parts[0].content, undefined);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 67);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 134);
});
it('should not return any content in the second part', function () {
assert.strictEqual(result.parts[1].content, undefined);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 67);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 134);
});
});
describe('Single part message of all surrogate-pair characters', function () {
var message;
var result;
before(function () {
message = randomSurrogatePairString(35);
result = splitter.split(message);
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 70 length', function () {
assert.strictEqual(result.length, 35);
});
it('should return 140 bytes', function () {
assert.strictEqual(result.bytes, 140);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, message);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 35);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 140);
});
});
describe('Multipart message of all surrogate-pair characters', function () {
var part1;
var part2;
var result;
before(function () {
part1 = randomSurrogatePairString(33);
part2 = randomSurrogatePairString(33);
result = splitter.split(part1 + part2);
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 66 length', function () {
assert.strictEqual(result.length, 66);
});
it('should return 264 bytes', function () {
assert.strictEqual(result.bytes, 264);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 1 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 1);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, part1);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 33);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 132);
});
it('should return the expected content in the second part', function () {
assert.strictEqual(result.parts[1].content, part2);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 33);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 132);
});
});
describe('Single part message of 70 GSM characters with Unicode character set option', function () {
var message;
var result;
before(function () {
message = randomGsmString(70);
result = splitter.split(message, { characterset: splitter.UNICODE });
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 70 length', function () {
assert.strictEqual(result.length, 70);
});
it('should return 140 bytes', function () {
assert.strictEqual(result.bytes, 140);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, message);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 70);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 140);
});
});
describe('Single part message of 160 surrogate-pair characters with GSM character set option', function () {
var message;
var expectedMessage;
var result;
before(function () {
message = randomSurrogatePairString(160);
expectedMessage = stringRepeat(' ', 160);
result = splitter.split(message, { characterset: splitter.GSM });
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 160 length', function () {
assert.strictEqual(result.length, 160);
});
it('should return 160 bytes', function () {
assert.strictEqual(result.bytes, 160);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, expectedMessage);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 160);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 160);
});
});
describe('Single part message of 160 2-byte characters with GSM character set option', function () {
var message;
var expectedMessage;
var result;
before(function () {
message = randomNonGsmString(160);
expectedMessage = stringRepeat(' ', 160);
result = splitter.split(message, { characterset: splitter.GSM });
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 160 length', function () {
assert.strictEqual(result.length, 160);
});
it('should return 160 bytes', function () {
assert.strictEqual(result.bytes, 160);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, expectedMessage);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 160);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 160);
});
});
describe('Multipart message of 71 GSM characters with Unicode character set option', function () {
var part1;
var part2;
var result;
before(function () {
part1 = randomGsmString(67);
part2 = randomGsmString(4);
result = splitter.split(part1 + part2, { characterset: splitter.UNICODE });
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 71 length', function () {
assert.strictEqual(result.length, 71);
});
it('should return 142 bytes', function () {
assert.strictEqual(result.bytes, 142);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 63 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 63);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, part1);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 67);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 134);
});
it('should return the expected content in the second part', function () {
assert.strictEqual(result.parts[1].content, part2);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 4);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 8);
});
});
describe('Multipart message of 161 surrogate-pair characters with GSM character set option', function () {
var part1;
var part2;
var expectedPart1;
var expectedPart2;
var result;
before(function () {
part1 = randomSurrogatePairString(153);
part2 = randomSurrogatePairString(153);
expectedPart1 = stringRepeat(' ', 153);
expectedPart2 = stringRepeat(' ', 153);
result = splitter.split(part1 + part2, { characterset: splitter.GSM });
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 306 length', function () {
assert.strictEqual(result.length, 306);
});
it('should return 306 bytes', function () {
assert.strictEqual(result.bytes, 306);
});
it('should return 2 parts', function () {
assert.strictEqual(result.parts.length, 2);
});
it('should return 0 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 0);
});
it('should return the expected content in the first part', function () {
assert.strictEqual(result.parts[0].content, expectedPart1);
});
it('should return the expected length in the first part', function () {
assert.strictEqual(result.parts[0].length, 153);
});
it('should return the expected bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 153);
});
it('should return the expected content in the second part', function () {
assert.strictEqual(result.parts[1].content, expectedPart2);
});
it('should return the expected length in the second part', function () {
assert.strictEqual(result.parts[1].length, 153);
});
it('should return the expected bytes in the second part', function () {
assert.strictEqual(result.parts[1].bytes, 153);
});
});
describe('Empty message', function () {
var result;
before(function () {
result = splitter.split('');
});
it('should return characterset GSM', function () {
assert.strictEqual(result.characterSet, 'GSM');
});
it('should return 0 length', function () {
assert.strictEqual(result.length, 0);
});
it('should return 0 bytes', function () {
assert.strictEqual(result.bytes, 0);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 160 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 160);
});
it('should return an empty first part', function () {
assert.strictEqual(result.parts[0].content, '');
});
it('should return zero length in the first part', function () {
assert.strictEqual(result.parts[0].length, 0);
});
it('should return zero bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 0);
});
});
describe('Empty message with forced Unicode character set', function () {
var result;
before(function () {
result = splitter.split('', { characterset: splitter.UNICODE });
});
it('should return characterset Unicode', function () {
assert.strictEqual(result.characterSet, 'Unicode');
});
it('should return 0 length', function () {
assert.strictEqual(result.length, 0);
});
it('should return 0 bytes', function () {
assert.strictEqual(result.bytes, 0);
});
it('should return 1 part', function () {
assert.strictEqual(result.parts.length, 1);
});
it('should return 70 remaining in last part', function () {
assert.strictEqual(result.remainingInPart, 70);
});
it('should return an empty first part', function () {
assert.strictEqual(result.parts[0].content, '');
});
it('should return zero length in the first part', function () {
assert.strictEqual(result.parts[0].length, 0);
});
it('should return zero bytes in the first part', function () {
assert.strictEqual(result.parts[0].bytes, 0);
});
});
});