Как напечатать типы std :: chrono с помощью теста Google? - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь использовать std::chrono типы с Google Test.Мой первый подход заключается в определении PrintTo для nanoseconds в пространстве имен std::chrono, но, к сожалению, это неопределенное поведение - добавлять объявления или определения в пространство имен std или в любое пространство имен, вложенное в std,Следующий код демонстрирует идею.

#include <gtest/gtest.h>
#include <chrono>

namespace std::chrono {

void PrintTo(nanoseconds ns, std::ostream* os) // UB
{
    *os << ns.count() << " nanoseconds ";
}

}

namespace {

struct MyTest : ::testing::Test{
};

TEST_F(MyTest, PrintingTest)
{
    using namespace testing;
    using namespace std::chrono_literals;
    ASSERT_THAT(1ns, Eq(2ns));
}

}

Если определено std::chrono::PrintTo, оно печатает:

Value of: 1ns
Expected: is equal to 2 nanoseconds 
  Actual: 

Если std::chrono::PrintTo не определено, оно печатается через байт-принтер по умолчанию:

Value of: 1ns
Expected: is equal to 8-byte object <02-00 00-00 00-00 00-00>
  Actual: 

Какой идиоматический способ определения принтера для std::chrono типов с помощью google test?

1 Ответ

1 голос
/ 27 марта 2019

Вы можете перегрузить оператор std :: ostream для типов хронографа следующим образом:

#include <gtest/gtest.h>
#include <chrono>

std::ostream& operator<<(std::ostream& os, const ::std::chrono::nanoseconds& ns) 
{
  return os << ns.count() << " nanoseconds ";
}

namespace {

struct MyTest : ::testing::Test{
};

TEST_F(MyTest, PrintingTest)
{
    using namespace testing;
    using namespace std::chrono_literals;
    ASSERT_EQ(1ns, 2ns);
}

}

Выходные данные должны быть такими, как ожидалось:

error:       Expected: 1ns
      Which is: 1 nanoseconds
To be equal to: 2ns
      Which is: 2 nanoseconds
[  FAILED  ] MyTest.PrintingTest (0 ms)
...