test_pickleutil.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import pickle
  2. from ipykernel.pickleutil import can, uncan, codeutil
  3. def interactive(f):
  4. f.__module__ = '__main__'
  5. return f
  6. def dumps(obj):
  7. return pickle.dumps(can(obj))
  8. def loads(obj):
  9. return uncan(pickle.loads(obj))
  10. def test_no_closure():
  11. @interactive
  12. def foo():
  13. a = 5
  14. return a
  15. pfoo = dumps(foo)
  16. bar = loads(pfoo)
  17. assert foo() == bar()
  18. def test_generator_closure():
  19. # this only creates a closure on Python 3
  20. @interactive
  21. def foo():
  22. i = 'i'
  23. r = [ i for j in (1,2) ]
  24. return r
  25. pfoo = dumps(foo)
  26. bar = loads(pfoo)
  27. assert foo() == bar()
  28. def test_nested_closure():
  29. @interactive
  30. def foo():
  31. i = 'i'
  32. def g():
  33. return i
  34. return g()
  35. pfoo = dumps(foo)
  36. bar = loads(pfoo)
  37. assert foo() == bar()
  38. def test_closure():
  39. i = 'i'
  40. @interactive
  41. def foo():
  42. return i
  43. pfoo = dumps(foo)
  44. bar = loads(pfoo)
  45. assert foo() == bar()
  46. def test_uncan_bytes_buffer():
  47. data = b'data'
  48. canned = can(data)
  49. canned.buffers = [memoryview(buf) for buf in canned.buffers]
  50. out = uncan(canned)
  51. assert out == data