Skip to content

Commit b2b5747

Browse files
committed
fix(query): improve mutants coverage
1 parent 1a8c9c9 commit b2b5747

1 file changed

Lines changed: 147 additions & 137 deletions

File tree

src/query/mod.rs

Lines changed: 147 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
#![cfg_attr(
2-
not(test),
3-
expect(dead_code, reason = "queries are not used yet"),
4-
expect(unused_imports, reason = "queries are not used yet")
5-
)]
1+
#![cfg_attr(not(test), expect(dead_code, reason = "queries are not used yet"))]
62

73
use crate::prelude::*;
84
use hir::*;
95

6+
#[expect(unused_imports, reason = "queries are not used yet")]
107
pub use self::traits::*;
118

129
/// Query builder for searching through the [`Hir`] for some [`Queryable`].
@@ -169,148 +166,161 @@ mod traits {
169166
true
170167
}
171168
}
172-
}
173-
174-
#[cfg(test)]
175-
mod test {
176-
use super::*;
177169

178-
#[fixture]
179-
fn ctx() -> Ctx {
180-
Ctx::new()
181-
}
182-
183-
#[fixture]
184-
fn hir() -> Hir {
185-
let mut hir = Hir::default();
186-
187-
// Empty trait.
188-
hir.traits.insert(Trait {
189-
name: TraitBindingId::from_id(0),
190-
method_scope: ScopeId::from_id(0),
191-
method_bindings: HashMap::new(),
192-
methods: IndexedVec::new(),
193-
});
194-
195-
// Single method trait.
196-
hir.traits.insert(Trait {
197-
name: TraitBindingId::from_id(1),
198-
method_scope: ScopeId::from_id(1),
199-
method_bindings: HashMap::from_iter([(
200-
IdentifierBindingId::from_id(0),
201-
TraitMethodId::from_id(0),
202-
)]),
203-
methods: indexed_vec![FunctionSignature {
204-
parameters: vec![],
205-
return_ty: MaybeSelfType::Type(TypeId::from_id(0)),
206-
}],
207-
});
208-
209-
// Single method trait with parameters.
210-
hir.traits.insert(Trait {
211-
name: TraitBindingId::from_id(2),
212-
method_scope: ScopeId::from_id(2),
213-
method_bindings: HashMap::from_iter([(
214-
IdentifierBindingId::from_id(0),
215-
TraitMethodId::from_id(0),
216-
)]),
217-
methods: indexed_vec![FunctionSignature {
218-
parameters: vec![
219-
(IdentifierBindingId::from_id(1), MaybeSelfType::SelfType),
220-
(
221-
IdentifierBindingId::from_id(2),
222-
MaybeSelfType::Type(TypeId::from_id(0))
223-
),
224-
],
225-
return_ty: MaybeSelfType::Type(TypeId::from_id(0)),
226-
}],
227-
});
228-
229-
// Multi method trait.
230-
hir.traits.insert(Trait {
231-
name: TraitBindingId::from_id(1),
232-
method_scope: ScopeId::from_id(1),
233-
method_bindings: HashMap::from_iter([
234-
(IdentifierBindingId::from_id(0), TraitMethodId::from_id(0)),
235-
(IdentifierBindingId::from_id(1), TraitMethodId::from_id(1)),
236-
]),
237-
methods: indexed_vec![
238-
FunctionSignature {
170+
#[cfg(test)]
171+
mod test {
172+
use super::*;
173+
174+
#[fixture]
175+
fn hir() -> Hir {
176+
let mut hir = Hir::default();
177+
178+
// Empty trait.
179+
hir.traits.insert(Trait {
180+
name: TraitBindingId::from_id(0),
181+
method_scope: ScopeId::from_id(0),
182+
method_bindings: HashMap::new(),
183+
methods: IndexedVec::new(),
184+
});
185+
186+
// Single method trait.
187+
hir.traits.insert(Trait {
188+
name: TraitBindingId::from_id(1),
189+
method_scope: ScopeId::from_id(1),
190+
method_bindings: HashMap::from_iter([(
191+
IdentifierBindingId::from_id(0),
192+
TraitMethodId::from_id(0),
193+
)]),
194+
methods: indexed_vec![FunctionSignature {
239195
parameters: vec![],
240196
return_ty: MaybeSelfType::Type(TypeId::from_id(0)),
241-
},
242-
FunctionSignature {
243-
parameters: vec![],
197+
}],
198+
});
199+
200+
// Single method trait with parameters.
201+
hir.traits.insert(Trait {
202+
name: TraitBindingId::from_id(2),
203+
method_scope: ScopeId::from_id(2),
204+
method_bindings: HashMap::from_iter([(
205+
IdentifierBindingId::from_id(0),
206+
TraitMethodId::from_id(0),
207+
)]),
208+
methods: indexed_vec![FunctionSignature {
209+
parameters: vec![
210+
(IdentifierBindingId::from_id(1), MaybeSelfType::SelfType),
211+
(
212+
IdentifierBindingId::from_id(2),
213+
MaybeSelfType::Type(TypeId::from_id(0))
214+
),
215+
],
244216
return_ty: MaybeSelfType::Type(TypeId::from_id(0)),
245-
}
246-
],
247-
});
217+
}],
218+
});
219+
220+
// Multi method trait.
221+
hir.traits.insert(Trait {
222+
name: TraitBindingId::from_id(3),
223+
method_scope: ScopeId::from_id(3),
224+
method_bindings: HashMap::from_iter([
225+
(IdentifierBindingId::from_id(0), TraitMethodId::from_id(0)),
226+
(IdentifierBindingId::from_id(1), TraitMethodId::from_id(1)),
227+
]),
228+
methods: indexed_vec![
229+
FunctionSignature {
230+
parameters: vec![],
231+
return_ty: MaybeSelfType::Type(TypeId::from_id(0)),
232+
},
233+
FunctionSignature {
234+
parameters: vec![],
235+
return_ty: MaybeSelfType::Type(TypeId::from_id(0)),
236+
}
237+
],
238+
});
248239

249-
hir
250-
}
240+
hir
241+
}
251242

252-
#[rstest]
253-
fn all_traits(hir: Hir) {
254-
assert_eq!(Query::traits().query(&hir).count(), 4);
255-
}
243+
#[rstest]
244+
fn all_traits(hir: Hir) {
245+
assert_eq!(Query::traits().query(&hir).count(), 4);
246+
}
256247

257-
#[rstest]
258-
fn single_method_traits(hir: Hir) {
259-
assert_eq!(
260-
Query::traits()
261-
.methods([SignatureFilter::new()])
262-
.query(&hir)
263-
.count(),
264-
2
265-
);
266-
}
248+
#[rstest]
249+
fn single_method_traits(hir: Hir) {
250+
assert_eq!(
251+
Query::traits()
252+
.methods([SignatureFilter::new()])
253+
.query(&hir)
254+
.count(),
255+
2
256+
);
257+
}
267258

268-
#[rstest]
269-
fn single_method_traits_returning_ty(hir: Hir) {
270-
assert_eq!(
271-
Query::traits()
272-
.methods([SignatureFilter::new().return_ty(TypeId::from_id(0))])
273-
.query(&hir)
274-
.count(),
275-
2
276-
);
277-
}
259+
#[rstest]
260+
fn single_method_traits_returning_ty(hir: Hir) {
261+
assert_eq!(
262+
Query::traits()
263+
.methods([SignatureFilter::new().return_ty(TypeId::from_id(0))])
264+
.query(&hir)
265+
.count(),
266+
2
267+
);
268+
}
278269

279-
#[rstest]
280-
fn single_method_trait_no_parameters_returning_ty(hir: Hir) {
281-
assert_eq!(
282-
Query::traits()
283-
.methods([SignatureFilter::new()
284-
.parameters([])
285-
.return_ty(TypeId::from_id(0))])
286-
.query(&hir)
287-
.count(),
288-
1
289-
);
290-
}
270+
#[rstest]
271+
fn single_method_trait_no_parameters_returning_ty(hir: Hir) {
272+
assert_eq!(
273+
Query::traits()
274+
.methods([SignatureFilter::new()
275+
.parameters([])
276+
.return_ty(TypeId::from_id(0))])
277+
.query(&hir)
278+
.count(),
279+
1
280+
);
281+
}
291282

292-
#[rstest]
293-
fn single_method_trait_with_parameters(hir: Hir) {
294-
assert_eq!(
295-
Query::traits()
296-
.methods([SignatureFilter::new().parameters([
297-
MaybeSelfType::SelfType,
298-
MaybeSelfType::Type(TypeId::from_id(0))
299-
])])
300-
.query(&hir)
301-
.count(),
302-
1
303-
);
304-
}
283+
#[rstest]
284+
fn single_method_trait_with_parameters(hir: Hir) {
285+
assert_eq!(
286+
Query::traits()
287+
.methods([SignatureFilter::new().parameters([
288+
MaybeSelfType::SelfType,
289+
MaybeSelfType::Type(TypeId::from_id(0))
290+
])])
291+
.query(&hir)
292+
.count(),
293+
1
294+
);
295+
}
296+
297+
#[rstest]
298+
fn multiple_method_trait(hir: Hir) {
299+
assert_eq!(
300+
Query::traits()
301+
.methods([SignatureFilter::new(), SignatureFilter::new()])
302+
.query(&hir)
303+
.count(),
304+
1
305+
);
306+
}
305307

306-
#[rstest]
307-
fn multiple_method_trait(hir: Hir) {
308-
assert_eq!(
309-
Query::traits()
310-
.methods([SignatureFilter::new(), SignatureFilter::new()])
311-
.query(&hir)
312-
.count(),
313-
1
314-
);
308+
#[rstest]
309+
fn signature_filter_parameter_match() {
310+
let filter = SignatureFilter::new().parameters([TypeId::from_id(0).into()]);
311+
assert!(filter.validate(&FunctionSignature {
312+
parameters: vec![(IdentifierBindingId::from_id(0), TypeId::from_id(0).into())],
313+
return_ty: TypeId::from_id(0).into(),
314+
}));
315+
}
316+
317+
#[rstest]
318+
fn signature_filter_parameter_mismatch() {
319+
let filter = SignatureFilter::new().parameters([TypeId::from_id(0).into()]);
320+
assert!(!filter.validate(&FunctionSignature {
321+
parameters: vec![(IdentifierBindingId::from_id(0), TypeId::from_id(1).into())],
322+
return_ty: TypeId::from_id(0).into(),
323+
}));
324+
}
315325
}
316326
}

0 commit comments

Comments
 (0)