@@ -534,6 +534,72 @@ def test_maketrans(self):
534534 self .assertRaises (ValueError , bytes .maketrans , b'abc' , b'xyzq' )
535535 self .assertRaises (TypeError , bytes .maketrans , 'abc' , 'def' )
536536
537+ @unittest .expectedFailure
538+ def test_mod (self ):
539+ """
540+ Test for the PEP 461 functionality (resurrection of %s formatting for
541+ bytes).
542+ """
543+ b1 = bytes (b'abc%b' )
544+ b2 = b1 % b'def'
545+ self .assertEqual (b2 , b'abcdef' )
546+ self .assertTrue (isinstance (b2 , bytes ))
547+ self .assertEqual (type (b2 ), bytes )
548+ b3 = b1 % bytes (b'def' )
549+ self .assertEqual (b3 , b'abcdef' )
550+ self .assertTrue (isinstance (b3 , bytes ))
551+ self .assertEqual (type (b3 ), bytes )
552+
553+ # %s is supported for backwards compatibility with Py2's str
554+ b4 = bytes (b'abc%s' )
555+ b5 = b4 % b'def'
556+ self .assertEqual (b5 , b'abcdef' )
557+ self .assertTrue (isinstance (b5 , bytes ))
558+ self .assertEqual (type (b5 ), bytes )
559+ b6 = b4 % bytes (b'def' )
560+ self .assertEqual (b6 , b'abcdef' )
561+ self .assertTrue (isinstance (b6 , bytes ))
562+ self .assertEqual (type (b6 ), bytes )
563+
564+ self .assertEqual (bytes (b'%c' ) % 48 , b'0' )
565+ self .assertEqual (bytes (b'%c' ) % b'a' , b'a' )
566+
567+ # For any numeric code %x, formatting of
568+ # b"%x" % val
569+ # is supposed to be equivalent to
570+ # ("%x" % val).encode("ascii")
571+ for code in b'xdiouxXeEfFgG' :
572+ pct_str = u"%" + code .decode ('ascii' )
573+ for val in range (300 ):
574+ self .assertEqual (bytes (b"%" + code ) % val ,
575+ (pct_str % val ).encode ("ascii" ))
576+
577+ with self .assertRaises (TypeError ):
578+ bytes (b'%b' ) % 3.14
579+ # Traceback (most recent call last):
580+ # ...
581+ # TypeError: b'%b' does not accept 'float'
582+
583+ with self .assertRaises (TypeError ):
584+ bytes (b'%b' ) % 'hello world!'
585+ # Traceback (most recent call last):
586+ # ...
587+ # TypeError: b'%b' does not accept 'str'
588+
589+ self .assertEqual (bytes (b'%a' ) % 3.14 , b'3.14' )
590+
591+ self .assertEqual (bytes (b'%a' ) % b'abc' , b"b'abc'" )
592+ self .assertEqual (bytes (b'%a' ) % bytes (b'abc' ), b"b'abc'" )
593+
594+ self .assertEqual (bytes (b'%a' ) % 'def' , b"'def'" )
595+
596+ # PEP 461 specifes that %r is not supported.
597+ with self .assertRaises (TypeError ):
598+ bytes (b'%r' % b'abc' )
599+
600+ with self .assertRaises (TypeError ):
601+ bytes (b'%r' % 'abc' )
602+
537603
538604if __name__ == '__main__' :
539605 unittest .main ()
0 commit comments