it('should ignore other comments', () => {
      let res = extractor.extract(`
         <!-- i18n: meaning1|desc1 --><!-- other -->message1<!-- /i18n -->`,
                                  "someUrl");

      expect(res.messages).toEqual([new Message("message1", "meaning1", "desc1")]);
    });
 it('should handle html content with interpolation', () => {
   let res =
       extractor.extract('<div i18n><div>zero{{a}}<div>{{b}}</div></div></div>', 'someurl');
   expect(res.messages).toEqual([new Message(
       '<ph name="e0"><ph name="t1">zero<ph name="0"/></ph><ph name="e2"><ph name="t3"><ph name="0"/></ph></ph></ph>',
       null, null)]);
 });
    it('should ignore other comments', () => {
      let res = extractor.extract(
          `
         <!-- i18n: meaning1|desc1 --><!-- other -->message1<!-- /i18n -->`,
          'someUrl');

      expect(res.messages).toEqual([new Message('message1', 'meaning1', 'desc1')]);
    });
 it('should replace interpolation with named placeholders if provided (attributes)', () => {
   let res = extractor.extract(`
   <div title='Hi {{one //i18n(ph="FIRST")}} and {{two //i18n(ph="SECOND")}}'
     i18n-title></div>`,
                               'someurl');
   expect(res.messages)
       .toEqual([new Message('Hi <ph name="FIRST"/> and <ph name="SECOND"/>', null, null)]);
 });
 it('should match named placeholders with extra spacing', () => {
   let res = extractor.extract(`
   <div title='Hi {{one // i18n ( ph = "FIRST" )}} and {{two // i18n ( ph = "SECOND" )}}'
     i18n-title></div>`,
                               'someurl');
   expect(res.messages)
       .toEqual([new Message('Hi <ph name="FIRST"/> and <ph name="SECOND"/>', null, null)]);
 });
      it('should error when cannot find a matching desc', () => {
        let res = extractor.extract(`
         <!-- i18n: meaning1|desc1 -->message1`,
                                    "someUrl");

        expect(res.errors.length).toEqual(1);
        expect(res.errors[0].msg).toEqual("Missing closing 'i18n' comment.");
      });
 it('should extract messages from attributes in i18n blocks', () => {
   let res = extractor.extract(
       '<div i18n><div attr="value" i18n-attr="meaning|desc">message</div></div>', 'someurl');
   expect(res.messages).toEqual([
     new Message('<ph name="e0">message</ph>', null, null),
     new Message('value', 'meaning', 'desc')
   ]);
 });
 it('should extract from nested elements', () => {
   let res = extractor.extract(
       '<div title="message1" i18n-title="meaning1|desc1"><div i18n="meaning2|desc2">message2</div></div>',
       'someurl');
   expect(res.messages).toEqual([
     new Message('message2', 'meaning2', 'desc2'), new Message('message1', 'meaning1', 'desc1')
   ]);
 });
 it("should handle html content", () => {
   let res = extractor.extract(
       '<div i18n><div attr="value">zero<div>one</div></div><div>two</div></div>', "someurl");
   expect(res.messages)
       .toEqual([
         new Message('<ph name="e0">zero<ph name="e2">one</ph></ph><ph name="e4">two</ph>', null,
                     null)
       ]);
 });
 it("should extract messages from attributes in i18n blocks", () => {
   let res = extractor.extract(
       '<div i18n><div attr="value" i18n-attr="meaning|desc">message</div></div>', "someurl");
   expect(res.messages)
       .toEqual([
         new Message('<div attr="value">message</div>', null, null),
         new Message('value', "meaning", "desc")
       ]);
 });