def setUp(self):
     self.dirName = "/bla/"
     self.bandSize = 40
     self.fileOpenings = []
     self.pretendFileExists = True
     self.pretendFileIsFull = True
     self.bff = BandFileFactory(self.dirName, 
                                writable=False, 
                                fileCtor=self.fakeFile,
                                fileSize = self.fakeFileSize)
class BandFileFactoryReadingTest(unittest.TestCase):
    """
    Unit test for BandFileFactory. 
    
    Test BandFileFactory and the wrapped files it returns.
    """
    def setUp(self):
        self.dirName = "/bla/"
        self.bandSize = 40
        self.fileOpenings = []
        self.pretendFileExists = True
        self.pretendFileIsFull = True
        self.bff = BandFileFactory(self.dirName, 
                                   writable=False, 
                                   fileCtor=self.fakeFile,
                                   fileSize = self.fakeFileSize)
        
    def fakeFile(self, filename, mode):
        "Stub for file constructor"
        self.fileOpenings.append((filename, mode))
        if self.pretendFileExists:
            if self.pretendFileIsFull:
                return StringIO(('hello '+filename).ljust(self.bandSize))
            else:
                return StringIO('hello')
        else:
            raise IOError(ENOENT, "No hay")

    def fakeFileSize(self, filename):
        "Stub for the function which computes file sizes"
        if self.pretendFileIsFull:
            return self.bandSize
        else:
            return 5

    def test_open_existing_band_0(self):
        f = self.bff.getBand(0, self.bandSize)
        self.assertEquals(1, len(self.fileOpenings))
        good = 'hello /bla/0'
        s = f.read(len(good)+2)
        self.assertEquals(good+'  ', s)
        f.seek(6)
        self.assertEquals('/bla/0   ', f.read(9))
        f.seek(self.bandSize-4)
        self.assertEquals(' '*4, f.read(4))

    def test_open_existing_band_31(self):
        f = self.bff.getBand(31, self.bandSize)
        self.assertEquals([('/bla/1f', 'rb')], self.fileOpenings)

    def test_open_nonexisting_band_returns_all_zero_file(self):
        self.pretendFileExists = False
        f = self.bff.getBand(255, self.bandSize)
        self.assertEquals(1, len(self.fileOpenings))
        self.assertEquals(('/bla/ff', 'rb'), self.fileOpenings[0])
        self.assertEquals('\0'*13, f.read(13))
        f.seek(self.bandSize - 5, SEEK_SET)
        self.assertEquals('\0'*5, f.read(5))

    def test_open_too_short_file(self):
        self.pretendFileIsFull = False
        f = self.bff.getBand(255, self.bandSize)
        self.assertEquals('hello\0', f.read(6))
        f.seek(self.bandSize - 5, SEEK_SET)
        self.assertEquals('\0'*5, f.read(5))