[Python-checkins] CVS: python/dist/src/Lib/test test_struct.py,1.11,1.12

Tim Peters tim_one@users.sourceforge.net
Wed, 13 Jun 2001 15:45:29 -0700


Update of /cvsroot/python/python/dist/src/Lib/test
In directory usw-pr-cvs1:/tmp/cvs-serv12079/python/dist/src/Lib/test

Modified Files:
	test_struct.py 
Log Message:
Generalize the new qQ std-mode tests to all int codes (bBhHiIlLqQ).
Unfortunately, the std-mode bBhHIL codes don't do any range-checking; if
and when some of those get fixed, remove their letters from the
IntTester.BUGGY_RANGE_CHECK string.  In the meantime, a msg saying that
range-tests are getting skipped is printed to stdout whenever one is
skipped.


Index: test_struct.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_struct.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** test_struct.py	2001/06/13 01:26:35	1.11
--- test_struct.py	2001/06/13 22:45:27	1.12
***************
*** 3,6 ****
--- 3,23 ----
  ## import pdb
  
+ import sys
+ ISBIGENDIAN = sys.byteorder == "big"
+ del sys
+ verify((struct.pack('=i', 1)[0] == chr(0)) == ISBIGENDIAN,
+        "bigendian determination appears wrong")
+ 
+ def string_reverse(s):
+     chars = list(s)
+     chars.reverse()
+     return "".join(chars)
+ 
+ def bigendian_to_native(value):
+     if ISBIGENDIAN:
+         return value
+     else:
+         return string_reverse(value)
+ 
  def simple_err(func, *args):
      try:
***************
*** 23,26 ****
--- 40,44 ----
  ##      pdb.set_trace()
  
+ 
  simple_err(struct.calcsize, 'Z')
  
***************
*** 104,114 ****
  ]
  
- isbigendian = struct.pack('=i', 1)[0] == chr(0)
- 
  for fmt, arg, big, lil, asy in tests:
      if verbose:
          print `fmt`, `arg`, `big`, `lil`
      for (xfmt, exp) in [('>'+fmt, big), ('!'+fmt, big), ('<'+fmt, lil),
!                         ('='+fmt, isbigendian and big or lil)]:
          res = struct.pack(xfmt, arg)
          if res != exp:
--- 122,130 ----
  ]
  
  for fmt, arg, big, lil, asy in tests:
      if verbose:
          print `fmt`, `arg`, `big`, `lil`
      for (xfmt, exp) in [('>'+fmt, big), ('!'+fmt, big), ('<'+fmt, lil),
!                         ('='+fmt, ISBIGENDIAN and big or lil)]:
          res = struct.pack(xfmt, arg)
          if res != exp:
***************
*** 125,129 ****
  
  ###########################################################################
! # q/Q tests.
  
  has_native_qQ = 1
--- 141,145 ----
  
  ###########################################################################
! # Simple native q/Q tests.
  
  has_native_qQ = 1
***************
*** 140,154 ****
  simple_err(struct.pack, "Q", "a")  # ditto, but 'Q'
  
- def string_reverse(s):
-     chars = list(s)
-     chars.reverse()
-     return "".join(chars)
- 
- def bigendian_to_native(value):
-     if isbigendian:
-         return value
-     else:
-         return string_reverse(value)
- 
  def test_native_qQ():
      bytes = struct.calcsize('q')
--- 156,159 ----
***************
*** 176,323 ****
      test_native_qQ()
  
! # Standard q/Q (8 bytes; should work on all platforms).
! 
! MIN_Q, MAX_Q = 0, 2L**64 - 1
! MIN_q, MAX_q = -(2L**63), 2L**63 - 1
  
  import binascii
- def test_one_qQ(x, pack=struct.pack,
-                    unpack=struct.unpack,
-                    unhexlify=binascii.unhexlify):
-     if verbose:
-         print "trying std q/Q on", x, "==", hex(x)
  
!     # Try 'q'.
!     if MIN_q <= x <= MAX_q:
!         # Try '>q'.
!         expected = long(x)
!         if x < 0:
!             expected += 1L << 64
!             assert expected > 0
!         expected = hex(expected)[2:-1] # chop "0x" and trailing 'L'
!         if len(expected) & 1:
!             expected = "0" + expected
!         expected = unhexlify(expected)
!         expected = "\x00" * (8 - len(expected)) + expected
! 
!         # >q pack work?
!         got = pack(">q", x)
!         verify(got == expected,
!                "'>q'-pack of %r gave %r, not %r" %
!                 (x, got, expected))
! 
!         # >q unpack work?
!         retrieved = unpack(">q", got)[0]
!         verify(x == retrieved,
!                "'>q'-unpack of %r gave %r, not %r" %
!                 (got, retrieved, x))
! 
!         # Adding any byte should cause a "too big" error.
!         any_err(unpack, ">q", '\x01' + got)
! 
!         # Try '<q'.
!         expected = string_reverse(expected)
! 
!         # <q pack work?
!         got = pack("<q", x)
!         verify(got == expected,
!                "'<q'-pack of %r gave %r, not %r" %
!                 (x, got, expected))
! 
!         # <q unpack work?
!         retrieved = unpack("<q", got)[0]
!         verify(x == retrieved,
!                "'<q'-unpack of %r gave %r, not %r" %
!                 (got, retrieved, x))
  
