|  | 
| 1 | 1 | """Tests for the Tools/i18n/msgfmt.py tool.""" | 
| 2 |  | - | 
|  | 2 | +import filecmp | 
| 3 | 3 | import os | 
|  | 4 | +import shutil | 
| 4 | 5 | import sys | 
| 5 | 6 | import unittest | 
| 6 | 7 | from gettext import GNUTranslations | 
| @@ -131,126 +132,6 @@ class Test_multi_input(unittest.TestCase): | 
| 131 | 132 | 
 | 
| 132 | 133 |     script = os.path.join(toolsdir, 'i18n', 'msgfmt.py') | 
| 133 | 134 | 
 | 
| 134 |  | -    # binary contents of tiny po files | 
| 135 |  | -    # windows end of lines for first one | 
| 136 |  | -    file1_fr_po = b'''# French translations for python package.\r | 
| 137 |  | -# Copyright (C) 2018 THE python\'S COPYRIGHT HOLDER\r | 
| 138 |  | -# This file is distributed under the same license as the python package.\r | 
| 139 |  | -# s-ball <[email protected]>, 2018.\r | 
| 140 |  | -#\r | 
| 141 |  | -msgid ""\r | 
| 142 |  | -msgstr ""\r | 
| 143 |  | -"Project-Id-Version: python 3.8\\n"\r | 
| 144 |  | -"Report-Msgid-Bugs-To: \\n"\r | 
| 145 |  | -"POT-Creation-Date: 2018-11-30 23:46+0100\\n"\r | 
| 146 |  | -"PO-Revision-Date: 2018-11-30 23:47+0100\\n"\r | 
| 147 |  | -"Last-Translator: s-ball <[email protected]>\\n"\r | 
| 148 |  | -"Language-Team: French\\n"\r\n"Language: fr\\n"\r | 
| 149 |  | -"MIME-Version: 1.0\\n"\r | 
| 150 |  | -"Content-Type: text/plain; charset=UTF-8\\n"\r | 
| 151 |  | -"Content-Transfer-Encoding: 8bit\\n"\r | 
| 152 |  | -"Plural-Forms: nplurals=2; plural=(n > 1);\\n"\r | 
| 153 |  | -\r | 
| 154 |  | -#: file1.py:6\r | 
| 155 |  | -msgid "Hello!"\r | 
| 156 |  | -msgstr "Bonjour !"\r | 
| 157 |  | -\r | 
| 158 |  | -#: file1.py:7\r | 
| 159 |  | -#, python-brace-format\r | 
| 160 |  | -msgid "{n} horse"\r | 
| 161 |  | -msgid_plural "{n} horses"\r | 
| 162 |  | -msgstr[0] "{n} cheval"\r | 
| 163 |  | -msgstr[1] "{n} chevaux"\r | 
| 164 |  | -''' | 
| 165 |  | - | 
| 166 |  | -    # Unix end of file and a non ascii character for second one | 
| 167 |  | -    file2_fr_po = rb'''# French translations for python package. | 
| 168 |  | -# Copyright (C) 2018 THE python'S COPYRIGHT HOLDER | 
| 169 |  | -# This file is distributed under the same license as the python package. | 
| 170 |  | -# s-ball <[email protected]>, 2018. | 
| 171 |  | -# | 
| 172 |  | -msgid "" | 
| 173 |  | -msgstr "" | 
| 174 |  | -"Project-Id-Version: python 3.8\n" | 
| 175 |  | -"Report-Msgid-Bugs-To: \n" | 
| 176 |  | -"POT-Creation-Date: 2018-11-30 23:57+0100\n" | 
| 177 |  | -"PO-Revision-Date: 2018-11-30 23:57+0100\n" | 
| 178 |  | -"Last-Translator: s-ball <[email protected]>\n" | 
| 179 |  | -"Language-Team: French\n" | 
| 180 |  | -"Language: fr\n" | 
| 181 |  | -"MIME-Version: 1.0\n" | 
| 182 |  | -"Content-Type: text/plain; charset=UTF-8\n" | 
| 183 |  | -"Content-Transfer-Encoding: 8bit\n" | 
| 184 |  | -"Plural-Forms: nplurals=2; plural=(n > 1);\n" | 
| 185 |  | -
 | 
| 186 |  | -#: file2.py:6 | 
| 187 |  | -msgid "It's over." | 
| 188 |  | -msgstr "C'est termin\xc3\xa9." | 
| 189 |  | -
 | 
| 190 |  | -#: file2.py:7 | 
| 191 |  | -msgid "Bye..." | 
| 192 |  | -msgstr "Au revoir ..." | 
| 193 |  | -''' | 
| 194 |  | - | 
| 195 |  | -    # binary contents of corresponding compiled mo files | 
| 196 |  | -    file1_fr_mo = ( | 
| 197 |  | -        b'\xde\x12\x04\x95\x00\x00\x00\x00\x03\x00\x00\x00\x1c' | 
| 198 |  | -        b'\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | 
| 199 |  | -        b'\x00\x00\x00\x00\x00L\x00\x00\x00\x06\x00\x00\x00M' | 
| 200 |  | -        b'\x00\x00\x00\x14\x00\x00\x00T\x00\x00\x00[\x01\x00' | 
| 201 |  | -        b'\x00i\x00\x00\x00\t\x00\x00\x00\xc5\x01\x00\x00\x16' | 
| 202 |  | -        b'\x00\x00\x00\xcf\x01\x00\x00\x00Hello!\x00{n} horse' | 
| 203 |  | -        b'\x00{n} horses\x00Project-Id-Version: python 3.8\n' | 
| 204 |  | -        b'Report-Msgid-Bugs-To: \nPOT-Creation-Date: 2018-11-30 ' | 
| 205 |  | -        b'23:46+0100\nPO-Revision-Date: 2018-11-30 23:47+0100\n' | 
| 206 |  | -        b'Last-Translator: s-ball <[email protected]>\n' | 
| 207 |  | -        b'Language-Team: French\nLanguage: fr\nMIME-Version: 1.0' | 
| 208 |  | -        b'\nContent-Type: text/plain; charset=UTF-8\nContent-' | 
| 209 |  | -        b'Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2' | 
| 210 |  | -        b'; plural=(n > 1);\n\x00Bonjour !\x00{n} cheval\x00{n' | 
| 211 |  | -        b'} chevaux\x00' | 
| 212 |  | -    ) | 
| 213 |  | -    file2_fr_mo = ( | 
| 214 |  | -        b"\xde\x12\x04\x95\x00\x00\x00\x00\x03\x00\x00\x00" | 
| 215 |  | -        b"\x1c\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00\x00" | 
| 216 |  | -        b"\x00\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x06\x00" | 
| 217 |  | -        b"\x00\x00M\x00\x00\x00\n\x00\x00\x00T\x00\x00\x00[" | 
| 218 |  | -        b"\x01\x00\x00_\x00\x00\x00\r\x00\x00\x00\xbb\x01" | 
| 219 |  | -        b"\x00\x00\x0f\x00\x00\x00\xc9\x01\x00\x00\x00Bye.." | 
| 220 |  | -        b".\x00It's over.\x00Project-Id-Version: python 3.8" | 
| 221 |  | -        b"\nReport-Msgid-Bugs-To: \nPOT-Creation-Date: 2018" | 
| 222 |  | -        b"-11-30 23:57+0100\nPO-Revision-Date: 2018-11-30 2" | 
| 223 |  | -        b"3:57+0100\nLast-Translator: s-ball <s-ball@lapost" | 
| 224 |  | -        b"e.net>\nLanguage-Team: French\nLanguage: fr\nMIME" | 
| 225 |  | -        b"-Version: 1.0\nContent-Type: text/plain; charset=" | 
| 226 |  | -        b"UTF-8\nContent-Transfer-Encoding: 8bit\nPlural-Fo" | 
| 227 |  | -        b"rms: nplurals=2; plural=(n > 1);\n\x00Au revoir ." | 
| 228 |  | -        b"..\x00C'est termin\xc3\xa9.\x00" | 
| 229 |  | -    ) | 
| 230 |  | - | 
| 231 |  | -    # content of merging both po files keeping second header | 
| 232 |  | -    file12_fr_mo = ( | 
| 233 |  | -        b"\xde\x12\x04\x95\x00\x00\x00\x00\x05\x00\x00\x00" | 
| 234 |  | -        b"\x1c\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00\x00" | 
| 235 |  | -        b"\x00\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x06\x00" | 
| 236 |  | -        b"\x00\x00m\x00\x00\x00\x06\x00\x00\x00t\x00\x00\x00" | 
| 237 |  | -        b"\n\x00\x00\x00{\x00\x00\x00\x14\x00\x00\x00\x86" | 
| 238 |  | -        b"\x00\x00\x00[\x01\x00\x00\x9b\x00\x00\x00\r\x00" | 
| 239 |  | -        b"\x00\x00\xf7\x01\x00\x00\t\x00\x00\x00\x05\x02\x00" | 
| 240 |  | -        b"\x00\x0f\x00\x00\x00\x0f\x02\x00\x00\x16\x00\x00" | 
| 241 |  | -        b"\x00\x1f\x02\x00\x00\x00Bye...\x00Hello!\x00It's " | 
| 242 |  | -        b"over.\x00{n} horse\x00{n} horses\x00Project-Id-Ver" | 
| 243 |  | -        b"sion: python 3.8\nReport-Msgid-Bugs-To: \nPOT-Crea" | 
| 244 |  | -        b"tion-Date: 2018-11-30 23:57+0100\nPO-Revision-Date" | 
| 245 |  | -        b": 2018-11-30 23:57+0100\nLast-Translator: s-ball <" | 
| 246 |  | -        b"[email protected]>\nLanguage-Team: French\nLangua" | 
| 247 |  | -        b"ge: fr\nMIME-Version: 1.0\nContent-Type: text/plai" | 
| 248 |  | -        b"n; charset=UTF-8\nContent-Transfer-Encoding: 8bit" | 
| 249 |  | -        b"\nPlural-Forms: nplurals=2; plural=(n > 1);\n\x00A" | 
| 250 |  | -        b"u revoir ...\x00Bonjour !\x00C'est termin\xc3\xa9." | 
| 251 |  | -        b"\x00{n} cheval\x00{n} chevaux\x00" | 
| 252 |  | -    ) | 
| 253 |  | - | 
| 254 | 135 |     def imp(self): | 
| 255 | 136 |         i18ndir = os.path.join(toolsdir, 'i18n') | 
| 256 | 137 |         sys.path.append(i18ndir) | 
| @@ -279,50 +160,48 @@ def test_wrong(self): | 
| 279 | 160 |     def test_outputfile(self): | 
| 280 | 161 |         """Test script with -o option - 1 single file, Windows EOL""" | 
| 281 | 162 |         with temp_cwd(None): | 
| 282 |  | -            with open("file1_fr.po", "wb") as out: | 
| 283 |  | -                out.write(self.file1_fr_po) | 
| 284 |  | -            assert_python_ok(self.script, '-o', 'file1.mo', 'file1_fr.po') | 
| 285 |  | -            with open('file1.mo', 'rb') as fin: | 
| 286 |  | -                self.assertEqual(self.file1_fr_mo, fin.read()) | 
|  | 163 | +            assert_python_ok(self.script, '-o', 'file1.mo', | 
|  | 164 | +                             data_dir / 'file1_fr.po') | 
|  | 165 | +            self.assertTrue( | 
|  | 166 | +                filecmp.cmp(data_dir / 'file1_fr.mo', 'file1.mo'), | 
|  | 167 | +                'Wrong compiled file1_fr.mo') | 
| 287 | 168 | 
 | 
