cmlenz@58: # -*- coding: utf-8 -*- cmlenz@58: # jruigrok@532: # Copyright (C) 2007-2011 Edgewall Software cmlenz@58: # All rights reserved. cmlenz@58: # cmlenz@58: # This software is licensed as described in the file COPYING, which cmlenz@58: # you should have received as part of this distribution. The terms cmlenz@58: # are also available at http://babel.edgewall.org/wiki/License. cmlenz@58: # cmlenz@58: # This software consists of voluntary contributions made by many cmlenz@58: # individuals. For the exact contribution history, see the revision cmlenz@58: # history and logs, available at http://babel.edgewall.org/log/. cmlenz@58: palgarvio@421: import copy palgarvio@421: import datetime cmlenz@58: import doctest cmlenz@58: import unittest cmlenz@58: cmlenz@58: from babel.messages import catalog cmlenz@58: cmlenz@58: cmlenz@58: class MessageTestCase(unittest.TestCase): cmlenz@58: cmlenz@58: def test_python_format(self): cmlenz@222: assert catalog.PYTHON_FORMAT.search('foo %d bar') cmlenz@222: assert catalog.PYTHON_FORMAT.search('foo %s bar') cmlenz@222: assert catalog.PYTHON_FORMAT.search('foo %r bar') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name).1f') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)3.3f') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)3f') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)06d') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)Li') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)#d') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)-4.4hs') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)*.3f') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name).*f') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)3.*f') cmlenz@227: assert catalog.PYTHON_FORMAT.search('foo %(name)*.*f') aronacher@360: assert catalog.PYTHON_FORMAT.search('foo %()s') palgarvio@107: palgarvio@82: def test_translator_comments(self): palgarvio@107: mess = catalog.Message('foo', user_comments=['Comment About `foo`']) palgarvio@202: self.assertEqual(mess.user_comments, ['Comment About `foo`']) palgarvio@82: mess = catalog.Message('foo', palgarvio@107: auto_comments=['Comment 1 About `foo`', palgarvio@82: 'Comment 2 About `foo`']) palgarvio@107: self.assertEqual(mess.auto_comments, ['Comment 1 About `foo`', palgarvio@82: 'Comment 2 About `foo`']) cmlenz@58: aronacher@360: def test_clone_message_object(self): aronacher@360: msg = catalog.Message('foo', locations=[('foo.py', 42)]) aronacher@360: clone = msg.clone() aronacher@360: clone.locations.append(('bar.py', 42)) aronacher@360: self.assertEqual(msg.locations, [('foo.py', 42)]) aronacher@361: msg.flags.add('fuzzy') aronacher@361: assert not clone.fuzzy and msg.fuzzy aronacher@360: cmlenz@58: cmlenz@71: class CatalogTestCase(unittest.TestCase): fschwarz@546: def test_add_returns_message_instance(self): fschwarz@546: cat = catalog.Catalog() fschwarz@546: message = cat.add('foo') fschwarz@546: self.assertEquals('foo', message.id) cmlenz@71: cmlenz@71: def test_two_messages_with_same_singular(self): cmlenz@71: cat = catalog.Catalog() cmlenz@71: cat.add('foo') cmlenz@71: cat.add(('foo', 'foos')) cmlenz@71: self.assertEqual(1, len(cat)) cmlenz@97: cmlenz@229: def test_duplicate_auto_comment(self): cmlenz@230: cat = catalog.Catalog() cmlenz@230: cat.add('foo', auto_comments=['A comment']) cmlenz@230: cat.add('foo', auto_comments=['A comment', 'Another comment']) cmlenz@230: self.assertEqual(['A comment', 'Another comment'], cmlenz@230: cat['foo'].auto_comments) cmlenz@229: cmlenz@229: def test_duplicate_user_comment(self): cmlenz@230: cat = catalog.Catalog() cmlenz@230: cat.add('foo', user_comments=['A comment']) cmlenz@230: cat.add('foo', user_comments=['A comment', 'Another comment']) cmlenz@230: self.assertEqual(['A comment', 'Another comment'], cmlenz@230: cat['foo'].user_comments) cmlenz@229: cmlenz@232: def test_duplicate_location(self): cmlenz@231: cat = catalog.Catalog() cmlenz@231: cat.add('foo', locations=[('foo.py', 1)]) cmlenz@231: cat.add('foo', locations=[('foo.py', 1)]) cmlenz@231: self.assertEqual([('foo.py', 1)], cat['foo'].locations) cmlenz@231: cmlenz@279: def test_update_message_changed_to_plural(self): cmlenz@279: cat = catalog.Catalog() cmlenz@279: cat.add(u'foo', u'Voh') cmlenz@279: tmpl = catalog.Catalog() cmlenz@279: tmpl.add((u'foo', u'foos')) cmlenz@279: cat.update(tmpl) cmlenz@279: self.assertEqual((u'Voh', ''), cat['foo'].string) cmlenz@279: assert cat['foo'].fuzzy cmlenz@279: cmlenz@279: def test_update_message_changed_to_simple(self): cmlenz@279: cat = catalog.Catalog() cmlenz@279: cat.add((u'foo' u'foos'), (u'Voh', u'Vöhs')) cmlenz@279: tmpl = catalog.Catalog() cmlenz@279: tmpl.add(u'foo') cmlenz@279: cat.update(tmpl) cmlenz@279: self.assertEqual(u'Voh', cat['foo'].string) cmlenz@279: assert cat['foo'].fuzzy cmlenz@279: palgarvio@91: def test_update_message_updates_comments(self): palgarvio@91: cat = catalog.Catalog() palgarvio@91: cat[u'foo'] = catalog.Message('foo', locations=[('main.py', 5)]) palgarvio@107: self.assertEqual(cat[u'foo'].auto_comments, []) palgarvio@107: self.assertEqual(cat[u'foo'].user_comments, []) palgarvio@91: # Update cat[u'foo'] with a new location and a comment palgarvio@91: cat[u'foo'] = catalog.Message('foo', locations=[('main.py', 7)], palgarvio@107: user_comments=['Foo Bar comment 1']) palgarvio@107: self.assertEqual(cat[u'foo'].user_comments, ['Foo Bar comment 1']) palgarvio@91: # now add yet another location with another comment palgarvio@91: cat[u'foo'] = catalog.Message('foo', locations=[('main.py', 9)], palgarvio@202: auto_comments=['Foo Bar comment 2']) palgarvio@107: self.assertEqual(cat[u'foo'].auto_comments, ['Foo Bar comment 2']) cmlenz@71: cmlenz@167: def test_update_fuzzy_matching_with_case_change(self): cmlenz@167: cat = catalog.Catalog() cmlenz@167: cat.add('foo', 'Voh') cmlenz@167: cat.add('bar', 'Bahr') cmlenz@167: tmpl = catalog.Catalog() cmlenz@167: tmpl.add('Foo') cmlenz@183: cat.update(tmpl) cmlenz@183: self.assertEqual(1, len(cat.obsolete)) cmlenz@167: assert 'foo' not in cat cmlenz@167: cmlenz@167: self.assertEqual('Voh', cat['Foo'].string) cmlenz@167: self.assertEqual(True, cat['Foo'].fuzzy) cmlenz@167: cmlenz@167: def test_update_fuzzy_matching_with_char_change(self): cmlenz@167: cat = catalog.Catalog() cmlenz@167: cat.add('fo', 'Voh') cmlenz@167: cat.add('bar', 'Bahr') cmlenz@167: tmpl = catalog.Catalog() cmlenz@167: tmpl.add('foo') cmlenz@183: cat.update(tmpl) cmlenz@183: self.assertEqual(1, len(cat.obsolete)) cmlenz@167: assert 'fo' not in cat cmlenz@167: cmlenz@167: self.assertEqual('Voh', cat['foo'].string) cmlenz@167: self.assertEqual(True, cat['foo'].fuzzy) cmlenz@167: cmlenz@314: def test_update_fuzzy_matching_no_msgstr(self): cmlenz@314: cat = catalog.Catalog() cmlenz@314: cat.add('fo', '') cmlenz@314: tmpl = catalog.Catalog() cmlenz@314: tmpl.add('fo') cmlenz@314: tmpl.add('foo') cmlenz@314: cat.update(tmpl) cmlenz@314: assert 'fo' in cat cmlenz@314: assert 'foo' in cat cmlenz@314: cmlenz@314: self.assertEqual('', cat['fo'].string) cmlenz@314: self.assertEqual(False, cat['fo'].fuzzy) cmlenz@314: self.assertEqual(None, cat['foo'].string) cmlenz@314: self.assertEqual(False, cat['foo'].fuzzy) cmlenz@314: cmlenz@352: def test_update_fuzzy_matching_with_new_context(self): cmlenz@352: cat = catalog.Catalog() cmlenz@352: cat.add('foo', 'Voh') cmlenz@352: cat.add('bar', 'Bahr') cmlenz@352: tmpl = catalog.Catalog() cmlenz@352: tmpl.add('Foo', context='Menu') cmlenz@352: cat.update(tmpl) cmlenz@352: self.assertEqual(1, len(cat.obsolete)) cmlenz@352: assert 'foo' not in cat cmlenz@352: cmlenz@352: message = cat.get('Foo', 'Menu') cmlenz@352: self.assertEqual('Voh', message.string) cmlenz@352: self.assertEqual(True, message.fuzzy) cmlenz@352: self.assertEqual('Menu', message.context) cmlenz@352: cmlenz@352: def test_update_fuzzy_matching_with_changed_context(self): cmlenz@352: cat = catalog.Catalog() cmlenz@352: cat.add('foo', 'Voh', context='Menu|File') cmlenz@352: cat.add('bar', 'Bahr', context='Menu|File') cmlenz@352: tmpl = catalog.Catalog() cmlenz@352: tmpl.add('Foo', context='Menu|Edit') cmlenz@352: cat.update(tmpl) cmlenz@352: self.assertEqual(1, len(cat.obsolete)) cmlenz@352: assert cat.get('Foo', 'Menu|File') is None cmlenz@352: cmlenz@352: message = cat.get('Foo', 'Menu|Edit') cmlenz@352: self.assertEqual('Voh', message.string) cmlenz@352: self.assertEqual(True, message.fuzzy) cmlenz@352: self.assertEqual('Menu|Edit', message.context) cmlenz@352: cmlenz@314: def test_update_fuzzy_matching_no_cascading(self): cmlenz@314: cat = catalog.Catalog() cmlenz@314: cat.add('fo', 'Voh') cmlenz@314: cat.add('foo', 'Vohe') cmlenz@314: tmpl = catalog.Catalog() cmlenz@314: tmpl.add('fo') cmlenz@314: tmpl.add('foo') cmlenz@314: tmpl.add('fooo') cmlenz@314: cat.update(tmpl) cmlenz@314: assert 'fo' in cat cmlenz@314: assert 'foo' in cat cmlenz@314: cmlenz@314: self.assertEqual('Voh', cat['fo'].string) cmlenz@314: self.assertEqual(False, cat['fo'].fuzzy) cmlenz@314: self.assertEqual('Vohe', cat['foo'].string) cmlenz@314: self.assertEqual(False, cat['foo'].fuzzy) cmlenz@314: self.assertEqual('Vohe', cat['fooo'].string) cmlenz@314: self.assertEqual(True, cat['fooo'].fuzzy) cmlenz@314: cmlenz@167: def test_update_without_fuzzy_matching(self): cmlenz@167: cat = catalog.Catalog() cmlenz@167: cat.add('fo', 'Voh') cmlenz@167: cat.add('bar', 'Bahr') cmlenz@167: tmpl = catalog.Catalog() cmlenz@167: tmpl.add('foo') palgarvio@202: cat.update(tmpl, no_fuzzy_matching=True) cmlenz@183: self.assertEqual(2, len(cat.obsolete)) cmlenz@167: palgarvio@427: def test_fuzzy_matching_regarding_plurals(self): palgarvio@427: cat = catalog.Catalog() palgarvio@427: cat.add(('foo', 'foh'), ('foo', 'foh')) palgarvio@427: ru = copy.copy(cat) palgarvio@427: ru.locale = 'ru_RU' palgarvio@427: ru.update(cat) palgarvio@427: self.assertEqual(True, ru['foo'].fuzzy) palgarvio@427: ru = copy.copy(cat) palgarvio@427: ru.locale = 'ru_RU' palgarvio@427: ru['foo'].string = ('foh', 'fohh', 'fohhh') palgarvio@427: ru.update(cat) palgarvio@427: self.assertEqual(False, ru['foo'].fuzzy) palgarvio@427: cmlenz@315: def test_update_no_template_mutation(self): cmlenz@315: tmpl = catalog.Catalog() cmlenz@315: tmpl.add('foo') cmlenz@315: cat1 = catalog.Catalog() cmlenz@315: cat1.add('foo', 'Voh') cmlenz@315: cat1.update(tmpl) cmlenz@315: cat2 = catalog.Catalog() cmlenz@315: cat2.update(tmpl) cmlenz@315: cmlenz@315: self.assertEqual(None, cat2['foo'].string) cmlenz@315: self.assertEqual(False, cat2['foo'].fuzzy) palgarvio@421: palgarvio@421: def test_update_po_updates_pot_creation_date(self): palgarvio@421: template = catalog.Catalog() palgarvio@421: localized_catalog = copy.deepcopy(template) palgarvio@421: localized_catalog.locale = 'de_DE' palgarvio@421: self.assertNotEqual(template.mime_headers, palgarvio@421: localized_catalog.mime_headers) palgarvio@421: self.assertEqual(template.creation_date, palgarvio@421: localized_catalog.creation_date) palgarvio@421: template.creation_date = datetime.datetime.now() - \ palgarvio@421: datetime.timedelta(minutes=5) palgarvio@421: localized_catalog.update(template) palgarvio@421: self.assertEqual(template.creation_date, palgarvio@421: localized_catalog.creation_date) palgarvio@424: palgarvio@424: def test_update_po_keeps_po_revision_date(self): palgarvio@424: template = catalog.Catalog() palgarvio@424: localized_catalog = copy.deepcopy(template) palgarvio@424: localized_catalog.locale = 'de_DE' palgarvio@424: fake_rev_date = datetime.datetime.now() - datetime.timedelta(days=5) palgarvio@424: localized_catalog.revision_date = fake_rev_date palgarvio@424: self.assertNotEqual(template.mime_headers, palgarvio@424: localized_catalog.mime_headers) palgarvio@424: self.assertEqual(template.creation_date, palgarvio@424: localized_catalog.creation_date) palgarvio@424: template.creation_date = datetime.datetime.now() - \ palgarvio@424: datetime.timedelta(minutes=5) palgarvio@424: localized_catalog.update(template) palgarvio@424: self.assertEqual(localized_catalog.revision_date, fake_rev_date) cmlenz@71: jruigrok@429: def test_stores_datetime_correctly(self): jruigrok@429: localized = catalog.Catalog() jruigrok@429: localized.locale = 'de_DE' jruigrok@429: localized[''] = catalog.Message('', jruigrok@429: "POT-Creation-Date: 2009-03-09 15:47-0700\n" + jruigrok@429: "PO-Revision-Date: 2009-03-09 15:47-0700\n") jruigrok@429: for key, value in localized.mime_headers: jruigrok@429: if key in ('POT-Creation-Date', 'PO-Revision-Date'): jruigrok@429: self.assertEqual(value, '2009-03-09 15:47-0700') cmlenz@352: cmlenz@58: def suite(): cmlenz@58: suite = unittest.TestSuite() jruigrok@468: if hasattr(doctest, 'ELLIPSIS'): jruigrok@468: suite.addTest(doctest.DocTestSuite(catalog, optionflags=doctest.ELLIPSIS)) jruigrok@468: else: jruigrok@468: suite.addTest(doctest.DocTestSuite(catalog)) cmlenz@58: suite.addTest(unittest.makeSuite(MessageTestCase)) cmlenz@71: suite.addTest(unittest.makeSuite(CatalogTestCase)) cmlenz@58: return suite cmlenz@58: cmlenz@58: if __name__ == '__main__': cmlenz@58: unittest.main(defaultTest='suite')