
Prior to this commit, translations were built in the serializers. This could not work as a single translation can be used for different source messages having different placeholder content. Serializers do not try to replace the placeholders any more. Placeholders are replaced by the translation bundle and the source message is given as parameter so that the content of the placeholders is taken into account. Also XMB ids are now independent of the expression which is replaced by a placeholder in the extracted file. fixes #12512
95 lines
3.3 KiB
TypeScript
95 lines
3.3 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 {fingerprint, sha1} from '../../src/i18n/digest';
|
|
|
|
export function main(): void {
|
|
describe('digest', () => {
|
|
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', () => {
|
|
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',
|
|
};
|
|
|
|
it('should work on well known inputs', () => {
|
|
Object.keys(fixtures).forEach(msg => { expect(fingerprint(msg)).toEqual(fixtures[msg]); });
|
|
});
|
|
|
|
it('should support arbitrary string size', () => {
|
|
const prefix = `你好,世界`;
|
|
let result = fingerprint(prefix);
|
|
for (let size = prefix.length; size < 5000; size += 101) {
|
|
result = prefix + fingerprint(result);
|
|
while (result.length < size) {
|
|
result += result;
|
|
}
|
|
result = result.slice(-size);
|
|
}
|
|
expect(fingerprint(result)).toEqual('2122606631351252558');
|
|
});
|
|
|
|
});
|
|
});
|
|
}
|