#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

'''Unit tests for grit.xtb_reader'''


import os
import sys
if __name__ == '__main__':
  sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

import StringIO
import unittest

from grit import util
from grit import xtb_reader
from grit.node import empty


class XtbReaderUnittest(unittest.TestCase):
  def testParsing(self):
    xtb_file = StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE translationbundle>
      <translationbundle lang="fr">
        <translation id="5282608565720904145">Bingo.</translation>
        <translation id="2955977306445326147">Bongo longo.</translation>
        <translation id="238824332917605038">Hullo</translation>
        <translation id="6629135689895381486"><ph name="PROBLEM_REPORT"/> peut <ph name="START_LINK"/>utilisation excessive de majuscules<ph name="END_LINK"/>.</translation>
        <translation id="7729135689895381486">Hello
this is another line
and another

and another after a blank line.</translation>
      </translationbundle>''')

    messages = []
    def Callback(id, structure):
      messages.append((id, structure))
    xtb_reader.Parse(xtb_file, Callback)
    self.failUnless(len(messages[0][1]) == 1)
    self.failUnless(messages[3][1][0])  # PROBLEM_REPORT placeholder
    self.failUnless(messages[4][0] == '7729135689895381486')
    self.failUnless(messages[4][1][7][1] == 'and another after a blank line.')

  def testParsingIntoMessages(self):
    root = util.ParseGrdForUnittest('''
      <messages>
        <message name="ID_MEGA">Fantastic!</message>
        <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>Joi</ex></ph></message>
      </messages>''')

    msgs, = root.GetChildrenOfType(empty.MessagesNode)
    clique_mega = msgs.children[0].GetCliques()[0]
    msg_mega = clique_mega.GetMessage()
    clique_hello_user = msgs.children[1].GetCliques()[0]
    msg_hello_user = clique_hello_user.GetMessage()

    xtb_file = StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE translationbundle>
      <translationbundle lang="is">
        <translation id="%s">Meirihattar!</translation>
        <translation id="%s">Saelir <ph name="USERNAME"/></translation>
      </translationbundle>''' % (msg_mega.GetId(), msg_hello_user.GetId()))

    xtb_reader.Parse(xtb_file,
                     msgs.UberClique().GenerateXtbParserCallback('is'))
    self.assertEqual('Meirihattar!',
                     clique_mega.MessageForLanguage('is').GetRealContent())
    self.failUnless('Saelir %s',
                    clique_hello_user.MessageForLanguage('is').GetRealContent())

  def testIfNodesWithUseNameForId(self):
    root = util.ParseGrdForUnittest('''
      <messages>
        <message name="ID_BINGO" use_name_for_id="true">Bingo!</message>
      </messages>''')
    msgs, = root.GetChildrenOfType(empty.MessagesNode)
    clique = msgs.children[0].GetCliques()[0]
    msg = clique.GetMessage()

    xtb_file = StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE translationbundle>
      <translationbundle lang="is">
        <if expr="is_linux">
          <translation id="ID_BINGO">Bongo!</translation>
        </if>
        <if expr="not is_linux">
          <translation id="ID_BINGO">Congo!</translation>
        </if>
      </translationbundle>''')
    xtb_reader.Parse(xtb_file,
                     msgs.UberClique().GenerateXtbParserCallback('is'),
                     target_platform='darwin')
    self.assertEqual('Congo!', clique.MessageForLanguage('is').GetRealContent())

  def testParseLargeFile(self):
    def Callback(id, structure):
      pass
    with open(util.PathFromRoot('grit/testdata/generated_resources_fr.xtb')) as xtb:
      xtb_reader.Parse(xtb, Callback)


if __name__ == '__main__':
  unittest.main()
