@@ -499,3 +499,63 @@ impl Builder {
499
499
self
500
500
}
501
501
}
502
+
503
+ #[ cfg( test) ]
504
+ mod tests {
505
+ use itertools:: Itertools ;
506
+ use test_utils:: assert_eq_text;
507
+
508
+ use super :: CompletionRelevance ;
509
+
510
+ /// Check that these are CompletionRelevance are sorted in ascending order
511
+ /// by their relevance score.
512
+ ///
513
+ /// We want to avoid making assertions about the absolute score of any
514
+ /// item, but we do want to assert whether each is >, <, or == to the
515
+ /// others.
516
+ ///
517
+ /// If provided vec![vec![a], vec![b, c], vec![d]], then this will assert:
518
+ /// a.score < b.score == c.score < d.score
519
+ fn check_relevance_score_ordered ( expected_relevance_order : Vec < Vec < CompletionRelevance > > ) {
520
+ let expected = format ! ( "{:#?}" , & expected_relevance_order) ;
521
+
522
+ let actual_relevance_order = expected_relevance_order
523
+ . into_iter ( )
524
+ . flatten ( )
525
+ . map ( |r| ( r. score ( ) , r) )
526
+ . sorted_by_key ( |( score, _r) | * score)
527
+ . fold (
528
+ ( u8:: MIN , vec ! [ vec![ ] ] ) ,
529
+ |( mut currently_collecting_score, mut out) , ( score, r) | {
530
+ if currently_collecting_score == score {
531
+ out. last_mut ( ) . unwrap ( ) . push ( r) ;
532
+ } else {
533
+ currently_collecting_score = score;
534
+ out. push ( vec ! [ r] ) ;
535
+ }
536
+ ( currently_collecting_score, out)
537
+ } ,
538
+ )
539
+ . 1 ;
540
+
541
+ let actual = format ! ( "{:#?}" , & actual_relevance_order) ;
542
+
543
+ assert_eq_text ! ( & expected, & actual) ;
544
+ }
545
+
546
+ #[ test]
547
+ fn relevance_score ( ) {
548
+ // This test asserts that the relevance score for these items is ascending, and
549
+ // that any items in the same vec have the same score.
550
+ let expected_relevance_order = vec ! [
551
+ vec![ CompletionRelevance :: default ( ) ] ,
552
+ vec![
553
+ CompletionRelevance { exact_name_match: true , ..CompletionRelevance :: default ( ) } ,
554
+ CompletionRelevance { exact_type_match: true , ..CompletionRelevance :: default ( ) } ,
555
+ ] ,
556
+ vec![ CompletionRelevance { exact_name_match: true , exact_type_match: true } ] ,
557
+ ] ;
558
+
559
+ check_relevance_score_ordered ( expected_relevance_order) ;
560
+ }
561
+ }
0 commit comments