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