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

Last change on this file since 5735 was 5686, checked in by cameron, 19 months ago

Update to UCD 10.0.0

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