annotate Lib/test/test_struct.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 0872257752c2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
1 from collections import abc
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
2 import array
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
3 import operator
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
4 import unittest
4706
9785114326ab A test of the struct module
Barry Warsaw <barry@python.org>
parents:
diff changeset
5 import struct
59366
81477192cf7a Remove unused imports & clean up sys imports in test_struct.
Mark Dickinson <dickinsm@gmail.com>
parents: 55593
diff changeset
6 import sys
4706
9785114326ab A test of the struct module
Barry Warsaw <barry@python.org>
parents:
diff changeset
7
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
8 from test import support
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
9
18111
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
10 ISBIGENDIAN = sys.byteorder == "big"
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
11
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
12 integer_codes = 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'n', 'N'
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
13 byteorders = '', '@', '=', '<', '>', '!'
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
14
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
15 def iter_integer_formats(byteorders=byteorders):
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
16 for code in integer_codes:
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
17 for byteorder in byteorders:
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
18 if (byteorder in ('', '@') and code in ('q', 'Q') and
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
19 not HAVE_LONG_LONG):
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
20 continue
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
21 if (byteorder not in ('', '@') and code in ('n', 'N')):
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
22 continue
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
23 yield code, byteorder
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
24
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
25 # Native 'q' packing isn't available on systems that don't have the C
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
26 # long long type.
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
27 try:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
28 struct.pack('q', 5)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
29 except struct.error:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
30 HAVE_LONG_LONG = False
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
31 else:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
32 HAVE_LONG_LONG = True
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
33
18111
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
34 def string_reverse(s):
41891
b7cfb3fd8db0 Make struct tests pass.
Guido van Rossum <guido@python.org>
parents: 41642
diff changeset
35 return s[::-1]
18111
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
36
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
37 def bigendian_to_native(value):
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
38 if ISBIGENDIAN:
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
39 return value
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
40 else:
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
41 return string_reverse(value)
099ae4918069 Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Tim Peters <tim.peters@gmail.com>
parents: 18094
diff changeset
42
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
43 class StructTest(unittest.TestCase):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
44 def test_isbigendian(self):
48325
5f9435317de1 Another merge error, seen on bigendian machines
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48321
diff changeset
45 self.assertEqual((struct.pack('=i', 1)[0] == 0), ISBIGENDIAN)
4706
9785114326ab A test of the struct module
Barry Warsaw <barry@python.org>
parents:
diff changeset
46
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
47 def test_consistence(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
48 self.assertRaises(struct.error, struct.calcsize, 'Z')
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
49
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
50 sz = struct.calcsize('i')
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
51 self.assertEqual(sz * 3, struct.calcsize('iii'))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
52
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
53 fmt = 'cbxxxxxxhhhhiillffd?'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
54 fmt3 = '3c3b18x12h6i6l6f3d3?'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
55 sz = struct.calcsize(fmt)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
56 sz3 = struct.calcsize(fmt3)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
57 self.assertEqual(sz * 3, sz3)
4706
9785114326ab A test of the struct module
Barry Warsaw <barry@python.org>
parents:
diff changeset
58
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
59 self.assertRaises(struct.error, struct.pack, 'iii', 3)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
60 self.assertRaises(struct.error, struct.pack, 'i', 3, 3, 3)
62894
10c0630f1c14 allow more exceptions
Benjamin Peterson <benjamin@python.org>
parents: 62890
diff changeset
61 self.assertRaises((TypeError, struct.error), struct.pack, 'i', 'foo')
10c0630f1c14 allow more exceptions
Benjamin Peterson <benjamin@python.org>
parents: 62890
diff changeset
62 self.assertRaises((TypeError, struct.error), struct.pack, 'P', 'foo')
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
63 self.assertRaises(struct.error, struct.unpack, 'd', b'flap')
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
64 s = struct.pack('ii', 1, 2)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
65 self.assertRaises(struct.error, struct.unpack, 'iii', s)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
66 self.assertRaises(struct.error, struct.unpack, 'i', s)
4847
d53812d68408 Exercise the new feature set somewhat.
Guido van Rossum <guido@python.org>
parents: 4706
diff changeset
67
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
68 def test_transitiveness(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
69 c = b'a'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
70 b = 1
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
71 h = 255
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
72 i = 65535
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
73 l = 65536
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
74 f = 3.1415
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
75 d = 3.1415
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
76 t = True
4847
d53812d68408 Exercise the new feature set somewhat.
Guido van Rossum <guido@python.org>
parents: 4706
diff changeset
77
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
78 for prefix in ('', '@', '<', '>', '=', '!'):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
79 for format in ('xcbhilfd?', 'xcBHILfd?'):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
80 format = prefix + format
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
81 s = struct.pack(format, c, b, h, i, l, f, d, t)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
82 cp, bp, hp, ip, lp, fp, dp, tp = struct.unpack(format, s)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
83 self.assertEqual(cp, c)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
84 self.assertEqual(bp, b)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
85 self.assertEqual(hp, h)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
86 self.assertEqual(ip, i)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
87 self.assertEqual(lp, l)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
88 self.assertEqual(int(100 * fp), int(100 * f))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
89 self.assertEqual(int(100 * dp), int(100 * d))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
90 self.assertEqual(tp, t)
4847
d53812d68408 Exercise the new feature set somewhat.
Guido van Rossum <guido@python.org>
parents: 4706
diff changeset
91
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
92 def test_new_features(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
93 # Test some of the new features in detail
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
94 # (format, argument, big-endian result, little-endian result, asymmetric)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
95 tests = [
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
96 ('c', b'a', b'a', b'a', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
97 ('xc', b'a', b'\0a', b'\0a', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
98 ('cx', b'a', b'a\0', b'a\0', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
99 ('s', b'a', b'a', b'a', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
100 ('0s', b'helloworld', b'', b'', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
101 ('1s', b'helloworld', b'h', b'h', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
102 ('9s', b'helloworld', b'helloworl', b'helloworl', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
103 ('10s', b'helloworld', b'helloworld', b'helloworld', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
104 ('11s', b'helloworld', b'helloworld\0', b'helloworld\0', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
105 ('20s', b'helloworld', b'helloworld'+10*b'\0', b'helloworld'+10*b'\0', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
106 ('b', 7, b'\7', b'\7', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
107 ('b', -7, b'\371', b'\371', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
108 ('B', 7, b'\7', b'\7', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
109 ('B', 249, b'\371', b'\371', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
110 ('h', 700, b'\002\274', b'\274\002', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
111 ('h', -700, b'\375D', b'D\375', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
112 ('H', 700, b'\002\274', b'\274\002', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
113 ('H', 0x10000-700, b'\375D', b'D\375', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
114 ('i', 70000000, b'\004,\035\200', b'\200\035,\004', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
115 ('i', -70000000, b'\373\323\342\200', b'\200\342\323\373', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
116 ('I', 70000000, b'\004,\035\200', b'\200\035,\004', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
117 ('I', 0x100000000-70000000, b'\373\323\342\200', b'\200\342\323\373', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
118 ('l', 70000000, b'\004,\035\200', b'\200\035,\004', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
119 ('l', -70000000, b'\373\323\342\200', b'\200\342\323\373', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
120 ('L', 70000000, b'\004,\035\200', b'\200\035,\004', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
121 ('L', 0x100000000-70000000, b'\373\323\342\200', b'\200\342\323\373', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
122 ('f', 2.0, b'@\000\000\000', b'\000\000\000@', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
123 ('d', 2.0, b'@\000\000\000\000\000\000\000',
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
124 b'\000\000\000\000\000\000\000@', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
125 ('f', -2.0, b'\300\000\000\000', b'\000\000\000\300', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
126 ('d', -2.0, b'\300\000\000\000\000\000\000\000',
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
127 b'\000\000\000\000\000\000\000\300', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
128 ('?', 0, b'\0', b'\0', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
129 ('?', 3, b'\1', b'\1', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
130 ('?', True, b'\1', b'\1', 0),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
131 ('?', [], b'\0', b'\0', 1),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
132 ('?', (1,), b'\1', b'\1', 1),
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
133 ]
18069
8e187740aa96 Initial support for 'q' and 'Q' struct format codes: for now, only in
Tim Peters <tim.peters@gmail.com>
parents: 15540
diff changeset
134
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
135 for fmt, arg, big, lil, asy in tests:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
136 for (xfmt, exp) in [('>'+fmt, big), ('!'+fmt, big), ('<'+fmt, lil),
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
137 ('='+fmt, ISBIGENDIAN and big or lil)]:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
138 res = struct.pack(xfmt, arg)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
139 self.assertEqual(res, exp)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
140 self.assertEqual(struct.calcsize(xfmt), len(res))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
141 rev = struct.unpack(xfmt, res)[0]
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
142 if rev != arg:
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 53271
diff changeset
143 self.assertTrue(asy)
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
144
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
145 def test_calcsize(self):
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
146 expected_size = {
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
147 'b': 1, 'B': 1,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
148 'h': 2, 'H': 2,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
149 'i': 4, 'I': 4,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
150 'l': 4, 'L': 4,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
151 'q': 8, 'Q': 8,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
152 }
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
153
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
154 # standard integer sizes
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
155 for code, byteorder in iter_integer_formats(('=', '<', '>', '!')):
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
156 format = byteorder+code
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
157 size = struct.calcsize(format)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
158 self.assertEqual(size, expected_size[code])
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
159
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
160 # native integer sizes
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
161 native_pairs = 'bB', 'hH', 'iI', 'lL', 'nN'
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
162 if HAVE_LONG_LONG:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
163 native_pairs += 'qQ',
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
164 for format_pair in native_pairs:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
165 for byteorder in '', '@':
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
166 signed_size = struct.calcsize(byteorder + format_pair[0])
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
167 unsigned_size = struct.calcsize(byteorder + format_pair[1])
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
168 self.assertEqual(signed_size, unsigned_size)
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
169
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
170 # bounds for native integer sizes
60305
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
171 self.assertEqual(struct.calcsize('b'), 1)
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
172 self.assertLessEqual(2, struct.calcsize('h'))
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
173 self.assertLessEqual(4, struct.calcsize('l'))
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
174 self.assertLessEqual(struct.calcsize('h'), struct.calcsize('i'))
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
175 self.assertLessEqual(struct.calcsize('i'), struct.calcsize('l'))
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
176 if HAVE_LONG_LONG:
60305
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
177 self.assertLessEqual(8, struct.calcsize('q'))
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
178 self.assertLessEqual(struct.calcsize('l'), struct.calcsize('q'))
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
179 self.assertGreaterEqual(struct.calcsize('n'), struct.calcsize('i'))
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
180 self.assertGreaterEqual(struct.calcsize('n'), struct.calcsize('P'))
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
181
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
182 def test_integers(self):
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
183 # Integer tests (bBhHiIlLqQnN).
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
184 import binascii
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
185
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
186 class IntTester(unittest.TestCase):
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
187 def __init__(self, format):
52827
c50c079b09eb Merged revisions 70837,70864,70878,71004,71032,71043 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52414
diff changeset
188 super(IntTester, self).__init__(methodName='test_one')
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
189 self.format = format
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
190 self.code = format[-1]
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
191 self.byteorder = format[:-1]
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
192 if not self.byteorder in byteorders:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
193 raise ValueError("unrecognized packing byteorder: %s" %
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
194 self.byteorder)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
195 self.bytesize = struct.calcsize(format)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
196 self.bitsize = self.bytesize * 8
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
197 if self.code in tuple('bhilqn'):
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
198 self.signed = True
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
199 self.min_value = -(2**(self.bitsize-1))
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
200 self.max_value = 2**(self.bitsize-1) - 1
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
201 elif self.code in tuple('BHILQN'):
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
202 self.signed = False
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
203 self.min_value = 0
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
204 self.max_value = 2**self.bitsize - 1
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
205 else:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
206 raise ValueError("unrecognized format code: %s" %
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
207 self.code)
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
208
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
209 def test_one(self, x, pack=struct.pack,
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
210 unpack=struct.unpack,
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
211 unhexlify=binascii.unhexlify):
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
212
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
213 format = self.format
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
214 if self.min_value <= x <= self.max_value:
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
215 expected = x
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
216 if self.signed and x < 0:
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
217 expected += 1 << self.bitsize
60305
58dc4f316ff6 Merged revisions 79740 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 60267
diff changeset
218 self.assertGreaterEqual(expected, 0)
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
219 expected = '%x' % expected
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
220 if len(expected) & 1:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
221 expected = "0" + expected
63244
f214ad09c384 Issue #4770: Restrict binascii module to accept only bytes (as specified).
Florent Xicluna <florent.xicluna@gmail.com>
parents: 62991
diff changeset
222 expected = expected.encode('ascii')
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
223 expected = unhexlify(expected)
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
224 expected = (b"\x00" * (self.bytesize - len(expected)) +
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
225 expected)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
226 if (self.byteorder == '<' or
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
227 self.byteorder in ('', '@', '=') and not ISBIGENDIAN):
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
228 expected = string_reverse(expected)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
229 self.assertEqual(len(expected), self.bytesize)
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
230
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
231 # Pack work?
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
232 got = pack(format, x)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
233 self.assertEqual(got, expected)
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
234
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
235 # Unpack work?
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
236 retrieved = unpack(format, got)[0]
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
237 self.assertEqual(x, retrieved)
18084
bbcdbd8f4469 Added q/Q standard (x-platform 8-byte ints) mode in struct module.
Tim Peters <tim.peters@gmail.com>
parents: 18070
diff changeset
238
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
239 # Adding any byte should cause a "too big" error.
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
240 self.assertRaises((struct.error, TypeError), unpack, format,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
241 b'\x01' + got)
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
242 else:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
243 # x is out of range -- verify pack realizes that.
62932
5e60c7db0f51 ValueError is eventually what we want to move to, I suppose
Benjamin Peterson <benjamin@python.org>
parents: 62896
diff changeset
244 self.assertRaises((OverflowError, ValueError, struct.error),
5e60c7db0f51 ValueError is eventually what we want to move to, I suppose
Benjamin Peterson <benjamin@python.org>
parents: 62896
diff changeset
245 pack, format, x)
19924
01f66f5db326 The 'p' (Pascal string) pack code acts unreasonably when the string size
Tim Peters <tim.peters@gmail.com>
parents: 18149
diff changeset
246
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
247 def run(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
248 from random import randrange
19924
01f66f5db326 The 'p' (Pascal string) pack code acts unreasonably when the string size
Tim Peters <tim.peters@gmail.com>
parents: 18149
diff changeset
249
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
250 # Create all interesting powers of 2.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
251 values = []
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
252 for exp in range(self.bitsize + 3):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
253 values.append(1 << exp)
19924
01f66f5db326 The 'p' (Pascal string) pack code acts unreasonably when the string size
Tim Peters <tim.peters@gmail.com>
parents: 18149
diff changeset
254
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
255 # Add some random values.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
256 for i in range(self.bitsize):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
257 val = 0
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
258 for j in range(self.bytesize):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
259 val = (val << 8) | randrange(256)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
260 values.append(val)
19924
01f66f5db326 The 'p' (Pascal string) pack code acts unreasonably when the string size
Tim Peters <tim.peters@gmail.com>
parents: 18149
diff changeset
261
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
262 # Values absorbed from other tests
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
263 values.extend([300, 700000, sys.maxsize*4])
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
264
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
265 # Try all those, and their negations, and +-1 from
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
266 # them. Note that this tests all power-of-2
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
267 # boundaries in range, and a few out of range, plus
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
268 # +-(2**n +- 1).
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
269 for base in values:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
270 for val in -base, base:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
271 for incr in -1, 0, 1:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
272 x = val + incr
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
273 self.test_one(x)
28334
9f287e5eb037 SF bug 705836: struct.pack of floats in non-native endian order
Tim Peters <tim.peters@gmail.com>
parents: 28089
diff changeset
274
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
275 # Some error cases.
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
276 class NotAnInt:
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
277 def __int__(self):
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
278 return 42
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
279
60309
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
280 # Objects with an '__index__' method should be allowed
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
281 # to pack as integers. That is assuming the implemented
85418
4d62a62ba44d Issue #18783: Removed existing mentions of Python long type in docstrings,
Serhiy Storchaka <storchaka@gmail.com>
parents: 78316
diff changeset
282 # '__index__' method returns an 'int'.
60309
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
283 class Indexable(object):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
284 def __init__(self, value):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
285 self._value = value
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
286
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
287 def __index__(self):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
288 return self._value
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
289
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
290 # If the '__index__' method raises a type error, then
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
291 # '__int__' should be used with a deprecation warning.
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
292 class BadIndex(object):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
293 def __index__(self):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
294 raise TypeError
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
295
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
296 def __int__(self):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
297 return 42
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
298
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
299 self.assertRaises((TypeError, struct.error),
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
300 struct.pack, self.format,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
301 "a string")
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
302 self.assertRaises((TypeError, struct.error),
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
303 struct.pack, self.format,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
304 randrange)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
305 self.assertRaises((TypeError, struct.error),
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
306 struct.pack, self.format,
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
307 3+42j)
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
308 self.assertRaises((TypeError, struct.error),
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
309 struct.pack, self.format,
60309
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
310 NotAnInt())
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
311 self.assertRaises((TypeError, struct.error),
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
312 struct.pack, self.format,
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
313 BadIndex())
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
314
60309
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
315 # Check for legitimate values from '__index__'.
60267
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
316 for obj in (Indexable(0), Indexable(10), Indexable(17),
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
317 Indexable(42), Indexable(100), Indexable(127)):
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
318 try:
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
319 struct.pack(format, obj)
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
320 except:
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
321 self.fail("integer code pack failed on object "
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
322 "with '__index__' method")
aa121a39a956 Merged revisions 79674 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60247
diff changeset
323
60309
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
324 # Check for bogus values from '__index__'.
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
325 for obj in (Indexable(b'a'), Indexable('b'), Indexable(None),
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
326 Indexable({'a': 1}), Indexable([1, 2, 3])):
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
327 self.assertRaises((TypeError, struct.error),
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
328 struct.pack, self.format,
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
329 obj)
72409b231967 Merged revisions 79745 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60305
diff changeset
330
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
331 for code, byteorder in iter_integer_formats():
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
332 format = byteorder+code
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
333 t = IntTester(format)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
334 t.run()
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
335
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
336 def test_nN_code(self):
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
337 # n and N don't exist in standard sizes
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
338 def assertStructError(func, *args, **kwargs):
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
339 with self.assertRaises(struct.error) as cm:
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
340 func(*args, **kwargs)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
341 self.assertIn("bad char in struct format", str(cm.exception))
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
342 for code in 'nN':
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
343 for byteorder in ('=', '<', '>', '!'):
60247
bd5121bf6996 Clean up integer tests in test_struct, and bring them more in line with the trunk tests.
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
344 format = byteorder+code
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
345 assertStructError(struct.calcsize, format)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
346 assertStructError(struct.pack, format, 0)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
347 assertStructError(struct.unpack, format, b"")
28334
9f287e5eb037 SF bug 705836: struct.pack of floats in non-native endian order
Tim Peters <tim.peters@gmail.com>
parents: 28089
diff changeset
348
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
349 def test_p_code(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
350 # Test p ("Pascal string") code.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
351 for code, input, expected, expectedback in [
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
352 ('p', b'abc', b'\x00', b''),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
353 ('1p', b'abc', b'\x00', b''),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
354 ('2p', b'abc', b'\x01a', b'a'),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
355 ('3p', b'abc', b'\x02ab', b'ab'),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
356 ('4p', b'abc', b'\x03abc', b'abc'),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
357 ('5p', b'abc', b'\x03abc\x00', b'abc'),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
358 ('6p', b'abc', b'\x03abc\x00\x00', b'abc'),
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
359 ('1000p', b'x'*1000, b'\xff' + b'x'*999, b'x'*255)]:
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
360 got = struct.pack(code, input)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
361 self.assertEqual(got, expected)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
362 (got,) = struct.unpack(code, got)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
363 self.assertEqual(got, expectedback)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
364
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
365 def test_705836(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
366 # SF bug 705836. "<f" and ">f" had a severe rounding bug, where a carry
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
367 # from the low-order discarded bits could propagate into the exponent
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
368 # field, causing the result to be wrong by a factor of 2.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
369 import math
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
370
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
371 for base in range(1, 33):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
372 # smaller <- largest representable float less than base.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
373 delta = 0.5
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
374 while base - delta / 2.0 != base:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
375 delta /= 2.0
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
376 smaller = base - delta
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
377 # Packing this rounds away a solid string of trailing 1 bits.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
378 packed = struct.pack("<f", smaller)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
379 unpacked = struct.unpack("<f", packed)[0]
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
380 # This failed at base = 2, 4, and 32, with unpacked = 1, 2, and
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
381 # 16, respectively.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
382 self.assertEqual(base, unpacked)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
383 bigpacked = struct.pack(">f", smaller)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
384 self.assertEqual(bigpacked, string_reverse(packed))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
385 unpacked = struct.unpack(">f", bigpacked)[0]
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
386 self.assertEqual(base, unpacked)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
387
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
388 # Largest finite IEEE single.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
389 big = (1 << 24) - 1
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
390 big = math.ldexp(big, 127 - 23)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
391 packed = struct.pack(">f", big)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
392 unpacked = struct.unpack(">f", packed)[0]
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
393 self.assertEqual(big, unpacked)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
394
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
395 # The same, but tack on a 1 bit so it rounds up to infinity.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
396 big = (1 << 25) - 1
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
397 big = math.ldexp(big, 127 - 24)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
398 self.assertRaises(OverflowError, struct.pack, ">f", big)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
399
53271
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52827
diff changeset
400 def test_1530559(self):
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
401 for code, byteorder in iter_integer_formats():
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
402 format = byteorder + code
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
403 self.assertRaises(struct.error, struct.pack, format, 1.0)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
404 self.assertRaises(struct.error, struct.pack, format, 1.5)
53271
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52827
diff changeset
405 self.assertRaises(struct.error, struct.pack, 'P', 1.0)
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52827
diff changeset
406 self.assertRaises(struct.error, struct.pack, 'P', 1.5)
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52827
diff changeset
407
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
408 def test_unpack_from(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
409 test_string = b'abcd01234'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
410 fmt = '4s'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
411 s = struct.Struct(fmt)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
412 for cls in (bytes, bytearray):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
413 data = cls(test_string)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
414 self.assertEqual(s.unpack_from(data), (b'abcd',))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
415 self.assertEqual(s.unpack_from(data, 2), (b'cd01',))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
416 self.assertEqual(s.unpack_from(data, 4), (b'0123',))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
417 for i in range(6):
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64355
diff changeset
418 self.assertEqual(s.unpack_from(data, i), (data[i:i+4],))
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
419 for i in range(6, len(test_string) + 1):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
420 self.assertRaises(struct.error, s.unpack_from, data, i)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
421 for cls in (bytes, bytearray):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
422 data = cls(test_string)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
423 self.assertEqual(struct.unpack_from(fmt, data), (b'abcd',))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
424 self.assertEqual(struct.unpack_from(fmt, data, 2), (b'cd01',))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
425 self.assertEqual(struct.unpack_from(fmt, data, 4), (b'0123',))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
426 for i in range(6):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
427 self.assertEqual(struct.unpack_from(fmt, data, i), (data[i:i+4],))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
428 for i in range(6, len(test_string) + 1):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
429 self.assertRaises(struct.error, struct.unpack_from, fmt, data, i)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
430
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
431 def test_pack_into(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
432 test_string = b'Reykjavik rocks, eow!'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
433 writable_buf = array.array('b', b' '*100)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
434 fmt = '21s'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
435 s = struct.Struct(fmt)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
436
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
437 # Test without offset
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
438 s.pack_into(writable_buf, 0, test_string)
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63419
diff changeset
439 from_buf = writable_buf.tobytes()[:len(test_string)]
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
440 self.assertEqual(from_buf, test_string)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
441
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
442 # Test with offset.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
443 s.pack_into(writable_buf, 10, test_string)
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63419
diff changeset
444 from_buf = writable_buf.tobytes()[:len(test_string)+10]
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
445 self.assertEqual(from_buf, test_string[:10] + test_string)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
446
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
447 # Go beyond boundaries.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
448 small_buf = array.array('b', b' '*10)
62856
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
449 self.assertRaises((ValueError, struct.error), s.pack_into, small_buf, 0,
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
450 test_string)
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
451 self.assertRaises((ValueError, struct.error), s.pack_into, small_buf, 2,
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
452 test_string)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
453
51596
a83f10edb6ff #3694: fix an "XXX undetected error" leak in struct.
Georg Brandl <georg@python.org>
parents: 51518
diff changeset
454 # Test bogus offset (issue 3694)
a83f10edb6ff #3694: fix an "XXX undetected error" leak in struct.
Georg Brandl <georg@python.org>
parents: 51518
diff changeset
455 sb = small_buf
62896
Benjamin Peterson <benjamin@python.org>
parents: 62894
diff changeset
456 self.assertRaises((TypeError, struct.error), struct.pack_into, b'', sb,
Benjamin Peterson <benjamin@python.org>
parents: 62894
diff changeset
457 None)
51596
a83f10edb6ff #3694: fix an "XXX undetected error" leak in struct.
Georg Brandl <georg@python.org>
parents: 51518
diff changeset
458
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
459 def test_pack_into_fn(self):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
460 test_string = b'Reykjavik rocks, eow!'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
461 writable_buf = array.array('b', b' '*100)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
462 fmt = '21s'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
463 pack_into = lambda *args: struct.pack_into(fmt, *args)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
464
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
465 # Test without offset.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
466 pack_into(writable_buf, 0, test_string)
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63419
diff changeset
467 from_buf = writable_buf.tobytes()[:len(test_string)]
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
468 self.assertEqual(from_buf, test_string)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
469
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
470 # Test with offset.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
471 pack_into(writable_buf, 10, test_string)
64355
fa8b57f987c5 Issue #8990: array.fromstring() and array.tostring() get renamed to
Antoine Pitrou <solipsis@pitrou.net>
parents: 63419
diff changeset
472 from_buf = writable_buf.tobytes()[:len(test_string)+10]
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
473 self.assertEqual(from_buf, test_string[:10] + test_string)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 33599
diff changeset
474
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
475 # Go beyond boundaries.
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
476 small_buf = array.array('b', b' '*10)
62856
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
477 self.assertRaises((ValueError, struct.error), pack_into, small_buf, 0,
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
478 test_string)
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
479 self.assertRaises((ValueError, struct.error), pack_into, small_buf, 2,
8c6b3dc652fb Merged revisions 82637 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62855
diff changeset
480 test_string)
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
481
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
482 def test_unpack_with_buffer(self):
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 62856
diff changeset
483 # SF bug 1563759: struct.unpack doesn't support buffer protocol objects
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
484 data1 = array.array('B', b'\x12\x34\x56\x78')
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
485 data2 = memoryview(b'\x12\x34\x56\x78') # XXX b'......XXXX......', 6, 4
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
486 for data in [data1, data2]:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
487 value, = struct.unpack('>I', data)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
488 self.assertEqual(value, 0x12345678)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
489
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
490 def test_bool(self):
62855
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62251
diff changeset
491 class ExplodingBool(object):
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62251
diff changeset
492 def __bool__(self):
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78316
diff changeset
493 raise OSError
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
494 for prefix in tuple("<>!=")+('',):
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
495 false = (), [], [], '', 0
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
496 true = [1], 'test', 5, -1, 0xffffffff+1, 0xffffffff/2
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
497
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
498 falseFormat = prefix + '?' * len(false)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
499 packedFalse = struct.pack(falseFormat, *false)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
500 unpackedFalse = struct.unpack(falseFormat, packedFalse)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
501
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
502 trueFormat = prefix + '?' * len(true)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
503 packedTrue = struct.pack(trueFormat, *true)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
504 unpackedTrue = struct.unpack(trueFormat, packedTrue)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
505
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
506 self.assertEqual(len(true), len(unpackedTrue))
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
507 self.assertEqual(len(false), len(unpackedFalse))
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
508
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
509 for t in unpackedFalse:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
510 self.assertFalse(t)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
511 for t in unpackedTrue:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
512 self.assertTrue(t)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
513
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
514 packed = struct.pack(prefix+'?', 1)
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
515
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
516 self.assertEqual(len(packed), struct.calcsize(prefix+'?'))
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
517
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
518 if len(packed) != 1:
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
519 self.assertFalse(prefix, msg='encoded bool is not one byte: %r'
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
520 %packed)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
521
62991
60fdf147032c Yield more information on failure in test_struct boolean test.
Mark Dickinson <dickinsm@gmail.com>
parents: 62932
diff changeset
522 try:
60fdf147032c Yield more information on failure in test_struct boolean test.
Mark Dickinson <dickinsm@gmail.com>
parents: 62932
diff changeset
523 struct.pack(prefix + '?', ExplodingBool())
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78316
diff changeset
524 except OSError:
62991
60fdf147032c Yield more information on failure in test_struct boolean test.
Mark Dickinson <dickinsm@gmail.com>
parents: 62932
diff changeset
525 pass
60fdf147032c Yield more information on failure in test_struct boolean test.
Mark Dickinson <dickinsm@gmail.com>
parents: 62932
diff changeset
526 else:
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78316
diff changeset
527 self.fail("Expected OSError: struct.pack(%r, "
62991
60fdf147032c Yield more information on failure in test_struct boolean test.
Mark Dickinson <dickinsm@gmail.com>
parents: 62932
diff changeset
528 "ExplodingBool())" % (prefix + '?'))
62855
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62251
diff changeset
529
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62251
diff changeset
530 for c in [b'\x01', b'\x7f', b'\xff', b'\x0f', b'\xf0']:
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62251
diff changeset
531 self.assertTrue(struct.unpack('>?', c)[0])
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
532
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
533 def test_count_overflow(self):
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
534 hugecount = '{}b'.format(sys.maxsize+1)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
535 self.assertRaises(struct.error, struct.calcsize, hugecount)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
536
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
537 hugecount2 = '{}b{}H'.format(sys.maxsize//2, sys.maxsize//2)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
538 self.assertRaises(struct.error, struct.calcsize, hugecount2)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 59366
diff changeset
539
62243
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
540 def test_trailing_counter(self):
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
541 store = array.array('b', b' '*100)
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
542
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
543 # format lists containing only count spec should result in an error
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
544 self.assertRaises(struct.error, struct.pack, '12345')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
545 self.assertRaises(struct.error, struct.unpack, '12345', '')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
546 self.assertRaises(struct.error, struct.pack_into, '12345', store, 0)
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
547 self.assertRaises(struct.error, struct.unpack_from, '12345', store, 0)
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
548
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
549 # Format lists with trailing count spec should result in an error
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
550 self.assertRaises(struct.error, struct.pack, 'c12345', 'x')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
551 self.assertRaises(struct.error, struct.unpack, 'c12345', 'x')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
552 self.assertRaises(struct.error, struct.pack_into, 'c12345', store, 0,
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
553 'x')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
554 self.assertRaises(struct.error, struct.unpack_from, 'c12345', store,
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
555 0)
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
556
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
557 # Mixed format tests
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
558 self.assertRaises(struct.error, struct.pack, '14s42', 'spam and eggs')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
559 self.assertRaises(struct.error, struct.unpack, '14s42',
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
560 'spam and eggs')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
561 self.assertRaises(struct.error, struct.pack_into, '14s42', store, 0,
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
562 'spam and eggs')
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
563 self.assertRaises(struct.error, struct.unpack_from, '14s42', store, 0)
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 60309
diff changeset
564
63419
1f0271c036e1 Add test for memory leak reported in issue 9422.
Mark Dickinson <dickinsm@gmail.com>
parents: 63244
diff changeset
565 def test_Struct_reinitialization(self):
1f0271c036e1 Add test for memory leak reported in issue 9422.
Mark Dickinson <dickinsm@gmail.com>
parents: 63244
diff changeset
566 # Issue 9422: there was a memory leak when reinitializing a
1f0271c036e1 Add test for memory leak reported in issue 9422.
Mark Dickinson <dickinsm@gmail.com>
parents: 63244
diff changeset
567 # Struct instance. This test can be used to detect the leak
1f0271c036e1 Add test for memory leak reported in issue 9422.
Mark Dickinson <dickinsm@gmail.com>
parents: 63244
diff changeset
568 # when running with regrtest -L.
1f0271c036e1 Add test for memory leak reported in issue 9422.
Mark Dickinson <dickinsm@gmail.com>
parents: 63244
diff changeset
569 s = struct.Struct('i')
1f0271c036e1 Add test for memory leak reported in issue 9422.
Mark Dickinson <dickinsm@gmail.com>
parents: 63244
diff changeset
570 s.__init__('ii')
48321
f6726f32ef70 Merged revisions 64119,64147,64150,64165,64219-64221,64229-64230,64233,64235,64253,64278,64280,64301,64303,64320,64328,64338-64339 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47750
diff changeset
571
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
572 def check_sizeof(self, format_str, number_of_codes):
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
573 # The size of 'PyStructObject'
78316
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 78313 78315
diff changeset
574 totalsize = support.calcobjsize('2n3P')
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
575 # The size taken up by the 'formatcode' dynamic array
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
576 totalsize += struct.calcsize('P3n0P') * (number_of_codes + 1)
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
577 support.check_sizeof(self, struct.Struct(format_str), totalsize)
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
578
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 78312
diff changeset
579 @support.cpython_only
78312
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
580 def test__sizeof__(self):
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
581 for code in integer_codes:
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
582 self.check_sizeof(code, 1)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
583 self.check_sizeof('BHILfdspP', 9)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
584 self.check_sizeof('B' * 1234, 1234)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
585 self.check_sizeof('fd', 2)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
586 self.check_sizeof('xxxxxxxxxxxxxx', 0)
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
587 self.check_sizeof('100H', 1)
78312
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
588 self.check_sizeof('187s', 1)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
589 self.check_sizeof('20p', 1)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
590 self.check_sizeof('0s', 1)
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78259
diff changeset
591 self.check_sizeof('0c', 0)
78256
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68586
diff changeset
592
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
593
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
594 class UnpackIteratorTest(unittest.TestCase):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
595 """
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
596 Tests for iterative unpacking (struct.Struct.iter_unpack).
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
597 """
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
598
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
599 def test_construct(self):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
600 def _check_iterator(it):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
601 self.assertIsInstance(it, abc.Iterator)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
602 self.assertIsInstance(it, abc.Iterable)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
603 s = struct.Struct('>ibcp')
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
604 it = s.iter_unpack(b"")
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
605 _check_iterator(it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
606 it = s.iter_unpack(b"1234567")
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
607 _check_iterator(it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
608 # Wrong bytes length
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
609 with self.assertRaises(struct.error):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
610 s.iter_unpack(b"123456")
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
611 with self.assertRaises(struct.error):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
612 s.iter_unpack(b"12345678")
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
613 # Zero-length struct
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
614 s = struct.Struct('>')
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
615 with self.assertRaises(struct.error):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
616 s.iter_unpack(b"")
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
617 with self.assertRaises(struct.error):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
618 s.iter_unpack(b"12")
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
619
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
620 def test_iterate(self):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
621 s = struct.Struct('>IB')
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
622 b = bytes(range(1, 16))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
623 it = s.iter_unpack(b)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
624 self.assertEqual(next(it), (0x01020304, 5))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
625 self.assertEqual(next(it), (0x06070809, 10))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
626 self.assertEqual(next(it), (0x0b0c0d0e, 15))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
627 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
628 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
629
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
630 def test_arbitrary_buffer(self):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
631 s = struct.Struct('>IB')
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
632 b = bytes(range(1, 11))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
633 it = s.iter_unpack(memoryview(b))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
634 self.assertEqual(next(it), (0x01020304, 5))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
635 self.assertEqual(next(it), (0x06070809, 10))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
636 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
637 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
638
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
639 def test_length_hint(self):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
640 lh = operator.length_hint
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
641 s = struct.Struct('>IB')
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
642 b = bytes(range(1, 16))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
643 it = s.iter_unpack(b)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
644 self.assertEqual(lh(it), 3)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
645 next(it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
646 self.assertEqual(lh(it), 2)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
647 next(it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
648 self.assertEqual(lh(it), 1)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
649 next(it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
650 self.assertEqual(lh(it), 0)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
651 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
652 self.assertEqual(lh(it), 0)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
653
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
654 def test_module_func(self):
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
655 # Sanity check for the global struct.iter_unpack()
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
656 it = struct.iter_unpack('>IB', bytes(range(1, 11)))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
657 self.assertEqual(next(it), (0x01020304, 5))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
658 self.assertEqual(next(it), (0x06070809, 10))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
659 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
660 self.assertRaises(StopIteration, next, it)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
661
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
662
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
663 def test_main():
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 81039
diff changeset
664 support.run_unittest(__name__)
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40644
diff changeset
665
47750
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
666 if __name__ == '__main__':
f64996760984 Merged revisions 64089,64098,64100-64102,64113,64115-64116,64118,64120,64132,64342 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47201
diff changeset
667 test_main()