pytils/test/test_numeral.py
author pythy <the.pythy@gmail.com>
Mon Sep 22 23:42:30 2008 +0700 (5 weeks ago)
changeset 105 1ff4355c8413
parent 72d22e10a3ca9d
permissions -rw-r--r--
Make .hgignore
     1 # -*- coding: utf-8 -*-
     2 # pytils - russian-specific string utils
     3 # Copyright (C) 2006-2008  Yury Yurevich
     4 #
     5 # /projects/pytils/
     6 #
     7 # This program is free software; you can redistribute it and/or
     8 # modify it under the terms of the GNU General Public License
     9 # as published by the Free Software Foundation, version 2
    10 # of the License.
    11 #
    12 # This program is distributed in the hope that it will be useful,
    13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
    14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15 # GNU General Public License for more details.
    16 """
    17 Unit-tests for pytils.numeral
    18 """
    19 
    20 import unittest
    21 import pytils
    22 
    23 class ChoosePluralTestCase(unittest.TestCase):
    24     """
    25     Test case for pytils.numeral.choose_plural
    26     """
    27 
    28     def setUp(self):
    29         """
    30         Setting up environment for tests
    31         """
    32         self.variants = (u"гвоздь", u"гвоздя", u"гвоздей")
    33 
    34     def checkChoosePlural(self, amount, estimated):
    35         """
    36         Checks choose_plural
    37         """
    38         self.assertEquals(pytils.numeral.choose_plural(amount, self.variants),
    39                           estimated)
    40     
    41     def testChoosePlural(self):
    42         """
    43         Unit-test for choose_plural
    44         """
    45         self.checkChoosePlural(1, u"гвоздь")
    46         self.checkChoosePlural(2, u"гвоздя")
    47         self.checkChoosePlural(3, u"гвоздя")
    48         self.checkChoosePlural(5, u"гвоздей")
    49         self.checkChoosePlural(11, u"гвоздей")
    50         self.checkChoosePlural(109, u"гвоздей")
    51         self.checkChoosePlural(109l, u"гвоздей")
    52 
    53     def testChoosePluralExceptions(self):
    54         """
    55         Unit-test for testing choos_plural's exceptions
    56         """
    57         self.assertRaises(TypeError, pytils.numeral.choose_plural,
    58                           "25", u"any,bene,raba")
    59         self.assertRaises(TypeError, pytils.numeral.choose_plural,
    60                           25, 30)
    61         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.choose_plural,
    62                           "25", u"any,bene,raba")
    63         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.choose_plural,
    64                           25, 30)
    65         self.assertRaises(ValueError, pytils.numeral.choose_plural,
    66                           25, u"any,bene")
    67         self.assertRaises(ValueError, pytils.numeral.choose_plural,
    68                           -25, u"any,bene,raba")
    69 
    70     def testChoosePluralVariantsInStr(self):
    71         """
    72         Tests new-style variants
    73         """
    74         self.assertEquals(
    75             pytils.numeral.choose_plural(1,u"гвоздь,гвоздя, гвоздей"),
    76             u"гвоздь")
    77         self.assertEquals(
    78             pytils.numeral.choose_plural(5,u"гвоздь, гвоздя, гвоздей\, шпунтов"),
    79             u"гвоздей, шпунтов")
    80 
    81 class GetPluralTestCase(unittest.TestCase):
    82     """
    83     Test case for get_plural
    84     """
    85     def testGetPlural(self):
    86         """
    87         Test regular get_plural
    88         """
    89         self.assertEquals(
    90             pytils.numeral.get_plural(1, u"комментарий, комментария, комментариев"),
    91             u"1 комментарий")
    92         self.assertEquals(
    93             pytils.numeral.get_plural(0, u"комментарий, комментария, комментариев"),
    94             u"0 комментариев")
    95         
    96     def testGetPluralAbsence(self):
    97         """
    98         Test get_plural with absence
    99         """
   100         self.assertEquals(
   101             pytils.numeral.get_plural(1, u"комментарий, комментария, комментариев",
   102                                       u"без комментариев"),
   103             u"1 комментарий")
   104         self.assertEquals(
   105             pytils.numeral.get_plural(0, u"комментарий, комментария, комментариев",
   106                                       u"без комментариев"),
   107             u"без комментариев")
   108 
   109     def testGetPluralLegacy(self):
   110         """
   111         Test _get_plural_legacy
   112         """
   113         self.assertEquals(
   114             pytils.numeral._get_plural_legacy(1, u"комментарий, комментария, комментариев"),
   115             u"1 комментарий")
   116         self.assertEquals(
   117             pytils.numeral._get_plural_legacy(0, u"комментарий, комментария, комментариев"),
   118             u"0 комментариев")
   119         self.assertEquals(
   120             pytils.numeral._get_plural_legacy(1, u"комментарий, комментария, комментариев, без комментариев"),
   121             u"1 комментарий")
   122         self.assertEquals(
   123             pytils.numeral._get_plural_legacy(0, u"комментарий, комментария, комментариев, без комментариев"),
   124             u"без комментариев")
   125         
   126 
   127 class GetFloatRemainderTestCase(unittest.TestCase):
   128     """
   129     Test case for pytils.numeral._get_float_remainder
   130     """
   131 
   132     def testFloatRemainder(self):
   133         """
   134         Unit-test for _get_float_remainder
   135         """        
   136         self.assertEquals(pytils.numeral._get_float_remainder(1.3),
   137                           '3')
   138         self.assertEquals(pytils.numeral._get_float_remainder(2.35, 1),
   139                           '4')
   140         self.assertEquals(pytils.numeral._get_float_remainder(123.1234567891),
   141                           '123456789')
   142         self.assertEquals(pytils.numeral._get_float_remainder(2.353, 2),
   143                           '35')
   144         self.assertEquals(pytils.numeral._get_float_remainder(0.01),
   145                           '01')
   146         self.assertEquals(pytils.numeral._get_float_remainder(5),
   147                           '0')
   148 
   149     def testFloatRemainderExceptions(self):
   150         """
   151         Unit-test for testing _get_float_remainder's exceptions
   152         """
   153         self.assertRaises(ValueError, pytils.numeral._get_float_remainder,
   154                           2.998, 2)
   155         self.assertRaises(TypeError, pytils.numeral._get_float_remainder, "1.23")
   156         self.assertRaises(pytils.err.InputParameterError, pytils.numeral._get_float_remainder, "1.23")
   157         self.assertRaises(ValueError, pytils.numeral._get_float_remainder, -1.23)
   158 
   159 class RublesTestCase(unittest.TestCase):
   160     """
   161     Test case for pytils.numeral.rubles
   162     """
   163 
   164     def testRubles(self):
   165         """
   166         Unit-test for rubles
   167         """        
   168         self.assertEquals(pytils.numeral.rubles(10.01),
   169                           u"десять рублей одна копейка")
   170         self.assertEquals(pytils.numeral.rubles(10.10),
   171                           u"десять рублей десять копеек")
   172         self.assertEquals(pytils.numeral.rubles(2.353),
   173                           u"два рубля тридцать пять копеек")
   174         self.assertEquals(pytils.numeral.rubles(2.998),
   175                           u"три рубля")
   176         self.assertEquals(pytils.numeral.rubles(3),
   177                           u"три рубля")
   178         self.assertEquals(pytils.numeral.rubles(3, True),
   179                           u"три рубля ноль копеек")
   180         self.assertEquals(pytils.numeral.rubles(3l),
   181                           u"три рубля")
   182 
   183     def testRublesExceptions(self):
   184         """
   185         Unit-test for testing rubles' exceptions
   186         """
   187         self.assertRaises(TypeError, pytils.numeral.rubles, "3")
   188         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.rubles, "3")
   189         self.assertRaises(ValueError, pytils.numeral.rubles, -15)
   190         
   191 
   192 class InWordsTestCase(unittest.TestCase):
   193     """
   194     Test case for pytils.numeral.in_words
   195     """
   196 
   197     def testInt(self):
   198         """
   199         Unit-test for in_words_int
   200         """                
   201         self.assertEquals(pytils.numeral.in_words_int(10), u"десять")
   202         self.assertEquals(pytils.numeral.in_words_int(5), u"пять")
   203         self.assertEquals(pytils.numeral.in_words_int(102), u"сто два")
   204         self.assertEquals(pytils.numeral.in_words_int(3521),
   205                           u"три тысячи пятьсот двадцать один")
   206         self.assertEquals(pytils.numeral.in_words_int(3500),
   207                           u"три тысячи пятьсот")
   208         self.assertEquals(pytils.numeral.in_words_int(5231000),
   209                           u"пять миллионов двести тридцать одна тысяча")
   210         self.assertEquals(pytils.numeral.in_words_int(10l), u"десять")
   211 
   212     def testIntExceptions(self):
   213         """
   214         Unit-test for testing in_words_int's exceptions
   215         """
   216         self.assertRaises(TypeError, pytils.numeral.in_words_int, 2.5)
   217         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.in_words_int, 2.5)
   218         self.assertRaises(ValueError, pytils.numeral.in_words_int, -3)
   219 
   220     def testFloat(self):
   221         """
   222         Unit-test for in_words_float
   223         """                
   224         self.assertEquals(pytils.numeral.in_words_float(10.0),
   225                           u"десять целых ноль десятых")
   226         self.assertEquals(pytils.numeral.in_words_float(2.25),
   227                           u"две целых двадцать пять сотых")
   228         self.assertEquals(pytils.numeral.in_words_float(0.01),
   229                           u"ноль целых одна сотая")
   230         self.assertEquals(pytils.numeral.in_words_float(0.10),
   231                           u"ноль целых одна десятая")
   232 
   233     def testFloatExceptions(self):
   234         """
   235         Unit-test for testing in_words_float's exceptions
   236         """
   237         self.assertRaises(TypeError, pytils.numeral.in_words_float, '2')
   238         self.assertRaises(TypeError, pytils.numeral.in_words_float, 2)
   239         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.in_words_float, '2')
   240         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.in_words_float, 2)
   241         self.assertRaises(ValueError, pytils.numeral.in_words_float, -2.3)        
   242 
   243     def testWithGenderOldStyle(self):
   244         """
   245         Unit-test for in_words_float with gender (old-style, i.e. ints)
   246         """
   247         self.assertEquals(pytils.numeral.in_words(21, 1),
   248                           u"двадцать один")
   249         self.assertEquals(pytils.numeral.in_words(21, 2),
   250                           u"двадцать одна")
   251         self.assertEquals(pytils.numeral.in_words(21, 3),
   252                           u"двадцать одно")
   253         # на дробные пол не должен влиять - всегда в женском роде
   254         self.assertEquals(pytils.numeral.in_words(21.0, 1),
   255                           u"двадцать одна целая ноль десятых")
   256         self.assertEquals(pytils.numeral.in_words(21.0, 2),
   257                           u"двадцать одна целая ноль десятых")
   258         self.assertEquals(pytils.numeral.in_words(21.0, 3),
   259                           u"двадцать одна целая ноль десятых")
   260         self.assertEquals(pytils.numeral.in_words(21l, 1),
   261                           u"двадцать один")
   262 
   263     def testWithGender(self):
   264         """
   265         Unit-test for in_words_float with gender (old-style, i.e. ints)
   266         """
   267         self.assertEquals(pytils.numeral.in_words(21, pytils.numeral.MALE),
   268                           u"двадцать один")
   269         self.assertEquals(pytils.numeral.in_words(21, pytils.numeral.FEMALE),
   270                           u"двадцать одна")
   271         self.assertEquals(pytils.numeral.in_words(21, pytils.numeral.NEUTER),
   272                           u"двадцать одно")
   273         # на дробные пол не должен влиять - всегда в женском роде
   274         self.assertEquals(pytils.numeral.in_words(21.0, pytils.numeral.MALE),
   275                           u"двадцать одна целая ноль десятых")
   276         self.assertEquals(pytils.numeral.in_words(21.0, pytils.numeral.FEMALE),
   277                           u"двадцать одна целая ноль десятых")
   278         self.assertEquals(pytils.numeral.in_words(21.0, pytils.numeral.NEUTER),
   279                           u"двадцать одна целая ноль десятых")
   280         self.assertEquals(pytils.numeral.in_words(21l, pytils.numeral.MALE),
   281                           u"двадцать один")
   282 
   283 
   284     def testCommon(self):
   285         """
   286         Unit-test for general in_words
   287         """                
   288         self.assertEquals(pytils.numeral.in_words(10), u"десять")
   289         self.assertEquals(pytils.numeral.in_words(5), u"пять")
   290         self.assertEquals(pytils.numeral.in_words(102), u"сто два")
   291         self.assertEquals(pytils.numeral.in_words(3521),
   292                           u"три тысячи пятьсот двадцать один")
   293         self.assertEquals(pytils.numeral.in_words(3500),
   294                           u"три тысячи пятьсот")
   295         self.assertEquals(pytils.numeral.in_words(5231000),
   296                           u"пять миллионов двести тридцать одна тысяча")
   297         self.assertEquals(pytils.numeral.in_words(10.0),
   298                           u"десять целых ноль десятых")
   299         self.assertEquals(pytils.numeral.in_words(2.25),
   300                           u"две целых двадцать пять сотых")
   301         self.assertEquals(pytils.numeral.in_words(0.01),
   302                           u"ноль целых одна сотая")
   303         self.assertEquals(pytils.numeral.in_words(0.10),
   304                           u"ноль целых одна десятая")
   305         self.assertEquals(pytils.numeral.in_words(10l), u"десять")
   306 
   307     def testCommonExceptions(self):
   308         """
   309         Unit-test for testing in_words' exceptions
   310         """
   311         self.assertRaises(TypeError, pytils.numeral.in_words, "0.2")
   312         self.assertRaises(TypeError, pytils.numeral.in_words, 0.2, "1")
   313         self.assertRaises(TypeError, pytils.numeral.in_words, 0.2, 5)
   314         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.in_words, "0.2")
   315         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.in_words, 0.2, "1")
   316         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.in_words, 0.2, 5)
   317         self.assertRaises(ValueError, pytils.numeral.in_words, -2)
   318         
   319 
   320 class SumStringTestCase(unittest.TestCase):
   321     """
   322     Test case for pytils.numeral.sum_string
   323     """
   324     
   325     def setUp(self):
   326         """
   327         Setting up environment for tests
   328         """
   329         self.variants_male = (u"гвоздь", u"гвоздя", u"гвоздей")
   330         self.variants_female = (u"шляпка", u"шляпки", u"шляпок")
   331 
   332     def ckMaleOldStyle(self, amount, estimated):
   333         """
   334         Checks sum_string with male gender with old-style genders (i.e. ints)
   335         """
   336         self.assertEquals(pytils.numeral.sum_string(amount,
   337                                                     1,
   338                                                     self.variants_male),
   339                           estimated)
   340 
   341     def ckMale(self, amount, estimated):
   342         """
   343         Checks sum_string with male gender
   344         """
   345         self.assertEquals(pytils.numeral.sum_string(amount,
   346                                                     pytils.numeral.MALE,
   347                                                     self.variants_male),
   348                           estimated)
   349 
   350 
   351     def ckFemaleOldStyle(self, amount, estimated):
   352         """
   353         Checks sum_string with female gender wuth old-style genders (i.e. ints)
   354         """
   355         self.assertEquals(pytils.numeral.sum_string(amount,
   356                                                     2,
   357                                                     self.variants_female),
   358                           estimated)
   359 
   360     def ckFemale(self, amount, estimated):
   361         """
   362         Checks sum_string with female gender
   363         """
   364         self.assertEquals(pytils.numeral.sum_string(amount,
   365                                                     pytils.numeral.FEMALE,
   366                                                     self.variants_female),
   367                           estimated)
   368 
   369     def testSumStringOldStyleGender(self):
   370         """
   371         Unit-test for sum_string with old-style genders
   372         """
   373         self.ckMaleOldStyle(10, u"десять гвоздей")
   374         self.ckMaleOldStyle(2, u"два гвоздя")
   375         self.ckMaleOldStyle(31, u"тридцать один гвоздь")
   376         self.ckFemaleOldStyle(10, u"десять шляпок")
   377         self.ckFemaleOldStyle(2, u"две шляпки")
   378         self.ckFemaleOldStyle(31, u"тридцать одна шляпка")
   379         
   380         self.ckFemaleOldStyle(31l, u"тридцать одна шляпка")
   381 
   382         self.assertEquals(u"одиннадцать негритят",
   383                           pytils.numeral.sum_string(
   384                               11,
   385                               1,
   386                               u"негритенок,негритенка,негритят"
   387                               ))
   388 
   389     def testSumString(self):
   390         """
   391         Unit-test for sum_string
   392         """
   393         self.ckMale(10, u"десять гвоздей")
   394         self.ckMale(2, u"два гвоздя")
   395         self.ckMale(31, u"тридцать один гвоздь")
   396         self.ckFemale(10, u"десять шляпок")
   397         self.ckFemale(2, u"две шляпки")
   398         self.ckFemale(31, u"тридцать одна шляпка")
   399         
   400         self.ckFemale(31l, u"тридцать одна шляпка")
   401 
   402         self.assertEquals(u"одиннадцать негритят",
   403                           pytils.numeral.sum_string(
   404                               11,
   405                               pytils.numeral.MALE,
   406                               u"негритенок,негритенка,негритят"
   407                               ))
   408 
   409     def testSumStringExceptions(self):
   410         """
   411         Unit-test for testing sum_string's exceptions
   412         """
   413         self.assertRaises(TypeError, pytils.numeral.sum_string,
   414                                       "1", 1)
   415         self.assertRaises(TypeError, pytils.numeral.sum_string,
   416                                       1, "1")
   417         self.assertRaises(TypeError, pytils.numeral.sum_string,
   418                                       1, "1", 23)
   419         self.assertRaises(TypeError, pytils.numeral.sum_string,
   420                                       1, pytils.numeral.MALE, (23,24,25))
   421         self.assertRaises(TypeError, pytils.numeral.sum_string,
   422                                       1, pytils.numeral.MALE, (23,))
   423         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.sum_string,
   424                                       "1", 1)
   425         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.sum_string,
   426                                       1, "1")
   427         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.sum_string,
   428                                       1, "1", 23)
   429         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.sum_string,
   430                                       1, pytils.numeral.MALE, (23,24,25))
   431         self.assertRaises(pytils.err.InputParameterError, pytils.numeral.sum_string,
   432                                       1, pytils.numeral.MALE, (23,))
   433         self.assertRaises(ValueError, pytils.numeral.sum_string,
   434                                       -1, pytils.numeral.MALE, u"any,bene,raba")
   435 
   436 if __name__ == '__main__':
   437     unittest.main()