1#!/usr/bin/python -B
2
3""" Usage: make-normalize-generateddata-input.py PATH_TO_MOZILLA_CENTRAL
4
5    This script generates test input data for String.prototype.normalize
6    from intl/icu/source/data/unidata/NormalizationTest.txt
7    to js/src/tests/non262/String/normalize-generateddata-input.js
8"""
9
10from __future__ import print_function
11import re
12import sys
13
14sep_pat = re.compile(" +")
15
16
17def to_code_list(codes):
18    return "[" + ", ".join("0x{0}".format(x) for x in re.split(sep_pat, codes)) + "]"
19
20
21def convert(dir):
22    ver_pat = re.compile("NormalizationTest-([0-9\.]+)\.txt")
23    part_pat = re.compile("^@(Part([0-9]+) .+)$")
24    test_pat = re.compile(
25        "^([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);$"
26    )
27    ignore_pat = re.compile("^#|^$")
28    js_path = "js/src/tests/non262/String/normalize-generateddata-input.js"
29    txt_path = "intl/icu/source/data/unidata/NormalizationTest.txt"
30
31    part_opened = False
32    not_empty = False
33    with open("{dir}/{path}".format(dir=dir, path=txt_path), "r") as f:
34        with open("{dir}/{path}".format(dir=dir, path=js_path), "w") as outf:
35            for line in f:
36                m = test_pat.search(line)
37                if m:
38                    if not_empty:
39                        outf.write(",")
40                    outf.write("\n")
41                    pat = "{{ source: {source}, NFC: {NFC}, NFD: {NFD}, NFKC: {NFKC}, NFKD: {NFKD} }}"  # NOQA: E501
42                    outf.write(
43                        pat.format(
44                            source=to_code_list(m.group(1)),
45                            NFC=to_code_list(m.group(2)),
46                            NFD=to_code_list(m.group(3)),
47                            NFKC=to_code_list(m.group(4)),
48                            NFKD=to_code_list(m.group(5)),
49                        )
50                    )
51                    not_empty = True
52                    continue
53                m = part_pat.search(line)
54                if m:
55                    desc = m.group(1)
56                    part = m.group(2)
57                    if part_opened:
58                        outf.write("\n];\n")
59                    outf.write("/* {desc} */\n".format(desc=desc))
60                    outf.write("var tests_part{part} = [".format(part=part))
61                    part_opened = True
62                    not_empty = False
63                    continue
64                m = ver_pat.search(line)
65                if m:
66                    ver = m.group(1)
67                    outf.write(
68                        "/* created from NormalizationTest-{ver}.txt */\n".format(
69                            ver=ver
70                        )
71                    )
72                    continue
73                m = ignore_pat.search(line)
74                if m:
75                    continue
76                print("Unknown line: {0}".format(line), file=sys.stderr)
77            if part_opened:
78                outf.write("\n];\n")
79
80
81if __name__ == "__main__":
82    if len(sys.argv) < 2:
83        print(
84            "Usage: make-normalize-generateddata-input.py PATH_TO_MOZILLA_CENTRAL",
85            file=sys.stderr,
86        )
87        sys.exit(1)
88    convert(sys.argv[1])
89