121 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import {computeMsgId, digest, sha1} from '../../src/i18n/digest';
 | |
| 
 | |
| export function main(): void {
 | |
|   describe('digest', () => {
 | |
|     describe('digest', () => {
 | |
|       it('must return the ID if it\'s explicit', () => {
 | |
|         expect(digest({
 | |
|           id: 'i',
 | |
|           nodes: [],
 | |
|           placeholders: {},
 | |
|           placeholderToMessage: {},
 | |
|           meaning: '',
 | |
|           description: '',
 | |
|           sources: [],
 | |
|         })).toEqual('i');
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     describe('sha1', () => {
 | |
|       it('should work on empty strings',
 | |
|          () => { expect(sha1('')).toEqual('da39a3ee5e6b4b0d3255bfef95601890afd80709'); });
 | |
| 
 | |
|       it('should returns the sha1 of "hello world"',
 | |
|          () => { expect(sha1('abc')).toEqual('a9993e364706816aba3e25717850c26c9cd0d89d'); });
 | |
| 
 | |
|       it('should returns the sha1 of unicode strings',
 | |
|          () => { expect(sha1('你好,世界')).toEqual('3becb03b015ed48050611c8d7afe4b88f70d5a20'); });
 | |
| 
 | |
|       it('should support arbitrary string size', () => {
 | |
|         // node.js reference code:
 | |
|         //
 | |
|         // var crypto = require('crypto');
 | |
|         //
 | |
|         // function sha1(string) {
 | |
|         //   var shasum = crypto.createHash('sha1');
 | |
|         //   shasum.update(string, 'utf8');
 | |
|         //   return shasum.digest('hex', 'utf8');
 | |
|         // }
 | |
|         //
 | |
|         // var prefix = `你好,世界`;
 | |
|         // var result = sha1(prefix);
 | |
|         // for (var size = prefix.length; size < 5000; size += 101) {
 | |
|         //   result = prefix + sha1(result);
 | |
|         //   while (result.length < size) {
 | |
|         //     result += result;
 | |
|         //   }
 | |
|         //   result = result.slice(-size);
 | |
|         // }
 | |
|         //
 | |
|         // console.log(sha1(result));
 | |
|         const prefix = `你好,世界`;
 | |
|         let result = sha1(prefix);
 | |
|         for (let size = prefix.length; size < 5000; size += 101) {
 | |
|           result = prefix + sha1(result);
 | |
|           while (result.length < size) {
 | |
|             result += result;
 | |
|           }
 | |
|           result = result.slice(-size);
 | |
|         }
 | |
|         expect(sha1(result)).toEqual('24c2dae5c1ac6f604dbe670a60290d7ce6320b45');
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     describe('decimal fingerprint', () => {
 | |
|       it('should work on well known inputs w/o meaning', () => {
 | |
|         const fixtures: {[msg: string]: string} = {
 | |
|           '  Spaced  Out  ': '3976450302996657536',
 | |
|           'Last Name': '4407559560004943843',
 | |
|           'First Name': '6028371114637047813',
 | |
|           'View': '2509141182388535183',
 | |
|           'START_BOLDNUMEND_BOLD of START_BOLDmillionsEND_BOLD': '29997634073898638',
 | |
|           'The customer\'s credit card was authorized for AMOUNT and passed all risk checks.':
 | |
|               '6836487644149622036',
 | |
|           'Hello world!': '3022994926184248873',
 | |
|           'Jalape\u00f1o': '8054366208386598941',
 | |
|           'The set of SET_NAME is {XXX, ...}.': '135956960462609535',
 | |
|           'NAME took a trip to DESTINATION.': '768490705511913603',
 | |
|           'by AUTHOR (YEAR)': '7036633296476174078',
 | |
|           '': '4416290763660062288',
 | |
|         };
 | |
| 
 | |
|         Object.keys(fixtures).forEach(
 | |
|             msg => { expect(computeMsgId(msg, '')).toEqual(fixtures[msg]); });
 | |
|       });
 | |
| 
 | |
|       it('should work on well known inputs with meaning', () => {
 | |
|         const fixtures: {[msg: string]: [string, string]} = {
 | |
|           '7790835225175622807': ['Last Name', 'Gmail UI'],
 | |
|           '1809086297585054940': ['First Name', 'Gmail UI'],
 | |
|           '3993998469942805487': ['View', 'Gmail UI'],
 | |
|         };
 | |
| 
 | |
|         Object.keys(fixtures).forEach(
 | |
|             id => { expect(computeMsgId(fixtures[id][0], fixtures[id][1])).toEqual(id); });
 | |
|       });
 | |
| 
 | |
|       it('should support arbitrary string size', () => {
 | |
|         const prefix = `你好,世界`;
 | |
|         let result = computeMsgId(prefix, '');
 | |
|         for (let size = prefix.length; size < 5000; size += 101) {
 | |
|           result = prefix + computeMsgId(result, '');
 | |
|           while (result.length < size) {
 | |
|             result += result;
 | |
|           }
 | |
|           result = result.slice(-size);
 | |
|         }
 | |
|         expect(computeMsgId(result, '')).toEqual('2122606631351252558');
 | |
|       });
 | |
| 
 | |
|     });
 | |
|   });
 | |
| }
 |