Убедитесь, что реализация черты в ржавчине удовлетворяет свойствам - PullRequest
0 голосов
/ 11 июля 2019

Я создаю черту для определения расстояния в метрическом пространстве, например:

trait Metric<T> {
    fn distance(o1: &T, o2: &T) -> f64;
}

, и я хочу, чтобы любая реализация удовлетворяла некоторым свойствам, например:

distance(o, o) = 0.0

Существоватьпуть в ржавчине, чтобы навязать это?

1 Ответ

1 голос
/ 11 июля 2019

Вы можете использовать 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].

...