谷歌测试比较指针数组的内容
Google test compare pointer-arrays' content
我是谷歌测试的新手,我发现的任何方法都不起作用。
假设我有一个数组,然后是一个函数,它向我返回指向一个新数组的指针,我想比较这两个数组是否包含相同的元素。
例:
int foo[] {1,2,3};
int* expected result = foo;
int* result = bar(foo);
//comparison
EXPECT_THAT(foo, testing::UnorderedElementsAreArray(result, 3));
//other way
EXPECT_THAT(foo, testing::ContainerEq(result));
这两种方式都没有(类似的尝试都不起作用)。
我想检查两个数组是否包含相同的元素,无论顺序如何。
我已经尝试了谷歌测试中的数组比较中的方法? 但它们都没有奏效。
此外,"ElementsAreArray"是正确的比较器吗?
感谢您的任何帮助。
您尝试使用的最匹配器testing::UnorderedElementsAreArray
和testing::ContainerEq
仅适用于 STL 样式容器的对象。 请参阅文档。
您的foo
是一个 C 样式的int
数组。 你expected_result
和result
是指向int
的指针。这些都不是 STL 风格的容器, 指针在任何意义上都不是容器。
您要测试的问题是N
整数是否从expected_result
是从result
开始的N
整数的任何排列,其中N
是数字 数组中的元素foo
.
通过单个EXPECT...
电话测试该问题的唯一方法 是当你调用某个函数来准确确定 使用参数result
和expected_result
的问题,并返回布尔判定(或可转换为布尔判定的内容)。
C++ 标准库(C++11 或更高版本)为以下目的提供了一个通用函数:std::is_permutation
, 您将如图所示应用:
#include <gtest/gtest.h>
#include <algorithm>
int * reverse(int in[], std::size_t len)
{
int * permute = new int[len];
std::reverse_copy(in,in + len,permute);
return permute;
}
TEST(reverse,is_correct)
{
int foo[] {1,2,3};
int* expected_result = foo;
std::size_t len = sizeof(foo)/sizeof(foo[0]);
int* result = reverse(foo,len);
EXPECT_TRUE(std::is_permutation(result,result + len,expected_result));
delete [] result;
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
输出:
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from reverse
[ RUN ] reverse.is_correct
[ OK ] reverse.is_correct (0 sec)
[----------] 1 test from reverse (0 sec total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 1 test.
请注意,使用 C 样式数组迫使您通过以下方式管理堆内存 手:
int * permute = new int[len];
...
...
delete [] result
这C++是无端邀请堆泄漏或堆损坏 错误。对于固定大小的数组,请使用std::array
。 对于动态大小的数组,请使用std::vector
。 这样更好:
#include <gtest/gtest.h>
#include <algorithm>
#include <array>
template<std::size_t N>
std::array<int,N> reverse(std::array<int,N> const & in)
{
std::array<int,N> permute;
std::reverse_copy(in.begin(),in.end(),permute.begin());
return permute;
}
TEST(reverse,is_correct)
{
std::array<int,3> foo {1,2,3};
auto result = reverse(foo);
EXPECT_TRUE(std::is_permutation(result.begin(),result.end(),foo.begin()));
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
而且,由于std::array
和std::vector
是STL 样式的容器,因此 如果您使用其中任何一个,原始尝试都会起作用:
#include <gmock/gmock.h>
#include <algorithm>
#include <array>
template<std::size_t N>
std::array<int,N> reverse(std::array<int,N> const & in)
{
std::array<int,N> permute;
std::reverse_copy(in.begin(),in.end(),permute.begin());
return permute;
}
TEST(reverse,is_correct)
{
std::array<int,3> foo {1,2,3};
auto result = reverse(foo);
EXPECT_THAT(foo,testing::UnorderedElementsAreArray(result));
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”