Вы можете использовать trait_tests
ящик , хотя я действительно считаю, что ящик - это просто эксперимент, поэтому могут быть неровные края.
В частности, я не мог понять, как на самом деле протестировать все реализации Metric<T>
, а только для конкретного типа, Metric<i32>
.
Для вашего примера:
use trait_tests::*;
pub trait Metric<T> {
fn distance(o1: &T, o2: &T) -> f64;
}
#[trait_tests]
pub trait MetricTests: Metric<i32> {
fn test_distance() {
// These could possibly be extended using quickcheck or proptest
assert!(Self::distance(&42, &42) == 0.0);
}
}
struct CartesianPlane {}
#[test_impl]
impl Metric<i32> for CartesianPlane {
fn distance(o1: &i32, o2: &i32) -> f64 {
(*o2 - *o1) as f64
}
}
Тогда cargo test
должен включать автоматически сгенерированный тест для разработчиков черты, помеченных #[test_impl]
.