Skip to content

Commit d0e4299

Browse files
committed
Improve testing for AVX2 searchers
1 parent 8948532 commit d0e4299

File tree

1 file changed

+91
-32
lines changed

1 file changed

+91
-32
lines changed

src/x86.rs

Lines changed: 91 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -521,129 +521,188 @@ impl DynamicAvx2Searcher {
521521

522522
#[cfg(test)]
523523
mod tests {
524-
use super::Avx2Searcher;
524+
use super::{Avx2Searcher, DynamicAvx2Searcher};
525+
use crate::Needle;
525526

526-
fn avx2_search(haystack: &[u8], needle: &[u8]) -> bool {
527-
let search = |position| unsafe {
528-
Avx2Searcher::with_position(needle.to_owned().into_boxed_slice(), position)
527+
fn search(haystack: &[u8], needle: &[u8]) -> bool {
528+
let search =
529+
|position| unsafe { Avx2Searcher::with_position(needle, position).search_in(haystack) };
530+
531+
let dynamic_search = |position| unsafe {
532+
DynamicAvx2Searcher::with_position(needle.to_owned().into_boxed_slice(), position)
529533
.search_in(haystack)
530534
};
531535

532536
let result = search(0);
533537
for position in 1..needle.len() {
534538
assert_eq!(search(position), result);
539+
assert_eq!(dynamic_search(position), result);
535540
}
536541

537542
result
538543
}
539544

540545
#[test]
541-
fn avx2_search_same() {
542-
assert!(avx2_search(b"foo", b"foo"));
546+
fn search_same() {
547+
assert!(search(b"x", b"x"));
548+
549+
assert!(search(b"xy", b"xy"));
543550

544-
assert!(avx2_search(
551+
assert!(search(b"foo", b"foo"));
552+
553+
assert!(search(
545554
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
546555
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
547556
));
548557

549-
assert!(avx2_search(
558+
assert!(search(
550559
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",
551560
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"
552561
));
553562
}
554563

555564
#[test]
556-
fn avx2_search_different() {
557-
assert!(!avx2_search(b"bar", b"foo"));
565+
fn search_different() {
566+
assert!(!search(b"x", b"y"));
567+
568+
assert!(!search(b"xy", b"xz"));
558569

559-
assert!(!avx2_search(
570+
assert!(!search(b"bar", b"foo"));
571+
572+
assert!(!search(
560573
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
561574
b"foo"
562575
));
563576

564-
assert!(!avx2_search(
577+
assert!(!search(
565578
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",
566579
b"foo"
567580
));
568581

569-
assert!(!avx2_search(
582+
assert!(!search(
570583
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",
571584
b"foo bar baz qux quux quuz corge grault garply waldo fred plugh xyzzy thud"
572585
));
573586
}
574587

575588
#[test]
576-
fn avx2_search_prefix() {
577-
assert!(avx2_search(b"foobar", b"foo"));
589+
fn search_prefix() {
590+
assert!(search(b"xy", b"x"));
591+
592+
assert!(search(b"foobar", b"foo"));
578593

579-
assert!(avx2_search(
594+
assert!(search(
580595
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
581596
b"Lorem"
582597
));
583598

584-
assert!(avx2_search(
599+
assert!(search(
585600
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",
586601
b"Lorem"
587602
));
588603

589-
assert!(avx2_search(
604+
assert!(search(
590605
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",
591606
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
592607
));
593608
}
594609

595610
#[test]
596-
fn avx2_search_suffix() {
597-
assert!(avx2_search(b"foobar", b"bar"));
611+
fn search_suffix() {
612+
assert!(search(b"xy", b"y"));
613+
614+
assert!(search(b"foobar", b"bar"));
598615

599-
assert!(avx2_search(
616+
assert!(search(
600617
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
601618
b"elit"
602619
));
603620

604-
assert!(avx2_search(
621+
assert!(search(
605622
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",
606623
b"purus"
607624
));
608625

609-
assert!(avx2_search(
626+
assert!(search(
610627
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",
611628
b"Aliquam iaculis fringilla mi, nec aliquet purus"
612629
));
613630
}
614631

615632
#[test]
616-
fn avx2_search_mutiple() {
617-
assert!(avx2_search(b"foobarfoo", b"foo"));
633+
fn search_multiple() {
634+
assert!(search(b"xx", b"x"));
618635

619-
assert!(avx2_search(
636+
assert!(search(b"xyxy", b"xy"));
637+
638+
assert!(search(b"foobarfoo", b"foo"));
639+
640+
assert!(search(
620641
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
621642
b"it"
622643
));
623644

624-
assert!(avx2_search(
645+
assert!(search(
625646
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",
626647
b"conse"
627648
));
628649
}
629650

630651
#[test]
631-
fn avx2_search_middle() {
632-
assert!(avx2_search(b"foobarfoo", b"bar"));
652+
fn search_middle() {
653+
assert!(search(b"xyz", b"y"));
654+
655+
assert!(search(b"wxyz", b"xy"));
656+
657+
assert!(search(b"foobarfoo", b"bar"));
633658

634-
assert!(avx2_search(
659+
assert!(search(
635660
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
636661
b"consectetur"
637662
));
638663

639-
assert!(avx2_search(
664+
assert!(search(
640665
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",
641666
b"orci"
642667
));
643668

644-
assert!(avx2_search(
669+
assert!(search(
645670
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",
646671
b"Maecenas commodo posuere orci a consectetur"
647672
));
648673
}
674+
675+
#[test]
676+
#[should_panic]
677+
fn avx2_invalid_position() {
678+
unsafe { Avx2Searcher::with_position(b"foo".to_vec().into_boxed_slice(), 3) };
679+
}
680+
681+
#[test]
682+
#[should_panic]
683+
fn dynamic_avx2_invalid_position() {
684+
unsafe { DynamicAvx2Searcher::with_position(b"foo".to_vec().into_boxed_slice(), 3) };
685+
}
686+
687+
#[test]
688+
#[should_panic]
689+
fn avx2_empty_needle() {
690+
unsafe { Avx2Searcher::new(Box::new([])) };
691+
}
692+
693+
#[test]
694+
#[should_panic]
695+
fn avx2_invalid_size() {
696+
struct Foo(&'static [u8]);
697+
698+
impl Needle for Foo {
699+
const SIZE: Option<usize> = Some(2);
700+
701+
fn as_bytes(&self) -> &[u8] {
702+
&self.0
703+
}
704+
}
705+
706+
unsafe { Avx2Searcher::new(Foo(b"foo")) };
707+
}
649708
}

0 commit comments

Comments
 (0)