fakeopen.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. # Written by Bram Cohen
  2. # see LICENSE.txt for license information
  3. from string import join
  4. class FakeHandle:
  5. def __init__(self, name, fakeopen):
  6. self.name = name
  7. self.fakeopen = fakeopen
  8. self.pos = 0
  9. def flush(self):
  10. pass
  11. def close(self):
  12. pass
  13. def seek(self, pos):
  14. self.pos = pos
  15. def read(self, amount = None):
  16. old = self.pos
  17. f = self.fakeopen.files[self.name]
  18. if self.pos >= len(f):
  19. return ''
  20. if amount is None:
  21. self.pos = len(f)
  22. return join(f[old:], '')
  23. else:
  24. self.pos = min(len(f), old + amount)
  25. return join(f[old:self.pos], '')
  26. def write(self, s):
  27. f = self.fakeopen.files[self.name]
  28. while len(f) < self.pos:
  29. f.append(chr(0))
  30. self.fakeopen.files[self.name][self.pos : self.pos + len(s)] = list(s)
  31. self.pos += len(s)
  32. class FakeOpen:
  33. def __init__(self, initial = {}):
  34. self.files = {}
  35. for key, value in initial.items():
  36. self.files[key] = list(value)
  37. def open(self, filename, mode):
  38. """currently treats everything as rw - doesn't support append"""
  39. self.files.setdefault(filename, [])
  40. return FakeHandle(filename, self)
  41. def exists(self, file):
  42. return self.files.has_key(file)
  43. def getsize(self, file):
  44. return len(self.files[file])
  45. def test_normal():
  46. f = FakeOpen({'f1': 'abcde'})
  47. assert f.exists('f1')
  48. assert not f.exists('f2')
  49. assert f.getsize('f1') == 5
  50. h = f.open('f1', 'rw')
  51. assert h.read(3) == 'abc'
  52. assert h.read(1) == 'd'
  53. assert h.read() == 'e'
  54. assert h.read(2) == ''
  55. h.write('fpq')
  56. h.seek(4)
  57. assert h.read(2) == 'ef'
  58. h.write('ghij')
  59. h.seek(0)
  60. assert h.read() == 'abcdefghij'
  61. h.seek(2)
  62. h.write('p')
  63. h.write('q')
  64. assert h.read(1) == 'e'
  65. h.seek(1)
  66. assert h.read(5) == 'bpqef'
  67. h2 = f.open('f2', 'rw')
  68. assert h2.read() == ''
  69. h2.write('mnop')
  70. h2.seek(1)
  71. assert h2.read() == 'nop'
  72. assert f.exists('f1')
  73. assert f.exists('f2')
  74. assert f.getsize('f1') == 10
  75. assert f.getsize('f2') == 4