// 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); } }); }); }); });