2013-05-07 16 views
8

W ramach testu chcę potwierdzić, że funkcja zwraca wektor z odpowiednią zawartością. Dlatego udostępniłem oczekiwane dane jako zmienną statyczną. Jednak nie mogę znaleźć odpowiedniego sposobu na porównanie zawartości wektorów zarządzanych ze zmienną wektorową statyczną.Jak porównać zawartość posiadanego wektora do wektora statycznego w Rust?

#[test] 
fn test_my_data_matches_expected_data() { 
    static expected_data: [u8, ..3] = [1, 2, 3]; 
    let my_data: ~[u8] = ~[1, 2, 3]; // actually returned by the function to test 

    // This would be obvious, but fails: 
    // -> mismatched types: expected `~[u8]` but found `[u8 * 3]` 
    assert_eq!(my_data, expected_data); 

    // Static vectors are told to be available as a borrowed pointer, 
    // so I tried to borrow a pointer from my_data and compare it: 
    // -> mismatched types: expected `&const ~[u8]` but found `[u8 * 3]` 
    assert_eq!(&my_data, expected_data); 

    // Dereferencing also doesn't work: 
    // -> type ~[u8] cannot be dereferenced 
    assert_eq!(*my_data, expected_data); 

    // Copying the static vector to a managed one works, but this 
    // involves creating a copy of the data and actually defeats 
    // the reason to declare it statically: 
    assert_eq!(my_data, expected_data.to_owned()); 
} 

Aktualizacja: Przypisywanie odniesienie do statycznego wektora przed porównując to działa sobie z tym problemem, więc skończyło się z małym makro dochodzić równość wektorów:

macro_rules! assert_typed_eq (($T: ty, $given: expr, $expected: expr) => ({ 
    let given_val: &$T = $given; 
    let expected_val: &$T = $expected; 
    assert_eq!(given_val, expected_val); 
})) 

Użycie:

+0

Można porównać długości, a następnie zapętlić obie. Napisz własne makro asercji. –

Odpowiedz

6

Istnieją dwa rodzaje wektorów statycznych: o stałej długości ([u8, .. 3]) i statyczne plasterki (&'static [u8]). Ten pierwszy nie współdziała bardzo dobrze z innymi typami wektorów. Ten ostatni jest najbardziej przydatny tutaj:

fn main() { 
    static x: &'static [u8] = &[1,2,3]; 

    let y = ~[1u8,2,3]; 
    assert_eq!(y.as_slice(), x); 
} 
+0

Dzięki za wyjaśnienie tego. Nie wiedziałem, że istnieją dwa rodzaje wektorów statycznych. W końcu zdefiniowałem nowe makro o nazwie "assert_typed_eq", które najpierw przypisuje wartości do lokalnej typowej zmiennej referencyjnej, a następnie używa assert_equal. Wydaje się nieco niewygodne, ale teraz działa dobrze. Ty! – Zargony

+0

Nie mówisz, której wersji Rust używasz - wydaje się, że 'vec :: eq' zniknął o 0.8. –

+2

@AndrewAylett to na pewno ma. (Przypadkowo, myślę, że byłem nawet tym, który to zrobił, haha.) Na szczęście dodałem również '.as_slice()', aby ręcznie wykonać przymus ... aktualizując odpowiedź. – huon