fuchsia / third_party / fonttools / e1f0d1ae09c84c60d0492a075cff1dcc17fedf54 / . / Tests / varLib / featureVars_test.py

from __future__ import print_function, division, absolute_import | |

from fontTools.misc.py23 import * | |

from fontTools.varLib.featureVars import ( | |

overlayFeatureVariations) | |

def test_linear(n = 10): | |

conds = [] | |

for i in range(n): | |

end = i / n | |

start = end - 1. | |

region = [{'X': (start, end)}] | |

subst = {'g%.2g'%start: 'g%.2g'%end} | |

conds.append((region, subst)) | |

overlaps = overlayFeatureVariations(conds) | |

assert len(overlaps) == 2 * n - 1, overlaps | |

return conds, overlaps | |

def test_quadratic(n = 10): | |

conds = [] | |

for i in range(1, n + 1): | |

region = [{'X': (0, i / n), | |

'Y': (0, (n + 1 - i) / n)}] | |

subst = {str(i): str(n + 1 - i)} | |

conds.append((region, subst)) | |

overlaps = overlayFeatureVariations(conds) | |

assert len(overlaps) == n * (n + 1) // 2, overlaps | |

return conds, overlaps | |

def _merge_substitutions(substitutions): | |

merged = {} | |

for subst in substitutions: | |

merged.update(subst) | |

return merged | |

def _match_condition(location, overlaps): | |

for box, substitutions in overlaps: | |

for tag, coord in location.items(): | |

start, end = box[tag] | |

if start <= coord <= end: | |

return _merge_substitutions(substitutions) | |

return {} # no match | |

def test_overlaps_1(): | |

# https://github.com/fonttools/fonttools/issues/1400 | |

conds = [ | |

([{'abcd': (4, 9)}], {0: 0}), | |

([{'abcd': (5, 10)}], {1: 1}), | |

([{'abcd': (0, 8)}], {2: 2}), | |

([{'abcd': (3, 7)}], {3: 3}), | |

] | |

overlaps = overlayFeatureVariations(conds) | |

subst = _match_condition({'abcd': 0}, overlaps) | |

assert subst == {2: 2} | |

subst = _match_condition({'abcd': 1}, overlaps) | |

assert subst == {2: 2} | |

subst = _match_condition({'abcd': 3}, overlaps) | |

assert subst == {2: 2, 3: 3} | |

subst = _match_condition({'abcd': 4}, overlaps) | |

assert subst == {0: 0, 2: 2, 3: 3} | |

subst = _match_condition({'abcd': 5}, overlaps) | |

assert subst == {0: 0, 1: 1, 2: 2, 3: 3} | |

subst = _match_condition({'abcd': 7}, overlaps) | |

assert subst == {0: 0, 1: 1, 2: 2, 3: 3} | |

subst = _match_condition({'abcd': 8}, overlaps) | |

assert subst == {0: 0, 1: 1, 2: 2} | |

subst = _match_condition({'abcd': 9}, overlaps) | |

assert subst == {0: 0, 1: 1} | |

subst = _match_condition({'abcd': 10}, overlaps) | |

assert subst == {1: 1} | |

def test_overlaps_2(): | |

# https://github.com/fonttools/fonttools/issues/1400 | |

conds = [ | |

([{'abcd': (1, 9)}], {0: 0}), | |

([{'abcd': (8, 10)}], {1: 1}), | |

([{'abcd': (3, 4)}], {2: 2}), | |

([{'abcd': (1, 10)}], {3: 3}), | |

] | |

overlaps = overlayFeatureVariations(conds) | |

subst = _match_condition({'abcd': 0}, overlaps) | |

assert subst == {} | |

subst = _match_condition({'abcd': 1}, overlaps) | |

assert subst == {0: 0, 3: 3} | |

subst = _match_condition({'abcd': 2}, overlaps) | |

assert subst == {0: 0, 3: 3} | |

subst = _match_condition({'abcd': 3}, overlaps) | |

assert subst == {0: 0, 2: 2, 3: 3} | |

subst = _match_condition({'abcd': 5}, overlaps) | |

assert subst == {0: 0, 3: 3} | |

subst = _match_condition({'abcd': 10}, overlaps) | |

assert subst == {1: 1, 3: 3} | |

def run(test, n, quiet): | |

print() | |

print("%s:" % test.__name__) | |

input, output = test(n) | |

if quiet: | |

print(len(output)) | |

else: | |

print() | |

print("Input:") | |

pprint(input) | |

print() | |

print("Output:") | |

pprint(output) | |

print() | |

if __name__ == "__main__": | |

import sys | |

from pprint import pprint | |

quiet = False | |

n = 3 | |

if len(sys.argv) > 1 and sys.argv[1] == '-q': | |

quiet = True | |

del sys.argv[1] | |

if len(sys.argv) > 1: | |

n = int(sys.argv[1]) | |

run(test_linear, n=n, quiet=quiet) | |

run(test_quadratic, n=n, quiet=quiet) |