a58d01703d7921469d84c4f753b0a6a00e088a24
[platform/upstream/harfbuzz.git] / test / subset / subset_test_suite.py
1 #!/usr/bin/env python3
2
3 import os
4
5 # A single test in a subset test suite. Identifies a font
6 # a subsetting profile, and a subset to be cut.
7 class Test:
8         def __init__(self, font_path, profile_path, subset):
9                 self.font_path = font_path
10                 self.profile_path = profile_path
11                 self.subset = subset
12
13         def unicodes(self):
14                 import re
15                 if self.subset == '*':
16                         return self.subset[0]
17                 elif re.match("^U\+", self.subset):
18                         s = re.sub (r"U\+", "", self.subset)
19                         return s
20                 else:
21                         return ",".join("%X" % ord(c) for (i, c) in enumerate(self.subset))
22
23         def get_profile_flags(self):
24                 with open (self.profile_path, mode="r", encoding="utf-8") as f:
25                     return f.read().splitlines()
26
27         def get_font_name(self):
28                 font_base_name = os.path.basename(self.font_path)
29                 font_base_name_parts = os.path.splitext(font_base_name)
30                 profile_name = os.path.splitext(os.path.basename(self.profile_path))[0]
31
32                 if self.unicodes() == "*":
33                         return "%s.%s.retain-all-codepoint%s" % (font_base_name_parts[0],
34                                        profile_name,
35                                        font_base_name_parts[1])
36                 else:
37                         return "%s.%s.%s%s" % (font_base_name_parts[0],
38                                        profile_name,
39                                        self.unicodes(),
40                                        font_base_name_parts[1])
41
42         def get_font_extension(self):
43                 font_base_name = os.path.basename(self.font_path)
44                 font_base_name_parts = os.path.splitext(font_base_name)
45                 return font_base_name_parts[1]
46
47 # A group of tests to perform on the subsetter. Each test
48 # Identifies a font a subsetting profile, and a subset to be cut.
49 class SubsetTestSuite:
50
51         def __init__(self, test_path, definition):
52                 self.test_path = test_path
53                 self.fonts = []
54                 self.profiles = []
55                 self.subsets = []
56                 self._parse(definition)
57
58         def get_output_directory(self):
59                 test_name = os.path.splitext(os.path.basename(self.test_path))[0]
60                 data_dir = os.path.join(os.path.dirname(self.test_path), "..")
61
62                 output_dir = os.path.normpath(os.path.join(data_dir, "expected", test_name))
63                 if not os.path.exists(output_dir):
64                         os.mkdir(output_dir)
65                 if not os.path.isdir(output_dir):
66                         raise Exception("%s is not a directory." % output_dir)
67
68                 return output_dir
69
70         def tests(self):
71                 for font in self.fonts:
72                         font = os.path.join(self._base_path(), "fonts", font)
73                         for profile in self.profiles:
74                                 profile = os.path.join(self._base_path(), "profiles", profile)
75                                 for subset in self.subsets:
76                                         yield Test(font, profile, subset)
77
78         def _base_path(self):
79                 return os.path.dirname(os.path.dirname(self.test_path))
80
81         def _parse(self, definition):
82                 destinations = {
83                                 "FONTS:": self.fonts,
84                                 "PROFILES:": self.profiles,
85                                 "SUBSETS:": self.subsets
86                 }
87
88                 current_destination = None
89                 for line in definition.splitlines():
90                         line = line.strip()
91
92                         if line.startswith("#"):
93                                 continue
94
95                         if not line:
96                                 continue
97
98                         if line in destinations:
99                                 current_destination = destinations[line]
100                         elif current_destination is not None:
101                                 current_destination.append(line)
102                         else:
103                                 raise Exception("Failed to parse test suite file.")