| Index: grit/clique_unittest.py
 | 
| ===================================================================
 | 
| --- grit/clique_unittest.py	(revision 0)
 | 
| +++ grit/clique_unittest.py	(revision 0)
 | 
| @@ -0,0 +1,203 @@
 | 
| +#!/usr/bin/python2.4
 | 
| +# Copyright (c) 2011 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.clique'''
 | 
| +
 | 
| +import os
 | 
| +import sys
 | 
| +if __name__ == '__main__':
 | 
| +  sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), '..'))
 | 
| +
 | 
| +import re
 | 
| +import StringIO
 | 
| +import unittest
 | 
| +
 | 
| +from grit import clique
 | 
| +from grit import exception
 | 
| +from grit import pseudo
 | 
| +from grit import tclib
 | 
| +from grit import grd_reader
 | 
| +from grit import util
 | 
| +
 | 
| +class MessageCliqueUnittest(unittest.TestCase):
 | 
| +  def testClique(self):
 | 
| +    factory = clique.UberClique()
 | 
| +    msg = tclib.Message(text='Hello USERNAME, how are you?',
 | 
| +                        placeholders=[
 | 
| +                          tclib.Placeholder('USERNAME', '%s', 'Joi')])
 | 
| +    c = factory.MakeClique(msg)
 | 
| +
 | 
| +    self.failUnless(c.GetMessage() == msg)
 | 
| +    self.failUnless(c.GetId() == msg.GetId())
 | 
| +
 | 
| +    msg_fr = tclib.Translation(text='Bonjour USERNAME, comment ca va?',
 | 
| +                               id=msg.GetId(), placeholders=[
 | 
| +                                tclib.Placeholder('USERNAME', '%s', 'Joi')])
 | 
| +    msg_de = tclib.Translation(text='Guten tag USERNAME, wie geht es dir?',
 | 
| +                               id=msg.GetId(), placeholders=[
 | 
| +                                tclib.Placeholder('USERNAME', '%s', 'Joi')])
 | 
| +
 | 
| +    c.AddTranslation(msg_fr, 'fr')
 | 
| +    factory.FindCliqueAndAddTranslation(msg_de, 'de')
 | 
| +
 | 
| +    # sort() sorts lists in-place and does not return them
 | 
| +    for lang in ('en', 'fr', 'de'):
 | 
| +      self.failUnless(lang in c.clique)
 | 
| +
 | 
| +    self.failUnless(c.MessageForLanguage('fr').GetRealContent() ==
 | 
| +                    msg_fr.GetRealContent())
 | 
| +
 | 
| +    try:
 | 
| +      c.MessageForLanguage('zh-CN', False)
 | 
| +      self.fail('Should have gotten exception')
 | 
| +    except:
 | 
| +      pass
 | 
| +
 | 
| +    self.failUnless(c.MessageForLanguage('zh-CN', True) != None)
 | 
| +
 | 
| +    rex = re.compile('fr|de|bingo')
 | 
| +    self.failUnless(len(c.AllMessagesThatMatch(rex, False)) == 2)
 | 
| +    self.failUnless(c.AllMessagesThatMatch(rex, True)[pseudo.PSEUDO_LANG] != None)
 | 
| +
 | 
| +  def testBestClique(self):
 | 
| +    factory = clique.UberClique()
 | 
| +    factory.MakeClique(tclib.Message(text='Alfur', description='alfaholl'))
 | 
| +    factory.MakeClique(tclib.Message(text='Alfur', description=''))
 | 
| +    factory.MakeClique(tclib.Message(text='Vaettur', description=''))
 | 
| +    factory.MakeClique(tclib.Message(text='Vaettur', description=''))
 | 
| +    factory.MakeClique(tclib.Message(text='Troll', description=''))
 | 
| +    factory.MakeClique(tclib.Message(text='Gryla', description='ID: IDS_GRYLA'))
 | 
| +    factory.MakeClique(tclib.Message(text='Gryla', description='vondakerling'))
 | 
| +    factory.MakeClique(tclib.Message(text='Leppaludi', description='ID: IDS_LL'))
 | 
| +    factory.MakeClique(tclib.Message(text='Leppaludi', description=''))
 | 
| +
 | 
| +    count_best_cliques = 0
 | 
| +    for c in factory.BestCliquePerId():
 | 
| +      count_best_cliques += 1
 | 
| +      msg = c.GetMessage()
 | 
| +      text = msg.GetRealContent()
 | 
| +      description = msg.GetDescription()
 | 
| +      if text == 'Alfur':
 | 
| +        self.failUnless(description == 'alfaholl')
 | 
| +      elif text == 'Gryla':
 | 
| +        self.failUnless(description == 'vondakerling')
 | 
| +      elif text == 'Leppaludi':
 | 
| +        self.failUnless(description == 'ID: IDS_LL')
 | 
| +    self.failUnless(count_best_cliques == 5)
 | 
| +
 | 
| +  def testAllInUberClique(self):
 | 
