Trevor Norris | e92f487 | 2013-06-11 21:30:16 | [diff] [blame] | 1 | var common = require('../common'); |
| 2 | var assert = require('assert'); |
| 3 | // minimum string size to overflow into external string space |
| 4 | var EXTERN_APEX = 0xFBEE9; |
| 5 | |
| 6 | // manually controlled string for checking binary output |
| 7 | var ucs2_control = 'a\u0000'; |
| 8 | var write_str = 'a'; |
| 9 | |
| 10 | |
| 11 | // first do basic checks |
| 12 | var b = new Buffer(write_str, 'ucs2'); |
| 13 | var c = b.toString('binary'); |
| 14 | assert.equal(b[0], 0x61); |
| 15 | assert.equal(b[1], 0); |
| 16 | assert.equal(ucs2_control, c); |
| 17 | |
Ben Noordhuis | e2fb733 | 2015-03-03 15:07:26 | [diff] [blame] | 18 | // now create big strings |
| 19 | var size = 1 + (1 << 20); |
| 20 | write_str = Array(size).join(write_str); |
| 21 | ucs2_control = Array(size).join(ucs2_control); |
Trevor Norris | e92f487 | 2013-06-11 21:30:16 | [diff] [blame] | 22 | |
| 23 | // check resultant buffer and output string |
| 24 | var b = new Buffer(write_str, 'ucs2'); |
| 25 | // check fist Buffer created from write string |
| 26 | for (var i = 0; i < b.length; i += 2) { |
| 27 | assert.equal(b[i], 0x61); |
| 28 | assert.equal(b[i + 1], 0); |
| 29 | } |
| 30 | // create another string to create an external string |
| 31 | var b_bin = b.toString('binary'); |
| 32 | var b_ucs = b.toString('ucs2'); |
| 33 | // check control against external binary string |
| 34 | assert.equal(ucs2_control, b_bin); |
| 35 | // create buffer copy from external |
| 36 | var c_bin = new Buffer(b_bin, 'binary'); |
| 37 | var c_ucs = new Buffer(b_ucs, 'ucs2'); |
| 38 | // make sure they're the same length |
| 39 | assert.equal(c_bin.length, c_ucs.length); |
| 40 | // make sure Buffers from externals are the same |
| 41 | for (var i = 0; i < c_bin.length; i++) { |
| 42 | assert.equal(c_bin[i], c_ucs[i], c_bin[i] + ' == ' + c_ucs[i] + |
| 43 | ' : index ' + i); |
| 44 | } |
| 45 | // check resultant strings |
| 46 | assert.equal(c_bin.toString('ucs2'), c_ucs.toString('ucs2')); |
| 47 | assert.equal(c_bin.toString('binary'), ucs2_control); |
| 48 | assert.equal(c_ucs.toString('binary'), ucs2_control); |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 49 | |
| 50 | |
| 51 | |
| 52 | // now let's test BASE64 and HEX ecoding/decoding |
| 53 | var RADIOS = 2; |
| 54 | var PRE_HALF_APEX = Math.ceil(EXTERN_APEX / 2) - RADIOS; |
| 55 | var PRE_3OF4_APEX = Math.ceil((EXTERN_APEX / 4) * 3) - RADIOS; |
| 56 | |
| 57 | (function () { |
| 58 | for (var j = 0; j < RADIOS * 2; j += 1) { |
| 59 | var datum = b; |
| 60 | var slice = datum.slice(0, PRE_HALF_APEX + j); |
| 61 | var slice2 = datum.slice(0, PRE_HALF_APEX + j + 2); |
| 62 | var pumped_string = slice.toString('hex'); |
| 63 | var pumped_string2 = slice2.toString('hex'); |
| 64 | var decoded = new Buffer(pumped_string, 'hex'); |
| 65 | |
| 66 | var metadata = "\nEXTERN_APEX=1031913 - pumped_string.length=" |
| 67 | metadata += pumped_string.length + '\n'; |
| 68 | |
| 69 | // the string are the same? |
| 70 | for (var k = 0; k < pumped_string.length; ++k) { |
| 71 | assert.equal(pumped_string[k], pumped_string2[k], |
| 72 | metadata + 'chars should be the same at ' + k); |
| 73 | } |
| 74 | |
| 75 | // the recoded buffer is the same? |
| 76 | for (var i = 0; i < decoded.length; ++i) { |
| 77 | assert.equal(datum[i], decoded[i], |
| 78 | metadata + 'bytes should be the same at ' + i); |
| 79 | } |
| 80 | } |
| 81 | })(); |
| 82 | |
| 83 | (function () { |
| 84 | for (var j = 0; j < RADIOS * 2; j += 1) { |
| 85 | var datum = b; |
| 86 | var slice = datum.slice(0, PRE_3OF4_APEX + j); |
| 87 | var slice2 = datum.slice(0, PRE_3OF4_APEX + j + 2); |
| 88 | var pumped_string = slice.toString('base64'); |
| 89 | var pumped_string2 = slice2.toString('base64'); |
| 90 | var decoded = new Buffer(pumped_string, 'base64'); |
| 91 | |
| 92 | var metadata = "\nEXTERN_APEX=1031913 - data=" + slice.length |
| 93 | metadata += " pumped_string.length=" + pumped_string.length + '\n'; |
| 94 | |
| 95 | // the string are the same? |
| 96 | for (var k = 0; k < pumped_string.length - 3; ++k) { |
| 97 | assert.equal(pumped_string[k], pumped_string2[k], |
| 98 | metadata + 'chars should be the same for two slices at ' |
| 99 | + k + ' ' + pumped_string[k] + ' ' + pumped_string2[k]); |
| 100 | } |
| 101 | |
| 102 | // the recoded buffer is the same? |
| 103 | for (var i = 0; i < decoded.length; ++i) { |
| 104 | assert.equal(datum[i], decoded[i], |
| 105 | metadata + 'bytes should be the same at ' + i); |
| 106 | } |
| 107 | } |
| 108 | })(); |
Ben Noordhuis | 1640ded | 2015-03-03 14:44:54 | [diff] [blame^] | 109 | |
| 110 | // https://github.com/iojs/io.js/issues/1024 |
| 111 | (function() { |
| 112 | var a = Array(1 << 20).join('x'); |
| 113 | var b = Buffer(a, 'ucs2').toString('ucs2'); |
| 114 | var c = Buffer(b, 'utf8').toString('utf8'); |
| 115 | |
| 116 | assert.equal(a.length, b.length); |
| 117 | assert.equal(b.length, c.length); |
| 118 | |
| 119 | assert.equal(a, b); |
| 120 | assert.equal(b, c); |
| 121 | })(); |