Skip to content

Commit 2ae45c2

Browse files
committed
Move tests to lib.rs to prepare for generic API
1 parent a27b76c commit 2ae45c2

File tree

3 files changed

+157
-148
lines changed

3 files changed

+157
-148
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,8 @@ keywords = ["search", "text", "string", "single", "simd"]
1313
memchr = "2.3"
1414
seq-macro = "0.2"
1515

16+
[dev-dependencies]
17+
cfg-if = "1"
18+
1619
[profile.release]
1720
debug = true

src/lib.rs

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,158 @@ mod tests {
200200

201201
assert_eq!(<&[u8] as Needle>::SIZE, None);
202202
}
203+
204+
fn search(haystack: &[u8], needle: &[u8]) -> bool {
205+
let result = haystack
206+
.windows(needle.len())
207+
.any(|window| window == needle);
208+
209+
for position in 0..needle.len() {
210+
cfg_if::cfg_if! {
211+
if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] {
212+
use crate::x86::{Avx2Searcher, DynamicAvx2Searcher};
213+
214+
let searcher = unsafe { Avx2Searcher::with_position(needle, position) };
215+
assert_eq!(unsafe { searcher.search_in(haystack) }, result);
216+
217+
let searcher = unsafe { DynamicAvx2Searcher::with_position(needle, position) };
218+
assert_eq!(unsafe { searcher.search_in(haystack) }, result);
219+
} else {
220+
compile_error!("Unsupported architecture");
221+
}
222+
}
223+
}
224+
225+
result
226+
}
227+
228+
#[test]
229+
fn search_same() {
230+
assert!(search(b"x", b"x"));
231+
232+
assert!(search(b"xy", b"xy"));
233+
234+
assert!(search(b"foo", b"foo"));
235+
236+
assert!(search(
237+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
238+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
239+
));
240+
241+
assert!(search(
242+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
243+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus"
244+
));
245+
}
246+
247+
#[test]
248+
fn search_different() {
249+
assert!(!search(b"x", b"y"));
250+
251+
assert!(!search(b"xy", b"xz"));
252+
253+
assert!(!search(b"bar", b"foo"));
254+
255+
assert!(!search(
256+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
257+
b"foo"
258+
));
259+
260+
assert!(!search(
261+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
262+
b"foo"
263+
));
264+
265+
assert!(!search(
266+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
267+
b"foo bar baz qux quux quuz corge grault garply waldo fred plugh xyzzy thud"
268+
));
269+
}
270+
271+
#[test]
272+
fn search_prefix() {
273+
assert!(search(b"xy", b"x"));
274+
275+
assert!(search(b"foobar", b"foo"));
276+
277+
assert!(search(
278+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
279+
b"Lorem"
280+
));
281+
282+
assert!(search(
283+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
284+
b"Lorem"
285+
));
286+
287+
assert!(search(
288+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
289+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
290+
));
291+
}
292+
293+
#[test]
294+
fn search_suffix() {
295+
assert!(search(b"xy", b"y"));
296+
297+
assert!(search(b"foobar", b"bar"));
298+
299+
assert!(search(
300+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
301+
b"elit"
302+
));
303+
304+
assert!(search(
305+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
306+
b"purus"
307+
));
308+
309+
assert!(search(
310+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
311+
b"Aliquam iaculis fringilla mi, nec aliquet purus"
312+
));
313+
}
314+
315+
#[test]
316+
fn search_multiple() {
317+
assert!(search(b"xx", b"x"));
318+
319+
assert!(search(b"xyxy", b"xy"));
320+
321+
assert!(search(b"foobarfoo", b"foo"));
322+
323+
assert!(search(
324+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
325+
b"it"
326+
));
327+
328+
assert!(search(
329+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
330+
b"conse"
331+
));
332+
}
333+
334+
#[test]
335+
fn search_middle() {
336+
assert!(search(b"xyz", b"y"));
337+
338+
assert!(search(b"wxyz", b"xy"));
339+
340+
assert!(search(b"foobarfoo", b"bar"));
341+
342+
assert!(search(
343+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
344+
b"consectetur"
345+
));
346+
347+
assert!(search(
348+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
349+
b"orci"
350+
));
351+
352+
assert!(search(
353+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
354+
b"Maecenas commodo posuere orci a consectetur"
355+
));
356+
}
203357
}

