def test_incorrect_compressed_size(self): data = self.file.read(woff2DirectorySize) header = sstruct.unpack(woff2DirectoryFormat, data) header['totalCompressedSize'] = 0 data = sstruct.pack(woff2DirectoryFormat, header) with self.assertRaises((brotli.error, ttLib.TTLibError)): WOFF2Reader(BytesIO(data + self.file.read()))
def test_get_normal_tables(self): woff2Reader = WOFF2Reader(self.file) specialTags = woff2TransformedTableTags + ('head', 'GlyphOrder', 'DSIG') for tag in [t for t in self.font.keys() if t not in specialTags]: origData = self.font.getTableData(tag) decompressedData = woff2Reader[tag] self.assertEqual(origData, decompressedData)
def test_incorrect_uncompressed_size(self): decompress_backup = brotli.decompress brotli.decompress = lambda data: b"" # return empty byte string with self.assertRaisesRegex(ttLib.TTLibError, 'unexpected size for decompressed'): WOFF2Reader(self.file) brotli.decompress = decompress_backup
def test_incorrect_file_size(self): data = self.file.read(woff2DirectorySize) header = sstruct.unpack(woff2DirectoryFormat, data) header['length'] -= 1 data = sstruct.pack(woff2DirectoryFormat, header) with self.assertRaisesRegex( ttLib.TTLibError, "doesn't match the actual file size"): WOFF2Reader(BytesIO(data + self.file.read()))
def setUpClass(cls): font = ttLib.TTFont(recalcBBoxes=False, recalcTimestamp=False) font.importXML(TTX) cls.tables = {} cls.transformedTags = ('maxp', 'head', 'loca', 'glyf') for tag in reversed(cls.transformedTags): # compile in inverse order cls.tables[tag] = font.getTableData(tag) infile = BytesIO(TT_WOFF2.getvalue()) reader = WOFF2Reader(infile) cls.transformedGlyfData = reader.tables['glyf'].loadData( reader.transformBuffer) cls.glyphOrder = ['.notdef'] + ["glyph%.5d" % i for i in range(1, font['maxp'].numGlyphs)]
def test_no_transforms(self): writer = WOFF2Writer(BytesIO(), self.numTables, self.font.sfntVersion) writer.flavorData = WOFF2FlavorData(transformedTables=()) for tag in self.tags: writer[tag] = self.font.getTableData(tag) writer.close() self.assertNotEqual(writer.file.getvalue(), TT_WOFF2.getvalue()) writer.file.seek(0) reader = WOFF2Reader(writer.file) self.assertEqual(len(reader.flavorData.transformedTables), 0)
def test_not_enough_data_header(self): incomplete_header = self.file.read(woff2DirectorySize - 1) with self.assertRaisesRegex(ttLib.TTLibError, 'not enough data'): WOFF2Reader(BytesIO(incomplete_header))
def test_bad_signature(self): with self.assertRaisesRegex(ttLib.TTLibError, 'bad signature'): WOFF2Reader(BytesIO(b"wOFF"))
def test_reconstruct_loca_not_match_orig_size(self): reader = WOFF2Reader(self.file) reader.tables['loca'].origLength -= 1 with self.assertRaisesRegex( ttLib.TTLibError, "'loca' table doesn't match original size"): reader.reconstructTable('loca')
def test_reconstruct_loca(self): woff2Reader = WOFF2Reader(self.file) reconstructedData = woff2Reader['loca'] self.font.getTableData("glyf") # 'glyf' needs to be compiled before 'loca' self.assertEqual(self.font.getTableData('loca'), reconstructedData) self.assertTrue(hasattr(woff2Reader.tables['glyf'], 'data'))
def test_reconstruct_glyf(self): woff2Reader = WOFF2Reader(self.file) reconstructedData = woff2Reader['glyf'] self.assertEqual(self.font.getTableData('glyf'), reconstructedData)
def test_reconstruct_unknown(self): reader = WOFF2Reader(self.file) with self.assertRaisesRegex(ttLib.TTLibError, 'transform for table .* unknown'): reader.reconstructTable('head')
def test_table_tags(self): tags = set([t for t in self.font.keys() if t not in ('GlyphOrder', 'DSIG')]) reader = WOFF2Reader(self.file) self.assertEqual(set(reader.keys()), tags)