!         # Adding any byte should cause a "too big" error.
!         any_err(unpack, "<q", '\x01' + got)
  
!     else:
!         # x is out of q's range -- verify pack realizes that.
!         any_err(pack, '>q', x)
!         any_err(pack, '<q', x)
! 
!     # Much the same for 'Q'.
!     if MIN_Q <= x <= MAX_Q:
!         # Try '>Q'.
!         expected = long(x)
!         expected = hex(expected)[2:-1] # chop "0x" and trailing 'L'
!         if len(expected) & 1:
!             expected = "0" + expected
!         expected = unhexlify(expected)
!         expected = "\x00" * (8 - len(expected)) + expected
! 
!         # >Q pack work?
!         got = pack(">Q", x)
!         verify(got == expected,
!                "'>Q'-pack of %r gave %r, not %r" %
!                 (x, got, expected))
! 
!         # >Q unpack work?
!         retrieved = unpack(">Q", got)[0]
!         verify(x == retrieved,
!                "'>Q'-unpack of %r gave %r, not %r" %
!                 (got, retrieved, x))
! 
!         # Adding any byte should cause a "too big" error.
!         any_err(unpack, ">Q", '\x01' + got)
! 
!         # Try '<Q'.
!         expected = string_reverse(expected)
! 
!         # <Q pack work?
!         got = pack("<Q", x)
!         verify(got == expected,
!                "'<Q'-pack of %r gave %r, not %r" %
!                 (x, got, expected))
! 
!         # <Q unpack work?
!         retrieved = unpack("<Q", got)[0]
!         verify(x == retrieved,
!                "'<Q'-unpack of %r gave %r, not %r" %
!                 (got, retrieved, x))
! 
!         # Adding any byte should cause a "too big" error.
!         any_err(unpack, "<Q", '\x01' + got)
  
!     else:
!         # x is out of Q's range -- verify pack realizes that.
!         any_err(pack, '>Q', x)
!         any_err(pack, '<Q', x)
! 
! def test_std_qQ():
!     from random import randrange
! 
!     # Create all interesting powers of 2.
!     values = []
!     for exp in range(70):
!         values.append(1L << exp)
! 
!     # Add some random 64-bit values.
!     for i in range(50):
!         val = 0L
!         for j in range(8):
!             val = (val << 8) | randrange(256)
!         values.append(val)
! 
!     # Try all those, and their negations, and +-1 from them.  Note
!     # that this tests all power-of-2 boundaries in range, and a few out
!     # of range, plus +-(2**n +- 1).
!     for base in values:
!         for val in -base, base:
!             for incr in -1, 0, 1:
!                 x = val + incr
!                 try:
!                     x = int(x)
!                 except OverflowError:
!                     pass
!                 test_one_qQ(x)
! 
!     # Some error cases.
!     for direction in "<>":
!         for letter in "qQ":
!             for badobject in "a string", 3+42j, randrange:
!                 any_err(struct.pack, direction + letter, badobject)
!     
! test_std_qQ()
--- 181,367 ----
      test_native_qQ()
  
! ###########################################################################
! # Standard integer tests (bBhHiIlLqQ).
  
  import binascii
  
! class IntTester:
  
!     # XXX Most std integer modes fail to test for out-of-range.
!     BUGGY_RANGE_CHECK = "bBhHIL"
  
!     def __init__(self, formatpair, bytesize):
!         assert len(formatpair) == 2
!         self.formatpair = formatpair
!         for direction in "<>!=":
!             for code in formatpair:
!                 format = direction + code
!                 verify(struct.calcsize(format) == bytesize)
!         self.bytesize = bytesize
!         self.bitsize = bytesize * 8
!         self.signed_code, self.unsigned_code = formatpair
!         self.unsigned_min = 0
!         self.unsigned_max = 2L**self.bitsize - 1
!         self.signed_min = -(2L**(self.bitsize-1))
!         self.signed_max = 2L**(self.bitsize-1) - 1
! 
!     def test_one(self, x, pack=struct.pack,
!                           unpack=struct.unpack,
!                           unhexlify=binascii.unhexlify):
!         if verbose:
!             print "trying std", self.formatpair, "on", x, "==", hex(x)
  
