@@ -86,6 +86,8 @@ impl<S: Deref<Target = str>> ModifierSet<S> {
8686 /// by the following two criteria (in order):
8787 /// 1. Number of modifiers in common with `self` (more is better).
8888 /// 2. Total number of modifiers (fewer is better).
89+ ///
90+ /// If there are multiple best matches, the first of them is returned.
8991 pub fn best_match_in < ' a , T > (
9092 & self ,
9193 variants : impl Iterator < Item = ( ModifierSet < & ' a str > , T ) > ,
@@ -150,7 +152,63 @@ mod tests {
150152 type ModifierSet = super :: ModifierSet < & ' static str > ;
151153
152154 #[ test]
153- fn empty_set_empty_iter ( ) {
155+ fn default_is_empty ( ) {
156+ assert ! ( ModifierSet :: default ( ) . is_empty( ) ) ;
157+ }
158+
159+ #[ test]
160+ fn iter_count ( ) {
154161 assert_eq ! ( ModifierSet :: default ( ) . iter( ) . count( ) , 0 ) ;
162+ assert_eq ! ( ModifierSet :: new_unchecked( "a" ) . iter( ) . count( ) , 1 ) ;
163+ assert_eq ! ( ModifierSet :: new_unchecked( "a.b" ) . iter( ) . count( ) , 2 ) ;
164+ assert_eq ! ( ModifierSet :: new_unchecked( "a.b.c" ) . iter( ) . count( ) , 3 ) ;
155165 }
156- }
166+
167+ #[ test]
168+ fn subset ( ) {
169+ assert ! (
170+ ModifierSet :: new_unchecked( "a" ) . is_subset( ModifierSet :: new_unchecked( "a.b" ) )
171+ ) ;
172+ assert ! (
173+ ModifierSet :: new_unchecked( "a" ) . is_subset( ModifierSet :: new_unchecked( "b.a" ) )
174+ ) ;
175+ assert ! ( ModifierSet :: new_unchecked( "a.b" )
176+ . is_subset( ModifierSet :: new_unchecked( "b.c.a" ) ) ) ;
177+ }
178+
179+ #[ test]
180+ fn best_match ( ) {
181+ // 1. more modifiers in common with self
182+ assert_eq ! (
183+ ModifierSet :: new_unchecked( "a.b" ) . best_match_in( [
184+ ( ModifierSet :: new_unchecked( "a.c" ) , 1 ) ,
185+ ( ModifierSet :: new_unchecked( "a.b" ) , 2 ) ,
186+ ] . into_iter( ) ) ,
187+ Some ( 2 )
188+ ) ;
189+ // 2. fewer modifiers in general
190+ assert_eq ! (
191+ ModifierSet :: new_unchecked( "a" ) . best_match_in( [
192+ ( ModifierSet :: new_unchecked( "a" ) , 1 ) ,
193+ ( ModifierSet :: new_unchecked( "a.b" ) , 2 ) ,
194+ ] . into_iter( ) ) ,
195+ Some ( 1 )
196+ ) ;
197+ // the first rule takes priority over the second
198+ assert_eq ! (
199+ ModifierSet :: new_unchecked( "a.b" ) . best_match_in( [
200+ ( ModifierSet :: new_unchecked( "a" ) , 1 ) ,
201+ ( ModifierSet :: new_unchecked( "a.b" ) , 2 ) ,
202+ ] . into_iter( ) ) ,
203+ Some ( 2 )
204+ ) ;
205+ // among multiple best matches, the first one is returned
206+ assert_eq ! (
207+ ModifierSet :: default ( ) . best_match_in( [
208+ ( ModifierSet :: new_unchecked( "a" ) , 1 ) ,
209+ ( ModifierSet :: new_unchecked( "b" ) , 2 )
210+ ] . into_iter( ) ) ,
211+ Some ( 1 )
212+ ) ;
213+ }
214+ }
0 commit comments