0

Я младший инженер-программист в моей дневной работе, работая с C#/WPF/Prism, и я пытался научить себя другим языкам и библиотекам в свободное время, чтобы расширить свое горизонты. Недавно я работал над C++ во время модульного тестирования через библиотеки тестирования Google и Mocking и довольно хорошо относился к передаче из C# мышления в мир C++. В то время как некоторые понятия, такие как полиморфизм и интерфейсы, отлично двигались с C#, некоторые из них немного озадачивают меня, например, арифметику указателей. Я недавно работал над более низкими уровнями памяти, чего я никогда не видел на C#, и начал писать распределители памяти для трехмерного симуляционного проекта, над которым я работал в свободное время. Это подводит меня к моему вопросу.Функции модульного тестирования с указателями void в 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; 
    } 

Я не писал это сам, так как я нашел его в качестве части руководства я использую, чтобы узнать, как сделать ручную распределители памяти. Однако, как часть понимания этого предмета, я пытался писать модульные тесты, чтобы доказать, что мои распределители работают, начиная с самого низкого уровня, который я мог найти.

Это одна из моих вспомогательных функций для выравнивания памяти, и она принимает и возвращает пустоту *. Из того, что я понимаю, это означает, что он возвращает указатель некоторого неформатированного или неизвестного типа блока памяти, что имеет смысл в этом контексте. Мой вопрос: есть ли способ написать единицу или интеграционный тест для такого метода? В C# я вообще пытаюсь проверить любую функцию, которую я могу получить из-за пределов класса, но я честно не знаю, как бы я написал тест, который держится в Void * (задан как значение, которое я ожидал бы), а затем способен чтобы верный указатель был правильно выровнен.

Есть ли какие-либо действия, которые я могу сделать, чтобы сказать «Uint» в пустоту * и просто проверить математику на другом конце? Или, должен ли я просто написать такую ​​функцию как непроверенную? Любая помощь была бы лучше всего оценена, или даже толчок в правильном направлении.

Заранее благодарю вас!

+4

Поиск intptr_t. – kec

+0

Извините за новинку на сайте и не хватает репутации, чтобы проголосовать за свой комментарий, по-видимому. Спасибо за помощь, хотя! – BlindGarret

ответ

1

Поиск 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! Отмечил бы ваш комментарий как ответ, но я не могу найти способ сделать это.

+1

Независимо от того, нужен ли вам этот бросок, зависит от типа 'blah' и того, что вы хотите сделать с' castBackOut'. BTW, преобразование в 'void *' подразумевается в C++, поэтому вам, вероятно, это не нужно. – kec

+0

Разве это? Когда я пытаюсь передать в castedPtr без приведения в действие void *, он жалуется, что ищет константу void *. – BlindGarret

+0

Хм .. ли 'castedPtr' указатель? – kec