summaryrefslogtreecommitdiffstats
path: root/tests/decode.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/decode.js')
-rw-r--r--tests/decode.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/decode.js b/tests/decode.js
new file mode 100644
index 0000000..c9457ba
--- /dev/null
+++ b/tests/decode.js
@@ -0,0 +1,123 @@
+// 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);
+ }
+ });
+ });
+ });
+});