@@ -26,3 +26,52 @@ 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 ! [ make_post( 1 , & [ "rust lang" ] ) , make_post( 2 , & [ "crust test" ] ) ] ;
63+
64+ let engine = WordSearchEngine :: new ( posts) ;
65+ let results = engine. search ( "rust" ) ;
66+ assert_eq ! ( results. len( ) , 1 ) ;
67+ assert_eq ! ( results[ 0 ] [ "id" ] , 1 ) ;
68+ }
69+
70+ #[ test]
71+ fn search_returns_empty_for_no_match ( ) {
72+ let posts = vec ! [ make_post( 1 , & [ "hello world" ] ) ] ;
73+ let engine = WordSearchEngine :: new ( posts) ;
74+ let results = engine. search ( "absent" ) ;
75+ assert ! ( results. is_empty( ) ) ;
76+ }
77+ }
0 commit comments