Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost test


Автор: Superklug 10.8.2010, 13:33
Доброго времени суток!

Может кто-нибудь пользовался этой библиотекой?

Добавил в проект файл test.cpp. Создал конфигурацию UnitTest (в этой конфигурации собирается exe, а в Debug и Release статическая библиотека). В Post build event добавил:
Код

"$(TargetPath)" --result_code=no --report_level=short


Большинство тестов работают нормально. А вот тесты в которых используются файловые потоки заваливаются...
Например такой тест:
Код

#define BOOST_TEST_MODULE Main_test
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(Some_test_case)
{
    std::ifstream is_1( "file_1", std::ios::binary );
    is_1.seekg( 0, std::ios::end );
    size_t size_1 = is_1.tellg();
    is_1.seekg(0, std::ios::beg);
    char* data_1 = new char[size_1];
    is_1.read( data_1, size_1 );
    is_1.close();

    std::ifstream is_2( "file_2", std::ios::binary );
    is_2.seekg( 0, std::ios::end );
    size_t size_2 = is_2.tellg();
    is_2.seekg(0, std::ios::beg);
    char* data_2 = new char[size_2];
    is_2.read( data_2, size_2 );
    is_2.close();

    BOOST_CHECK( ( memcmp( data_1, data_2, size_1 > size_2 ? size_1 : size_2 ) == 0 ) );
    delete[] data_1;
    delete[] data_2;
}


После сборки в логе примерно такие сообщения:
Код

fatal error in "Some_test_case": Invalid allocation size: 4294967295 bytes.    unknown location


Помогите, пожалуйста, разобраться в чем дело...

Автор: SenkraD 10.8.2010, 13:47
Superklug,  у вас валится new - генерит std::bad_alloc из-за того, что у Microsoft  размер массива не должен превышать 0x7fffffff байтов (в стандарт по этому поводу глянить не успел и о других компилерах ничего сказать не могу, под рукой нет).
P.S. код ошибки от мелкомягких - C2148

Автор: Superklug 10.8.2010, 13:55
Размер файла около 200 байт...
Да и потом, если бы было исключение boost его отловил бы.
Если написать что-нибудь вроде:
Код

int main()
    std::ifstream is_1( "file_1", std::ios::binary );
    is_1.seekg( 0, std::ios::end );
    size_t size_1 = is_1.tellg();
    is_1.seekg(0, std::ios::beg);
    char* data_1 = new char[size_1];
    is_1.read( data_1, size_1 );
    is_1.close();
    std::ifstream is_2( "file_2", std::ios::binary );
    is_2.seekg( 0, std::ios::end );
    size_t size_2 = is_2.tellg();
    is_2.seekg(0, std::ios::beg);
    char* data_2 = new char[size_2];
    is_2.read( data_2, size_2 );
    is_2.close();
    std::cout << ( memcmp( data_1, data_2, size_1 > size_2 ? size_1 : size_2 ) == 0 ) ? "OK" : "error";
    delete[] data_1;
    delete[] data_2;
    return 0;
}

то все работает как надо. 

А когда делаю это с помощью буста и через Post Build Event, почему-то не работает...

Автор: SenkraD 10.8.2010, 14:07
ну там не исключение, а что-то типа assert, который CRT делает.
Цитата(Superklug @  10.8.2010,  13:55 Найти цитируемый пост)
Размер файла около 200 байт...
Не спорю, скорее фолит какой-то с tellg из-за чего вы и страдаете. Поставьте свои асерты аля assert(size_1 < 0x7fffffff); и assert(size_2 < 0x7fffffff); или зайдите под дебагом в тесты

Автор: maxim1000 10.8.2010, 16:06
4294967295  это (-1)
сильно похоже на то, что просто файлы не найдены
для проверки гипотезы можно прописать абсолютные пути и посмотреть, что будет
а если проблема в этом - разбираться, с какой текущей директорией запускаются тесты

Автор: Superklug 11.8.2010, 07:58
maxim1000, спасибо! Проблема действительно в этом...
Помогите пожалуйста настроить проект, чтобы все работало корректно.. Не хочется оставлять абсолютные пути)

Сейчас такие настройки:
General
Output Directory: $(SolutionDir)$(ProjectName)\$(ConfigurationName)
Intermediate Directory: $(ConfigurationName)

Linker
Output File: $(OutDir)\$(ProjectName)_test.exe

Build Events / Post Build Event
Command: "$(TargetPath)" --result_code=no --report_level=short

Если с настройками все в порядке, подскажите относительно чего нужно задавать пути? Нужный мне файл лежит в $(TargetDir)

Автор: maxim1000 11.8.2010, 11:12
если я не ошибаюсь, текущая директория во время билда - директория проекта

но это можно и выяснить экспериментально - просто вывести текущую директорию в post-build event
(что-то типа echo %CD%)

Автор: Superklug 11.8.2010, 11:45
Цитата(maxim1000 @  11.8.2010,  11:12 Найти цитируемый пост)
если я не ошибаюсь, текущая директория во время билда - директория проекта

Да, так и есть...

Спасибо!

Автор: Superklug 12.8.2010, 12:44
У меня опять проблема(
Для тестирования другого проекта (dll Библиотека) решил сделать отдельный проект.
При попытке вызова какой-либо функции из dll возникает ошибка. Вызываю так:
Код

void (*func)(void*);
(FARPROC&)func = GetProcAddress( hLib, "Func" );


Если написать свой int main() (без буста), то все вызовы работают нормально.. В чем может быть проблема?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)