1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <iostream>
6 #include <iterator>
7
8 #include "asserttestexit.h"
9 #include "srchilite/lineranges.h"
10 #include <sstream>
11
12 using namespace std;
13 using namespace srchilite;
14
15 static std::ostream& operator<<(std::ostream& os,
16 const LineRanges::RangeType &entry);
17
18 static void check_add_range(LineRanges &lineranges, const string &range);
19 static void check_wrong_add_range(LineRanges &lineranges, const string &range,
20 RangeError error);
21 static void check_in_range(LineRanges &lineranges,
22 const LineRanges::RangeElemType e);
23 static void check_not_in_range(LineRanges &lineranges,
24 const LineRanges::RangeElemType e, bool checkContext = false,
25 bool expectedInContext = false);
26
27 static void print_line_ranges(ostream &os, const LineRanges &lineranges);
28
check_add_range(LineRanges & lineranges,const string & range)29 void check_add_range(LineRanges &lineranges, const string &range) {
30 RangeError result = lineranges.addRange(range);
31 cout << "checking " << range << "..." << endl;
32 assertTrue(result == NO_ERROR);
33 }
34
check_wrong_add_range(LineRanges & lineranges,const string & range,RangeError error)35 void check_wrong_add_range(LineRanges &lineranges, const string &range,
36 RangeError error) {
37 RangeError result = lineranges.addRange(range);
38 cout << "checking " << range << "..." << endl;
39 assertEquals(error, result);
40 }
41
operator <<(std::ostream & os,const LineRanges::RangeType & entry)42 std::ostream& operator<<(std::ostream& os, const LineRanges::RangeType &entry) {
43 if (entry.second == 0) {
44 os << entry.first;
45 } else if (entry.first < 0) {
46 os << "-" << entry.second;
47 } else if (entry.second < 0) {
48 os << entry.first << "-";
49 } else {
50 os << entry.first << "-" << entry.second;
51 }
52
53 return os;
54 }
55
print_line_ranges(ostream & os,const LineRanges & lineranges)56 void print_line_ranges(ostream &os, const LineRanges &lineranges) {
57 for (LineRanges::LineRangeSet::const_iterator it =
58 lineranges.getLineRangeSet().begin(); it
59 != lineranges.getLineRangeSet().end(); ++it) {
60 os << *it << endl;
61 }
62 }
63
check_in_range(LineRanges & lineranges,const LineRanges::RangeElemType e)64 void check_in_range(LineRanges &lineranges, const LineRanges::RangeElemType e) {
65 cout << "is " << e << " in range? ";
66 assertTrue(lineranges.isInRange(e) == IN_RANGE);
67 cout << "yes" << endl;
68 }
69
check_not_in_range(LineRanges & lineranges,const LineRanges::RangeElemType e,bool checkContext,bool expectedInContext)70 void check_not_in_range(LineRanges &lineranges,
71 const LineRanges::RangeElemType e, bool checkContext,
72 bool expectedInContext) {
73 cout << "is " << e << " in range (expect no)? ";
74 RangeResult result = lineranges.isInRange(e);
75 assertFalse(result == IN_RANGE);
76 cout << "no" << endl;
77 if (checkContext) {
78 cout << "is " << e << " in context range"
79 << (!expectedInContext ? " (expect no)" : "") << "? ";
80 assertEquals(expectedInContext, result == CONTEXT_RANGE);
81 cout << (expectedInContext ? "yes" : "no") << endl;
82 }
83 }
84
main()85 int main() {
86
87 LineRanges lineranges;
88 ostringstream buffer;
89
90 check_add_range(lineranges, " 20");
91 check_add_range(lineranges, "30 ");
92 check_add_range(lineranges, "10");
93
94 check_add_range(lineranges, "11-22");
95 check_add_range(lineranges, "100 - 200");
96
97 print_line_ranges(cout, lineranges);
98 print_line_ranges(buffer, lineranges);
99
100 assertEquals("10\n11-22\n20\n30\n100-200\n", buffer.str());
101
102 check_wrong_add_range(lineranges, "foo", INVALID_RANGE_NUMBER);
103
104 check_add_range(lineranges, "-33");
105 check_add_range(lineranges, "-20");
106 check_add_range(lineranges, "101 - ");
107 check_add_range(lineranges, "5 - ");
108
109 buffer.str("");
110 print_line_ranges(cout, lineranges);
111 print_line_ranges(buffer, lineranges);
112
113 assertEquals("-20\n-33\n5-\n10\n11-22\n20\n30\n100-200\n101-\n",
114 buffer.str());
115
116 lineranges = LineRanges();
117
118 lineranges.addRange("-5");
119 lineranges.addRange("7");
120 lineranges.addRange("10-20");
121
122 check_in_range(lineranges, 1);
123 check_not_in_range(lineranges, 6);
124 check_in_range(lineranges, 7);
125 check_not_in_range(lineranges, 8);
126 check_in_range(lineranges, 10);
127 check_in_range(lineranges, 15);
128 check_in_range(lineranges, 20);
129 check_not_in_range(lineranges, 25);
130
131 // now checking lines which are less the ones already checked should fail
132 check_not_in_range(lineranges, 1);
133 check_not_in_range(lineranges, 6);
134
135 // but if we reset it, it works again
136 lineranges.reset();
137 check_in_range(lineranges, 1);
138 check_not_in_range(lineranges, 6);
139 check_in_range(lineranges, 7);
140 check_not_in_range(lineranges, 8);
141
142 lineranges.reset();
143 lineranges.addRange("30-");
144
145 check_in_range(lineranges, 20);
146 check_not_in_range(lineranges, 25);
147 check_in_range(lineranges, 30);
148 check_in_range(lineranges, 100);
149
150 // with unspecified context lines, we must always get false context
151 lineranges.reset();
152 check_not_in_range(lineranges, 6, true, false);
153 check_not_in_range(lineranges, 8, true, false);
154 check_not_in_range(lineranges, 25, true, false);
155
156 lineranges.reset();
157 lineranges.setContextLines(1);
158 check_not_in_range(lineranges, 6, true, true);
159 check_not_in_range(lineranges, 8, true, true);
160 check_not_in_range(lineranges, 9, true, true);
161 check_not_in_range(lineranges, 25, true, false);
162 check_not_in_range(lineranges, 28, true, false);
163 check_not_in_range(lineranges, 29, true, true);
164
165 lineranges.reset();
166 lineranges.setContextLines(2);
167 check_not_in_range(lineranges, 6, true, true);
168 check_not_in_range(lineranges, 8, true, true);
169 check_not_in_range(lineranges, 9, true, true);
170 check_not_in_range(lineranges, 25, true, false);
171 check_not_in_range(lineranges, 28, true, true);
172 check_not_in_range(lineranges, 29, true, true);
173
174 lineranges.reset();
175 lineranges.setContextLines(5);
176 check_not_in_range(lineranges, 6, true, true);
177 check_not_in_range(lineranges, 8, true, true);
178 check_not_in_range(lineranges, 9, true, true);
179 check_not_in_range(lineranges, 25, true, true);
180 check_not_in_range(lineranges, 28, true, true);
181 check_not_in_range(lineranges, 29, true, true);
182
183 return 0;
184 }
185