From: Behdad Esfahbod Date: Fri, 20 Jan 2012 23:27:52 +0000 (-0500) Subject: Move most testing logic into hb_test_tools.py X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=91540a7d97051a3d6e97fdcd1e98af23e0780cdd;p=platform%2Fupstream%2FlibHarfBuzzSharp.git Move most testing logic into hb_test_tools.py The actual utils are one-liners now. --- diff --git a/test/shaping/hb-diff b/test/shaping/hb-diff index 46ad19c..d6bc2d2 100755 --- a/test/shaping/hb-diff +++ b/test/shaping/hb-diff @@ -1,75 +1,14 @@ #!/usr/bin/python -import sys, re, difflib, os +from hb_test_tools import * +import sys, os -red_color = green_color = end_color = "" -if "--color" in sys.argv or os.isatty (sys.stdout.fileno ()): - if "--color" in sys.argv: - sys.argv.remove ("--color") - red_color = '\033[41;37;1m' - green_color = '\033[42;37;1m' - end_color = '\033[m' +if len (sys.argv) != 3: + print "usage: %s [--color] file1 file2" % sys.argv[0] + sys.exit (1) -def fancy_diff_lines (l1, l2): +colors = Colors.Auto (sys.argv) - ss = [re.sub ('([A-Za-z0-9_]*)([^A-Za-z0-9_]?)', r'\1\n\2\n', l).splitlines (True) for l in (l1, l2)] - oo = ["",""] - st = [False, False] - for l in difflib.Differ().compare (*ss): - if l[0] == '?': - continue - if l[0] == ' ': - for i in range(2): - if st[i]: - oo[i] += end_color - st[i] = False - oo = [o + l[2:] for o in oo] - continue - if l[0] == '-': - if not st[0]: - oo[0] += red_color - st[0] = True - oo[0] += l[2:] - continue - if l[0] == '+': - if not st[1]: - oo[1] += green_color - st[1] = True - oo[1] += l[2:] - for i in range(2): - if st[i]: - oo[i] += end_color - st[i] = 0 - oo = [o.replace ('\n', '') for o in oo] - if oo[0] == oo[1]: - return [' ', oo[0], '\n'] - return ['-', oo[0], '\n', '+', oo[1], '\n'] +f1, f2 = (open_file_or_stdin (f) for f in sys.argv[1:3]) -def fancy_diff_files (f1, f2): - for (l1,l2) in zip (f1, f2): - if l1 == l2: - sys.stdout.writelines ([" ", l1]) - continue - - sys.stdout.writelines (fancy_diff_lines (l1, l2)) - # Print out residues - for l in f1: - sys.stdout.writelines (["-", red_color, l1, end_color]) - for l in f1: - sys.stdout.writelines (["-", green_color, l1, end_color]) - - -def open_file (f): - if f == '-': - return sys.stdin - return file (f) - -if __name__ == '__main__': - - if len (sys.argv) != 3: - print "Usage: %s [--color] FILE1 FILE2" % sys.argv[0] - sys.exit (1) - - f1, f2 = (open_file (f) for f in sys.argv[1:3]) - - fancy_diff_files (f1, f2) +FancyDiffer.diff_files (f1, f2, colors=colors) diff --git a/test/shaping/hb-diff-filter-failures b/test/shaping/hb-diff-filter-failures index 3048555..663c9ec 100755 --- a/test/shaping/hb-diff-filter-failures +++ b/test/shaping/hb-diff-filter-failures @@ -1,28 +1,5 @@ #!/usr/bin/python -import sys +from hb_test_tools import * -red_color = '\033[41;37;1m' -green_color = '\033[42;37;1m' -end_color = '\033[m' - -def filter_failures (f): - for l in f: - if l[0] in '-+': - sys.stdout.writelines (l) - continue - - -def open_file (f): - if f == '-': - return sys.stdin - return file (f) - -if __name__ == '__main__': - - if len (sys.argv) == 1: - print "Usage: %s FILE..." % sys.argv[0] - sys.exit (1) - - for s in sys.argv[1:]: - filter_failures (open_file (s)) +UtilMains.process_multiple_files (DiffFilters.filter_failures) diff --git a/test/shaping/hb-unicode-decode b/test/shaping/hb-unicode-decode index e880f49..5b00eae 100755 --- a/test/shaping/hb-unicode-decode +++ b/test/shaping/hb-unicode-decode @@ -1,19 +1,5 @@ #!/usr/bin/python -import sys +from hb_test_tools import * -def decode (s): - return '<' + ','.join ("U+%04X" % ord (u) for u in unicode (s, 'utf8')) + '>' - -if __name__ == '__main__': - - if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): - print "Usage:\n %s UNICODE_STRING...\nor:\n %s --stdin" % (sys.argv[0], sys.argv[0]) - sys.exit (1) - - if '--stdin' in sys.argv: - sys.argv.remove ('--stdin') - for line in sys.stdin.readlines (): - print decode (line) - else: - print ' '.join (decode (x) for x in (sys.argv[1:])) +UtilMains.filter_multiple_strings_or_stdin (Unicode.decode, "UNICODE_STRING") diff --git a/test/shaping/hb-unicode-encode b/test/shaping/hb-unicode-encode index 02609be..11bf365 100755 --- a/test/shaping/hb-unicode-encode +++ b/test/shaping/hb-unicode-encode @@ -1,22 +1,5 @@ #!/usr/bin/python -import sys -import re +from hb_test_tools import * -def encode (s): - s = re.sub (r"[<+>\\uU]", " ", s) - s = re.sub (r"0[xX]", " ", s) - return u''.join (unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)) - -if __name__ == '__main__': - - if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): - print "Usage:\n %s UNICODE_CODEPOINTS...\nor:\n %s --stdin" % (sys.argv[0], sys.argv[0]) - sys.exit (1) - - if '--stdin' in sys.argv: - sys.argv.remove ('--stdin') - for line in sys.stdin.readlines (): - print encode (line) - else: - print encode (','.join (sys.argv[1:])) +UtilMains.filter_multiple_strings_or_stdin (Unicode.encode, "UNICODE_STRING", '') diff --git a/test/shaping/hb-unicode-prettyname b/test/shaping/hb-unicode-prettyname index d20ce92..ecc26cc 100755 --- a/test/shaping/hb-unicode-prettyname +++ b/test/shaping/hb-unicode-prettyname @@ -1,53 +1,6 @@ #!/usr/bin/python -import sys -import re -import unicodedata +from hb_test_tools import * -shorthands = { - "ZERO WIDTH NON-JOINER": "ZWNJ", - "ZERO WIDTH JOINER": "ZWJ", - "NARROW NO-BREAK SPACE": "NNBSP", - "COMBINING GRAPHEME JOINER": "CGJ", - "LEFT-TO-RIGHT MARK": "LRM", - "RIGHT-TO-LEFT MARK": "RLM", - "LEFT-TO-RIGHT EMBEDDING": "LRE", - "RIGHT-TO-LEFT EMBEDDING": "RLE", - "POP DIRECTIONAL FORMATTING": "PDF", - "LEFT-TO-RIGHT OVERRIDE": "LRO", - "RIGHT-TO-LEFT OVERRIDE": "RLO", -} -def pretty_name (x): - try: - s = unicodedata.name (x) - except ValueError: - return "XXX" - s = re.sub (".* LETTER ", "", s) - s = re.sub (".* VOWEL SIGN (.*)", r"\1-MATRA", s) - s = re.sub (".* SIGN ", "", s) - s = re.sub (".* COMBINING ", "", s) - if re.match (".* VIRAMA", s): - s = "HALANT" - if s in shorthands: - s = shorthands[s] - return s - - -def pretty_names (s): - s = re.sub (r"[<+>\\uU]", " ", s) - s = re.sub (r"0[xX]", " ", s) - s = [unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)] - return ' + '.join (pretty_name (x) for x in s) - -if __name__ == '__main__': - - if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): - print "Usage:\n %s UNICODE_CODEPOINTS...\nor:\n %s --stdin" % (sys.argv[0], sys.argv[0]) - sys.exit (1) - - if '--stdin' in sys.argv: - sys.argv.remove ('--stdin') - for line in sys.stdin.readlines (): - print pretty_names (line) - else: - print pretty_names (','.join (sys.argv[1:])) +UtilMains.filter_multiple_strings_or_stdin (Unicode.pretty_names, "UNICODE_CODEPOINTS", \ + concat_separator = ' ') diff --git a/test/shaping/hb_test_tools.py b/test/shaping/hb_test_tools.py new file mode 100644 index 0000000..fb2b622 --- /dev/null +++ b/test/shaping/hb_test_tools.py @@ -0,0 +1,180 @@ +#!/usr/bin/python + +import sys, os, re, difflib, unicodedata + +class Colors: + class Null: + red = '' + green = '' + end = '' + class ANSI: + red = '\033[41;37;1m' + green = '\033[42;37;1m' + end = '\033[m' + class HTML: + red = '' + green = '' + end = '' + + @staticmethod + def Auto (argv = [], out = sys.stdout): + if "--color" in argv or os.isatty (out.fileno ()): + if "--color" in sys.argv[1:]: + argv.remove ("--color") + return Colors.ANSI + else: + return Colors.Null + + +class FancyDiffer: + + diff_regex = re.compile ('([a-za-z0-9_]*)([^a-za-z0-9_]?)') + + @staticmethod + def diff_lines (l1, l2, colors=Colors.Null): + + ss = [FancyDiffer.diff_regex.sub (r'\1\n\2\n', l).splitlines (True) for l in (l1, l2)] + oo = ["",""] + st = [False, False] + for l in difflib.Differ().compare (*ss): + if l[0] == '?': + continue + if l[0] == ' ': + for i in range(2): + if st[i]: + oo[i] += colors.end + st[i] = False + oo = [o + l[2:] for o in oo] + continue + if l[0] == '-': + if not st[0]: + oo[0] += colors.red + st[0] = True + oo[0] += l[2:] + continue + if l[0] == '+': + if not st[1]: + oo[1] += colors.green + st[1] = True + oo[1] += l[2:] + for i in range(2): + if st[i]: + oo[i] += colors.end + st[i] = 0 + oo = [o.replace ('\n', '') for o in oo] + if oo[0] == oo[1]: + return [' ', oo[0], '\n'] + return ['-', oo[0], '\n', '+', oo[1], '\n'] + + @staticmethod + def diff_files (f1, f2, colors=Colors.Null): + for (l1,l2) in zip (f1, f2): + if l1 == l2: + sys.stdout.writelines ([" ", l1]) + continue + + sys.stdout.writelines (FancyDiffer.diff_lines (l1, l2, colors)) + # print out residues + for l in f1: + sys.stdout.writelines (["-", colors.red, l1, colors.end]) + for l in f1: + sys.stdout.writelines (["-", colors.green, l1, colors.end]) + +class DiffFilters: + + @staticmethod + def filter_failures (f): + for l in f: + if l[0] in '-+': + sys.stdout.writelines (l) + + +class UtilMains: + + @staticmethod + def process_multiple_files (callback): + + if len (sys.argv) == 1: + print "Usage: %s FILE..." % sys.argv[0] + sys.exit (1) + + for s in sys.argv[1:]: + callback (open_file_or_stdin (s)) + + @staticmethod + def filter_multiple_strings_or_stdin (callback, string_mnemonic, \ + separator = " ", \ + concat_separator = False): + + if len (sys.argv) == 1 or ('--stdin' in sys.argv and len (sys.argv) != 2): + print "Usage:\n %s %s...\nor:\n %s --stdin" \ + % (sys.argv[0], string_mnemonic, sys.argv[0]) + sys.exit (1) + + if '--stdin' in sys.argv: + sys.argv.remove ('--stdin') + for line in sys.stdin.readlines (): + print callback (line) + else: + args = sys.argv[1:] + if concat_separator != False: + args = [concat_separator.join (args)] + print separator.join (callback (x) for x in (args)) + + +class Unicode: + + @staticmethod + def decode (s): + return '<' + ','.join ("U+%04X" % ord (u) for u in unicode (s, 'utf8')) + '>' + + @staticmethod + def encode (s): + s = re.sub (r"[<+>\\uU]", " ", s) + s = re.sub (r"0[xX]", " ", s) + return u''.join (unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)) + + shorthands = { + "ZERO WIDTH NON-JOINER": "ZWNJ", + "ZERO WIDTH JOINER": "ZWJ", + "NARROW NO-BREAK SPACE": "NNBSP", + "COMBINING GRAPHEME JOINER": "CGJ", + "LEFT-TO-RIGHT MARK": "LRM", + "RIGHT-TO-LEFT MARK": "RLM", + "LEFT-TO-RIGHT EMBEDDING": "LRE", + "RIGHT-TO-LEFT EMBEDDING": "RLE", + "POP DIRECTIONAL FORMATTING": "PDF", + "LEFT-TO-RIGHT OVERRIDE": "LRO", + "RIGHT-TO-LEFT OVERRIDE": "RLO", + } + + @staticmethod + def pretty_name (u): + try: + s = unicodedata.name (u) + except ValueError: + return "XXX" + s = re.sub (".* LETTER ", "", s) + s = re.sub (".* VOWEL SIGN (.*)", r"\1-MATRA", s) + s = re.sub (".* SIGN ", "", s) + s = re.sub (".* COMBINING ", "", s) + if re.match (".* VIRAMA", s): + s = "HALANT" + if s in Unicode.shorthands: + s = Unicode.shorthands[s] + return s + + @staticmethod + def pretty_names (s): + s = re.sub (r"[<+>\\uU]", " ", s) + s = re.sub (r"0[xX]", " ", s) + s = [unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)] + return ' + '.join (Unicode.pretty_name (x) for x in s) + +def open_file_or_stdin (f): + if f == '-': + return sys.stdin + return file (f) + +if __name__ == '__main__': + pass