src/x86.rs

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -642,154 +642,6 @@ mod tests {
642642
use super::{Avx2Searcher, DynamicAvx2Searcher};
643643
use crate::Needle;
644644

645-
fn search(haystack: &[u8], needle: &[u8]) -> bool {
646-
let search =
647-
|position| unsafe { Avx2Searcher::with_position(needle, position).search_in(haystack) };
648-
649-
let dynamic_search = |position| unsafe {
650-
DynamicAvx2Searcher::with_position(needle.to_owned().into_boxed_slice(), position)
651-
.search_in(haystack)
652-
};
653-
654-
let result = search(0);
655-
for position in 1..needle.len() {
656-
assert_eq!(search(position), result);
657-
assert_eq!(dynamic_search(position), result);
658-
}
659-
660-
result
661-
}
662-
663-
#[test]
664-
fn search_same() {
665-
assert!(search(b"x", b"x"));
666-
667-
assert!(search(b"xy", b"xy"));
668-
669-
assert!(search(b"foo", b"foo"));
670-
671-
assert!(search(
672-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
673-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
674-
));
675-
676-
assert!(search(
677-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
678-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus"
679-
));
680-
}
681-
682-
#[test]
683-
fn search_different() {
684-
assert!(!search(b"x", b"y"));
685-
686-
assert!(!search(b"xy", b"xz"));
687-
688-
assert!(!search(b"bar", b"foo"));
689-
690-
assert!(!search(
691-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
692-
b"foo"
693-
));
694-
695-
assert!(!search(
696-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
697-
b"foo"
698-
));
699-
700-
assert!(!search(
701-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
702-
b"foo bar baz qux quux quuz corge grault garply waldo fred plugh xyzzy thud"
703-
));
704-
}
705-
706-
#[test]
707-
fn search_prefix() {
708-
assert!(search(b"xy", b"x"));
709-
710-
assert!(search(b"foobar", b"foo"));
711-
712-
assert!(search(
713-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
714-
b"Lorem"
715-
));
716-
717-
assert!(search(
718-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
719-
b"Lorem"
720-
));
721-
722-
assert!(search(
723-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
724-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
725-
));
726-
}
727-
728-
#[test]
729-
fn search_suffix() {
730-
assert!(search(b"xy", b"y"));
731-
732-
assert!(search(b"foobar", b"bar"));
733-
734-
assert!(search(
735-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
736-
b"elit"
737-
));
738-
739-
assert!(search(
740-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
741-
b"purus"
742-
));
743-
744-
assert!(search(
745-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
746-
b"Aliquam iaculis fringilla mi, nec aliquet purus"
747-
));
748-
}
749-
750-
#[test]
751-
fn search_multiple() {
752-
assert!(search(b"xx", b"x"));
753-
754-
assert!(search(b"xyxy", b"xy"));
755-
756-
assert!(search(b"foobarfoo", b"foo"));
757-
758-
assert!(search(
759-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
760-
b"it"
761-
));
762-
763-
assert!(search(
764-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
765-
b"conse"
766-
));
767-
}
768-
769-
#[test]
770-
fn search_middle() {
771-
assert!(search(b"xyz", b"y"));
772-
773-
assert!(search(b"wxyz", b"xy"));
774-
775-
assert!(search(b"foobarfoo", b"bar"));
776-
777-
assert!(search(
778-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
779-
b"consectetur"
780-
));
781-
782-
assert!(search(
783-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
784-
b"orci"
785-
));
786-
787-
assert!(search(
788-
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas commodo posuere orci a consectetur. Ut mattis turpis ut auctor consequat. Aliquam iaculis fringilla mi, nec aliquet purus",
789-
b"Maecenas commodo posuere orci a consectetur"
790-
));
791-
}
792-
793645
#[test]
794646
#[should_panic]
795647
fn avx2_invalid_position() {

0 commit comments

Comments
 (0)