Piszę kod Rust, który manipuluje surowymi wskazówkami. Te surowe wskaźniki są następnie eksponowane na użytkowników za pomocą struktur używających ContravariantLifetime do wiązania czasu trwania struktury z moim obiektem.Czy mogę pisać testy dotyczące nieprawidłowych wcieleń?
Chciałbym móc pisać testy, które potwierdzą, że struktury skierowane do użytkownika nie mogą żyć dłużej niż mój obiekt. Mam kod jak poniżej:
fn element_cannot_outlive_parts() {
let mut z = {
let p = Package::new();
p.create() // returns an object that cannot live longer than p
};
}
To nie kompiluje, co jest dokładnie to, co chcę. Chciałbym jednak mieć zautomatyzowane sprawdzenie, czy to zachowanie jest prawdziwe, nawet po jakimkolwiek refaktoryzacji, którą wykonuję dla kodu.
W tej chwili najlepszym pomysłem jest napisanie jednorazowych plików Rust za pomocą tego kodu i wykonanie skryptów bashowych, aby spróbować je skompilować i wyszukać konkretne komunikaty o błędach, co wydaje się dość hackowskie.
Niestety, nie ma natywnej obsługi testów niepowodzeń kompilacji. rustc ma infrastrukturę do osiągnięcia tego celu ('src/test/compile-fail' i in.), ale jest niestandardowy i nie jest ogólnie dostępny. –
@ChrisMorgan: Czy wierzysz, że zainteresuje się społecznością za wspieranie tego rodzaju testów? Rust ma naprawdę ewoluowany system typów pozwalający na egzekwowanie wielu kontroli i dobrze jest sprawdzić, czy kontrole są faktycznie egzekwowane. W przeszłości z C++ używałam specyficznych testów Clanga (flaga '' -verify' + specyficzne komentarze Clanga) dla tego rodzaju rzeczy; jest dość zaawansowany. –
@MatthieuM .: Wiem, że chciałbym, aby podczas projektowania biblioteki testowałem sprawdzanie, czy dany kod się nie kompiluje. –