Repository navigation
Expand file tree
/
Copy pathtest_csvpath_comments.py
More file actions
211 lines (199 loc) · 7.36 KB
/
Copy pathtest_csvpath_comments.py
File metadata and controls
211 lines (199 loc) · 7.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
import unittest
import pytest
import os
from csvpath import CsvPath
from csvpath.util.printer import LogPrinter
from csvpath.matching.util.exceptions import MatchException
PATH = f"tests{os.sep}csvpath{os.sep}test_resources{os.sep}test.csv"
class TestCsvPathComments(unittest.TestCase):
def test_update_settings_from_metadata(self):
path = CsvPath()
assert path.OR is False
assert path.collect_when_not_matched is False
assert path.has_default_printer is True
assert path.print_validation_errors is True
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""
~ logic-mode: OR
return-mode: no-matches
print-mode: no-default
validation-mode: raise no-print
~
${PATH}[1*]
[
~ this path is simple and so are its comments ~
yes()
]
"""
)
assert "logic-mode" in path.metadata
assert "return-mode" in path.metadata
assert "print-mode" in path.metadata
assert "validation-mode" in path.metadata
assert path.OR is True
assert path.collect_when_not_matched is True
assert path.has_default_printer is False
assert path.print_validation_errors is False
def test_update_settings_from_metadata2(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.add_printer(LogPrinter(path.logger))
assert path.print_validation_errors is True
path.parse(
f"""
~ validation-mode: print no-raise ~
${PATH}[1*][
~ this path is simple and so are its comments ~
@c = concat("a", "b", "c")
print("$.variables.c")
]
"""
)
assert "validation-mode" in path.metadata
assert path.log_validation_errors is True
assert path.print_validation_errors is True
assert path.raise_validation_errors is False
path.fast_forward()
for p in path.printers:
assert p.last_line and p.last_line.find("abc") > -1
def test_update_settings_from_metadata3(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise, collect")
assert path.raise_validation_errors is None
path.parse(
f"""
~ validation-mode: raise, print ~
${PATH}[1*][
~ this path is simple and so are its comments ~
@a = add("five", none())
print("$.variables.a")
] """
)
assert "validation-mode" in path.metadata
assert path.log_validation_errors is True
assert path.print_validation_errors is True
assert path.raise_validation_errors is True
with pytest.raises(MatchException):
path.fast_forward()
for p in path.printers:
assert p.last_line and p.last_line.find("add requires") > -1
assert path.has_errors() is True
def test_update_settings_from_metadata_match_error_1(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
assert path.raise_validation_errors is None
path.parse(
f"""
~
id:match :
because we have match we will ignore the four errors and collect 8 lines.
validation-mode: print, match, no-raise, no-stop, collect
~
${PATH}[1*][
mod.nocontrib(line_number(), 2) == 1 -> @a = 5
mod.nocontrib(line_number(), 2) == 0 -> @a = "five"
~ every other line we blow up, but because we're matching
validation errors we collect all the lines ~
@b = add( @a, 1 )
]
"""
)
lines = path.collect()
assert len(lines) == 8
assert path.has_errors() is True
def test_update_settings_from_metadata_match_error_2(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""~
because we don't have validation-mode match we will only match on non-error lines == 4
validation-mode: print, no-raise, no-stop ~
${PATH}[1*][
mod.nocontrib(line_number(), 2) == 1 -> @a = 5
mod.nocontrib(line_number(), 2) == 0 -> @a = "five"
@b = add( @a, 1 )
]
"""
)
lines = path.collect()
assert len(lines) == 4
def test_comments_below(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""
~ checking collection of metadata,
not the actual modes. logic: AND collect: no-matches : ~
${PATH}[1*]
[
~ this path is simple and so are its comments ~
push.onmatch("cnt", count_lines())
count.nocontrib() == 3 -> advance(2)
]
~ what about me? fizzbats! ~
"""
)
assert "collect" in path.metadata
assert path.metadata["collect"] == "no-matches"
assert "logic" in path.metadata
assert path.metadata["logic"] == "AND"
assert "original_comment" in path.metadata
assert path.metadata["original_comment"].find("fizzbats") > -1
def test_comments1(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""${PATH}[1*]
[
~ this path is simple and so are its comments ~
push.onmatch("cnt", count_lines())
count.nocontrib() == 3 -> advance(2)
]"""
)
path.fast_forward()
assert path.variables["cnt"] == [2, 3, 4, 7, 8, 9]
def test_comments2(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""${PATH}[1*]
[
~ this path
has line breaks
in its comments ~
push.onmatch("cnt", count_lines())
count.nocontrib() == 3 -> advance(2)
]"""
)
path.fast_forward()
assert path.variables["cnt"] == [2, 3, 4, 7, 8, 9]
def test_comments_everything_except_tilde_and_right_bracket(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""${PATH}[1*]
[
~
[$#@"()!%^&*`@-/_=+{{}}#| \\;:',.<>?()/"$[
~
push("d", line_number())
]"""
)
path.fast_forward()
assert len(path.variables["d"]) == 8
def test_comments_back_to_back_and_empty(self):
path = CsvPath()
path.config.add_to_config("errors", "csvpath", "raise")
path.parse(
f"""${PATH}[1*]
[
~I have a lot to say ~ ~
[$#@"()!%^&*`@-/_=+{{}}#|\\;:',.<>?()/"$[
~~~
push.onmatch("cnt", count_lines())
count.nocontrib() == 3 -> advance(2)
]"""
)
path.fast_forward()
assert path.variables["cnt"] == [2, 3, 4, 7, 8, 9]