/** * @fileoverview Tests for textdecoder.js. */ goog.module('protobuf.binary.TextDecoderTest'); goog.setTestOnly(); const {decode, encode} = goog.require('protobuf.binary.textencoding'); describe('Decode does', () => { it('return empty string for empty array', () => { expect(decode(new DataView(new ArrayBuffer(0)))).toEqual(''); }); it('throw on null being passed', () => { expect(() => decode(/** @type {!DataView} */ (/** @type {*} */ (null)))) .toThrow(); }); }); describe('Encode does', () => { it('return empty array for empty string', () => { expect(encode('')).toEqual(new Uint8Array(0)); }); it('throw on null being passed', () => { expect(() => encode(/** @type {string} */ (/** @type {*} */ (null)))) .toThrow(); }); }); /** @const {!TextEncoder} */ const textEncoder = new TextEncoder('utf-8'); /** * A Pair of string and Uint8Array representing the same data. * Each pair has the string value and its utf-8 bytes. */ class Pair { /** * Constructs a pair from a given string. * @param {string} s * @return {!Pair} */ static fromString(s) { return new Pair(s, textEncoder.encode(s).buffer); } /** * Constructs a pair from a given charCode. * @param {number} charCode * @return {!Pair} */ static fromCharCode(charCode) { return Pair.fromString(String.fromCharCode(charCode)); } /** * @param {string} stringValue * @param {!ArrayBuffer} bytes * @private */ constructor(stringValue, bytes) { /** @const @private {string} */ this.stringValue_ = stringValue; /** @const @private {!ArrayBuffer} */ this.bytes_ = bytes; } /** Ensures that a given pair encodes and decodes round trip*/ expectPairToMatch() { expect(decode(new DataView(this.bytes_))).toEqual(this.stringValue_); expect(encode(this.stringValue_)).toEqual(new Uint8Array(this.bytes_)); } } describe('textencoding does', () => { it('works for empty string', () => { Pair.fromString('').expectPairToMatch(); }); it('decode and encode random strings', () => { // 1 byte strings Pair.fromString('hello').expectPairToMatch(); Pair.fromString('HELLO1!'); // 2 byte String Pair.fromString('©').expectPairToMatch(); // 3 byte string Pair.fromString('❄').expectPairToMatch(); // 4 byte string Pair.fromString('😁').expectPairToMatch(); }); it('decode and encode 1 byte strings', () => { for (let i = 0; i < 0x80; i++) { Pair.fromCharCode(i).expectPairToMatch(); } }); it('decode and encode 2 byte strings', () => { for (let i = 0xC0; i < 0x7FF; i++) { Pair.fromCharCode(i).expectPairToMatch(); } }); it('decode and encode 3 byte strings', () => { for (let i = 0x7FF; i < 0x8FFF; i++) { Pair.fromCharCode(i).expectPairToMatch(); } }); });