@@ -86,6 +86,8 @@ impl<S: Deref<Target = str>> ModifierSet<S> {
86
86
/// by the following two criteria (in order):
87
87
/// 1. Number of modifiers in common with `self` (more is better).
88
88
/// 2. Total number of modifiers (fewer is better).
89
+ ///
90
+ /// If there are multiple best matches, the first of them is returned.
89
91
pub fn best_match_in < ' a , T > (
90
92
& self ,
91
93
variants : impl Iterator < Item = ( ModifierSet < & ' a str > , T ) > ,
@@ -150,7 +152,63 @@ mod tests {
150
152
type ModifierSet = super :: ModifierSet < & ' static str > ;
151
153
152
154
#[ 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 ( ) {
154
161
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 ) ;
155
165
}
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