import os import pytest from fontTools.ttLib import TTFont from fontTools.otlLib.maxContextCalc import maxCtxFont from fontTools.feaLib.builder import addOpenTypeFeaturesFromString def test_max_ctx_calc_no_features(): font = TTFont() assert maxCtxFont(font) == 0 font.setGlyphOrder(['.notdef']) addOpenTypeFeaturesFromString(font, '') assert maxCtxFont(font) == 0 def test_max_ctx_calc_features(): glyphs = '.notdef space A B C a b c'.split() features = """ lookup GSUB_EXT useExtension { sub a by b; } GSUB_EXT; lookup GPOS_EXT useExtension { pos a b -10; } GPOS_EXT; feature sub1 { sub A by a; sub A B by b; sub A B C by c; sub [A B] C by c; sub [A B] C [A B] by c; sub A by A B; sub A' C by A B; sub a' by b; sub a' b by c; sub a from [A B C]; rsub a by b; rsub a' by b; rsub a b' by c; rsub a b' c by A; rsub [a b] c' by A; rsub [a b] c' [a b] by B; lookup GSUB_EXT; } sub1; feature pos1 { pos A 20; pos A B -50; pos A B' 10 C; lookup GPOS_EXT; } pos1; """ font = TTFont() font.setGlyphOrder(glyphs) addOpenTypeFeaturesFromString(font, features) assert maxCtxFont(font) == 3 @pytest.mark.parametrize('file_name, max_context', [ ('gsub_51', 2), ('gsub_52', 2), ('gsub_71', 1), ('gpos_91', 1), ]) def test_max_ctx_calc_features_ttx(file_name, max_context): ttx_path = os.path.join(os.path.dirname(__file__), 'data', '{}.ttx'.format(file_name)) font = TTFont() font.importXML(ttx_path) assert maxCtxFont(font) == max_context