3131import os .path
3232import unittest
3333from datetime import datetime , timedelta
34+ from io import BytesIO
3435
3536import babel .dates
37+ from babel .messages import Catalog
38+ from babel .messages .mofile import write_mo
3639
3740from cms .locale import Translation , DEFAULT_TRANSLATION , filter_language_codes , \
3841 choose_language_code
4144UTC = babel .dates .UTC
4245ROME = babel .dates .get_timezone ("Europe/Rome" )
4346
47+ FRENCH_CATALOG = Catalog (locale = "fr" )
48+ FRENCH_CATALOG .add ("%s KiB" , "%s Kio" )
49+ FRENCH_CATALOG .add ("%s MiB" , "%s Mio" )
50+ FRENCH_CATALOG .add ("%s GiB" , "%s Gio" )
51+ FRENCH_CATALOG .add ("%s TiB" , "%s Tio" )
52+ FRENCH_CATALOG_BUF = BytesIO ()
53+ write_mo (FRENCH_CATALOG_BUF , FRENCH_CATALOG )
54+ FRENCH_CATALOG_BUF .seek (0 )
55+
4456ENGLISH = DEFAULT_TRANSLATION
4557BRITISH_ENGLISH = Translation ("en_GB" )
46- FRENCH = Translation ("fr" )
58+ FRENCH = Translation ("fr" , mofile = FRENCH_CATALOG_BUF )
4759HINDI = Translation ("hi" )
4860ITALIAN = Translation ("it" )
4961NORWEGIAN = Translation ("no" )
@@ -450,36 +462,36 @@ class TestFormatSize(unittest.TestCase):
450462 def test_zero (self ):
451463 # Corner case.
452464 self .assertEqual (ENGLISH .format_size (0 ),
453- "0 byte " )
465+ "0 bytes " )
454466
455467 def test_small_values (self ):
456468 # Note that there is no singular/plural.
457469 self .assertEqual (ENGLISH .format_size (1 ),
458470 "1 byte" )
459471 self .assertEqual (ENGLISH .format_size (2 ),
460- "2 byte " )
472+ "2 bytes " )
461473
462474 def test_cutoff (self ):
463475 # Cutoff is at 1000, not 1024, as we use kilo, mega, ... rather
464476 # than kibi, mebi, ...
465477 self .assertEqual (ENGLISH .format_size (999 ),
466- "999 byte " )
478+ "999 bytes " )
467479 self .assertEqual (ENGLISH .format_size (1000 ),
468- "1.00 kB " )
480+ "1,000 bytes " )
469481 self .assertEqual (ENGLISH .format_size (1024 ),
470- "1.02 kB " )
482+ "1.00 KiB " )
471483
472484 def test_large (self ):
473485 # Ensure larger units are used for larger values, with rounding
474486 # to three significant digits, up to terabytes.
475487 self .assertEqual (ENGLISH .format_size (2.345 * 1000000 ),
476- "2.34 MB " )
488+ "2.24 MiB " )
477489 self .assertEqual (ENGLISH .format_size (34.567 * 1000000000 ),
478- "34.6 GB " )
490+ "32.2 GiB " )
479491 self .assertEqual (ENGLISH .format_size (456.789 * 1000000000000 ),
480- "457 TB " )
492+ "415 TiB " )
481493 self .assertEqual (ENGLISH .format_size (5678.9 * 1000000000000 ),
482- "5,679 TB " )
494+ "5,165 TiB " )
483495
484496 # As above, localized (use French as it's sensibly different).
485497
@@ -491,25 +503,25 @@ def test_localized_small_values(self):
491503 self .assertEqual (FRENCH .format_size (1 ),
492504 "1 octet" )
493505 self .assertEqual (FRENCH .format_size (2 ),
494- "2 octet " )
506+ "2 octets " )
495507
496508 def test_localized_cutoff (self ):
497509 self .assertEqual (FRENCH .format_size (999 ),
498- "999 octet " )
510+ "999 octets " )
499511 self .assertEqual (FRENCH .format_size (1000 ),
500- "1,00 ko " )
512+ "1\N{NO-BREAK SPACE} 000 octets " )
501513 self .assertEqual (FRENCH .format_size (1024 ),
502- "1,02 ko " )
514+ "1,00 Kio " )
503515
504516 def test_localized_large (self ):
505517 self .assertEqual (FRENCH .format_size (2.345 * 1000000 ),
506- "2,34 Mo " )
518+ "2,24 Mio " )
507519 self .assertEqual (FRENCH .format_size (34.567 * 1000000000 ),
508- "34,6 Go " )
520+ "32,2 Gio " )
509521 self .assertEqual (FRENCH .format_size (456.789 * 1000000000000 ),
510- "457 To " )
522+ "415 Tio " )
511523 self .assertEqual (FRENCH .format_size (5678.9123 * 1000000000000 ),
512- "5\N{NO-BREAK SPACE} 679 To " )
524+ "5\N{NO-BREAK SPACE} 165 Tio " )
513525
514526
515527class TestFormatDecimal (unittest .TestCase ):
0 commit comments