рдореИрдХреНрд░реЛ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдХреЗ рдмрд┐рдирд╛ рд╕реА ++ рдореЗрдВ рдЯреЗрд╕реНрдЯ

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Google рдЯреЗрд╕реНрдЯ, Catch2, Boost.Test, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрдВрдзреЗ рд╣реБрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рддрд╕реНрд╡реАрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:


namespace { // Tests the default c'tor. TEST(MyString, DefaultConstructor) { const MyString s; EXPECT_STREQ(nullptr, s.c_string()); EXPECT_EQ(0u, s.Length()); } const char kHelloString[] = "Hello, world!"; // Tests the c'tor that accepts a C string. TEST(MyString, ConstructorFromCString) { const MyString s(kHelloString); EXPECT_EQ(0, strcmp(s.c_string(), kHelloString)); EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1, s.Length()); } // Tests the copy c'tor. TEST(MyString, CopyConstructor) { const MyString s1(kHelloString); const MyString s2 = s1; EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString)); } } // namespace 

C ++ рдореЗрдВ рдореИрдХреНрд░реЛрдВ рд╕рд╛рд╡рдзрд╛рди рд╣реИрдВ, рд╡реЗ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЗрддрдиреЗ рд╕рдВрдкрдиреНрди рдХреНрдпреЛрдВ рд╣реИрдВ?


рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд░рдирдЯрд╛рдЗрдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рдвреВрдВрдв рд╕рдХреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХреЗред рдЬрдм рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯ () рдореИрдХреНрд░реЛ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (Google рдЯреЗрд╕реНрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдХреНрд░реЛ рдПрдХ рд╡рд░реНрдЧ рднреА рдмрдирд╛рддрд╛ рд╣реИ) рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рдореИрдХреНрд░реЛ рдХреЗ рдмрд┐рдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЯреБрдЯ-рдлреНрд░реЗрдорд╡рд░реНрдХ ред рдЖрдЗрдП рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдЙрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:


 #include <tut/tut.hpp> namespace tut { struct basic{}; typedef test_group<basic> factory; typedef factory::object object; } namespace { tut::factory tf("basic test"); } namespace tut { template<> template<> void object::test<1>() { ensure_equals("2+2=?", 2+2, 4); } } 

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐ рдЕрдВрдбрд░рд▓рд╛рдЗрдЬрд╝ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реИ рдЬреЛ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ:


 template <class Data> class test_object : public Data { /** * Default do-nothing test. */ template <int n> void test() { called_method_was_a_dummy_test_ = true; } } 

рдЕрдм рдЬрдм рдЖрдк рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ:


 template<> template<> void object::test<1>() { ensure_equals("2+2=?", 2+2, 4); } 

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ N = 1 рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ template<>template<> рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ)ред test<N>() рдХрд╣рдХрд░ test<N>() рдкрд░реАрдХреНрд╖рдг рд░рдирдЯрд╛рдЗрдо рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░реАрдХреНрд╖рдг рдерд╛ рдпрд╛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж called_method_was_a_dummy_test_ рдирд╛рдордХ рдорд╛рди рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред


