import {
beforeEach,
describe,
ddescribe,
expect,
iit,
inject,
it,
xdescribe,
xit
} from '@angular/core/testing/testing_internal';
import {HtmlParser} from '@angular/compiler/src/html_parser';
import {MessageExtractor, removeDuplicates} from '@angular/compiler/src/i18n/message_extractor';
import {Message} from '@angular/compiler/src/i18n/message';
import {Parser} from '@angular/compiler/src/expression_parser/parser';
import {Lexer} from '@angular/compiler/src/expression_parser/lexer';
export function main() {
describe('MessageExtractor', () => {
let extractor: MessageExtractor;
beforeEach(() => {
let htmlParser = new HtmlParser();
var parser = new Parser(new Lexer());
extractor = new MessageExtractor(htmlParser, parser, ['i18n-tag'], {'i18n-el': ['trans']});
});
it('should extract from elements with the i18n attr', () => {
let res = extractor.extract("
message
", "someurl");
expect(res.messages).toEqual([new Message("message", 'meaning', 'desc')]);
});
it('should extract from elements with the i18n attr without a desc', () => {
let res = extractor.extract("
message
", "someurl");
expect(res.messages).toEqual([new Message("message", 'meaning', null)]);
});
it('should extract from elements with the i18n attr without a meaning', () => {
let res = extractor.extract("
message
", "someurl");
expect(res.messages).toEqual([new Message("message", null, null)]);
});
it('should extract from attributes', () => {
let res = extractor.extract(`
`,
"someurl");
expect(res.messages)
.toEqual([
new Message("message1", "meaning1", "desc1"),
new Message("message2", "meaning2", "desc2")
]);
});
it('should extract from partitions', () => {
let res = extractor.extract(`
message1
message2`,
"someUrl");
expect(res.messages)
.toEqual([
new Message("message1", "meaning1", "desc1"),
new Message("message2", "meaning2", "desc2")
]);
});
it('should ignore other comments', () => {
let res = extractor.extract(`
message1`,
"someUrl");
expect(res.messages).toEqual([new Message("message1", "meaning1", "desc1")]);
});
it('should replace interpolation with placeholders (text nodes)', () => {
let res = extractor.extract("
Hi {{one}} and {{two}}
", "someurl");
expect(res.messages)
.toEqual(
[new Message('Hi and ', null, null)]);
});
it('should replace interpolation with placeholders (attributes)', () => {
let res =
extractor.extract("", "someurl");
expect(res.messages)
.toEqual([new Message('Hi and ', null, null)]);
});
it('should replace interpolation with named placeholders if provided (text nodes)', () => {
let res = extractor.extract(`
Hi {{one //i18n(ph="FIRST")}} and {{two //i18n(ph="SECOND")}}
`,
'someurl');
expect(res.messages)
.toEqual([
new Message('Hi and ', null,
null)
]);
});
it('should replace interpolation with named placeholders if provided (attributes)', () => {
let res = extractor.extract(`
`,
'someurl');
expect(res.messages)
.toEqual([new Message('Hi and ', null, null)]);
});
it('should match named placeholders with extra spacing', () => {
let res = extractor.extract(`
`,
'someurl');
expect(res.messages)
.toEqual([new Message('Hi and ', null, null)]);
});
it('should suffix duplicate placeholder names with numbers', () => {
let res = extractor.extract(`
`,
'someurl');
expect(res.messages)
.toEqual([
new Message('Hi and and ',
null, null)
]);
});
it("should handle html content", () => {
let res = extractor.extract(
'
zero
one
two
', "someurl");
expect(res.messages)
.toEqual([
new Message('zeroonetwo', null,
null)
]);
});
it("should handle html content with interpolation", () => {
let res =
extractor.extract('
zero{{a}}
{{b}}
', "someurl");
expect(res.messages)
.toEqual([
new Message(
'zero',
null, null)
]);
});
it("should extract from nested elements", () => {
let res = extractor.extract(
'
message2
',
"someurl");
expect(res.messages)
.toEqual([
new Message("message2", "meaning2", "desc2"),
new Message("message1", "meaning1", "desc1")
]);
});
it("should extract messages from attributes in i18n blocks", () => {
let res = extractor.extract(
'
message
', "someurl");
expect(res.messages)
.toEqual([
new Message('message', null, null),
new Message('value', "meaning", "desc")
]);
});
it("should extract messages from special forms", () => {
let res = extractor.extract(`
{messages.length, plural,
=0 {You have no messages}
=1 {You have one message}
}
`,
"someurl");
expect(res.messages)
.toEqual([
new Message('You have no messages', "plural_0", null),
new Message('You have one message', "plural_1", null)
]);
});
it("should remove duplicate messages", () => {
let res = extractor.extract(`
message
message`,
"someUrl");
expect(removeDuplicates(res.messages))
.toEqual([
new Message("message", "meaning", "desc1"),
]);
});
describe('implicit translation', () => {
it('should extract from elements', () => {
let res = extractor.extract("message", "someurl");
expect(res.messages).toEqual([new Message("message", null, null)]);
});
it('should extract meaning and description from elements when present', () => {
let res =
extractor.extract("message", "someurl");
expect(res.messages).toEqual([new Message("message", "meaning", "description")]);
});
it('should extract from attributes', () => {
let res = extractor.extract(``, "someurl");
expect(res.messages).toEqual([new Message("message", null, null)]);
});
it('should extract meaning and description from attributes when present', () => {
let res = extractor.extract(``,
"someurl");
expect(res.messages).toEqual([new Message("message", "meaning", "desc")]);
});
});
describe("errors", () => {
it('should error on i18n attributes without matching "real" attributes', () => {
let res = extractor.extract(`
`,
"someurl");
expect(res.errors.length).toEqual(1);
expect(res.errors[0].msg).toEqual("Missing attribute 'title2'.");
});
it('should error when cannot find a matching desc', () => {
let res = extractor.extract(`
message1`,
"someUrl");
expect(res.errors.length).toEqual(1);
expect(res.errors[0].msg).toEqual("Missing closing 'i18n' comment.");
});
it("should return parse errors when the template is invalid", () => {
let res = extractor.extract("