@@ -26,3 +26,55 @@ impl SearchEngine for WordSearchEngine {
2626 . collect ( )
2727 }
2828}
29+
30+ #[ cfg( test) ]
31+ mod tests {
32+ use super :: * ;
33+ use serde_json:: json;
34+
35+ fn make_post ( id : u32 , fields : & [ & str ] ) -> SearchPostData {
36+ SearchPostData {
37+ id : id. to_string ( ) ,
38+ fields : fields. iter ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ,
39+ meta : json ! ( { "id" : id } ) ,
40+ }
41+ }
42+
43+ #[ test]
44+ fn search_is_case_insensitive ( ) {
45+ let posts = vec ! [
46+ make_post( 1 , & [ "Hello World" ] ) ,
47+ make_post( 2 , & [ "rust language" ] ) ,
48+ ] ;
49+
50+ let engine = WordSearchEngine :: new ( posts) ;
51+ let results = engine. search ( "hello" ) ;
52+ assert_eq ! ( results. len( ) , 1 ) ;
53+ assert_eq ! ( results[ 0 ] [ "id" ] , 1 ) ;
54+
55+ let results_upper = engine. search ( "RUST" ) ;
56+ assert_eq ! ( results_upper. len( ) , 1 ) ;
57+ assert_eq ! ( results_upper[ 0 ] [ "id" ] , 2 ) ;
58+ }
59+
60+ #[ test]
61+ fn search_matches_complete_words ( ) {
62+ let posts = vec ! [
63+ make_post( 1 , & [ "rust lang" ] ) ,
64+ make_post( 2 , & [ "crust test" ] ) ,
65+ ] ;
66+
67+ let engine = WordSearchEngine :: new ( posts) ;
68+ let results = engine. search ( "rust" ) ;
69+ assert_eq ! ( results. len( ) , 1 ) ;
70+ assert_eq ! ( results[ 0 ] [ "id" ] , 1 ) ;
71+ }
72+
73+ #[ test]
74+ fn search_returns_empty_for_no_match ( ) {
75+ let posts = vec ! [ make_post( 1 , & [ "hello world" ] ) ] ;
76+ let engine = WordSearchEngine :: new ( posts) ;
77+ let results = engine. search ( "absent" ) ;
78+ assert ! ( results. is_empty( ) ) ;
79+ }
80+ }
0 commit comments