рдЕрдЧрд▓рд╛, рдЬрдм рдЖрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдореВрд╣ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


 tut::factory tf("basic test"); 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╕рднреА test<N> рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╡рд╛рдпрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╕реЗ, рдЖрдк рд╕рдореВрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдХрдВрдЯреЗрдирд░ (рд╕рдореВрд╣ рдХрд╛ рдирд╛рдо рдФрд░ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред


рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ tut::ensure_equals() рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП tut::ensure_equals() рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рджреЛ рдорд╛рди рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд░рди рд╡рд╛рддрд╛рд╡рд░рдг рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╡рд┐рдлрд▓ рдорд╛рди рд▓реЗрдЧрд╛ред рдореБрдЭреЗ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рд╕реА ++ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдиреЗ рдПрдХ рд╕рд╣рд╛рдпрдХ рдзрд╛рдЧрд╛ рдмрдирд╛рдпрд╛, рддреЛ рд╡рд╣рд╛рдВ рджрд╛рд╡реЗ рдХрд░рдирд╛ рдмреЗрдХрд╛рд░ рд╣реИ, рдХреЛрдИ рднреА рдЙрдиреНрд╣реЗрдВ рдкрдХрдбрд╝ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдкрд╡рд╛рдж рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдереЗред


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЯреБрдЯ-рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рди рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдЧреБрдг рднреА рд╣реЛрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд╛рдо, рд╕рд╛рде рд╣реА рдкрд░реАрдХреНрд╖рдг рдХрд╛ "рдЖрдХрд╛рд░" (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдпрд╣ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рд╣реИ рдпрд╛ рдпрд╣ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ)ред рдпрд╣ рдПрдкреАрдЖрдИ рдЯреБрдЯ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ:


 template<> template<> void object::test<1>() { set_name("2+2"); // Set test name to be shown in test report ensure_equals("2+2=?", 2+2, 4); } 

рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯреБрдЯ рдЯреЗрд╕реНрдЯ рд░рди рдкрд░реНрдпрд╛рд╡рд░рдг рдРрд╕реЗ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрддред рд╡рд╛рддрд╛рд╡рд░рдг object::test<N>() рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ object::test<N>() рдФрд░ рдпрд╣ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕реА рджрд┐рдП рдЧрдП N рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯрдм рд╣реИред рд╡рд╣ рдХреЗрд╡рд▓ рдпрд╣ called_method_was_a_dummy_test_ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрдм called_method_was_a_dummy_test_ рдореВрд▓реНрдп called_method_was_a_dummy_test_ ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕реАрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЦреБрдж рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЙрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рдмреАрдЪ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдореБрдЦреНрдп рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ "рдШрд╛рддрдХ рджреЛрд╖") рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╣рд╛рдпрдХ рдХреЛрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЯреБрдЯ-рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рд╣реИрдВ: рдкрд╣рд▓реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ struct basic{} рдмрдирд╛рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдФрд░ рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдк рдЙрди рддрд░реАрдХреЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкрд░реАрдХреНрд╖рдг рд╕рдореВрд╣ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлреНрд░реЗрдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЗрдпреВрдирд┐рдЯ рд╕реЗ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЪреАрдЬ рдмрдирд╛рддреЗ рд╣реИрдВред рдЯреБрдЯ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕реВрдЦ рдЬрд╛рддрд╛ рд╣реИред


рддреЛ, рд╣рдо рдмрд╛рдЗрдХ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЫреЛрдЯреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред


рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдпрд╣ рдиреНрдпреВрдирддрдо рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 // Test group for std::vector (illustrative purposes) #include "tested.h" #include <vector> template<> void tested::Case<CASE_COUNTER>(tested::IRuntime* runtime) { runtime->StartCase("emptiness"); std::vector<int> vec; tested::Is(vec.empty(), "Vector must be empty by default"); } template<> void tested::Case<CASE_COUNTER>(tested::IRuntime* runtime) { runtime->StartCase("AddElement"); std::vector<int> vec; vec.push_back(1); tested::Is(vec.size() == 1); tested::Is(vec[0] == 1); tested::FailIf(vec.empty()); } void LinkVectorTests() { static tested::Group<CASE_COUNTER> x("std.vector", __FILE__); } 

рдореИрдХреНрд░реЛ рдХреА рдХрдореА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдВрджрд░ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдмреЛрдирд╕ рд╣реИред


рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛


рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╡реЗрд╢ рд╕реНрддрд░ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреБрдЯ рдХреЗ рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╣реАрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрд╛рд░реНрдп рд╣реИ:


 template <int N> static void Case(IRuntime* runtime) { throw TheCaseIsAStub(); } 

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдерд┐рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдореЗрдВ, рд╣рдо рдРрд╕реЗ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдирд╛рдо рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред


рдРрд╕рд╛ рдирд┐рдпрдо рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ StartCase() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд╛рдо рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЬреЛ рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИрдВред


рдЬрдм рдПрдХ рдкрд░реАрдХреНрд╖рдг runtime->StartTest() рдХреЙрд▓ рдХрд░рддрд╛ runtime->StartTest() , рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдЕрдм рд░рди рдореЛрдб рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рддреЛ StartTest() рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж StartTest() рдлреЗрдВрдХ StartTest() , StartTest() рдЕрд░реНрде рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ, рдФрд░ рд╕реНрдЯрдм рдирд╣реАрдВред


рдкрдВрдЬреАрдХрд░рдг


рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЛ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдкрддреЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдпрд╣ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рд┐рдд рдХрд╛ рдирд┐рд░реНрдорд╛рдг :: рд╕рдореВрд╣ рд╡рд░реНрдЧ рдЗрд╕реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддрд╛ рд╣реИ:


 static tested::Group<CASE_COUNTER> x("std.vector", __FILE__); 

рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рднреА Case<N> рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдореЗрдВ рдкрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдореЗрдВ рдЖрдкрдХреЗ рджреЛ рд╕рдореВрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕рдореВрд╣ рдХреЛ рдХрдИ рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдмрд╛рдБрдЯ рд╕рдХрддреЗред


рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдХрд┐ рдмрдирд╛рдП рдЧрдП рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╣реИрдВред


рдЬреЛрдбрд╝рдиреЗ


рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг :: рд╕рдореВрд╣ () рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


 void LinkStdVectorTests() { static tested::Group<CASE_COUNTER> x("std.vector", __FILE__); } 

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХрднреА-рдХрднреА рдЖрдк tested::Group рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ tested::Group рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ tested::Group рдХреНрд▓рд╛рд╕ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХрд░ рдХрднреА-рдХрднреА рдкреВрд░реА рдлрд╛рдЗрд▓ рдХреЛ "рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝" рдХрд░ рджреЗрддрд╛ рд╣реИ рдЕрдЧрд░ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдВрджрд░ рдЗрдХрдЯреНрдард╛ рд╣реЛ рдЬрд╛рдП, рдФрд░ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрд╕ cpp рдлрд╝рд╛рдЗрд▓ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:


 calc.lib <- calc_test.lib(calc_test.cpp) ^ ^ | | app.exe run_test.exe 

рдЬрдм calc_test.cpp рдХреЛ run_test.exe рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рд┐рдВрдХрд░ рдмрд╕ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред


рдпрджрд┐ рдХрд┐рд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ run_test.exe рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 void LinkStdVectorTests() { static tested::Group<CASE_COUNTER> x("std.vector", __FILE__); } 

рдпрд╛ рддреЛ:


 static tested::Group<CASE_COUNTER> x("std.vector", __FILE__); void LinkStdVectorTests() { } 

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдореБрдЦреНрдп () рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЖрд╡реЗрджрди рдХрд╛ рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрддрд╛ рд╣реИред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреИрд╕рд╛рдЦреА рдХреА рдпрд╣ рд╕реНрдерд╛рдкрдирд╛ рдХрд┐рд╕реА рднреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдХрд░ рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ- рд╣реЛрд▓-рдЖрд░реНрдХрд╛рдЗрд╡ (MSVC рдореЗрдВ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреЗрд╡рд▓ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2015.3 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛)ред


рдореИрдХреНрд░реЛ


рдореИрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдХреЛрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ - CASE_COUNTER ред рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ __COUNTER__ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдореИрдХреНрд░реЛ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред
GCC, CLANG, MSVC рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ:


  • рд╕рдВрдЦреНрдпрд╛ 0, 1, 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • рдорд╛рдирдХ __LINE__ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • 80 рдХреЗ рд╕реНрддрд░ рдХреЗ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрдк "рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХрд╛рдЙрдВрдЯрд░" рдХреА рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

__LINE__ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдмрдирддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдореВрд╣ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рдкреИрдЯрд░реНрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред


рдЧрддрд┐рд╢реАрд▓ рд╕реНрдореГрддрд┐ рдХреА рд╡рд┐рдлрд▓рддрд╛


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреА рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Google рдЯреЗрд╕реНрдЯ рдЗрд╕реА рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реИ, рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ:


 // Use the RAII idiom to flag mem allocs that are intentionally never // deallocated. The motivation is to silence the false positive mem leaks // that are reported by the debug version of MS's CRT which can only detect // if an alloc is missing a matching deallocation. // Example: // MemoryIsNotDeallocated memory_is_not_deallocated; // critical_section_ = new CRITICAL_SECTION; class MemoryIsNotDeallocated 

рдФрд░ рд╣рдо рдмрд╕ рдореБрд╢реНрдХрд┐рд▓реЗрдВ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рдлрд┐рд░ рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕реВрдЪреА рдХреИрд╕реЗ рдорд┐рд▓рддреА рд╣реИ? рдпреЗ рдЕрдзрд┐рдХ рддрдХрдиреАрдХреА рдЗрдВрдЯрд░реНрди рд╣реИрдВ, рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рдмрддрд╛рдКрдВрдЧрд╛ред


рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рддреЗ рд╕рдордп, рдЗрд╕рдХрд╛ рд╡рд░реНрдЧ tested::CaseCollector<CASE_COUNTER>::collect рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ tested::CaseCollector<CASE_COUNTER>::collect рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рд╕рднреА рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 // Make the anonymouse namespace to have instances be hidden to specific translation unit namespace { template <Ordinal_t N> struct CaseCollector { // Test runtime that collects the test case struct CollectorRuntime final : IRuntime { void StartCase(const char* caseName, const char* description = nullptr) final { // the trick is exit from test case function into the collector via throw throw CaseIsReal(); } }; // Finds the Case<N> function in current translation unit and adds into the static list. It uses the // reverse order, so the case executed in order of appearance in C++ file. static CaseListEntry* collect(CaseListEntry* tail) { CaseListEntry* current = nullptr; CollectorRuntime collector; try { Case<N>(&collector); } catch (CaseIsStub) { current = tail; } catch (CaseIsReal) { s_caseListEntry.CaseProc = Case<N>; s_caseListEntry.Next = tail; s_caseListEntry.Ordinal = N; current = &s_caseListEntry; } return CaseCollector<N - 1>::collect(current); } private: static CaseListEntry s_caseListEntry; }; // This static storage will be instantiated in any cpp file template <Ordinal_t N> CaseListEntry CaseCollector<N>::s_caseListEntry; } 

рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдореЗрдВ CaseListEntry CaseCollector \ :: s_caseListEntry рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рд╕реНрдерд┐рд░ рдЪрд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЪреА рдХреЗ рддрддреНрд╡ рд╣реИрдВ, рдФрд░ рд╕рдВрдЧреНрд░рд╣ () рд╡рд┐рдзрд┐ рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ рдХрдиреЗрдХреНрдЯ рдХреА рдЧрдИ рд╕реВрдЪреА рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣, рд╕реВрдЪреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рдореВрд╣ рдмрдирд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреИрдЯрд░реНрди рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ред


рд╕рдВрд░рдЪрдирд╛


рдЯреЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓рд╛рд▓ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ, рдЕрд╕рдлрд▓, рд╕реАрдЖрдИ рдпрд╛ рдЬреАрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрдпрдирд┐рдд рд▓реЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛, рдЙрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реИред рджрд╛рд╡рд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЦреБрдж рдХреЛ "рд╣реЗрдбрд░-рдУрдирд▓реА" рдХрд╣рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред


рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд╡рдпрдВ рдФрд░ рдмреИрдХ-рдПрдВрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдЪ, рдЬреЛ рдЕрдм C ++ 17 рд╣реИ (std :: std :: string_view рдХреЗ рдХрд╛рд░рдг) рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ C ++ 98 рд╣реЛрдЧрд╛ред Tested.h рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдиреНрдпреВрдирддрдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓реЙрдиреНрдЪ рд╡рд┐рдХрд▓реНрдк, рд╕рд╛рде рд╣реА рдкрд░реАрдХреНрд╖рдг (рд╕рдореВрд╣реЛрдВ, рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ) рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдмреИрдХ-рдПрдВрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЬреЛ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рддрд░рд╣, рдЖрдк рд▓реЙрдиреНрдЪ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкрд░рд┐рдгрд╛рдо


рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп ( рдЬреАрдереВрдм рдХреЛрдб ) рдХреЛ рдЕрднреА рднреА рдХреБрдЫ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрд░реАрдХреНрд╖рдг (WebAssembly рдореЗрдВ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ) рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрднреА рднреА рдЙрддреНрдкрд╛рджрди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдЪрд╛рдирдХ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рдФрд░ рдордВрдЪ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╕рд╛рдВрд╕ рд▓реЗрдВ рдФрд░ рд╕рдореБрджрд╛рдп рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд╛рдВрдЧреЗрдВред рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реЛрдВрдЧреЗ? рд╢рд╛рдпрдж C ++ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдРрд╕рд╛ рдмрдпрд╛рди рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ?

Source: https://habr.com/ru/post/hi434906/


All Articles