blob: c9457babe0d8fa05542ae5661f81dd2717d26962 [file]
// TODO: port to Python
'use strict';
var assert = require('assert');
var decode = require('../decode');
function encodeBinary(str) {
var result = '';
str = str.replace(/\s+/g, '');
while (str.length) {
result = '%' + ('0' + parseInt(str.slice(-8), 2).toString(16)).slice(-2) + result;
str = str.slice(0, -8);
}
return result;
}
var samples = {
'00000000': true,
'01010101': true,
'01111111': true,
// invalid as 1st byte
'10000000': true,
'10111111': true,
// invalid sequences, 2nd byte should be >= 0x80
'11000111 01010101': false,
'11100011 01010101': false,
'11110001 01010101': false,
// invalid sequences, 2nd byte should be < 0xc0
'11000111 11000000': false,
'11100011 11000000': false,
'11110001 11000000': false,
// invalid 3rd byte
'11100011 10010101 01010101': false,
'11110001 10010101 01010101': false,
// invalid 4th byte
'11110001 10010101 10010101 01010101': false,
// valid sequences
'11000111 10101010': true,
'11100011 10101010 10101010': true,
'11110001 10101010 10101010 10101010': true,
// minimal chars with given length
'11000010 10000000': true,
'11100000 10100000 10000000': true,
// impossible sequences
'11000001 10111111': false,
'11100000 10011111 10111111': false,
'11000001 10000000': false,
'11100000 10010000 10000000': false,
// maximum chars with given length
'11011111 10111111': true,
'11101111 10111111 10111111': true,
'11110000 10010000 10000000 10000000': true,
'11110000 10010000 10001111 10001111': true,
'11110100 10001111 10110000 10000000': true,
'11110100 10001111 10111111 10111111': true,
// too low
'11110000 10001111 10111111 10111111': false,
// too high
'11110100 10010000 10000000 10000000': false,
'11110100 10011111 10111111 10111111': false,
// surrogate range
'11101101 10011111 10111111': true,
'11101101 10100000 10000000': false,
'11101101 10111111 10111111': false,
'11101110 10000000 10000000': true
};
describe('decode', function() {
it('should decode %xx', function() {
assert.equal(decode('x%20xx%20%2520'), 'x xx %20');
});
it('should not decode invalid sequences', function() {
assert.equal(decode('%2g%z1%%'), '%2g%z1%%');
});
it('should not decode reservedSet', function() {
assert.equal(decode('%20%25%20', '%'), ' %25 ');
assert.equal(decode('%20%25%20', ' '), '%20%%20');
assert.equal(decode('%20%25%20', ' %'), '%20%25%20');
});
describe('utf8', function() {
Object.keys(samples).forEach(function(k) {
it(k, function() {
var res1, res2,
er = null,
str = encodeBinary(k);
try {
res1 = decodeURIComponent(str);
} catch(e) {
er = e;
}
res2 = decode(str);
if (er) {
assert.notEqual(res2.indexOf('\ufffd'), -1);
} else {
assert.equal(res1, res2);
assert.equal(res2.indexOf('\ufffd'), -1);
}
});
});
});
});