2013-05-07 4 views
8

Как часть теста, я хочу утверждать, что функция возвращает вектор с правильным содержимым. Поэтому я сделал ожидаемые данные доступными как статические переменные. Однако я не могу найти подходящий способ сравнить содержимое управляемого вектора со статической векторной переменной.Как сравнить содержимое принадлежащего вектору статического вектора в 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()); 
} 

Update: Назначение ссылки на статический вектор перед сравнением она работает вокруг проблемы, так что я в конечном итоге с небольшим макро утверждать равенство векторов:

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); 
})) 

Использование: assert_typed_eq([u8], my_data, expected_data);

+0

Вы можете сравнить длины, а затем перевернуть их оба. Напишите свой собственный макрос утверждения. –

ответ

6

Существует фактически два вида статических векторов: фиксированные длины ([u8, .. 3]) и статические срезы (&'static [u8]). Первый не очень хорошо взаимодействует с другими типами векторов. Последнее наиболее полезно здесь:

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

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

Спасибо за разъяснение этого. Я не знал, что существует два типа статических векторов. Я закончил определение нового макроса с именем 'assert_typed_eq', который сначала присваивает значения локальной типизированной ссылочной переменной, а затем использует assert_equal. Это кажется немного неудобным, но сейчас отлично работает. Ty! – Zargony

+0

Вы не говорите, какой выпуск Rust вы используете - 'vec :: eq', кажется, исчез на 0.8. –

+2

@AndrewAylett это определенно имеет. (Кстати, я думаю, что я даже тот, кто это сделал, ха-ха.) К счастью, я также добавил '.as_slice()', чтобы сделать принуждение вручную ... обновив ответ. – huon