| +    resources = grd_reader.Parse(util.WrapInputStream(
 | 
| +      StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
 | 
| +<grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
 | 
| +  <release seq="3">
 | 
| +    <messages>
 | 
| +      <message name="IDS_GREETING" desc="Printed to greet the currently logged in user">
 | 
| +        Hello <ph name="USERNAME">%s<ex>Joi</ex></ph>, how are you doing today?
 | 
| +      </message>
 | 
| +    </messages>
 | 
| +    <structures>
 | 
| +      <structure type="dialog" name="IDD_ABOUTBOX" encoding="utf-16" file="grit/testdata/klonk.rc" />
 | 
| +      <structure type="tr_html" name="ID_HTML" file="grit/testdata/simple.html" />
 | 
| +    </structures>
 | 
| +  </release>
 | 
| +</grit>''')), util.PathFromRoot('.'))
 | 
| +    resources.RunGatherers(True)
 | 
| +    content_list = []
 | 
| +    for clique_list in resources.UberClique().cliques_.values():
 | 
| +      for clique in clique_list:
 | 
| +        content_list.append(clique.GetMessage().GetRealContent())
 | 
| +    self.failUnless('Hello %s, how are you doing today?' in content_list)
 | 
| +    self.failUnless('Jack "Black" Daniels' in content_list)
 | 
| +    self.failUnless('Hello!' in content_list)
 | 
| +
 | 
| +  def testCorrectExceptionIfWrongEncodingOnResourceFile(self):
 | 
| +    '''This doesn't really belong in this unittest file, but what the heck.'''
 | 
| +    resources = grd_reader.Parse(util.WrapInputStream(
 | 
| +      StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
 | 
| +<grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
 | 
| +  <release seq="3">
 | 
| +    <structures>
 | 
| +      <structure type="dialog" name="IDD_ABOUTBOX" file="grit/testdata/klonk.rc" />
 | 
| +    </structures>
 | 
| +  </release>
 | 
| +</grit>''')), util.PathFromRoot('.'))
 | 
| +    self.assertRaises(exception.SectionNotFound, resources.RunGatherers, True)
 | 
| +
 | 
| +  def testSemiIdenticalCliques(self):
 | 
| +    messages = [
 | 
| +      tclib.Message(text='Hello USERNAME',
 | 
| +                    placeholders=[tclib.Placeholder('USERNAME', '$1', 'Joi')]),
 | 
| +      tclib.Message(text='Hello USERNAME',
 | 
| +                    placeholders=[tclib.Placeholder('USERNAME', '%s', 'Joi')]),
 | 
| +    ]
 | 
| +    self.failUnless(messages[0].GetId() == messages[1].GetId())
 | 
| +
 | 
| +    # Both of the above would share a translation.
 | 
| +    translation = tclib.Translation(id=messages[0].GetId(),
 | 
| +                                    text='Bonjour USERNAME',
 | 
| +                                    placeholders=[tclib.Placeholder(
 | 
| +                                      'USERNAME', '$1', 'Joi')])
 | 
| +
 | 
| +    factory = clique.UberClique()
 | 
| +    cliques = [factory.MakeClique(msg) for msg in messages]
 | 
| +
 | 
| +    for clq in cliques:
 | 
| +      clq.AddTranslation(translation, 'fr')
 | 
| +
 | 
| +    self.failUnless(cliques[0].MessageForLanguage('fr').GetRealContent() ==
 | 
| +                    'Bonjour $1')
 | 
| +    self.failUnless(cliques[1].MessageForLanguage('fr').GetRealContent() ==
 | 
| +                    'Bonjour %s')
 | 
| +
 | 
| +  def testMissingTranslations(self):
 | 
| +    messages = [ tclib.Message(text='Hello'), tclib.Message(text='Goodbye') ]
 | 
| +    factory = clique.UberClique()
 | 
| +    cliques = [factory.MakeClique(msg) for msg in messages]
 | 
| +
 | 
| +    cliques[1].MessageForLanguage('fr', False, True)
 | 
| +
 | 
| +    self.failUnless(not factory.HasMissingTranslations())
 | 
| +
 | 
| +    cliques[0].MessageForLanguage('de', False, False)
 | 
| +
 | 
| +    self.failUnless(factory.HasMissingTranslations())
 | 
| +
 | 
| +    report = factory.MissingTranslationsReport()
 | 
| +    self.failUnless(report.count('WARNING') == 1)
 | 
| +    self.failUnless(report.count('8053599568341804890 "Goodbye" fr') == 1)
 | 
| +    self.failUnless(report.count('ERROR') == 1)
 | 
| +    self.failUnless(report.count('800120468867715734 "Hello" de') == 1)
 | 
| +
 | 
| +  def testCustomTypes(self):
 | 
| +    factory = clique.UberClique()
 | 
| +    message = tclib.Message(text='Bingo bongo')
 | 
| +    c = factory.MakeClique(message)
 | 
| +    try:
 | 
| +      c.SetCustomType(DummyCustomType())
 | 
| +      self.fail()
 | 
| +    except:
 | 
| +      pass  # expected case - 'Bingo bongo' does not start with 'jjj'
 | 
| +
 | 
| +    message = tclib.Message(text='jjjBingo bongo')
 | 
| +    c = factory.MakeClique(message)
 | 
| +    c.SetCustomType(util.NewClassInstance(
 | 
| +      'grit.clique_unittest.DummyCustomType', clique.CustomType))
 | 
| +    translation = tclib.Translation(id=message.GetId(), text='Bilingo bolongo')
 | 
| +    c.AddTranslation(translation, 'fr')
 | 
| +    self.failUnless(c.MessageForLanguage('fr').GetRealContent().startswith('jjj'))
 | 
| +
 | 
| +
 | 
| +class DummyCustomType(clique.CustomType):
 | 
| +  def Validate(self, message):
 | 
| +    return message.GetRealContent().startswith('jjj')
 | 
| +  def ValidateAndModify(self, lang, translation):
 | 
| +    is_ok = self.Validate(translation)
 | 
| +    self.ModifyEachTextPart(lang, translation)
 | 
| +  def ModifyTextPart(self, lang, text):
 | 
| +    return 'jjj%s' % text
 | 
| +
 | 
| +
 | 
| +if __name__ == '__main__':
 | 
| +  unittest.main()
 | 
| 
 | 
| Property changes on: grit/clique_unittest.py
 | 
| ___________________________________________________________________
 | 
| Added: svn:eol-style
 | 
|    + LF
 | 
| 
 | 
| 
 |