Соответствие концу строки в регулярном выражении ASSERT_DEATH Google Test

Использование Google Test для модульного теста оболочки assert, которая может дополнительно включать информацию __FILE__ и __LINE__ в сообщение об ошибке.

void My_Assert (bool test)
{
#if USE_FILE_MACRO
    std::cerr << "fatal error: false in file __FILE__ at line __LINE__\n"
#else
    std::cerr << "fatal error: false\n"
#endif
    throw std::runtime_error ("Fatal error"); 
}

Я хочу убедиться, что для этого теста файл и строка не включены, поэтому я хочу, чтобы ASSERT_DEATH соответствовало только "фатальной ошибке: false", а не "фатальной ошибке: false в файле my_file.cpp по адресу строка 42". Вот с чего я начинаю:

ASSERT_DEATH( try {My_Assert (false);} catch (...){exit(1);}, "fatal error: false" );

Я попытался добавить знак доллара, чтобы он соответствовал концу строки, но это не соответствует «фатальной ошибке: ложь». Я пробовал разные варианты \s, [:space:] безуспешно. Возможно, я неправильно понимаю документ, и знак доллара не соответствует концу строки в регулярном выражении gtest: я не могу сказать, соответствует ли оператор «концу строки (не каждой строки)» в расширенное руководство здесь относится только к регулярному выражению Windows или ко всем системам. Я компилирую для OSX, используя LLVM версии 7.3.0 (clang-703.0.31).


person kslattery    schedule 05.08.2016    source источник
comment
К сожалению, предоставлено недостаточно информации. 1. Предоставьте минимальный воспроизводимый пример 2. Предоставьте некоторые сведения о вашей целевой платформе и используемой версии компилятора. Улучшите свой вопрос, пожалуйста! Кстати, происходит ли процесс сбой с ненулевым значением выхода на 1-м месте?   -  person πάντα ῥεῖ    schedule 05.08.2016
comment
@πάνταῥεῖ Обновлен вопрос с дополнительной информацией. Тестируемая функция (My_Assert) не дает сбоя — просто регистрируется в stderr и выдает исключение.   -  person kslattery    schedule 05.08.2016
comment
ASSERT_DEATH()ожидает, что ваша программа выйдет с ненулевым кодом выхода на 1-м месте, прежде чем регулярное выражение будет проверено. Вы, вероятно, используете его неправильно.   -  person πάντα ῥεῖ    schedule 05.08.2016
comment
Где регулярное выражение?   -  person Laurel    schedule 05.08.2016
comment
@ πάνταῥεῖ - +1 к тому, что я, вероятно, использую его неправильно, но я действительно не знаю, как правильно его использовать. У меня есть этот выход (1) в улове выражения ASSERT_DEATH, поэтому он определенно падает (подпроцесс) при запуске теста.   -  person kslattery    schedule 05.08.2016
comment
@Laurel: регулярное выражение fatal error: false, которое, очевидно, не работает, потому что оно будет соответствовать фатальной ошибке: falseFOLLOWED_BY_ANYTHING_AT_ALL_OR_NOTHING. Я попробовал "fatal error: false$", который не соответствует фатальной ошибке: false (не говоря уже о том, что не соответствует фатальной ошибке: false и другим вещам).   -  person kslattery    schedule 05.08.2016
comment
@kslattery Почему бы просто не взять последние 18 символов из строки и посмотреть, равны ли они fatal error: false?   -  person Laurel    schedule 05.08.2016
comment
Я подозреваю, что вам нужно сопоставить false в конце строки и строки. Используйте ($|\n).   -  person Wiktor Stribiżew    schedule 05.08.2016
comment
@WiktorStribiżew Это помогло. Оказывается, это делает просто ...false\n. Я думал, что пробовал это, но, вероятно, я сделал что-то глупое, например, добавил дополнительную обратную косую черту, чтобы убедиться, что \n будет передан механизму регулярных выражений. Я думаю, вам нужно представить это как ответ, чтобы я принял его как один? Спасибо за вашу помощь!!   -  person kslattery    schedule 05.08.2016


Ответы (1)


Кажется, вам нужно учитывать символ новой строки после false, используйте false\n.

Если вам нужно сопоставить false в конце строки и строки, используйте ($|\n).

person Wiktor Stribiżew    schedule 06.08.2016