source: icGREP/icgrep-devel/UCD-scripts/generate_UCD_tests.py @ 5864

Last change on this file since 5864 was 5749, checked in by nmedfort, 19 months ago

updated UCD python scripts

File size: 9.1 KB
Line 
1#
2# generate_UCD_tests.py -
3# generating Python pablo functions for various Unicode properties
4#
5# Robert D. Cameron
6# January 31, 2015
7#
8# Licensed under Open Software License 3.0.
9#
10#
11from random import randint
12
13from UCD_parser import *
14
15
16class UCD_test_generator():
17    def __init__(self): 
18        self.enum_value_map = {}
19        self.binary_value_map = {}
20        self.all_good_set = uset_union(range_uset(0x20, 0xD7FF), range_uset(0xE000,0x10FFFF))
21        self.all_good_set = uset_difference(self.all_good_set, singleton_uset(0x85))
22        self.all_good_set = uset_difference(self.all_good_set, range_uset(0x2028,0x2029))
23
24    def load_property_name_info(self):
25        (self.property_enum_name_list, self.property_object_map) = parse_PropertyAlias_txt()
26        self.property_lookup_map = getPropertyLookupMap(self.property_object_map)
27        self.full_name_map = {}
28        for p in self.property_enum_name_list:
29            self.full_name_map[p] = self.property_object_map[p].getPropertyFullName()
30
31    def load_property_value_info(self):
32        initializePropertyValues(self.property_object_map, self.property_lookup_map)
33
34    def load_property_value_file(self, filename_root, property_code):
35        property_object = self.property_object_map[property_code]
36        parse_property_data(self.property_object_map[property_code], filename_root + '.txt')
37
38    def load_ScriptExtensions_data(self):
39        property_code = 'scx'
40        extension_object = self.property_object_map['scx']
41        extension_object.setBaseProperty(self.property_object_map['sc'])
42        parse_property_data(extension_object, 'ScriptExtensions.txt')
43       
44    def load_multisection_properties_file(self, filename_root):
45        props = parse_multisection_property_data(filename_root + '.txt', self.property_object_map, self.property_lookup_map)
46        for p in sorted(props):
47            property_object = self.property_object_map[p]
48
49    def load_others(self):
50        self.others = ['Alphabetic', 'Uppercase', 'Lowercase', 'White_Space', 'Noncharacter_Code_Point', 'Default_Ignorable_Code_Point', 'ANY', 'ASCII', 'ASSIGNED']
51        self.binary_value_map['ANY'] = range_uset(0, 0x10FFFF)
52        self.binary_value_map['ASCII'] = range_uset(0, 0x7F)
53        self.binary_value_map['ASSIGNED'] = uset_complement(self.property_object_map['gc'].value_map['Cn'])     
54        self.binary_value_map['White_Space'] = self.property_object_map['WSpace'].value_map['Y']
55        self.binary_value_map['Uppercase'] = self.property_object_map['Upper'].value_map['Y']
56        self.binary_value_map['Lowercase'] = self.property_object_map['Lower'].value_map['Y']
57        self.binary_value_map['Alphabetic'] = self.property_object_map['Alpha'].value_map['Y']
58        self.binary_value_map['Noncharacter_Code_Point'] = self.property_object_map['NChar'].value_map['Y']
59        self.binary_value_map['Default_Ignorable_Code_Point'] = self.property_object_map['DI'].value_map['Y']
60
61    def load_all(self):
62        # First parse all property names and their aliases
63        self.load_property_name_info()
64        #
65        # Next parse all property value names and their aliases.  Generate the data.
66        self.load_property_value_info()
67        #
68        # The Block property
69        self.load_property_value_file('Blocks', 'blk')
70        #
71        # Scripts
72        self.load_property_value_file('Scripts', 'sc')
73        #
74        # Script Extensions
75        self.load_ScriptExtensions_data()
76        #
77        # General Category
78        self.load_property_value_file('extracted/DerivedGeneralCategory', 'gc')
79        #
80        # Core Properties
81        self.load_multisection_properties_file('DerivedCoreProperties')
82        #
83        self.load_multisection_properties_file('PropList')
84        self.load_others()
85
86    def generate_level_1_property_terms(self, negated_per_10 = 5, propgroups=['others', 'sc', 'scx', 'gc']):
87        template = r"""<grepcase regexp="^\%s{%s}$" datafile="All_good" grepcount="%i"/>"""
88        terms = []
89        if 'others' in propgroups:
90            for p in self.others:
91                s = self.binary_value_map[p]
92                lbl = 'p'
93                if randint(1,10) <= negated_per_10:
94                    s = uset_complement(s)
95                    lbl = 'P'
96                terms.append(template % (lbl, p, uset_popcount(uset_intersection(self.all_good_set, s))))
97        if 'gc' in propgroups:
98            obj = self.property_object_map['gc']
99            for v in obj.name_list_order:
100                s = obj.value_map[v]
101                lbl = 'p'
102                if randint(1,10) <= negated_per_10:
103                    s = uset_complement(s)
104                    lbl = 'P'
105                terms.append(template % (lbl, v, uset_popcount(uset_intersection(self.all_good_set, s))))
106        if 'sc' in propgroups:
107            obj = self.property_object_map['sc']
108            for v in obj.name_list_order:
109                s = obj.value_map[v]
110                vname = obj.property_value_full_name_map[v]
111                lbl = 'p'
112                if randint(1,10) <= negated_per_10:
113                    s = uset_complement(s)
114                    lbl = 'P'
115                terms.append(template % (lbl, vname, uset_popcount(uset_intersection(self.all_good_set, s))))
116        if 'scx' in propgroups:
117            for v in self.property_object_map['sc'].name_list_order:
118                s = self.property_object_map['scx'][v]
119                vname = self.property_object_map['sc'].property_value_full_name_map[v]
120                lbl = 'p'
121                if randint(1,10) <= negated_per_10:
122                    s = uset_complement(s)
123                    lbl = 'P'
124                terms.append(template % (lbl, "scx=" + vname, uset_popcount(uset_intersection(self.all_good_set, s))))
125        return terms
126
127    def random_binary(self, a1, a2, useLookbehindAssertions = False):
128        (p1, t1) = a1
129        (p2, t2) = a2
130        op = randint(0,2)
131        s1 = self.property_object_map[p1].value_map[t1]
132        if p2 == 'others':
133            s2 = self.binary_value_map[t2]
134        else: s2 = self.property_object_map[p2].value_map[t2]
135        if op == 0: s3 = uset_intersection(s1, s2)
136        elif op == 1: s3 = uset_difference(s1, s2)
137        elif op == 2: s3 = uset_union(s1, s2)
138        s3 = uset_intersection(s3, self.all_good_set)
139        if p1 == 'sc' or p1 == 'scx': t1 = self.property_object_map['sc'].property_value_full_name_map[t1]
140        if p2 == 'sc' or p2 == 'scx': t2 = self.property_object_map['sc'].property_value_full_name_map[t2]
141        if p1 == 'scx': t1 = 'scx=' + t1
142        if p2 == 'scx': t2 = 'scx=' + t2
143        v1 = "\\p{%s}" % (t1)
144        v2 = "\\p{%s}" % (t2)
145        if not useLookbehindAssertions:
146            opr = ["&amp;&amp;", "--", ""][op]
147            return r"""<grepcase regexp="^[%s%s%s]$" datafile="All_good" grepcount="%i"/>""" % (v1, opr, v2, uset_popcount(s3))
148        if op == 0:
149            return r"""<grepcase regexp="^%s(?&lt;=%s)$" datafile="All_good" grepcount="%i"/>""" % (v1, v2, uset_popcount(s3))
150        elif op == 1:
151            return r"""<grepcase regexp="^%s(?&lt;!%s)$" datafile="All_good" grepcount="%i"/>""" % (v1, v2, uset_popcount(s3))
152        else:
153            return r"""<grepcase regexp="^[%s%s]$" datafile="All_good" grepcount="%i"/>""" % (v1, v2, uset_popcount(s3))
154
155    def generate_random_property_expressions(self, useLookbehindAssertions = False):
156        gc = self.property_object_map['gc'].name_list_order
157        sc = self.property_object_map['sc'].name_list_order
158        others = ['Alphabetic', 'Uppercase', 'Lowercase', 'White_Space', 'Noncharacter_Code_Point', 'Default_Ignorable_Code_Point', 'ANY', 'ASCII', 'ASSIGNED']
159        exprs = []
160        for p in gc:
161           s = sc[randint(0, len(sc)-1)]
162           exprs.append(self.random_binary(('gc', p), ('sc', s), useLookbehindAssertions))           
163           #sx = sc[randint(0, len(sc)-1)]
164           #exprs.append(self.random_binary(('gc', p), ('scx', sx), useLookbehindAssertions))
165           #othr = others[randint(0, len(others)-1)]
166           #exprs.append(self.random_binary(('gc', p), ('others', othr), useLookbehindAssertions))
167        for p in sc:
168           g = gc[randint(0, len(gc)-1)]
169           exprs.append(self.random_binary(('sc', p), ('gc', g), useLookbehindAssertions))           
170           #sx = sc[randint(0, len(sc)-1)]
171           #exprs.append(self.random_binary(('sc', p), ('scx', sx), useLookbehindAssertions))
172           #othr = others[randint(0, len(others)-1)]
173           #exprs.append(self.random_binary(('sc', p), ('others', othr), useLookbehindAssertions))
174        #for p in others:
175           #s = sc[randint(0, len(sc)-1)]
176           #exprs.append(self.random_binary(('sc', s), ('others', p), useLookbehindAssertions))
177           #sx = sc[randint(0, len(sc)-1)]
178           #exprs.append(self.random_binary(('scx', sx), ('others', p), useLookbehindAssertions))
179        return exprs
180
181def UCD_main():
182    ucd = UCD_test_generator()
183    ucd.load_all()
184    print("<greptest>")
185    for t in ucd.generate_level_1_property_terms(1, ['sc', 'gc']):
186        print(t)
187    for p in ucd.generate_random_property_expressions(True):
188        print(p)
189    print("</greptest>")
190
191if __name__ == "__main__":
192    UCD_main()
Note: See TracBrowser for help on using the repository browser.