1from __future__ import print_function, division, absolute_import 2from fontTools.misc.py23 import * 3from fontTools.varLib.featureVars import ( 4 overlayFeatureVariations) 5 6 7def test_linear(n = 10): 8 conds = [] 9 for i in range(n): 10 end = i / n 11 start = end - 1. 12 region = [{'X': (start, end)}] 13 subst = {'g%.2g'%start: 'g%.2g'%end} 14 conds.append((region, subst)) 15 overlaps = overlayFeatureVariations(conds) 16 assert len(overlaps) == 2 * n - 1, overlaps 17 return conds, overlaps 18 19def test_quadratic(n = 10): 20 conds = [] 21 for i in range(1, n + 1): 22 region = [{'X': (0, i / n), 23 'Y': (0, (n + 1 - i) / n)}] 24 subst = {str(i): str(n + 1 - i)} 25 conds.append((region, subst)) 26 overlaps = overlayFeatureVariations(conds) 27 assert len(overlaps) == n * (n + 1) // 2, overlaps 28 return conds, overlaps 29 30def _merge_substitutions(substitutions): 31 merged = {} 32 for subst in substitutions: 33 merged.update(subst) 34 return merged 35 36def _match_condition(location, overlaps): 37 for box, substitutions in overlaps: 38 for tag, coord in location.items(): 39 start, end = box[tag] 40 if start <= coord <= end: 41 return _merge_substitutions(substitutions) 42 return {} # no match 43 44def test_overlaps_1(): 45 # https://github.com/fonttools/fonttools/issues/1400 46 conds = [ 47 ([{'abcd': (4, 9)}], {0: 0}), 48 ([{'abcd': (5, 10)}], {1: 1}), 49 ([{'abcd': (0, 8)}], {2: 2}), 50 ([{'abcd': (3, 7)}], {3: 3}), 51 ] 52 overlaps = overlayFeatureVariations(conds) 53 subst = _match_condition({'abcd': 0}, overlaps) 54 assert subst == {2: 2} 55 subst = _match_condition({'abcd': 1}, overlaps) 56 assert subst == {2: 2} 57 subst = _match_condition({'abcd': 3}, overlaps) 58 assert subst == {2: 2, 3: 3} 59 subst = _match_condition({'abcd': 4}, overlaps) 60 assert subst == {0: 0, 2: 2, 3: 3} 61 subst = _match_condition({'abcd': 5}, overlaps) 62 assert subst == {0: 0, 1: 1, 2: 2, 3: 3} 63 subst = _match_condition({'abcd': 7}, overlaps) 64 assert subst == {0: 0, 1: 1, 2: 2, 3: 3} 65 subst = _match_condition({'abcd': 8}, overlaps) 66 assert subst == {0: 0, 1: 1, 2: 2} 67 subst = _match_condition({'abcd': 9}, overlaps) 68 assert subst == {0: 0, 1: 1} 69 subst = _match_condition({'abcd': 10}, overlaps) 70 assert subst == {1: 1} 71 72def test_overlaps_2(): 73 # https://github.com/fonttools/fonttools/issues/1400 74 conds = [ 75 ([{'abcd': (1, 9)}], {0: 0}), 76 ([{'abcd': (8, 10)}], {1: 1}), 77 ([{'abcd': (3, 4)}], {2: 2}), 78 ([{'abcd': (1, 10)}], {3: 3}), 79 ] 80 overlaps = overlayFeatureVariations(conds) 81 subst = _match_condition({'abcd': 0}, overlaps) 82 assert subst == {} 83 subst = _match_condition({'abcd': 1}, overlaps) 84 assert subst == {0: 0, 3: 3} 85 subst = _match_condition({'abcd': 2}, overlaps) 86 assert subst == {0: 0, 3: 3} 87 subst = _match_condition({'abcd': 3}, overlaps) 88 assert subst == {0: 0, 2: 2, 3: 3} 89 subst = _match_condition({'abcd': 5}, overlaps) 90 assert subst == {0: 0, 3: 3} 91 subst = _match_condition({'abcd': 10}, overlaps) 92 assert subst == {1: 1, 3: 3} 93 94 95def run(test, n, quiet): 96 97 print() 98 print("%s:" % test.__name__) 99 input, output = test(n) 100 if quiet: 101 print(len(output)) 102 else: 103 print() 104 print("Input:") 105 pprint(input) 106 print() 107 print("Output:") 108 pprint(output) 109 print() 110 111if __name__ == "__main__": 112 import sys 113 from pprint import pprint 114 quiet = False 115 n = 3 116 if len(sys.argv) > 1 and sys.argv[1] == '-q': 117 quiet = True 118 del sys.argv[1] 119 if len(sys.argv) > 1: 120 n = int(sys.argv[1]) 121 122 run(test_linear, n=n, quiet=quiet) 123 run(test_quadratic, n=n, quiet=quiet) 124