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