def test_getKerningClasses(self, FontClass): font = FontClass() for i in range(65, 65 + 6): # A..F font.newGlyph(chr(i)) font.groups.update({ "public.kern1.A": ["A", "B"], "public.kern2.C": ["C", "D"] }) # simulate a name clash between pre-existing class definitions in # feature file, and those generated by the feature writer font.features.text = "@kern1.A = [E F];" writer = KernFeatureWriter() feaFile = parseLayoutFeatures(font) side1Classes, side2Classes = KernFeatureWriter.getKerningClasses( font, feaFile) assert "public.kern1.A" in side1Classes # the new class gets a unique name assert side1Classes["public.kern1.A"].name == "kern1.A_1" assert getGlyphs(side1Classes["public.kern1.A"]) == ["A", "B"] assert "public.kern2.C" in side2Classes assert side2Classes["public.kern2.C"].name == "kern2.C" assert getGlyphs(side2Classes["public.kern2.C"]) == ["C", "D"]
def test_correct_invalid_class_names(self, FontClass): font = FontClass() for i in range(65, 65 + 12): # A..L font.newGlyph(chr(i)) font.groups.update( { "public.kern1.foo$": ["A", "B", "C"], "public.kern1.foo@": ["D", "E", "F"], "@public.kern2.bar": ["G", "H", "I"], "public.kern2.bar&": ["J", "K", "L"], } ) font.kerning.update( { ("public.kern1.foo$", "@public.kern2.bar"): 10, ("public.kern1.foo@", "public.kern2.bar&"): -10, } ) side1Classes, side2Classes = KernFeatureWriter.getKerningClasses(font) assert side1Classes["public.kern1.foo$"].name == "kern1.foo" assert side1Classes["public.kern1.foo@"].name == "kern1.foo_1" # no valid 'public.kern{1,2}.' prefix, skipped assert "@public.kern2.bar" not in side2Classes assert side2Classes["public.kern2.bar&"].name == "kern2.bar"
def test_getKerningPairs(self, FontClass): font = FontClass() for i in range(65, 65 + 8): # A..H font.newGlyph(chr(i)) font.groups.update({ "public.kern1.foo": ["A", "B"], "public.kern2.bar": ["C", "D"], "public.kern1.baz": ["E", "F"], "public.kern2.nul": ["G", "H"], }) font.kerning.update({ ("public.kern1.foo", "public.kern2.bar"): 10, ("public.kern1.baz", "public.kern2.bar"): -10, ("public.kern1.foo", "D"): 15, ("A", "public.kern2.bar"): 5, ("G", "H"): -5, # class-class zero-value pairs are skipped ("public.kern1.foo", "public.kern2.nul"): 0, }) s1c, s2c = KernFeatureWriter.getKerningClasses(font) pairs = KernFeatureWriter.getKerningPairs(font, s1c, s2c) assert len(pairs) == 5 assert "G H -5" in repr(pairs[0]) assert (pairs[0].firstIsClass, pairs[0].secondIsClass) == (False, False) assert pairs[0].glyphs == {"G", "H"} assert "A @kern2.bar 5" in repr(pairs[1]) assert (pairs[1].firstIsClass, pairs[1].secondIsClass) == (False, True) assert pairs[1].glyphs == {"A", "C", "D"} assert "@kern1.foo D 15" in repr(pairs[2]) assert (pairs[2].firstIsClass, pairs[2].secondIsClass) == (True, False) assert pairs[2].glyphs == {"A", "B", "D"} assert "@kern1.baz @kern2.bar -10" in repr(pairs[3]) assert (pairs[3].firstIsClass, pairs[3].secondIsClass) == (True, True) assert pairs[3].glyphs == {"C", "D", "E", "F"} assert "@kern1.foo @kern2.bar 10" in repr(pairs[4]) assert (pairs[4].firstIsClass, pairs[4].secondIsClass) == (True, True) assert pairs[4].glyphs == {"A", "B", "C", "D"}