!         # Try signed.
!         code = self.signed_code
!         if self.signed_min <= x <= self.signed_max:
!             # Try big-endian.
!             expected = long(x)
!             if x < 0:
!                 expected += 1L << self.bitsize
!                 assert expected > 0
!             expected = hex(expected)[2:-1] # chop "0x" and trailing 'L'
!             if len(expected) & 1:
!                 expected = "0" + expected
!             expected = unhexlify(expected)
!             expected = "\x00" * (self.bytesize - len(expected)) + expected
! 
!             # Pack work?
!             format = ">" + code
!             got = pack(format, x)
!             verify(got == expected,
!                    "'%s'-pack of %r gave %r, not %r" %
!                     (format, x, got, expected))
! 
!             # Unpack work?
!             retrieved = unpack(format, got)[0]
!             verify(x == retrieved,
!                    "'%s'-unpack of %r gave %r, not %r" %
!                     (format, got, retrieved, x))
! 
!             # Adding any byte should cause a "too big" error.
!             any_err(unpack, format, '\x01' + got)
! 
!             # Try little-endian.
!             format = "<" + code
!             expected = string_reverse(expected)
! 
!             # Pack work?
!             got = pack(format, x)
!             verify(got == expected,
!                    "'%s'-pack of %r gave %r, not %r" %
!                     (format, x, got, expected))
! 
!             # Unpack work?
!             retrieved = unpack(format, got)[0]
!             verify(x == retrieved,
!                    "'%s'-unpack of %r gave %r, not %r" %
!                     (format, got, retrieved, x))
! 
!             # Adding any byte should cause a "too big" error.
!             any_err(unpack, format, '\x01' + got)
! 
!         else:
!             # x is out of range -- verify pack realizes that.
!             if code in self.BUGGY_RANGE_CHECK:
!                 if verbose:
!                     print "Skipping buggy range check for code", code
!             else:
!                 any_err(pack, ">" + code, x)
!                 any_err(pack, "<" + code, x)
! 
!         # Much the same for unsigned.
!         code = self.unsigned_code
!         if self.unsigned_min <= x <= self.unsigned_max:
!             # Try big-endian.
!             format = ">" + code
!             expected = long(x)
!             expected = hex(expected)[2:-1] # chop "0x" and trailing 'L'
!             if len(expected) & 1:
!                 expected = "0" + expected
!             expected = unhexlify(expected)
!             expected = "\x00" * (self.bytesize - len(expected)) + expected
! 
!             # Pack work?
!             got = pack(format, x)
!             verify(got == expected,
!                    "'%s'-pack of %r gave %r, not %r" %
!                     (format, x, got, expected))
! 
!             # Unpack work?
!             retrieved = unpack(format, got)[0]
!             verify(x == retrieved,
!                    "'%s'-unpack of %r gave %r, not %r" %
!                     (format, got, retrieved, x))
! 
!             # Adding any byte should cause a "too big" error.
!             any_err(unpack, format, '\x01' + got)
! 
!             # Try little-endian.
!             format = "<" + code
!             expected = string_reverse(expected)
! 
!             # Pack work?
!             got = pack(format, x)
!             verify(got == expected,
!                    "'%s'-pack of %r gave %r, not %r" %
!                     (format, x, got, expected))
! 
!             # Unpack work?
!             retrieved = unpack(format, got)[0]
!             verify(x == retrieved,
!                    "'%s'-unpack of %r gave %r, not %r" %
!                     (format, got, retrieved, x))
! 
!             # Adding any byte should cause a "too big" error.
!             any_err(unpack, format, '\x01' + got)
! 
!         else:
!             # x is out of range -- verify pack realizes that.
!             if code in self.BUGGY_RANGE_CHECK:
!                 if verbose:
!                     print "Skipping buggy range check for code", code
!             else:
!                 any_err(pack, ">" + code, x)
!                 any_err(pack, "<" + code, x)
! 
!     def run(self):
!         from random import randrange
! 
!         # Create all interesting powers of 2.
!         values = []
!         for exp in range(self.bitsize + 3):
!             values.append(1L << exp)
! 
!         # Add some random values.
!         for i in range(self.bitsize):
!             val = 0L
!             for j in range(self.bytesize):
!                 val = (val << 8) | randrange(256)
!             values.append(val)
! 
!         # Try all those, and their negations, and +-1 from them.  Note
!         # that this tests all power-of-2 boundaries in range, and a few out
!         # of range, plus +-(2**n +- 1).
!         for base in values:
!             for val in -base, base:
!                 for incr in -1, 0, 1:
!                     x = val + incr
!                     try:
!                         x = int(x)
!                     except OverflowError:
!                         pass
!                     self.test_one(x)
! 
!         # Some error cases.
!         for direction in "<>":
!             for code in self.formatpair:
!                 for badobject in "a string", 3+42j, randrange:
!                     any_err(struct.pack, direction + code, badobject)
! 
! for args in [("bB", 1),
!              ("hH", 2),
!              ("iI", 4),
!              ("lL", 4),
!              ("qQ", 8)]:
!     t = IntTester(*args)
!     t.run()