| 288 | 169 |     def test_no_outputfile(self): | 
| 289 | 170 |         """Test script without -o option - 1 single file, Unix EOL""" | 
| 290 | 171 |         with temp_cwd(None): | 
| 291 |  | -            with open("file2_fr.po", "wb") as out: | 
| 292 |  | -                out.write(self.file2_fr_po) | 
|  | 172 | +            shutil.copy(data_dir / 'file2_fr.po', '.') | 
| 293 | 173 |             assert_python_ok(self.script, 'file2_fr.po') | 
| 294 |  | -            with open('file2_fr.mo', 'rb') as fin: | 
| 295 |  | -                self.assertEqual(self.file2_fr_mo, fin.read()) | 
|  | 174 | +            self.assertTrue( | 
|  | 175 | +                filecmp.cmp(data_dir / 'file2_fr.mo', 'file2_fr.mo'), | 
|  | 176 | +                'Wrong compiled file2_fr.mo') | 
| 296 | 177 | 
 | 
| 297 | 178 |     def test_both_with_outputfile(self): | 
| 298 | 179 |         """Test script with -o option and 2 input files""" | 
| 299 | 180 |         # msgfmt.py version 1.2 behaviour is to correctly merge the input | 
| 300 | 181 |         # files and to keep last entry when same entry occurs in more than | 
| 301 | 182 |         # one file | 
| 302 | 183 |         with temp_cwd(None): | 
| 303 |  | -            with open("file1_fr.po", "wb") as out: | 
| 304 |  | -                out.write(self.file1_fr_po) | 
| 305 |  | -            with open("file2_fr.po", "wb") as out: | 
| 306 |  | -                out.write(self.file2_fr_po) | 
| 307 |  | -            assert_python_ok(self.script, '-o', 'file1.mo', | 
| 308 |  | -                             'file1_fr.po', 'file2_fr.po') | 
| 309 |  | -            with open('file1.mo', 'rb') as fin: | 
| 310 |  | -                self.assertEqual(self.file12_fr_mo, fin.read()) | 
|  | 184 | +            assert_python_ok(self.script, '-o', 'file12.mo', | 
|  | 185 | +                             data_dir / 'file1_fr.po', | 
|  | 186 | +                             data_dir / 'file2_fr.po') | 
|  | 187 | +            self.assertTrue( | 
|  | 188 | +                filecmp.cmp(data_dir / 'file12_fr.mo', 'file12.mo'), | 
|  | 189 | +                'Wrong compiled file12.mo') | 
| 311 | 190 | 
 | 
