Upstream version 11.39.266.0
[platform/framework/web/crosswalk.git] / src / native_client / src / trusted / validator_x86 / testscripts / test_format.py
1 # Copyright (c) 2012 The Native Client Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import re
6
7
8 def ParseTest(lines):
9   r"""Parses section-based test.
10
11   Args:
12     lines: list of \n-terminated strings.
13
14   Returns:
15     List of string pairs (field name, field content) in order. Field content is
16     concatenation of \n-terminated lines, so it's either empty or ends with \n.
17   """
18   fields = []
19   field_data = {}
20   current_field = None
21
22   for line in lines:
23     if line.startswith('  '):
24       assert current_field is not None, line
25       field_data[current_field].append(line[2:])
26     else:
27       match = re.match('@(\S+):$', line)
28       if match is None:
29         raise Exception('Bad line: %r' % line)
30       current_field = match.group(1)
31       assert current_field not in field_data, current_field
32       field_data[current_field] = []
33       fields.append(current_field)
34
35   return [(field, ''.join(field_data[field])) for field in fields]
36
37
38 def SplitLines(lines, separator_regex):
39   """Split sequence of lines into sequence of list of lines.
40
41   Args:
42     lines: sequence of strings.
43     separator_regex: separator regex.
44
45   Yields:
46     Nonempty sequence of (possibly empty) lists of strings. Separator lines
47     are not included.
48   """
49   part = []
50   for line in lines:
51     if re.match(separator_regex, line):
52       yield part
53       part = []
54     else:
55       part.append(line)
56   yield part
57
58
59 def LoadTestFile(filename):
60   r"""Loads and parses .test file.
61
62   Args:
63     filename: filename.
64
65   Returns:
66     List of tests (see ParseTest).
67   """
68   with open(filename) as file_in:
69     return map(ParseTest, SplitLines(file_in, r'-{3,}\s*$'))
70
71
72 def UnparseTest(items_list):
73   """Convert test to sequence of \n-terminated strings
74
75   Args:
76     items_list: list of string pairs (see ParseTest).
77
78   Yields:
79     Sequence of \n-terminated strings.
80   """
81   for field, content in items_list:
82     yield '@%s:\n' % field
83     if content == '':
84       continue
85
86     assert content.endswith('\n')
87     content = content[:-1]
88
89     for line in content.split('\n'):
90       yield '  %s\n' % line
91
92
93 def SaveTestFile(tests, filename):
94   r"""Saves .test file
95
96   Args:
97     tests: list of tests (see ParseTest).
98     filename: filename.
99   Returns:
100     None.
101   """
102   with open(filename, 'w') as file_out:
103     first = True
104     for test in tests:
105       if not first:
106         file_out.write('-' * 70 + '\n')
107       first = False
108       for line in UnparseTest(test):
109         file_out.write(line)