2012-04-08 1 views
5

Ho letto this official document, ho imparato come fare il confronto binario e il confronto delle stringhe.In che modo gtest confronta i valori in due matrici?

L'ASSERT_EQ e ASSERT_STREQ potrebbero non funzionare nel caso di confronto degli array.

Ad esempio

[email protected]:~/poc$ g++ -I${GTEST_DIR}/include insertion_sort.cpp insertion_sort_unittest.cpp /home/li/libgtest.a -lpthread -o inser_unit 
[email protected]:~/poc$ ./inser_unit 
[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from InsertionSortTest 
[ RUN  ] InsertionSortTest.Two 
insertion_sort_unittest.cpp:18: Failure 
Value of: two_sorted 
    Actual: { 2, 5 } 
Expected: two 
Which is: { 2, 5 } 
[ FAILED ] InsertionSortTest.Two (1 ms) 
[----------] 1 test from InsertionSortTest (1 ms total) 

[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (1 ms total) 
[ PASSED ] 0 tests. 
[ FAILED ] 1 test, listed below: 
[ FAILED ] InsertionSortTest.Two 

1 FAILED TEST 

insertion_sort_unittest.cpp

#include <limits.h> 
#include "insertionsort.h" 
#include "gtest/gtest.h" 

namespace{ 
    class InsertionSortTest : public ::testing::Test{ 
     protected: 
      InsertionSortTest() {} 
      virtual ~InsertionSortTest() {} 
      virtual void SetUp() {} 
      virtual void TearDown() {} 
    }; 

    TEST(InsertionSortTest, Two){ 
     int two[] = {5, 2}; 
     int two_sorted[] = {2, 5}; 
     insertionSort(two, 2); 
     EXPECT_EQ(two, two_sorted); 
    } 
} 

int main(int argc, char **argv){ 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

insertion_sort.cpp

#include "insertionsort.h" 
void insertionSort(int *data, int size){ 
    for (int i=1,j; i<size; i++){ 
     int key = data[i]; 
     for (j=i-1; j>=0; j--){ 
      if (data[j] > key){ 
       data[j+1]=data[j]; 
       data[j]=key; 
      } 
     } 
    } 
} 

insertionsort.h

#ifndef INSERTIONSORT_H_ 
#define INSERTIONSORT_H_ 
void insertionSort(int *data, int size); 
#endif 
+2

Forse dovrei imparare ad usare googlemock, ho trovato la risposta [qui] (http://stackoverflow.com/questions/1460703/comparison-of-arrays-in-google-test) e [qui] (http://code.google.com/p/googletest/issues/detail?id=231) – liweijian

risposta

13

Non è necessario aggiungere una dipendenza su googlemock se non si desidera, è possibile scrivere la propria funzione semplice che restituisce un testing::AssertionResult, ad es.

template<typename T, size_t size> 
    ::testing::AssertionResult ArraysMatch(const T (&expected)[size], 
              const T (&actual)[size]){ 
     for (size_t i(0); i < size; ++i){ 
      if (expected[i] != actual[i]){ 
       return ::testing::AssertionFailure() << "array[" << i 
        << "] (" << actual[i] << ") != expected[" << i 
        << "] (" << expected[i] << ")"; 
      } 
     } 

     return ::testing::AssertionSuccess(); 
    } 

Poi nel test, lo chiamano:

EXPECT_TRUE(ArraysMatch(two_sorted, two)); 
+0

Grazie Fraser, mi aiuti molto :) – liweijian

6

ASSERT_EQ confronta i suoi argomenti con operator==. Il confronto con operator== funziona per std::vector ma non per C-array in C++. Il motivo è che, quando si tenta di utilizzare un valore di un array C in un'espressione, nella maggior parte dei casi il valore decade in un puntatore che punta all'inizio della memoria in cui è archiviato l'array. Finisci per confrontare due indicatori. In caso di due diversi array C, i puntatori non avranno mai lo stesso valore.

Il tuo modo più semplice è quello di utilizzare le ASSERT_THAT macro e la ContainerEq matcher di Google Mock. Invece di ASSERT_EQ, scrivere

ASSERT_THAT(two, ContainerEq(two_sorted)); 
+0

Giusto per chiarire - questo ancora non funziona su C array, giusto? perché non c'è un posto dove passare la lunghezza degli array? – dwanderson

+0

Essa - vedi https://github.com/google/googletest/blob/786564fa4a3c8e0f908acca32cce481de5481b9f/googlemock/test/gmock-matchers_test.cc#L4311. – VladLosev

+0

Oh, no! Potrei giurare che l'ho provato, ma dovrò ricontrollare. Forse ho appena pensato che non avrebbe funzionato. Grazie per aver segnalato questo! – dwanderson

1

penso che sia sufficiente scrivere proprio come questo.

EXPECT_EQ(memcmp(two, two_sorted, 2 * sizeof(int)), 0);

+0

fornire una spiegazione del motivo per cui la risposta funziona? –