Debargha Roy
Debargha Roy

Reputation: 2708

How to assert if two vectors are equal in CppUnitTest framework

I am trying to assert 2-D vectors as shown below

TEST_METHOD(TestCase1)
{
    std::vector<int> arr{2};
    int sum{ 2 };
    std::vector<std::vector<int>> subsets;
    std::vector<std::vector<int>> expected{ {2} };
    generate_subsets(subsets, arr, sum);
    Assert::AreEqual<std::vector<std::vector<int>>>(subsets, expected);
}

But it shows an error as below

Error - C2338 Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class std::vector<class std::vector<int,class…

Any suggestion would be of great help.

Upvotes: 2

Views: 2205

Answers (1)

Chris Olsen
Chris Olsen

Reputation: 3511

Assert::AreEqual wants to convert the values to std::wstring for display in case of failure i.e:

Assert failed. Expected:<some value> Actual:<some other value>

the compiler complains because there is no built in conversion for the type you're using.

A quick fix would be to use Assert::IsTrue instead, since it won't try to convert the values to strings:

Assert::IsTrue(subsets == expected, L"Unexpected value for <subsets>);

If you are going to be comparing these types a lot and want Assert::AreEqual to show the actual values when a test fails, then you can do what the compile message suggests and create a ToString override for that specific type:

#include <CppUnitTestAssert.h>

namespace Microsoft {
    namespace VisualStudio {
        namespace CppUnitTestFramework {
            template<> static inline std::wstring ToString(const std::vector<std::vector<int>> &object)
            {
                // Insert some code here to convert <object> to wstring
                return std::wstring();
            }
        }
    }
}

Upvotes: 3

Related Questions