| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # coding: utf-8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from nose import main | 
					
						
							|  |  |  | from nose.tools import * | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-04 14:58:36 +09:00
										 |  |  | from msgpack import packb, unpackb | 
					
						
							| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _decode_complex(obj): | 
					
						
							| 
									
										
										
										
											2012-06-19 13:55:14 +09:00
										 |  |  |     if b'__complex__' in obj: | 
					
						
							|  |  |  |         return complex(obj[b'real'], obj[b'imag']) | 
					
						
							| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  |     return obj | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _encode_complex(obj): | 
					
						
							|  |  |  |     if isinstance(obj, complex): | 
					
						
							| 
									
										
										
										
											2012-06-19 13:55:14 +09:00
										 |  |  |         return {b'__complex__': True, b'real': 1, b'imag': 2} | 
					
						
							| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  |     return obj | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_encode_hook(): | 
					
						
							| 
									
										
										
										
											2012-07-04 14:58:36 +09:00
										 |  |  |     packed = packb([3, 1+2j], default=_encode_complex) | 
					
						
							| 
									
										
										
										
											2012-09-24 02:20:53 +09:00
										 |  |  |     unpacked = unpackb(packed, use_list=1) | 
					
						
							| 
									
										
										
										
											2012-06-19 13:55:14 +09:00
										 |  |  |     eq_(unpacked[1], {b'__complex__': True, b'real': 1, b'imag': 2}) | 
					
						
							| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_decode_hook(): | 
					
						
							| 
									
										
										
										
											2012-07-04 14:58:36 +09:00
										 |  |  |     packed = packb([3, {b'__complex__': True, b'real': 1, b'imag': 2}]) | 
					
						
							| 
									
										
										
										
											2012-09-24 02:20:53 +09:00
										 |  |  |     unpacked = unpackb(packed, object_hook=_decode_complex, use_list=1) | 
					
						
							| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  |     eq_(unpacked[1], 1+2j) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-23 19:37:28 +10:00
										 |  |  | def test_decode_pairs_hook(): | 
					
						
							|  |  |  |     packed = packb([3, {1: 2, 3: 4}]) | 
					
						
							|  |  |  |     prod_sum = 1 * 2 + 3 * 4 | 
					
						
							| 
									
										
										
										
											2012-09-24 03:08:13 +09:00
										 |  |  |     unpacked = unpackb(packed, object_pairs_hook=lambda l: sum(k * v for k, v in l), use_list=1) | 
					
						
							| 
									
										
										
										
											2012-09-23 19:37:28 +10:00
										 |  |  |     eq_(unpacked[1], prod_sum) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @raises(ValueError) | 
					
						
							|  |  |  | def test_only_one_obj_hook(): | 
					
						
							| 
									
										
										
										
											2012-09-24 03:05:39 +09:00
										 |  |  |     unpackb(b'', object_hook=lambda x: x, object_pairs_hook=lambda x: x) | 
					
						
							| 
									
										
										
										
											2012-09-23 19:37:28 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-29 23:22:41 +09:00
										 |  |  | @raises(ValueError) | 
					
						
							| 
									
										
										
										
											2010-10-26 01:49:00 +09:00
										 |  |  | def test_bad_hook(): | 
					
						
							| 
									
										
										
										
											2012-07-04 14:58:36 +09:00
										 |  |  |     packed = packb([3, 1+2j], default=lambda o: o) | 
					
						
							| 
									
										
										
										
											2012-09-24 02:20:53 +09:00
										 |  |  |     unpacked = unpackb(packed, use_list=1) | 
					
						
							| 
									
										
										
										
											2010-10-26 01:49:00 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-26 02:09:52 +09:00
										 |  |  | def _arr_to_str(arr): | 
					
						
							|  |  |  |     return ''.join(str(c) for c in arr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_array_hook(): | 
					
						
							| 
									
										
										
										
											2012-07-04 14:58:36 +09:00
										 |  |  |     packed = packb([1,2,3]) | 
					
						
							| 
									
										
										
										
											2012-09-24 02:20:53 +09:00
										 |  |  |     unpacked = unpackb(packed, list_hook=_arr_to_str, use_list=1) | 
					
						
							| 
									
										
										
										
											2010-10-26 02:09:52 +09:00
										 |  |  |     eq_(unpacked, '123') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-12 12:34:18 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | class DecodeError(Exception): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def bad_complex_decoder(o): | 
					
						
							|  |  |  |     raise DecodeError("Ooops!") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @raises(DecodeError) | 
					
						
							|  |  |  | def test_an_exception_in_objecthook1(): | 
					
						
							|  |  |  |     packed = packb({1: {'__complex__': True, 'real': 1, 'imag': 2}}) | 
					
						
							|  |  |  |     unpackb(packed, object_hook=bad_complex_decoder) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-12 13:19:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | @raises(DecodeError) | 
					
						
							|  |  |  | def test_an_exception_in_objecthook2(): | 
					
						
							|  |  |  |     packed = packb({1: [{'__complex__': True, 'real': 1, 'imag': 2}]}) | 
					
						
							|  |  |  |     unpackb(packed, list_hook=bad_complex_decoder, use_list=1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-26 01:26:06 +09:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2012-06-19 13:55:14 +09:00
										 |  |  |     main() |