Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

BOOST_TEST: details on expressions

Boost , Boost.Test , Writing unit tests

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Рассмотрим следующий пример:

Example: BOOST_TEST reporting

Код

<
#defineBOOST_TEST_MODULEboost_test_macro3
#include<boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(test_op_reportings)
{
 inta=13,b=12;
 BOOST_TEST(a==b);
 BOOST_TEST(a<b);
 BOOST_TEST(a-1<b);
 BOOST_TEST(b>a-1);
}
>

выход

<
>./boost_test_macro3--log_level=all
Running1testcase...
Enteringtestmodule"boost_test_macro3"
test.cpp(12):Enteringtestcase"test_op_reportings"
test.cpp(15):error:in"test_op_reportings":checka==bhasfailed[13!=12]
test.cpp(16):error:in"test_op_reportings":checka<bhasfailed[13>=12]
test.cpp(17):error:in"test_op_reportings":checka-1<bhasfailed[13-1>=12]
test.cpp(18):error:in"test_op_reportings":checkb>a-1hasfailed[12<=12]
test.cpp(12):Leavingtestcase"test_op_reportings";testingtime:484us
Leavingtestmodule"boost_test_macro3";testingtime:588us
***2failuresaredetectedinthetestmodule"boost_test_macro3"
>

Уже упоминалось, что отчетность не является симметричной (см.здесь). Выражение построено из<statement>, появляющегося в макросе<BOOST_TEST>. Это выражение позволяет оценивать и сообщать, например<"13 - 1 >= 12"failed>, вместе с копией<statement>, которая содержит больше деталей, чем<"a - 1 < b"failed>. В деталях происходит следующее:

  1. специальный объект,<seed>выражения, составлен с левой стороны<statement>. Этот первоначальный состав имеет наивысший приоритет перед поддерживаемыми операциями. Выражение ниже:

    <
    aop1bop2cop3d
    
    >

    фактически рассматривается как

    <
    (seeda)op1bop2cop3d
    
    >.
  2. <seeda>возвращает<expression>объект, который отслеживает тип<a>. Это выражение имеет перегрузки для ассоциативности слева направо, и операции<op1>,<op2>...прикованы цепьюсправа от этого объекта выражения:

    <
    aop1b
    
    >

    уступает псевдокоду

    <
    expression1=create-expression(a)
    expression2=create-expression(expression1,op1,b)
    
    >

    <expression1>и<expression2>отслеживает их левый и правый операнды, и операцию на этих операндах. Выражения также отслеживают тип результата связанного подвыражения. В приведенном выше примере<expression1>и<expression2>имеют тип результата<decltype(a)>и<decltype(aop1 b)>соответственно. Тип результата позволяет сцеплять подвыражения.

  3. В любом случае применяются правила приоритета операторов C++. То, что видно по выражению, - это то, что доступно с композицией слева направо. Любая другая операция, которая происходит до того, как она достигает правого операнда выражения, не рассматривается как подвыражение и рассматривается как единый операнд: правый операнд не развивается далее в рамках. Предположим, что<op2>ниже имеет более высокий приоритет, чем<op1>, тогда

    <
    aop1bop2c
    
    >

    эквивалентно:

    <
    create-expression(create-expression(a),op1,(bop2c))
    
    >

    В приведенном выше заявлении окончательное выражение может видеть только результат<(b op2c)>справа от него, для которого в журналах не может быть предоставлено никаких дополнительных подробностей. Это также относится кправо-левымассоциативным операторам, таким как<!>,<~>,<->(унитарное отрицание) и т. Д.

    Осторожность

    Поскольку<expression>объект состоит слева направо, он фактически наблюдает цепочку операций, а не дерево полного выражения.

  4. После построения полной экспрессионной цепи она оценивается как цепь подвыражений слева направо, точно так же, как правило композиции выше. Оцениваемые элементы являются элементами самого выражения. Выражение

    <
    aop1b
    
    >

    приводит к следующей цепи оценки:

    <
    expression2.result=expression1.resultop1b
    expression1.result=a
    
    >

    Окончательное выражение заявления отбрасывается на булев, который в свою очередь оценивается.Система испытаний на блоке

Приведенный ниже пример иллюстрирует конструкцию выражения слева направос цепями.

Example: BOOST_TEST compound statements

Код

<
#defineBOOST_TEST_MODULEboost_test_macro2
#include<boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(test_op_precedence)
{
 inta=13,b=2,c=12;
 // left term of == is expanded in the logs
 BOOST_TEST(a%b==c);
 // right term of == is not expanded in the logs
 BOOST_TEST(a==c%b);
}
BOOST_AUTO_TEST_CASE(test_op_right_associative)
{
 inta=1;
 BOOST_TEST(a);
 BOOST_TEST(!a);
 BOOST_TEST(--a);
}
>

выход

<
>./boost_test_macro2--log_level=all
Running2testcases...
test.cpp(16):error:in"test_op_precedence":checka%b==chasfailed[13%2!=12]
test.cpp(18):error:in"test_op_precedence":checka==c%bhasfailed[13!=0]
test.cpp(25):error:in"test_op_right_associative":check!ahasfailed
test.cpp(26):error:in"test_op_right_associative":check--ahasfailed[(bool)0isfalse]
***4failuresaredetectedinthetestmodule"boost_test_macro2"
>

PrevUpHomeNext

Статья BOOST_TEST: details on expressions раздела Boost.Test Writing unit tests может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Writing unit tests ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:36:38/0.0073349475860596/1