c++ - C++ 中带有 void 指针的单元测试函数

标签 c++ unit-testing memory-management googletest void-pointers

我的日常工作是一名初级软件工程师,使用 C#/WPF/Prism,我一直在尝试在业余时间自学其他语言和库以扩大我的视野。我最近一直在研究 C++,同时通过 Google 的测试和模拟库进行单元测试,并且在从 C# 思维模式转移到 C++ 世界方面做得相对较好。虽然一些概念,如多态性和接口(interface),从 C# 中移出是非常有意义的,但其中一些概念让我自己有点困惑,比如指针算法。我最近一直在研究较低级别的内存,这是我在 C# 中从未见过的东西,并且已经开始为我在业余时间从事的有趣的三维模拟项目编写内存分配器。这引出了我的问题。

我有一个看起来像这样的函数:

    inline u8 AlignForwardAdjustment(const void* address, u8 alignment)
    {
        u8 adjustment = alignment - (reinterpret_cast<uptr>(address)& static_cast<uptr>(alignment - 1));

        if (adjustment == alignment)
        {
            return 0; //already aligned
        }

        return adjustment;
    }

这不是我自己写的,因为我发现它是我一直用来学习如何进行手动内存分配器的指南的一部分。然而,作为对这个主题的更多理解的一部分,我试图编写单元测试来证明我的分配器工作,从我能找到的最低级别开始。

这是我用于对齐内存的辅助函数之一,它接受并返回一个 void*。据我了解,这意味着它正在返回一些未格式化或类型未知的内存块的指针,这在这种情况下是有意义的。我的问题是,有没有办法为这种方法编写单元或集成测试?在 C# 中,我通常会尝试测试我可以从类外访问的任何函数,但老实说,我不知道我将如何编写一个测试,该测试提交一个 Void* (设置为我期望的值)然后能够确保返回的指针正确对齐。

我可以做任何类型的转换来将 Uint 传递给 void* 并在另一端检查数学吗?或者,我应该把这样的函数写成不可测试的吗?任何帮助将不胜感激,甚至是朝着正确方向的插入。

提前致谢!

最佳答案

Lookup intptr_t. - kec

Kec 完全正确!答案很简单:

const intptr_t given = 30;
const intptr_t expected = 2;

auto returnedValue = pointerMath::AlignForwardAdjustment((void*)given, 8);

EXPECT_EQ(expected, returnedValue);

这为单元测试提供了一个很好的可重现设置和结果。

再次感谢kec!本来可以将您的评论标记为答案,但我似乎找不到这样做的方法。

关于c++ - C++ 中带有 void 指针的单元测试函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27576312/

相关文章:

c++ - 顺序独立的可变参数模板基础特化

c++ - 将单词和数字的文件输入数组 C++

c# - 如何保留我的功能(对象/方法) 'lean and mean'

c# - 如何对 OData 客户端进行单元测试?

ios - iPhone调用相机时随机死机?

python - 从 C++ 调用 Python 脚本以持续传输数据

c++ - 从排序数组中删除重复项,不同代码方式的相同解决方案具有不同的输出

C++ 内存管理技术/实践

c - 对 `UNITY_BEGIN' 和 'UNITY_END' 的 undefined reference

ios - 我需要澄清一下我是否应该(可以?)解除分配与 View 相关的 UI 元素