/**
 * @license
 * Copyright Google LLC 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 {Xliff} from '@angular/compiler/src/i18n/serializers/xliff';
import {waitForAsync} from '@angular/core/testing';
import {expect} from '@angular/platform-browser/testing/src/matchers';
import {configureCompiler, createComponent, HTML, serializeTranslations, validateHtml} from './integration_common';
describe('i18n XLIFF integration spec', () => {
  describe('(with LF line endings)', () => {
    beforeEach(
        waitForAsync(() => configureCompiler(XLIFF_TOMERGE + LF_LINE_ENDING_XLIFF_TOMERGE, 'xlf')));
    it('should extract from templates', () => {
      const serializer = new Xliff();
      const serializedXliff = serializeTranslations(HTML, serializer);
      XLIFF_EXTRACTED.forEach(x => {
        expect(serializedXliff).toContain(x);
      });
      expect(serializedXliff).toContain(LF_LINE_ENDING_XLIFF_EXTRACTED);
    });
    it('should translate templates', () => {
      const {tb, cmp, el} = createComponent(HTML);
      validateHtml(tb, cmp, el);
    });
  });
  describe('(with CRLF line endings', () => {
    beforeEach(waitForAsync(
        () => configureCompiler(XLIFF_TOMERGE + CRLF_LINE_ENDING_XLIFF_TOMERGE, 'xlf')));
    it('should extract from templates (with CRLF line endings)', () => {
      const serializer = new Xliff();
      const serializedXliff = serializeTranslations(HTML.replace(/\n/g, '\r\n'), serializer);
      XLIFF_EXTRACTED.forEach(x => {
        expect(serializedXliff).toContain(x);
      });
      expect(serializedXliff).toContain(CRLF_LINE_ENDING_XLIFF_EXTRACTED);
    });
    it('should translate templates (with CRLF line endings)', () => {
      const {tb, cmp, el} = createComponent(HTML.replace(/\n/g, '\r\n'));
      validateHtml(tb, cmp, el);
    });
  });
});
const XLIFF_TOMERGE = `
      
        i18n attribute on tags
        attributs i18n sur les balises
      
      
        nested
        imbriqué
      
      
        nested
        imbriqué
        different meaning
      
      
        with placeholders
        avec des espaces réservés
      
      
        with nested placeholders
        with nested placeholders
        
          file.ts
          11
        
      
      
        on not translatable node
        sur des balises non traductibles
      
      
        <b>bold</b>
        <b>gras</b>
      
      
        on translatable node
        sur des balises traductibles
      
      
        {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} }
        {VAR_PLURAL, plural, =0 {zero} =1 {un} =2 {deux} other {beaucoup} }
      
      
        
        
    
        
      
      
        {VAR_SELECT, select, other {other} male {m} female {f} }
        {VAR_SELECT, select, other {autre} male {homme} female {femme}}
      
      
        
        
    
        
      
      
        {VAR_SELECT, select, male {m} female {f} }
        {VAR_SELECT, select, male {homme} female {femme} }
      
      
        
        
      
      
        sex = 
        sexe = 
      
      
        
        
      
      
        in a translatable section
        dans une section traductible
      
      
        
    Markers in html comments
    
    
        
    Balises dans les commentaires html
    
    
      
      
        it should work
        ca devrait marcher
      
      
        with an explicit ID
        avec un ID explicite
      
      
        {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} }
        {VAR_PLURAL, plural, =0 {zero} =1 {un} =2 {deux} other {beaucoup} }
      
      
        foobar
        FOOBAR
      
      
        
        
      `;
const LF_LINE_ENDING_XLIFF_TOMERGE =
    `      
        {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found  results} }
        {VAR_PLURAL, plural, =0 {Pas de réponse} =1 {Une réponse} other { réponses} }
        desc
      `;
const CRLF_LINE_ENDING_XLIFF_TOMERGE =
    `      
        {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found  results} }
        {VAR_PLURAL, plural, =0 {Pas de réponse} =1 {Une réponse} other { réponses} }
        desc
      `;
const XLIFF_EXTRACTED: string[] = [
  `      
        i18n attribute on tags
        
          file.ts
          3
        
      `,
  `      
        nested
        
          file.ts
          5
        
      `,
  `      
        nested
        
          file.ts
          7
        
        different meaning
      `,
  `
        with placeholders
        
          file.ts
          9
        
        
          file.ts
          10
        
      `,
  `    
        with nested placeholders
        
          file.ts
          11
        
      `,
  `      
        on not translatable node
        
          file.ts
          14
        
      `,
  `      
        <b>bold</b>
        
          file.ts
          14
        
      `,
  `      
        on translatable node
        
          file.ts
          15
        
      `,
  `      
        {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} }
        
          file.ts
          20
        
        
          file.ts
          37
        
      `,
  `      
        
        
    
        
          file.ts
          22
        
      `,
  `      
        {VAR_SELECT, select, male {m} female {f} other {other} }
        
          file.ts
          23
        
      `,
  `      
        
        
    
        
          file.ts
          25
        
      `,
  `      
        {VAR_SELECT, select, male {m} female {f} }
        
          file.ts
          26
        
      `,
  `      
        
        
          file.ts
          29
        
      `,
  `      
        sex = 
        
          file.ts
          30
        
      `,
  `      
        
        
          file.ts
          31
        
      `,
  `      
        in a translatable section
        
          file.ts
          36
        
        
          file.ts
          54
        
      `,
  `      
        
    Markers in html comments
    
    
        
          file.ts
          34
        
      `,
  `      
        it should work
        
          file.ts
          40
        
      `,
  `      
        with an explicit ID
        
          file.ts
          42
        
      `,
  `      
        {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} }
        
          file.ts
          43
        
      `,
  `      
        foobar
        
          file.ts
          54
        
      `,
  `      
        
        
          file.ts
          56
        
      `
];
const LF_LINE_ENDING_XLIFF_EXTRACTED =
    `      
        {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found  results} }
        
          file.ts
          46
        
        desc
      `;
const CRLF_LINE_ENDING_XLIFF_EXTRACTED =
    `      
        {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found  results} }
        
          file.ts
          46
        
        desc
      `;