19e035921494cb8f101c3bfc22956fa968c6ab41fBarry Warsawimport os
2ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsawimport base64
39e035921494cb8f101c3bfc22956fa968c6ab41fBarry Warsawimport gettext
4d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisimport unittest
5a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
6ee8712cda46338d223509cc5751fd36509ad3860Benjamin Petersonfrom test import support
7a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
8004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
9d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# TODO:
10d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#  - Add new tests, for example for "dgettext"
11d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#  - Remove dummy tests, for example testing for single and double quotes
12d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#    has no sense, it would have if we were testing a parser (i.e. pygettext)
13d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#  - Tests should have only one assert.
1464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
1539478e852827a4ca6955151bf004c7a15099a4b1Guido van RossumGNU_MO_DATA = b'''\
16d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis3hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
17d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisAAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
18d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisAAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
19d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwiseW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
20d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisaGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
21d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisCnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
22d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisY2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
23d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
24d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisMDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
25d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisYXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
26d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
27d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisNTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
28d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
29d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisd29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
30d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwiseXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
31d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
32d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
33d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis'''
34d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
35be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou# This data contains an invalid major version number (5)
36be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou# An unexpected major version number should be treated as an error when
37be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou# parsing a .mo file
38be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
39be8d06f5234ace688520bfea9139e68214788910Antoine PitrouGNU_MO_DATA_BAD_MAJOR_VERSION = b'''\
40be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou3hIElQAABQAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
41be8d06f5234ace688520bfea9139e68214788910Antoine PitrouAAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
42be8d06f5234ace688520bfea9139e68214788910Antoine PitrouAAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
43be8d06f5234ace688520bfea9139e68214788910Antoine PitroueW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
44be8d06f5234ace688520bfea9139e68214788910Antoine PitrouaGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
45be8d06f5234ace688520bfea9139e68214788910Antoine PitrouCnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
46be8d06f5234ace688520bfea9139e68214788910Antoine PitrouY2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
47be8d06f5234ace688520bfea9139e68214788910Antoine PitrouZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
48be8d06f5234ace688520bfea9139e68214788910Antoine PitrouMDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
49be8d06f5234ace688520bfea9139e68214788910Antoine PitrouYXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
50be8d06f5234ace688520bfea9139e68214788910Antoine PitrouSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
51be8d06f5234ace688520bfea9139e68214788910Antoine PitrouNTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
52be8d06f5234ace688520bfea9139e68214788910Antoine PitrouZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
53be8d06f5234ace688520bfea9139e68214788910Antoine Pitroud29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
54be8d06f5234ace688520bfea9139e68214788910Antoine PitroueXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
55be8d06f5234ace688520bfea9139e68214788910Antoine PitrouIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
56be8d06f5234ace688520bfea9139e68214788910Antoine PitrouciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
57be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou'''
58be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
59be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou# This data contains an invalid minor version number (7)
60be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou# An unexpected minor version number only indicates that some of the file's
61be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou# contents may not be able to be read. It does not indicate an error.
62be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
63be8d06f5234ace688520bfea9139e68214788910Antoine PitrouGNU_MO_DATA_BAD_MINOR_VERSION = b'''\
64be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou3hIElQcAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
65be8d06f5234ace688520bfea9139e68214788910Antoine PitrouAAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
66be8d06f5234ace688520bfea9139e68214788910Antoine PitrouAAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
67be8d06f5234ace688520bfea9139e68214788910Antoine PitroueW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
68be8d06f5234ace688520bfea9139e68214788910Antoine PitrouaGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
69be8d06f5234ace688520bfea9139e68214788910Antoine PitrouCnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
70be8d06f5234ace688520bfea9139e68214788910Antoine PitrouY2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
71be8d06f5234ace688520bfea9139e68214788910Antoine PitrouZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
72be8d06f5234ace688520bfea9139e68214788910Antoine PitrouMDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
73be8d06f5234ace688520bfea9139e68214788910Antoine PitrouYXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
74be8d06f5234ace688520bfea9139e68214788910Antoine PitrouSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
75be8d06f5234ace688520bfea9139e68214788910Antoine PitrouNTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
76be8d06f5234ace688520bfea9139e68214788910Antoine PitrouZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
77be8d06f5234ace688520bfea9139e68214788910Antoine Pitroud29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
78be8d06f5234ace688520bfea9139e68214788910Antoine PitroueXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
79be8d06f5234ace688520bfea9139e68214788910Antoine PitrouIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
80be8d06f5234ace688520bfea9139e68214788910Antoine PitrouciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
81be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou'''
82be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
83be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
8439478e852827a4ca6955151bf004c7a15099a4b1Guido van RossumUMO_DATA = b'''\
85a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw3hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
86a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawAQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
87a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
88a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsaweSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
89a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
90a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawbjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
91a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawZC1CeTogbWFudWFsbHkKAMKkeXoA
92a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw'''
93d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
9439478e852827a4ca6955151bf004c7a15099a4b1Guido van RossumMMO_DATA = b'''\
95e960e22579838419541357712bbbc3317c219071Barry Warsaw3hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
96e960e22579838419541357712bbbc3317c219071Barry WarsawUHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
97e960e22579838419541357712bbbc3317c219071Barry WarsawIERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
98e960e22579838419541357712bbbc3317c219071Barry WarsawNTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
99e960e22579838419541357712bbbc3317c219071Barry WarsawZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
100e960e22579838419541357712bbbc3317c219071Barry WarsawcGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
101e960e22579838419541357712bbbc3317c219071Barry Warsawc2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
102e960e22579838419541357712bbbc3317c219071Barry WarsawbGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
103e960e22579838419541357712bbbc3317c219071Barry Warsaw'''
104e960e22579838419541357712bbbc3317c219071Barry Warsaw
105d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisLOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
106d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisMOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
107be8d06f5234ace688520bfea9139e68214788910Antoine PitrouMOFILE_BAD_MAJOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_major_version.mo')
108be8d06f5234ace688520bfea9139e68214788910Antoine PitrouMOFILE_BAD_MINOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_minor_version.mo')
109a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawUMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
110e960e22579838419541357712bbbc3317c219071Barry WarsawMMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
111d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
112d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
113a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass GettextBaseTest(unittest.TestCase):
114a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def setUp(self):
115a0e0cd3013840299a789f05be239d6ecb6387cdfNeal Norwitz        if not os.path.isdir(LOCALEDIR):
116a0e0cd3013840299a789f05be239d6ecb6387cdfNeal Norwitz            os.makedirs(LOCALEDIR)
1177fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(MOFILE, 'wb') as fp:
1187fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            fp.write(base64.decodebytes(GNU_MO_DATA))
119be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou        with open(MOFILE_BAD_MAJOR_VERSION, 'wb') as fp:
120be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MAJOR_VERSION))
121be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou        with open(MOFILE_BAD_MINOR_VERSION, 'wb') as fp:
122be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MINOR_VERSION))
1237fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(UMOFILE, 'wb') as fp:
1247fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            fp.write(base64.decodebytes(UMO_DATA))
1257fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(MMOFILE, 'wb') as fp:
1267fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            fp.write(base64.decodebytes(MMO_DATA))
127155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        self.env = support.EnvironmentVarGuard()
128155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        self.env['LANGUAGE'] = 'xx'
12937a89334da1fbe5b30f5a03a97b8f8c2a59adc1bÉric Araujo        gettext._translations.clear()
130a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
131a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def tearDown(self):
132155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        self.env.__exit__()
133155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        del self.env
134cdb2c601db078e0af2fcca49341a7d17d603e500Victor Stinner        support.rmtree(os.path.split(LOCALEDIR)[0])
135d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
1368b963c5853519533ef7188effcde9159c56780d1Andrew KuchlingGNU_MO_DATA_ISSUE_17898 = b'''\
1378b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling3hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z
1388b963c5853519533ef7188effcde9159c56780d1Andrew KuchlingOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7CiMtIy0jLSMtIyAgbWVzc2FnZXMucG8gKEVk
1398b963c5853519533ef7188effcde9159c56780d1Andrew KuchlingWCBTdHVkaW8pICAjLSMtIy0jLSMKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVU
1408b963c5853519533ef7188effcde9159c56780d1Andrew KuchlingRi04CgA=
1418b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling'''
142ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
143a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass GettextTestCase1(GettextBaseTest):
144d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def setUp(self):
145a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
146d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.localedir = os.curdir
147d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.mofile = MOFILE
148d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        gettext.install('gettext', self.localedir)
149ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
150d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_some_translations(self):
151a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
152d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # test some translations
153a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('albatross'), 'albatross')
154ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_('mullusk'), 'bacon')
155a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
156ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r'nudge nudge'), 'wink wink')
157d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
158d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_double_quotes(self):
159a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
160d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # double quotes
161a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_("albatross"), 'albatross')
162ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_("mullusk"), 'bacon')
163a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
164ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r"nudge nudge"), 'wink wink')
165d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
166d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_single_quotes(self):
167a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
168d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple single quotes
169a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('''albatross'''), 'albatross')
170ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_('''mullusk'''), 'bacon')
171a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
172ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r'''nudge nudge'''), 'wink wink')
173d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
174d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_double_quotes(self):
175a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
176d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple double quotes
177a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_("""albatross"""), 'albatross')
178ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_("""mullusk"""), 'bacon')
179a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
180ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r"""nudge nudge"""), 'wink wink')
181d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
182d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_multiline_strings(self):
183a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
184d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # multiline strings
185a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('''This module provides internationalization and localization
1869e035921494cb8f101c3bfc22956fa968c6ab41fBarry Warsawsupport for your Python programs by providing an interface to the GNU
187a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawgettext message catalog library.'''),
188a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw           '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
189d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisfhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
190a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawtrggrkg zrffntr pngnybt yvoenel.''')
191ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
192d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_the_alternative_interface(self):
193a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
194d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # test the alternative interface
1957fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(self.mofile, 'rb') as fp:
1967fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            t = gettext.GNUTranslations(fp)
197a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # Install the translation object
198d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        t.install()
199a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('nudge nudge'), 'wink wink')
200a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # Try unicode return type
201801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        t.install()
202a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('mullusk'), 'bacon')
203602b9ba6b37c4ac4ed445f8c9e9dccd68d631899Georg Brandl        # Test installation of other methods
2041a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl        import builtins
205801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        t.install(names=["gettext", "lgettext"])
206801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        eq(_, t.gettext)
207801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        eq(builtins.gettext, t.gettext)
208602b9ba6b37c4ac4ed445f8c9e9dccd68d631899Georg Brandl        eq(lgettext, t.lgettext)
2091a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl        del builtins.gettext
2101a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl        del builtins.lgettext
211d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
212ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
213a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass GettextTestCase2(GettextBaseTest):
214d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def setUp(self):
215a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
216d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.localedir = os.curdir
217a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # Set up the bindings
218d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        gettext.bindtextdomain('gettext', self.localedir)
219d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        gettext.textdomain('gettext')
220a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # For convenience
221d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self._ = gettext.gettext
22264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
223d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_bindtextdomain(self):
224a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
22564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
226d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_textdomain(self):
227a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        self.assertEqual(gettext.textdomain(), 'gettext')
22864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
229be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou    def test_bad_major_version(self):
230be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou        with open(MOFILE_BAD_MAJOR_VERSION, 'rb') as fp:
231be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            with self.assertRaises(OSError) as cm:
232be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou                gettext.GNUTranslations(fp)
233be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
234be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            exception = cm.exception
235be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            self.assertEqual(exception.errno, 0)
236be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            self.assertEqual(exception.strerror, "Bad version number 5")
237be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            self.assertEqual(exception.filename, MOFILE_BAD_MAJOR_VERSION)
238be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
239be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou    def test_bad_minor_version(self):
240be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou        with open(MOFILE_BAD_MINOR_VERSION, 'rb') as fp:
241be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            # Check that no error is thrown with a bad minor version number
242be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou            gettext.GNUTranslations(fp)
243be8d06f5234ace688520bfea9139e68214788910Antoine Pitrou
244d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_some_translations(self):
245a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
246d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # test some translations
247a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._('albatross'), 'albatross')
248ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._('mullusk'), 'bacon')
249a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
250ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r'nudge nudge'), 'wink wink')
25164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
252d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_double_quotes(self):
253a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
254d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # double quotes
255a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._("albatross"), 'albatross')
256ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._("mullusk"), 'bacon')
257a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
258ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r"nudge nudge"), 'wink wink')
259d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
260d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_single_quotes(self):
261a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
262d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple single quotes
263a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._('''albatross'''), 'albatross')
264ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._('''mullusk'''), 'bacon')
265a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
266ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r'''nudge nudge'''), 'wink wink')
267d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
268d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_double_quotes(self):
269a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
270d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple double quotes
271a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._("""albatross"""), 'albatross')
272ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._("""mullusk"""), 'bacon')
273a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
274ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r"""nudge nudge"""), 'wink wink')
275d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
276d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_multiline_strings(self):
277a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
278d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # multiline strings
279a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._('''This module provides internationalization and localization
28064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawsupport for your Python programs by providing an interface to the GNU
281a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawgettext message catalog library.'''),
282a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw           '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
283d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisfhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
284a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawtrggrkg zrffntr pngnybt yvoenel.''')
28564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
28664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
287a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass PluralFormsTestCase(GettextBaseTest):
288d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def setUp(self):
289a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
290d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.mofile = MOFILE
291ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
292d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_plural_forms1(self):
293a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
294d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = gettext.ngettext('There is %s file', 'There are %s files', 1)
295a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s fichero')
296d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = gettext.ngettext('There is %s file', 'There are %s files', 2)
297a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s ficheros')
298ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
299d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_plural_forms2(self):
300a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
3017fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(self.mofile, 'rb') as fp:
3027fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            t = gettext.GNUTranslations(fp)
303d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = t.ngettext('There is %s file', 'There are %s files', 1)
304a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s fichero')
305d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = t.ngettext('There is %s file', 'There are %s files', 2)
306a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s ficheros')
307d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
30807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    # Examples from http://www.gnu.org/software/gettext/manual/gettext.html
30907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
31007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_ja(self):
311a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
312d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('0')
313d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
314a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
315d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
316d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_de(self):
317a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
318d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n != 1')
319d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
320a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
321d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
322d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_fr(self):
323a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
324d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n>1')
325d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
326a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
327ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
32807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_lv(self):
32907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq = self.assertEqual
33007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2')
33107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        s = ''.join([ str(f(x)) for x in range(200) ])
33207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq(s, "20111111111111111111101111111110111111111011111111101111111110111111111011111111101111111110111111111011111111111111111110111111111011111111101111111110111111111011111111101111111110111111111011111111")
33307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
334d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_gd(self):
335a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
336d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
337d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
338a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
339d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
340d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_gd2(self):
341a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
342d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # Tests the combination of parentheses and "?:"
343d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
344d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
345a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
346d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
34707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_ro(self):
34807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq = self.assertEqual
34907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2')
35007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        s = ''.join([ str(f(x)) for x in range(200) ])
35107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq(s, "10111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222")
35207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
353d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_lt(self):
354a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
355d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
356d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
357a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
358d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
359d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_ru(self):
360a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
361d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
362d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
363a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
364d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
36507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_cs(self):
36607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq = self.assertEqual
36707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2')
36807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        s = ''.join([ str(f(x)) for x in range(200) ])
36907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq(s, "20111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
37007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
371d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_pl(self):
372a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
373d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
374d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
375a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
376d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
377d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_sl(self):
378a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
379d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
380d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
381a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
382d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
38307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_ar(self):
38407bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq = self.assertEqual
38507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5')
38607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        s = ''.join([ str(f(x)) for x in range(200) ])
38707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        eq(s, "01233333333444444444444444444444444444444444444444444444444444444444444444444444444444444444444444445553333333344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444")
38807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
389d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_security(self):
390a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        raises = self.assertRaises
391d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # Test for a dangerous expression
392a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
39307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        # issue28563
39407bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        raises(ValueError, gettext.c2py, '"(eval(foo) && ""')
39507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        raises(ValueError, gettext.c2py, 'f"{os.system(\'sh\')}"')
39607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        # Maximum recursion depth exceeded during compilation
39707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        raises(ValueError, gettext.c2py, 'n+'*10000 + 'n')
39807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('n+'*100 + 'n')(1), 101)
39907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        # MemoryError during compilation
40007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        raises(ValueError, gettext.c2py, '('*100 + 'n' + ')'*100)
40107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        # Maximum recursion depth exceeded in C to Python translator
40207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        raises(ValueError, gettext.c2py, '('*10000 + 'n' + ')'*10000)
40307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('('*20 + 'n' + ')'*20)(1), 1)
40407bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
40507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_chained_comparison(self):
40607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        # C doesn't chain comparison as Python so 2 == 2 == 2 gets different results
40707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('n == n == n')
40807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(''.join(str(f(x)) for x in range(3)), '010')
40907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('1 < n == n')
41007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(''.join(str(f(x)) for x in range(3)), '100')
41107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('n == n < 2')
41207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(''.join(str(f(x)) for x in range(3)), '010')
41307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('0 < n < 2')
41407bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(''.join(str(f(x)) for x in range(3)), '111')
41507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
41607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_decimal_number(self):
41707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('0123')(1), 123)
41807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
41907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_invalid_syntax(self):
42007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        invalid_expressions = [
42107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka            'x>1', '(n>1', 'n>1)', '42**42**42', '0xa', '1.0', '1e2',
42207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka            'n>0x1', '+n', '-n', 'n()', 'n(1)', '1+', 'nn', 'n n',
42307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        ]
42407bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        for expr in invalid_expressions:
42507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka            with self.assertRaises(ValueError):
42607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka                gettext.c2py(expr)
42707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
42807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_nested_condition_operator(self):
42907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('n?1?2:3:4')(0), 4)
43007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('n?1?2:3:4')(1), 2)
43107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('n?1:3?4:5')(0), 4)
43207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(gettext.c2py('n?1:3?4:5')(1), 1)
43307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
43407bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_division(self):
43507bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        f = gettext.c2py('2/n*3')
43607bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(f(1), 6)
43707bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(f(2), 3)
43807bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(f(3), 0)
43907bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertEqual(f(-1), -6)
44007bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka        self.assertRaises(ZeroDivisionError, f, 0)
44107bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
44207bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka    def test_plural_number(self):
44360ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        f = gettext.c2py('n != 1')
44460ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertEqual(f(1), 0)
44560ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertEqual(f(2), 1)
44660ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertEqual(f(1.0), 0)
44760ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertEqual(f(2.0), 1)
44860ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertEqual(f(1.1), 1)
44960ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertRaises(TypeError, f, '2')
45060ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertRaises(TypeError, f, b'2')
45160ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertRaises(TypeError, f, [])
45260ac989d6f9884f551327cc7e9a4b71ef67ab533Serhiy Storchaka        self.assertRaises(TypeError, f, object())
45307bcf05fcf3fd1d4001e8e3489162e6d67638285Serhiy Storchaka
454a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
4558b963c5853519533ef7188effcde9159c56780d1Andrew Kuchlingclass GNUTranslationParsingTest(GettextBaseTest):
4568b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling    def test_plural_form_error_issue17898(self):
4578b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling        with open(MOFILE, 'wb') as fp:
4588b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling            fp.write(base64.decodebytes(GNU_MO_DATA_ISSUE_17898))
4598b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling        with open(MOFILE, 'rb') as fp:
4608b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling            # If this runs cleanly, the bug is fixed.
4618b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling            t = gettext.GNUTranslations(fp)
4628b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling
463a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
464a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass UnicodeTranslationsTest(GettextBaseTest):
465a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def setUp(self):
466a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
4677fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(UMOFILE, 'rb') as fp:
468edb155fda199f7fa481d0020e911a6eec0705dfaBarry Warsaw            self.t = gettext.GNUTranslations(fp)
469801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        self._ = self.t.gettext
470d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
471a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def test_unicode_msgid(self):
472c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson        unless = self.assertTrue
473ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        unless(isinstance(self._(''), str))
474ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        unless(isinstance(self._(''), str))
475d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
476a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def test_unicode_msgstr(self):
477a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
478ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._('ab\xde'), '\xa4yz')
479d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
480d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
481e960e22579838419541357712bbbc3317c219071Barry Warsawclass WeirdMetadataTest(GettextBaseTest):
482e960e22579838419541357712bbbc3317c219071Barry Warsaw    def setUp(self):
483e960e22579838419541357712bbbc3317c219071Barry Warsaw        GettextBaseTest.setUp(self)
4847fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(MMOFILE, 'rb') as fp:
485e960e22579838419541357712bbbc3317c219071Barry Warsaw            try:
486e960e22579838419541357712bbbc3317c219071Barry Warsaw                self.t = gettext.GNUTranslations(fp)
487e960e22579838419541357712bbbc3317c219071Barry Warsaw            except:
488e960e22579838419541357712bbbc3317c219071Barry Warsaw                self.tearDown()
489e960e22579838419541357712bbbc3317c219071Barry Warsaw                raise
490e960e22579838419541357712bbbc3317c219071Barry Warsaw
491e960e22579838419541357712bbbc3317c219071Barry Warsaw    def test_weird_metadata(self):
492e960e22579838419541357712bbbc3317c219071Barry Warsaw        info = self.t.info()
4936ae5d7f2a132aa9690bfb59b8eebcc1fb7c792c8Christian Heimes        self.assertEqual(len(info), 9)
494e960e22579838419541357712bbbc3317c219071Barry Warsaw        self.assertEqual(info['last-translator'],
495e960e22579838419541357712bbbc3317c219071Barry Warsaw           'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
496e960e22579838419541357712bbbc3317c219071Barry Warsaw
497e960e22579838419541357712bbbc3317c219071Barry Warsaw
4986108bf5ed002925f2092deb025f336d8c2024299Éric Araujoclass DummyGNUTranslations(gettext.GNUTranslations):
4996108bf5ed002925f2092deb025f336d8c2024299Éric Araujo    def foo(self):
5006108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        return 'foo'
5016108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5026108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5036108bf5ed002925f2092deb025f336d8c2024299Éric Araujoclass GettextCacheTestCase(GettextBaseTest):
5046108bf5ed002925f2092deb025f336d8c2024299Éric Araujo    def test_cache(self):
5056108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.localedir = os.curdir
5066108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.mofile = MOFILE
5076108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5086108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 0)
5096108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5106108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        t = gettext.translation('gettext', self.localedir)
5116108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5126108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 1)
5136108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5146108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        t = gettext.translation('gettext', self.localedir,
5156108bf5ed002925f2092deb025f336d8c2024299Éric Araujo                                class_=DummyGNUTranslations)
5166108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5176108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 2)
5186108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(t.__class__, DummyGNUTranslations)
5196108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5206108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        # Calling it again doesn't add to the cache
5216108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5226108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        t = gettext.translation('gettext', self.localedir,
5236108bf5ed002925f2092deb025f336d8c2024299Éric Araujo                                class_=DummyGNUTranslations)
5246108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5256108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 2)
5266108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(t.__class__, DummyGNUTranslations)
5276108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
5286108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
529d226d308a3856e67c654ff3d5924be6d24568388Martin Panterclass MiscTestCase(unittest.TestCase):
530d226d308a3856e67c654ff3d5924be6d24568388Martin Panter    def test__all__(self):
531d226d308a3856e67c654ff3d5924be6d24568388Martin Panter        blacklist = {'c2py', 'ENOENT'}
532d226d308a3856e67c654ff3d5924be6d24568388Martin Panter        support.check__all__(self, gettext, blacklist=blacklist)
533d226d308a3856e67c654ff3d5924be6d24568388Martin Panter
534d226d308a3856e67c654ff3d5924be6d24568388Martin Panter
535a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawdef test_main():
536ee8712cda46338d223509cc5751fd36509ad3860Benjamin Peterson    support.run_unittest(__name__)
537004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
538a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawif __name__ == '__main__':
539a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    test_main()
540a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
541a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
542a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# For reference, here's the .po file used to created the GNU_MO_DATA above.
543d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#
544d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# The original version was automatically generated from the sources with
545d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# pygettext. Later it was manually modified to add plural forms support.
54664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
54764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw'''
548a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Dummy translation for the Python test_gettext.py module.
549191487351abb5d2b7daf9d839ca2b3a3c7fdc07bBarry Warsaw# Copyright (C) 2001 Python Software Foundation
550191487351abb5d2b7daf9d839ca2b3a3c7fdc07bBarry Warsaw# Barry Warsaw <barry@python.org>, 2000.
55164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#
55264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid ""
55364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr ""
55464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Project-Id-Version: 2.0\n"
555a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"PO-Revision-Date: 2003-04-11 14:32-0400\n"
556d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
55764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Language-Team: XX <python-dev@python.org>\n"
55864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"MIME-Version: 1.0\n"
559d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Content-Type: text/plain; charset=iso-8859-1\n"
560d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Content-Transfer-Encoding: 8bit\n"
56164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Generated-By: pygettext.py 1.1\n"
562d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Plural-Forms: nplurals=2; plural=n!=1;\n"
56364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
56464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
56564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
56664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:98
56764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "nudge nudge"
56864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr "wink wink"
56964dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
57064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
57164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
57264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "albatross"
57364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr ""
57464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
57564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
57664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
57764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "Raymond Luxury Yach-t"
57864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr "Throatwobbler Mangrove"
57964dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
58064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
58164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
58264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:96
58364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "mullusk"
58464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr "bacon"
58564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
58664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:40 test_gettext.py:101
58764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid ""
58864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"This module provides internationalization and localization\n"
58964dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"support for your Python programs by providing an interface to the GNU\n"
59064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"gettext message catalog library."
59164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr ""
59264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
59364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
59464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"trggrkg zrffntr pngnybt yvoenel."
595d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
596d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# Manually added, as neither pygettext nor xgettext support plural forms
597d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# in Python.
598d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgid "There is %s file"
599d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgid_plural "There are %s files"
600d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgstr[0] "Hay %s fichero"
601d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgstr[1] "Hay %s ficheros"
60264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw'''
603a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
604a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Here's the second example po file example, used to generate the UMO_DATA
605a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# containing utf-8 encoded Unicode strings
606a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
607a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw'''
608a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Dummy translation for the Python test_gettext.py module.
609a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Copyright (C) 2001 Python Software Foundation
610a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Barry Warsaw <barry@python.org>, 2000.
611a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw#
612a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgid ""
613a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgstr ""
614a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Project-Id-Version: 2.0\n"
615a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"PO-Revision-Date: 2003-04-11 12:42-0400\n"
616a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
617a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Language-Team: XX <python-dev@python.org>\n"
618a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"MIME-Version: 1.0\n"
619a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Content-Type: text/plain; charset=utf-8\n"
620a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Content-Transfer-Encoding: 7bit\n"
621a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Generated-By: manually\n"
622a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
623a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw#: nofile:0
624a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgid "ab\xc3\x9e"
625a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgstr "\xc2\xa4yz"
626a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw'''
627e960e22579838419541357712bbbc3317c219071Barry Warsaw
628e960e22579838419541357712bbbc3317c219071Barry Warsaw# Here's the third example po file, used to generate MMO_DATA
629e960e22579838419541357712bbbc3317c219071Barry Warsaw
630e960e22579838419541357712bbbc3317c219071Barry Warsaw'''
631e960e22579838419541357712bbbc3317c219071Barry Warsawmsgid ""
632e960e22579838419541357712bbbc3317c219071Barry Warsawmsgstr ""
633e960e22579838419541357712bbbc3317c219071Barry Warsaw"Project-Id-Version: No Project 0.0\n"
634e960e22579838419541357712bbbc3317c219071Barry Warsaw"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
635e960e22579838419541357712bbbc3317c219071Barry Warsaw"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
636e960e22579838419541357712bbbc3317c219071Barry Warsaw"Last-Translator: John Doe <jdoe@example.com>\n"
637e960e22579838419541357712bbbc3317c219071Barry Warsaw"Jane Foobar <jfoobar@example.com>\n"
638e960e22579838419541357712bbbc3317c219071Barry Warsaw"Language-Team: xx <xx@example.com>\n"
639e960e22579838419541357712bbbc3317c219071Barry Warsaw"MIME-Version: 1.0\n"
640e960e22579838419541357712bbbc3317c219071Barry Warsaw"Content-Type: text/plain; charset=iso-8859-15\n"
641e960e22579838419541357712bbbc3317c219071Barry Warsaw"Content-Transfer-Encoding: quoted-printable\n"
642e960e22579838419541357712bbbc3317c219071Barry Warsaw"Generated-By: pygettext.py 1.3\n"
643e960e22579838419541357712bbbc3317c219071Barry Warsaw'''
6448b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling
6458b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling#
6468b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling# messages.po, used for bug 17898
6478b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling#
6488b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling
6498b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling'''
6508b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling# test file for http://bugs.python.org/issue17898
6518b963c5853519533ef7188effcde9159c56780d1Andrew Kuchlingmsgid ""
6528b963c5853519533ef7188effcde9159c56780d1Andrew Kuchlingmsgstr ""
6538b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling"Plural-Forms: nplurals=2; plural=(n != 1);\n"
6548b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling"#-#-#-#-#  messages.po (EdX Studio)  #-#-#-#-#\n"
6558b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling"Content-Type: text/plain; charset=UTF-8\n"
6568b963c5853519533ef7188effcde9159c56780d1Andrew Kuchling'''
657