2 #include <stddef.h> /* For ptrdiff_t */
5 static int compare_lists(const char *label
,
6 const xmlChar
*expected_string
, const struct isds_list
*expected_list
,
7 const xmlChar
* string
, const struct isds_list
*list
) {
8 const struct isds_list
*expected_item
, *item
;
9 ptrdiff_t expected_offset
, offset
;
12 TEST_POINTER_DUPLICITY(expected_list
, list
);
13 for (i
= 1, expected_item
= expected_list
, item
= list
;
14 NULL
!= expected_item
&& NULL
!= item
;
15 i
++, expected_item
= expected_item
->next
, item
= item
->next
) {
16 expected_offset
= (xmlChar
*)expected_item
->data
- expected_string
;
17 offset
= (xmlChar
*)item
->data
- string
;
18 if (expected_offset
!= offset
)
19 FAIL_TEST("%d. %s match offsets differ: expected=%td, got=%td",
20 i
, label
, expected_offset
, offset
);
22 if (NULL
!= expected_item
&& NULL
== item
)
23 FAIL_TEST("%s match offsets list is missing %d. item", label
, i
);
24 if (NULL
== expected_item
&& NULL
!= item
)
25 FAIL_TEST("%s match offsets list has superfluous %d. item", label
, i
);
31 static int test_interpret_matches(const xmlChar
*input_string
,
32 isds_error expected_error
,
33 const xmlChar
*expected_string
,
34 const struct isds_list
*expected_starts
,
35 const struct isds_list
*expected_ends
,
36 struct isds_list
**starts
,
37 struct isds_list
**ends
) {
39 xmlChar
*string
= NULL
;
41 if (NULL
!= input_string
) {
42 string
= xmlStrdup(input_string
);
44 ABORT_UNIT("Could not duplicate a string");
45 TEST_DESTRUCTOR(xmlFree
, string
);
48 err
= interpret_matches(string
, starts
, ends
);
50 if (expected_error
!= err
)
51 FAIL_TEST("interpret_matches() returned wrong error code: "
52 "expected=%s, got=%s",
53 isds_strerror(expected_error
), isds_strerror(err
));
54 if (err
!= IE_SUCCESS
)
57 TEST_STRING_DUPLICITY((const char *)expected_string
, (const char *)string
);
59 if (compare_lists("start", expected_string
, expected_starts
,
64 if (compare_lists("end", expected_string
, expected_ends
,
73 #define START_MARKER "|$*HL_START*$|"
74 #define END_MARKER "|$*HL_END*$|"
77 xmlChar
*input
, *expected_output
;
78 struct isds_list expected_starts
= { .data
= NULL
, .next
= NULL
};
79 struct isds_list expected_ends
= { .data
= NULL
, .next
= NULL
};
80 struct isds_list expected_starts2
= { .data
= NULL
, .next
= NULL
};
81 struct isds_list expected_ends2
= { .data
= NULL
, .next
= NULL
};
82 struct isds_list
*starts
= NULL
, *ends
= NULL
;
83 INIT_TEST("interpret_matches string conversion");
86 ABORT_UNIT("isds_init() failed\n");
88 TEST("NULL start", test_interpret_matches
, BAD_CAST NULL
,
89 IE_INVAL
, BAD_CAST NULL
, NULL
, NULL
, NULL
, &ends
);
90 TEST("NULL ends", test_interpret_matches
, BAD_CAST NULL
,
91 IE_INVAL
, BAD_CAST NULL
, NULL
, NULL
, &starts
, NULL
);
92 TEST("NULL string", test_interpret_matches
, BAD_CAST NULL
,
93 IE_SUCCESS
, BAD_CAST NULL
, NULL
, NULL
, &starts
, &ends
);
94 TEST("Empty string", test_interpret_matches
, BAD_CAST
"",
95 IE_SUCCESS
, BAD_CAST
"", NULL
, NULL
, &starts
, &ends
);
98 input
= BAD_CAST
"foo";
99 TEST((const char *)input
, test_interpret_matches
, input
,
100 IE_SUCCESS
, input
, NULL
, NULL
, &starts
, &ends
);
102 /* One match is the whole empty string */
103 input
= BAD_CAST START_MARKER END_MARKER
;
104 expected_output
= BAD_CAST
"";
105 expected_starts
.data
= expected_output
;
106 expected_ends
.data
= expected_output
;
107 TEST((const char *)input
, test_interpret_matches
, input
,
108 IE_SUCCESS
, expected_output
,
109 &expected_starts
, &expected_ends
, &starts
, &ends
);
111 /* One match is the whole string */
112 input
= BAD_CAST START_MARKER
"MATCH" END_MARKER
;
113 expected_output
= BAD_CAST
"MATCH";
114 expected_starts
.data
= expected_output
;
115 expected_ends
.data
= expected_output
+ 5;
116 TEST((const char *)input
, test_interpret_matches
, input
,
117 IE_SUCCESS
, expected_output
,
118 &expected_starts
, &expected_ends
, &starts
, &ends
);
120 /* One match in the beginning */
121 input
= BAD_CAST START_MARKER
"MATCH" END_MARKER
"after";
122 expected_output
= BAD_CAST
"MATCH" "after";
123 expected_starts
.data
= expected_output
;
124 expected_ends
.data
= expected_output
+ 5;
125 TEST((const char *)input
, test_interpret_matches
, input
,
126 IE_SUCCESS
, expected_output
,
127 &expected_starts
, &expected_ends
, &starts
, &ends
);
129 /* One match at the end */
130 input
= BAD_CAST
"before" START_MARKER
"MATCH" END_MARKER
;
131 expected_output
= BAD_CAST
"before" "MATCH";
132 expected_starts
.data
= expected_output
+ 6;
133 expected_ends
.data
= expected_output
+ 6+ 5;
134 TEST((const char *)input
, test_interpret_matches
, input
,
135 IE_SUCCESS
, expected_output
,
136 &expected_starts
, &expected_ends
, &starts
, &ends
);
138 /* One empty match in the middle */
139 input
= BAD_CAST
"before" START_MARKER END_MARKER
"after";
140 expected_output
= BAD_CAST
"before" "after";
141 expected_starts
.data
= expected_output
+ 6;
142 expected_ends
.data
= expected_output
+ 6;
143 TEST((const char *)input
, test_interpret_matches
, input
,
144 IE_SUCCESS
, expected_output
,
145 &expected_starts
, &expected_ends
, &starts
, &ends
);
147 /* One non-empty match in the middle */
148 input
= BAD_CAST
"before" START_MARKER
"MATCH" END_MARKER
"after";
149 expected_output
= BAD_CAST
"before" "MATCH" "after";
150 expected_starts
.data
= expected_output
+ 6;
151 expected_ends
.data
= expected_output
+ 6 + 5;
152 TEST((const char *)input
, test_interpret_matches
, input
,
153 IE_SUCCESS
, expected_output
,
154 &expected_starts
, &expected_ends
, &starts
, &ends
);
156 /* Only a start marker. This is ill but still acceptable by the
158 input
= BAD_CAST
"before" START_MARKER
"MATCH";
159 expected_output
= BAD_CAST
"before" "MATCH";
160 expected_starts
.data
= expected_output
+ 6;
161 TEST((const char *)input
, test_interpret_matches
, input
,
162 IE_SUCCESS
, expected_output
,
163 &expected_starts
, NULL
, &starts
, &ends
);
165 /* Only an end marker. This is ill but still acceptable by the
167 input
= BAD_CAST
"MATCH" END_MARKER
"after";
168 expected_output
= BAD_CAST
"MATCH" "after";
169 expected_ends
.data
= expected_output
+ 5;
170 TEST((const char *)input
, test_interpret_matches
, input
,
171 IE_SUCCESS
, expected_output
,
172 NULL
, &expected_ends
, &starts
, &ends
);
174 /* Two matches in the middle */
175 input
= BAD_CAST
"before" START_MARKER
"AMATCH1" END_MARKER
"mid"
176 START_MARKER
"AMATCH02" END_MARKER
"after";
177 expected_output
= BAD_CAST
"before" "AMATCH1" "mid" "AMATCH02" "after";
178 expected_starts
.data
= expected_output
+ 6;
179 expected_starts
.next
= &expected_starts2
;
180 expected_ends
.data
= expected_output
+ 6 + 7;
181 expected_ends
.next
= &expected_ends2
;
182 expected_starts2
.data
= expected_output
+ 6 + 7 + 3;
183 expected_ends2
.data
= expected_output
+ 6 + 7 + 3 + 8;
184 TEST((const char *)input
, test_interpret_matches
, input
,
185 IE_SUCCESS
, expected_output
,
186 &expected_starts
, &expected_ends
, &starts
, &ends
);
188 isds_list_free(&starts
);
189 isds_list_free(&ends
);