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