| 312 | 191 |     def test_both_without_outputfile(self): | 
| 313 | 192 |         """Test script without -o option and 2 input files""" | 
| 314 | 193 |         # msgfmt.py version 1.2 behaviour was that second mo file | 
| 315 | 194 |         # also merged previous po files | 
| 316 | 195 |         with temp_cwd(None): | 
| 317 |  | -            with open("file1_fr.po", "wb") as out: | 
| 318 |  | -                out.write(self.file1_fr_po) | 
| 319 |  | -            with open("file2_fr.po", "wb") as out: | 
| 320 |  | -                out.write(self.file2_fr_po) | 
|  | 196 | +            shutil.copy(data_dir /'file1_fr.po', '.') | 
|  | 197 | +            shutil.copy(data_dir /'file2_fr.po', '.') | 
| 321 | 198 |             assert_python_ok(self.script, 'file1_fr.po', 'file2_fr.po') | 
| 322 |  | -            with open('file1_fr.mo', 'rb') as fin: | 
| 323 |  | -                self.assertEqual(self.file1_fr_mo, fin.read()) | 
| 324 |  | -            with open('file2_fr.mo', 'rb') as fin: | 
| 325 |  | -                self.assertEqual(self.file2_fr_mo, fin.read()) | 
|  | 199 | +            self.assertTrue( | 
|  | 200 | +                filecmp.cmp(data_dir / 'file1_fr.mo', 'file1_fr.mo'), | 
|  | 201 | +                'Wrong compiled file1_fr.mo') | 
|  | 202 | +            self.assertTrue( | 
|  | 203 | +                filecmp.cmp(data_dir / 'file2_fr.mo', 'file2_fr.mo'), | 
|  | 204 | +                'Wrong compiled file2_fr.mo') | 
| 326 | 205 | 
 | 
| 327 | 206 |     def test_consecutive_make_calls(self): | 
| 328 | 207 |         """Directly calls make twice to prove bpo-9741 is fixed""" | 
|  | 
0 commit comments