Как утверждает Кристоф Ламбрехтс, BitVector32 предоставляет решение. Эффективность Jitted должна быть адекватной, но не знаю точно. Вот код, иллюстрирующий это решение:
public struct rcSpan
{
//C# Spec 10.4.5.1: The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration.
internal static readonly BitVector32.Section sminSection = BitVector32.CreateSection(0x1FFF);
internal static readonly BitVector32.Section smaxSection = BitVector32.CreateSection(0x1FFF, sminSection);
internal static readonly BitVector32.Section areaSection = BitVector32.CreateSection(0x3F, smaxSection);
internal BitVector32 data;
//public uint smin : 13;
public uint smin
{
get { return (uint)data[sminSection]; }
set { data[sminSection] = (int)value; }
}
//public uint smax : 13;
public uint smax
{
get { return (uint)data[smaxSection]; }
set { data[smaxSection] = (int)value; }
}
//public uint area : 6;
public uint area
{
get { return (uint)data[areaSection]; }
set { data[areaSection] = (int)value; }
}
}
Вы можете так много сделать. Вы можете сделать еще лучше, не используя BitVector32, предоставляя устройства для ручной работы для каждого поля:
public struct rcSpan2
{
internal uint data;
//public uint smin : 13;
public uint smin
{
get { return data & 0x1FFF; }
set { data = (data & ~0x1FFFu ) | (value & 0x1FFF); }
}
//public uint smax : 13;
public uint smax
{
get { return (data >> 13) & 0x1FFF; }
set { data = (data & ~(0x1FFFu << 13)) | (value & 0x1FFF) << 13; }
}
//public uint area : 6;
public uint area
{
get { return (data >> 26) & 0x3F; }
set { data = (data & ~(0x3F << 26)) | (value & 0x3F) << 26; }
}
}
Удивительно, что это последнее решение ручной работы кажется наиболее удобным, наименее запутанным и самым коротким. Это, конечно, только мои личные предпочтения.
Вы можете проверить это:
http://gamesfromwithin.com/?p=29
http://www.opensourcetesting.org/unit_c.php
http://msdn.microsoft.com/en-us/magazine/cc136757.aspx[1266 visible
В 2019:
, если это для платформы Windows, вы можете попробовать WinUnit от MS отсюда. Упрощенное модульное тестирование для собственного приложения C ++
, если вы используете окна, посмотрите: Ограничения использования C ++ / CLI с NUnit и напишите свои тесты в http://en.wikipedia.org/wiki/Managed_Extensions_for_C% 2B% 2B .
также: http://golios.blogspot.com/2008/12/using-nunit-with-c-part-2.html , http : //golios.blogspot.com/2008/11/using-nunit-with-native-c.html
это будет работать только как junit, за исключением того факта, что nunit не создает новый экземпляр класса тестового примера перед запуском каждого теста.
Для Symbian есть SymbianOSUnit: http://www.symbianosunit.co.uk/
Another problem people grossly over-engineer.
The below is a top-of-my-head, rough, non-working implementation of a nominal unit test infrastructure. It makes some sense to construct Test with a std::string
namespace/class name and use a consistent naming scheme to print out which test is failing. I just use a unit test template and have some scripts that find all the executables starting with u
(one per class), runs them in turn and collects the return values.
struct Test
{
std::vector<(std::string)fptr*(void)> tests;
int run() const
{
int stat(0);
for (/* tests */)
{
std::string const res(test.run());
if (!res.empty())
{
std::cerr << res;
++stat;
}
}
return stat;
}
};
std::string test1()
{
std::ostringstream oss;
// do a bunch of stuff
// mark some of this code to be pulled into the class documentation
// conditional checks follow
if (fail)
{
oss << "fail: some reason" << std::endl;
}
// more checks
return oss.str();
}
int main(void)
{
Tests tests;
tests.push_back(test1);
tests.push_back(test2);
return tests.run();
}
UnitTest ++ заслуживает внимания. В нем отсутствуют функции по сравнению с некоторыми другими упомянутыми здесь фреймворками, но простота приятна, особенно если вы только начинаете.
Я считаю, что он был разработан Ноэлем Ллописом после написания статьи, упомянутой в http : //gamesfromwithin.com/? p = 29 . Его довольно легко перенести на множество различных компиляторов / платформ - полезно, если нужно настроить таргетинг на что-то другое, кроме ПК, будь то игровая консоль, встроенное устройство или что-то еще.
Список рассылки какое-то время молчал. сейчас, но время от времени возникают вопросы, исправления и / или новые версии, и люди, которые задают вопросы, обычно получают быстрые ответы.
Бесстыдный плагин: если вы ориентируетесь на Windows и используете Visual Studio, ознакомьтесь с cfix и cfix studio .
Он также совместим с WinUnit.
Мы используем Google Test и его сопутствующий Google Mock . Прекрасно работает и поддерживает вывод XML в стиле JUnit для легкой интеграции с CruiseControl и т. Д. Это также полностью кроссплатформенный, и, судя по моему исследованию несколько месяцев назад, GMock был ТОЛЬКО полностью кроссплатформенной средой имитации объектов для C ++.
Почему бы не использовать CppUnit ? Он был создан как порт JUnit.
В последней версии Visual Studio есть что-то:
http://msdn.microsoft.com/en-us/library/ms243147 (VS.80) .aspx
Я работаю с Qt под Windows и Linux, который предоставляет собственную интегрированную (но по сравнению с другими отдельными решениями немного ограниченную) среду тестирования.
Его очень легко использовать и быстро изучить - см. QTestLib
ciao, Крис