diff options
| author | Anton Samokhvalov <[email protected]> | 2022-02-10 16:45:15 +0300 | 
|---|---|---|
| committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:45:15 +0300 | 
| commit | 72cb13b4aff9bc9cf22e49251bc8fd143f82538f (patch) | |
| tree | da2c34829458c7d4e74bdfbdf85dff449e9e7fb8 /library/cpp/testing/unittest | |
| parent | 778e51ba091dc39e7b7fcab2b9cf4dbedfb6f2b5 (diff) | |
Restoring authorship annotation for Anton Samokhvalov <[email protected]>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/testing/unittest')
| -rw-r--r-- | library/cpp/testing/unittest/checks.cpp | 2 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/env.h | 2 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/example_ut.cpp | 18 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/gtest.cpp | 106 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/gtest.h | 188 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/plugin.cpp | 4 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/plugin.h | 4 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/registar.cpp | 58 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/registar.h | 664 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/tests_data.cpp | 2 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/tests_data.h | 2 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/ut/main.cpp | 50 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/utmain.cpp | 516 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/utmain.h | 10 | ||||
| -rw-r--r-- | library/cpp/testing/unittest/ya.make | 22 | 
15 files changed, 824 insertions, 824 deletions
| diff --git a/library/cpp/testing/unittest/checks.cpp b/library/cpp/testing/unittest/checks.cpp index c5712ae9d21..95baf5c9c21 100644 --- a/library/cpp/testing/unittest/checks.cpp +++ b/library/cpp/testing/unittest/checks.cpp @@ -6,7 +6,7 @@ bool CheckExceptionMessage(const char* msg, TString& err) {          // Операция успешно завершена [cp1251]          "\xce\xef\xe5\xf0\xe0\xf6\xe8\xff\x20\xf3\xf1\xef\xe5\xf8\xed\xee\x20\xe7\xe0\xe2\xe5\xf0\xf8\xe5\xed\xe0",          "The operation completed successfully", -        "No error"}; +        "No error"};       err.clear(); diff --git a/library/cpp/testing/unittest/env.h b/library/cpp/testing/unittest/env.h index 4807539ab28..568a1c8e8fb 100644 --- a/library/cpp/testing/unittest/env.h +++ b/library/cpp/testing/unittest/env.h @@ -1,3 +1,3 @@  // just shortcut  #include <library/cpp/testing/common/env.h> - +  diff --git a/library/cpp/testing/unittest/example_ut.cpp b/library/cpp/testing/unittest/example_ut.cpp index bcc1ce33f05..52790f1fc6d 100644 --- a/library/cpp/testing/unittest/example_ut.cpp +++ b/library/cpp/testing/unittest/example_ut.cpp @@ -1,12 +1,12 @@  #include <library/cpp/testing/unittest/registar.h> - -/* - * just copy-paste it for good start point - */ - +  +/*  + * just copy-paste it for good start point  + */  +   Y_UNIT_TEST_SUITE(TUnitTest) {      Y_UNIT_TEST(TestEqual) { -        UNIT_ASSERT_EQUAL(0, 0); -        UNIT_ASSERT_EQUAL(1, 1); -    } -} +        UNIT_ASSERT_EQUAL(0, 0);  +        UNIT_ASSERT_EQUAL(1, 1);  +    }  +}  diff --git a/library/cpp/testing/unittest/gtest.cpp b/library/cpp/testing/unittest/gtest.cpp index ebad1ea4d67..38f29dcdf8c 100644 --- a/library/cpp/testing/unittest/gtest.cpp +++ b/library/cpp/testing/unittest/gtest.cpp @@ -1,67 +1,67 @@ -#include "gtest.h" +#include "gtest.h"   #include "simple.h" - -#include <util/generic/map.h> -#include <util/generic/vector.h> +  +#include <util/generic/map.h>  +#include <util/generic/vector.h>   #include <util/system/type_name.h> - -using namespace NUnitTest; -using namespace NUnitTest::NPrivate; - +  +using namespace NUnitTest;  +using namespace NUnitTest::NPrivate;  +   IGTestFactory::~IGTestFactory() { -} - -namespace { +}  +  +namespace {       struct TCurrentTest: public TSimpleTestExecutor { -        inline TCurrentTest(TStringBuf name) -            : MyName(name) -        { -        } - +        inline TCurrentTest(TStringBuf name)  +            : MyName(name)  +        {  +        }  +           TString TypeId() const override {              return TypeName(*this) + "-" + MyName; -        } - +        }  +           TString Name() const noexcept override {              return TString(MyName); -        } - -        const TStringBuf MyName; -    }; - -    struct TGTestFactory: public IGTestFactory { -        inline TGTestFactory(TStringBuf name) -            : Test(name) -        { -        } - +        }  +  +        const TStringBuf MyName;  +    };  +  +    struct TGTestFactory: public IGTestFactory {  +        inline TGTestFactory(TStringBuf name)  +            : Test(name)  +        {  +        }  +           ~TGTestFactory() override { -        } - +        }  +           TString Name() const noexcept override { -            return Test.Name(); -        } - +            return Test.Name();  +        }  +           TTestBase* ConstructTest() override { -            return new TCurrentTest(Test); -        } - +            return new TCurrentTest(Test);  +        }  +           void AddTest(const char* name, void (*body)(TTestContext&), bool forceFork) override {              Test.Tests.push_back(TBaseTestCase(name, body, forceFork)); -        } - -        TCurrentTest Test; -    }; -} - -IGTestFactory* NUnitTest::NPrivate::ByName(const char* name) { +        }  +  +        TCurrentTest Test;  +    };  +}  +  +IGTestFactory* NUnitTest::NPrivate::ByName(const char* name) {       static TMap<TStringBuf, TAutoPtr<TGTestFactory>> tests; - -    auto& ret = tests[name]; - -    if (!ret) { -        ret = new TGTestFactory(name); -    } - -    return ret.Get(); -} +  +    auto& ret = tests[name];  +  +    if (!ret) {  +        ret = new TGTestFactory(name);  +    }  +  +    return ret.Get();  +}  diff --git a/library/cpp/testing/unittest/gtest.h b/library/cpp/testing/unittest/gtest.h index b6768b1bf0b..9db9e89757b 100644 --- a/library/cpp/testing/unittest/gtest.h +++ b/library/cpp/testing/unittest/gtest.h @@ -1,108 +1,108 @@ -#pragma once - +#pragma once  +   // WARNING: this is a legacy header that tries to mimic the gtest interface while using unittest  // under the hood. Avoid using this interface -- use the genuine gtest instead (the GTEST macro).  // If you're already using GTEST macro and you've found yourself here, you probably meant  // to include `library/cpp/testing/gtest/gtest.h`. -#include "registar.h" - -#include <util/generic/ymath.h> -#include <util/generic/ylimits.h> - -namespace NUnitTest { -    namespace NPrivate { -        struct IGTestFactory: public ITestBaseFactory { +#include "registar.h"  +  +#include <util/generic/ymath.h>  +#include <util/generic/ylimits.h>  +  +namespace NUnitTest {  +    namespace NPrivate {  +        struct IGTestFactory: public ITestBaseFactory {               ~IGTestFactory() override; - +               virtual void AddTest(const char* name, void (*body)(TTestContext&), bool forceFork) = 0; -        }; - -        IGTestFactory* ByName(const char* name); -    } -} - -namespace NTesting { -    struct TTest { -        virtual void SetUp() { -        } - -        virtual void TearDown() { -        } - +        };  +  +        IGTestFactory* ByName(const char* name);  +    }  +}  +  +namespace NTesting {  +    struct TTest {  +        virtual void SetUp() {  +        }  +  +        virtual void TearDown() {  +        }  +           inline TTest* _This() noexcept { -            return this; -        } -    }; -} - -namespace testing { -    struct Test: public ::NTesting::TTest { -    }; -} - -#define TEST_IMPL(N, NN, FF)                                                         \ +            return this;  +        }  +    };  +}  +  +namespace testing {  +    struct Test: public ::NTesting::TTest {  +    };  +}  +  +#define TEST_IMPL(N, NN, FF)                                                         \       void Test##N##NN(NUnitTest::TTestContext&);                                      \ -    namespace NTestSuite##N##NN {                                                    \ -        struct TReg {                                                                \ -            inline TReg() {                                                          \ -                ::NUnitTest::NPrivate::ByName(#N)->AddTest(#NN, &(Test##N##NN), FF); \ -            }                                                                        \ -        };                                                                           \ -        static TReg reg;                                                             \ -    }                                                                                \ +    namespace NTestSuite##N##NN {                                                    \  +        struct TReg {                                                                \  +            inline TReg() {                                                          \  +                ::NUnitTest::NPrivate::ByName(#N)->AddTest(#NN, &(Test##N##NN), FF); \  +            }                                                                        \  +        };                                                                           \  +        static TReg reg;                                                             \  +    }                                                                                \       void Test##N##NN(NUnitTest::TTestContext&) - -#define TEST_F_IMPL(N, NN, FF)                \ -    namespace NTestSuite##N##NN {             \ -        struct TTestSuite: public N {         \ -            inline TTestSuite() {             \ -                this->_This()->SetUp();       \ -            }                                 \ -            inline ~TTestSuite() {            \ -                this->_This()->TearDown();    \ -            }                                 \ -            void NN();                        \ -        };                                    \ -    };                                        \ -    TEST_IMPL(N, NN, FF) {                    \ -        NTestSuite##N##NN::TTestSuite().NN(); \ -    }                                         \ -    void NTestSuite##N##NN::TTestSuite::NN() - -#define TEST(A, B) TEST_IMPL(A, B, false) -#define TEST_FORKED(A, B) TEST_IMPL(A, B, true) - -#define TEST_F(A, B) TEST_F_IMPL(A, B, false) -#define TEST_F_FORKED(A, B) TEST_F_IMPL(A, B, true) - -#define EXPECT_EQ(A, B) UNIT_ASSERT_VALUES_EQUAL(A, B) -#define EXPECT_NE(A, B) UNIT_ASSERT_UNEQUAL(A, B) +  +#define TEST_F_IMPL(N, NN, FF)                \  +    namespace NTestSuite##N##NN {             \  +        struct TTestSuite: public N {         \  +            inline TTestSuite() {             \  +                this->_This()->SetUp();       \  +            }                                 \  +            inline ~TTestSuite() {            \  +                this->_This()->TearDown();    \  +            }                                 \  +            void NN();                        \  +        };                                    \  +    };                                        \  +    TEST_IMPL(N, NN, FF) {                    \  +        NTestSuite##N##NN::TTestSuite().NN(); \  +    }                                         \  +    void NTestSuite##N##NN::TTestSuite::NN()  +  +#define TEST(A, B) TEST_IMPL(A, B, false)  +#define TEST_FORKED(A, B) TEST_IMPL(A, B, true)  +  +#define TEST_F(A, B) TEST_F_IMPL(A, B, false)  +#define TEST_F_FORKED(A, B) TEST_F_IMPL(A, B, true)  +  +#define EXPECT_EQ(A, B) UNIT_ASSERT_VALUES_EQUAL(A, B)  +#define EXPECT_NE(A, B) UNIT_ASSERT_UNEQUAL(A, B)   #define EXPECT_LE(A, B) UNIT_ASSERT((A) <= (B)) -#define EXPECT_LT(A, B) UNIT_ASSERT((A) < (B)) +#define EXPECT_LT(A, B) UNIT_ASSERT((A) < (B))   #define EXPECT_GE(A, B) UNIT_ASSERT((A) >= (B)) -#define EXPECT_GT(A, B) UNIT_ASSERT((A) > (B)) -#define EXPECT_NO_THROW(A) UNIT_ASSERT_NO_EXCEPTION(A) -#define EXPECT_THROW(A, B) UNIT_ASSERT_EXCEPTION(A, B) -#define EXPECT_NEAR(A, B, D) UNIT_ASSERT_DOUBLES_EQUAL(A, B, D) -#define EXPECT_STREQ(A, B) UNIT_ASSERT_VALUES_EQUAL(A, B) - +#define EXPECT_GT(A, B) UNIT_ASSERT((A) > (B))  +#define EXPECT_NO_THROW(A) UNIT_ASSERT_NO_EXCEPTION(A)  +#define EXPECT_THROW(A, B) UNIT_ASSERT_EXCEPTION(A, B)  +#define EXPECT_NEAR(A, B, D) UNIT_ASSERT_DOUBLES_EQUAL(A, B, D)  +#define EXPECT_STREQ(A, B) UNIT_ASSERT_VALUES_EQUAL(A, B)  +   #define EXPECT_DOUBLE_EQ_TOLERANCE(A, B, tolerance) UNIT_ASSERT_C(fabs((A) - (B)) < tolerance * std::numeric_limits<decltype(A)>::epsilon(), TString("\n") + ToString(A) + " <> " + ToString(B))  #define EXPECT_DOUBLE_EQ(A, B) EXPECT_DOUBLE_EQ_TOLERANCE(A, B, 4.0) - -//conflicts with util/system/defaults.h -#undef EXPECT_TRUE -#define EXPECT_TRUE(X) UNIT_ASSERT(X) -#undef EXPECT_FALSE -#define EXPECT_FALSE(X) UNIT_ASSERT(!(X)) - -#define ASSERT_EQ(A, B) EXPECT_EQ(A, B) -#define ASSERT_NE(A, B) EXPECT_NE(A, B) -#define ASSERT_GT(A, B) EXPECT_GT(A, B) -#define ASSERT_LT(A, B) EXPECT_LT(A, B) -#define ASSERT_FALSE(X) EXPECT_FALSE(X) -#define ASSERT_TRUE(X) EXPECT_TRUE(X) -#define ASSERT_THROW(A, B) EXPECT_THROW(A, B) -#define ASSERT_NO_THROW(A) EXPECT_NO_THROW(A) -#define ASSERT_DOUBLE_EQ(A, B) EXPECT_DOUBLE_EQ(A, B) -#define ASSERT_STREQ(A, B) EXPECT_STREQ(A, B) +  +//conflicts with util/system/defaults.h  +#undef EXPECT_TRUE  +#define EXPECT_TRUE(X) UNIT_ASSERT(X)  +#undef EXPECT_FALSE  +#define EXPECT_FALSE(X) UNIT_ASSERT(!(X))  +  +#define ASSERT_EQ(A, B) EXPECT_EQ(A, B)  +#define ASSERT_NE(A, B) EXPECT_NE(A, B)  +#define ASSERT_GT(A, B) EXPECT_GT(A, B)  +#define ASSERT_LT(A, B) EXPECT_LT(A, B)  +#define ASSERT_FALSE(X) EXPECT_FALSE(X)  +#define ASSERT_TRUE(X) EXPECT_TRUE(X)  +#define ASSERT_THROW(A, B) EXPECT_THROW(A, B)  +#define ASSERT_NO_THROW(A) EXPECT_NO_THROW(A)  +#define ASSERT_DOUBLE_EQ(A, B) EXPECT_DOUBLE_EQ(A, B)  +#define ASSERT_STREQ(A, B) EXPECT_STREQ(A, B)  diff --git a/library/cpp/testing/unittest/plugin.cpp b/library/cpp/testing/unittest/plugin.cpp index 543112f7ac6..f03484a0893 100644 --- a/library/cpp/testing/unittest/plugin.cpp +++ b/library/cpp/testing/unittest/plugin.cpp @@ -46,5 +46,5 @@ namespace NUnitTest {              TPlugins::Instance().OnStopMain(argc, argv);          } -    } -} +    }  +}  diff --git a/library/cpp/testing/unittest/plugin.h b/library/cpp/testing/unittest/plugin.h index 102f2c1469e..f030654f975 100644 --- a/library/cpp/testing/unittest/plugin.h +++ b/library/cpp/testing/unittest/plugin.h @@ -25,5 +25,5 @@ namespace NUnitTest {              TPluginRegistrator(TSimpleSharedPtr<IPlugin> plugin);          }; -    } -} +    }  +}  diff --git a/library/cpp/testing/unittest/registar.cpp b/library/cpp/testing/unittest/registar.cpp index 3679b768ed4..606e18cefd0 100644 --- a/library/cpp/testing/unittest/registar.cpp +++ b/library/cpp/testing/unittest/registar.cpp @@ -11,27 +11,27 @@  #include <util/system/tls.h>  #include <util/system/error.h>  #include <util/string/cast.h> - +   bool NUnitTest::ShouldColorizeDiff = true;  bool NUnitTest::ContinueOnFail = false;  TString NUnitTest::RandomString(size_t len, ui32 seed) { -    TReallyFastRng32 rand(seed); +    TReallyFastRng32 rand(seed);       TString ret; - -    ret.reserve(len); - -    for (size_t i = 0; i < len; ++i) { -        ret.push_back(char(rand.Uniform(1, 128))); -    } - -    return ret; -} - -Y_POD_STATIC_THREAD(bool) -UnittestThread; -Y_POD_STATIC_THREAD(NUnitTest::TTestBase*) -currentTest; +  +    ret.reserve(len);  +  +    for (size_t i = 0; i < len; ++i) {  +        ret.push_back(char(rand.Uniform(1, 128)));  +    }  +  +    return ret;  +}  + +Y_POD_STATIC_THREAD(bool)  +UnittestThread;  +Y_POD_STATIC_THREAD(NUnitTest::TTestBase*)  +currentTest;   ::NUnitTest::TRaiseErrorHandler RaiseErrorHandler;  void ::NUnitTest::NPrivate::RaiseError(const char* what, const TString& msg, bool fatalFailure) { @@ -78,8 +78,8 @@ struct TDiffColorizer {      explicit TDiffColorizer(bool reverse = false)          : Reverse(reverse) -    { -    } +    {  +    }       TString Special(TStringBuf str) const {          return ToString(Colors.YellowColor()) + str; @@ -111,8 +111,8 @@ struct TTraceDiffFormatter {      explicit TTraceDiffFormatter(bool reverse = false)          : Reverse(reverse) -    { -    } +    {  +    }       TString Special(TStringBuf str) const {          return ToString(str); @@ -124,14 +124,14 @@ struct TTraceDiffFormatter {      TString Left(TArrayRef<const char> str) const {          return NUnitTest::GetFormatTag("good") + -               TString(str.begin(), str.end()) + -               NUnitTest::GetResetTag(); +               TString(str.begin(), str.end()) +  +               NUnitTest::GetResetTag();       }      TString Right(TArrayRef<const char> str) const {          return NUnitTest::GetFormatTag("bad") + -               TString(str.begin(), str.end()) + -               NUnitTest::GetResetTag(); +               TString(str.begin(), str.end()) +  +               NUnitTest::GetResetTag();       }  }; @@ -149,7 +149,7 @@ TString NUnitTest::ColoredDiff(TStringBuf s1, TStringBuf s2, const TString& deli      NDiff::InlineDiff(chunks, s1, s2, delims);      if (NUnitTest::ShouldColorizeDiff) {          NDiff::PrintChunks(res, TDiffColorizer(reverse), chunks); -    } else { +    } else {           res << NUnitTest::GetResetTag();          NDiff::PrintChunks(res, TTraceDiffFormatter(reverse), chunks);      } @@ -290,10 +290,10 @@ void NUnitTest::ITestBaseFactory::Register() noexcept {  }  NUnitTest::TTestBase::TTestBase() noexcept -    : Parent_(nullptr) -    , TestErrors_() -    , CurrentSubtest_() -{ +    : Parent_(nullptr)  +    , TestErrors_()  +    , CurrentSubtest_()  +{   }  NUnitTest::TTestBase::~TTestBase() = default; diff --git a/library/cpp/testing/unittest/registar.h b/library/cpp/testing/unittest/registar.h index 44517a00924..3307ba7e551 100644 --- a/library/cpp/testing/unittest/registar.h +++ b/library/cpp/testing/unittest/registar.h @@ -1,20 +1,20 @@  #pragma once - +   #include <library/cpp/dbg_output/dump.h> - +   #include <util/generic/bt_exception.h>  #include <util/generic/hash.h>  #include <util/generic/intrlist.h>  #include <util/generic/map.h>  #include <util/generic/ptr.h>  #include <util/generic/set.h> -#include <util/generic/typetraits.h> +#include <util/generic/typetraits.h>   #include <util/generic/vector.h>  #include <util/generic/yexception.h> - -#include <util/string/builder.h> -#include <util/string/cast.h> -#include <util/string/printf.h> +  +#include <util/string/builder.h>  +#include <util/string/cast.h>  +#include <util/string/printf.h>   #include <util/system/defaults.h>  #include <util/system/type_name.h> @@ -23,21 +23,21 @@  #include <util/system/rusage.h> -#include <cmath> -#include <cstdio> +#include <cmath>  +#include <cstdio>   #include <functional>  extern bool CheckExceptionMessage(const char*, TString&); +  +namespace NUnitTest {  +    class TTestBase;  -namespace NUnitTest { -    class TTestBase; - -    namespace NPrivate { +    namespace NPrivate {           void RaiseError(const char* what, const TString& msg, bool fatalFailure); -        void SetUnittestThread(bool); +        void SetUnittestThread(bool);           void SetCurrentTest(TTestBase*);          TTestBase* GetCurrentTest(); -    } +    }       extern bool ShouldColorizeDiff;      extern bool ContinueOnFail; @@ -64,13 +64,13 @@ namespace NUnitTest {      struct TTestContext {          TTestContext() -            : Processor(nullptr) -        { +            : Processor(nullptr)  +        {           }          explicit TTestContext(ITestSuiteProcessor* processor) -            : Processor(processor) -        { +            : Processor(processor)  +        {           }          using TMetrics = THashMap<TString, double>; @@ -79,59 +79,59 @@ namespace NUnitTest {          ITestSuiteProcessor* Processor;      }; -    class ITestSuiteProcessor { -    public: -        struct TUnit { +    class ITestSuiteProcessor {  +    public:  +        struct TUnit {               const TString name; -        }; - -        struct TTest { +        };  +  +        struct TTest {               const TUnit* unit;              const char* name; -        }; - -        struct TError { +        };  +  +        struct TError {               const TTest* test;              const char* msg;              TString BackTrace;              TTestContext* Context; -        }; - +        };  +           struct TFinish {              const TTest* test;              TTestContext* Context;              bool Success; -        }; - +        };  +           ITestSuiteProcessor(); - +           virtual ~ITestSuiteProcessor(); - +           void Start(); - +           void End(); - +           void UnitStart(const TUnit& unit); - +           void UnitStop(const TUnit& unit); - +           void Error(const TError& descr); - +           void BeforeTest(const TTest& test); - +           void Finish(const TFinish& descr); - +           unsigned GoodTests() const noexcept;          unsigned FailTests() const noexcept; - +           unsigned GoodTestsInCurrentUnit() const noexcept; - +           unsigned FailTestsInCurrentUnit() const noexcept; - +           // Should execute test suite?          virtual bool CheckAccess(TString /*name*/, size_t /*num*/); - +           // Should execute a test whitin suite?          virtual bool CheckAccessTest(TString /*suite*/, const char* /*name*/); @@ -143,142 +143,142 @@ namespace NUnitTest {          // --fork-tests is set (warning: this may be false, but never the less test will be forked if called inside UNIT_FORKED_TEST)          virtual bool GetForkTests() const; -    private: +    private:           virtual void OnStart(); - +           virtual void OnEnd(); - +           virtual void OnUnitStart(const TUnit* /*unit*/); - +           virtual void OnUnitStop(const TUnit* /*unit*/); - +           virtual void OnError(const TError* /*error*/); - +           virtual void OnFinish(const TFinish* /*finish*/); - +           virtual void OnBeforeTest(const TTest* /*test*/);          void AddTestError(const TTest& test);          void AddTestFinish(const TTest& test); -    private: +    private:           TMap<TString, size_t> TestErrors_;          TMap<TString, size_t> CurTestErrors_; -    }; - -    class TTestBase; -    class TTestFactory; - -    class ITestBaseFactory: public TIntrusiveListItem<ITestBaseFactory> { -    public: +    };  +  +    class TTestBase;  +    class TTestFactory;  +  +    class ITestBaseFactory: public TIntrusiveListItem<ITestBaseFactory> {  +    public:           ITestBaseFactory(); - +           virtual ~ITestBaseFactory(); - +           // name of test suite          virtual TString Name() const noexcept = 0; -        virtual TTestBase* ConstructTest() = 0; - -    private: +        virtual TTestBase* ConstructTest() = 0;  +  +    private:           void Register() noexcept; -    }; - -    class TTestBase { -        friend class TTestFactory; +    };  +  +    class TTestBase {  +        friend class TTestFactory;           TRusage rusage; - -    public: +  +    public:           TTestBase() noexcept; - +           virtual ~TTestBase(); - +           virtual TString TypeId() const; - +           virtual TString Name() const noexcept = 0; -        virtual void Execute() = 0; - +        virtual void Execute() = 0;  +           virtual void SetUp(); - +           virtual void TearDown(); - +           void AddError(const char* msg, const TString& backtrace = TString(), TTestContext* context = nullptr);          void AddError(const char* msg, TTestContext* context);          void RunAfterTest(std::function<void()> f); // function like atexit to run after current unit test -    protected: +    protected:           bool CheckAccessTest(const char* test);          void BeforeTest(const char* func);          void Finish(const char* func, TTestContext* context); - +           void AtStart(); - +           void AtEnd(); - +           void Run(std::function<void()> f, const TString& suite, const char* name, bool forceFork); - -        class TCleanUp { -        public: +  +        class TCleanUp {  +        public:               explicit TCleanUp(TTestBase* base); - +               ~TCleanUp(); - -        private: -            TTestBase* Base_; -        }; - +  +        private:  +            TTestBase* Base_;  +        };  +           void BeforeTest(); - +           void AfterTest(); - +           bool GetIsForked() const;          bool GetForkTests() const;          ITestSuiteProcessor* Processor() const noexcept; - -    private: -        TTestFactory* Parent_; +  +    private:  +        TTestFactory* Parent_;           size_t TestErrors_;          const char* CurrentSubtest_;          TAdaptiveLock AfterTestFunctionsLock_;          TVector<std::function<void()>> AfterTestFunctions_; -    }; - -#define UNIT_TEST_SUITE(N)                           \ -    typedef N TThisUnitTestSuite;                    \ -                                                     \ -public:                                              \ -    static TString StaticName() noexcept {           \ -        return TString(#N);                          \ -    }                                                \ -                                                     \ -private:                                             \ -    virtual TString Name() const noexcept override { \ -        return this->StaticName();                   \ -    }                                                \ -                                                     \ -    virtual void Execute() override {                \ -        this->AtStart(); - -#define UNIT_TEST_SUITE_DEMANGLE(N)                        \ -    typedef N TThisUnitTestSuite;                          \ -                                                           \ -public:                                                    \ -    static TString StaticName() noexcept {                 \ +    };  +  +#define UNIT_TEST_SUITE(N)                           \  +    typedef N TThisUnitTestSuite;                    \  +                                                     \  +public:                                              \  +    static TString StaticName() noexcept {           \  +        return TString(#N);                          \  +    }                                                \  +                                                     \  +private:                                             \  +    virtual TString Name() const noexcept override { \  +        return this->StaticName();                   \  +    }                                                \  +                                                     \  +    virtual void Execute() override {                \  +        this->AtStart();  +  +#define UNIT_TEST_SUITE_DEMANGLE(N)                        \  +    typedef N TThisUnitTestSuite;                          \  +                                                           \  +public:                                                    \  +    static TString StaticName() noexcept {                 \           return TypeName<N>(); \ -    }                                                      \ -                                                           \ -private:                                                   \ -    virtual TString Name() const noexcept override {       \ -        return this->StaticName();                         \ -    }                                                      \ -                                                           \ -    virtual void Execute() override {                      \ +    }                                                      \  +                                                           \  +private:                                                   \  +    virtual TString Name() const noexcept override {       \  +        return this->StaticName();                         \  +    }                                                      \  +                                                           \  +    virtual void Execute() override {                      \           this->AtStart();  #ifndef UT_SKIP_EXCEPTIONS @@ -289,21 +289,21 @@ private:                                                   \  #define CATCH_REACTION_BT(FN, e, context) throw  #endif -#define UNIT_TEST_CHECK_TEST_IS_DECLARED_ONLY_ONCE(F)                                       \ +#define UNIT_TEST_CHECK_TEST_IS_DECLARED_ONLY_ONCE(F)                                       \       /* If you see this message - delete multiple UNIT_TEST(TestName) with same TestName. */ \ -    /* It's forbidden to declare same test twice because it breaks --fork-tests logic.  */  \ -    int You_have_declared_test_##F##_multiple_times_This_is_forbidden;                      \ +    /* It's forbidden to declare same test twice because it breaks --fork-tests logic.  */  \  +    int You_have_declared_test_##F##_multiple_times_This_is_forbidden;                      \       Y_UNUSED(You_have_declared_test_##F##_multiple_times_This_is_forbidden); -#define UNIT_TEST_RUN(F, FF, context)                                                             \ -    this->BeforeTest((#F));                                                                       \ -    {                                                                                             \ -        struct T##F##Caller {                                                                     \ -            static void X(TThisUnitTestSuite* thiz, NUnitTest::TTestContext&) {                   \ -                TCleanUp cleaner(thiz);                                                           \ -                thiz->F();                                                                        \ -            }                                                                                     \ -        };                                                                                        \ +#define UNIT_TEST_RUN(F, FF, context)                                                             \  +    this->BeforeTest((#F));                                                                       \  +    {                                                                                             \  +        struct T##F##Caller {                                                                     \  +            static void X(TThisUnitTestSuite* thiz, NUnitTest::TTestContext&) {                   \  +                TCleanUp cleaner(thiz);                                                           \  +                thiz->F();                                                                        \  +            }                                                                                     \  +        };                                                                                        \           this->TTestBase::Run(std::bind(&T##F##Caller::X, this, context), StaticName(), (#F), FF); \      } @@ -323,17 +323,17 @@ private:                                                   \              }                                                          \              this->Finish((#F), &context);                              \          }                                                              \ -    } - +    }  +   #define UNIT_TEST(F) UNIT_TEST_IMPL(F, false) - +   #define UNIT_FORKED_TEST(F) UNIT_TEST_IMPL(F, true) -#define UNIT_TEST_EXCEPTION(F, E)                                                                                      \ -    /* main process with "--fork-tests" flag treats exceptions as errors - it's result of forked test run */           \ -    if (this->GetForkTests() && !this->GetIsForked()) {                                                                \ -        UNIT_TEST_IMPL(F, false);                                                                                      \ -        /* forked process (or main without "--fork-tests") treats some exceptions as success - it's exception test! */ \ +#define UNIT_TEST_EXCEPTION(F, E)                                                                                      \  +    /* main process with "--fork-tests" flag treats exceptions as errors - it's result of forked test run */           \  +    if (this->GetForkTests() && !this->GetIsForked()) {                                                                \  +        UNIT_TEST_IMPL(F, false);                                                                                      \  +        /* forked process (or main without "--fork-tests") treats some exceptions as success - it's exception test! */ \       } else {                                                                                                           \          NUnitTest::TTestContext context(this->TTestBase::Processor());                                                 \          if (this->CheckAccessTest((#F))) {                                                                             \ @@ -342,7 +342,7 @@ private:                                                   \                  this->AddError("exception expected", &context);                                                        \              } catch (const ::NUnitTest::TAssertException&) {                                                           \              } catch (const E& e) {                                                                                     \ -                TString err;                                                                                           \ +                TString err;                                                                                           \                   if (!CheckExceptionMessage(e.what(), err))                                                             \                      this->AddError(err.c_str(), &context);                                                             \              } catch (const std::exception& e) {                                                                        \ @@ -353,27 +353,27 @@ private:                                                   \              this->Finish((#F), &context);                                                                              \          }                                                                                                              \      } - -#define UNIT_TEST_SUITE_END() \ -    this->AtEnd();            \ -    }                         \ -                              \ -public:                       \ -    /*for ; after macros*/ void sub##F() - -#define UNIT_FAIL_IMPL(R, M)                                                                                                                     \ -    do {                                                                                                                                         \ +  +#define UNIT_TEST_SUITE_END() \  +    this->AtEnd();            \  +    }                         \  +                              \  +public:                       \  +    /*for ; after macros*/ void sub##F()  +  +#define UNIT_FAIL_IMPL(R, M)                                                                                                                     \  +    do {                                                                                                                                         \           ::NUnitTest::NPrivate::RaiseError(R, ::TStringBuilder() << R << " at " << __LOCATION__ << ", " << __PRETTY_FUNCTION__ << ": " << M, true); \      } while (false) - +   #define UNIT_FAIL_NONFATAL_IMPL(R, M)                                                                                                             \      do {                                                                                                                                          \          ::NUnitTest::NPrivate::RaiseError(R, ::TStringBuilder() << R << " at " << __LOCATION__ << ", " << __PRETTY_FUNCTION__ << ": " << M, false); \      } while (false) -#define UNIT_FAIL(M) UNIT_FAIL_IMPL("forced failure", M) +#define UNIT_FAIL(M) UNIT_FAIL_IMPL("forced failure", M)   #define UNIT_FAIL_NONFATAL(M) UNIT_FAIL_NONFATAL_IMPL("forced failure", M) - +   //types  #define UNIT_ASSERT_TYPES_EQUAL(A, B)                                                                                                                                  \      do {                                                                                                                                                               \ @@ -395,7 +395,7 @@ public:                       \              UNIT_FAIL_IMPL("assertion failure", failMsg);                                                      \          }                                                                                                      \      } while (false) - +   #define UNIT_ASSERT_DOUBLES_EQUAL_DEPRECATED(E, A, D) UNIT_ASSERT_DOUBLES_EQUAL_DEPRECATED_C(E, A, D, "")  #define UNIT_ASSERT_DOUBLES_EQUAL_C(E, A, D, C)                                                                                        \ @@ -423,24 +423,24 @@ public:                       \      } while (false)  #define UNIT_ASSERT_DOUBLES_EQUAL(E, A, D) UNIT_ASSERT_DOUBLES_EQUAL_C(E, A, D, "") - +   //strings -#define UNIT_ASSERT_STRINGS_EQUAL_C(A, B, C)                                                                 \ -    do {                                                                                                     \ -        const TString _a(A);                                                                                 \ -        const TString _b(B);                                                                                 \ -        if (_a != _b) {                                                                                      \ +#define UNIT_ASSERT_STRINGS_EQUAL_C(A, B, C)                                                                 \  +    do {                                                                                                     \  +        const TString _a(A);                                                                                 \  +        const TString _b(B);                                                                                 \  +        if (_a != _b) {                                                                                      \               auto&& failMsg = Sprintf("%s != %s %s", ToString(_a).data(), ToString(_b).data(), (::TStringBuilder() << C).data()); \              UNIT_FAIL_IMPL("strings equal assertion failed", failMsg);                                       \ -        }                                                                                                    \ +        }                                                                                                    \       } while (false) - +   #define UNIT_ASSERT_STRINGS_EQUAL(A, B) UNIT_ASSERT_STRINGS_EQUAL_C(A, B, "")  #define UNIT_ASSERT_STRING_CONTAINS_C(A, B, C)                                                                                  \      do {                                                                                                                        \ -        const TString _a(A);                                                                                                    \ -        const TString _b(B);                                                                                                    \ +        const TString _a(A);                                                                                                    \  +        const TString _b(B);                                                                                                    \           if (!_a.Contains(_b)) {                                                                                                 \              auto&& msg = Sprintf("\"%s\" does not contain \"%s\", %s", ToString(_a).data(), ToString(_b).data(), (::TStringBuilder() << C).data()); \              UNIT_FAIL_IMPL("strings contains assertion failed", msg);                                                           \ @@ -449,26 +449,26 @@ public:                       \  #define UNIT_ASSERT_STRING_CONTAINS(A, B) UNIT_ASSERT_STRING_CONTAINS_C(A, B, "") -#define UNIT_ASSERT_NO_DIFF(A, B)                                                                                                              \ -    do {                                                                                                                                       \ -        const TString _a(A);                                                                                                                   \ -        const TString _b(B);                                                                                                                   \ -        if (_a != _b) {                                                                                                                        \ +#define UNIT_ASSERT_NO_DIFF(A, B)                                                                                                              \  +    do {                                                                                                                                       \  +        const TString _a(A);                                                                                                                   \  +        const TString _b(B);                                                                                                                   \  +        if (_a != _b) {                                                                                                                        \               UNIT_FAIL_IMPL("strings (" #A ") and (" #B ") are different", Sprintf("\n%s", ::NUnitTest::ColoredDiff(_a, _b, " \t\n.,:;'\"").data())); \ -        }                                                                                                                                      \ +        }                                                                                                                                      \       } while (false)  //strings -#define UNIT_ASSERT_STRINGS_UNEQUAL_C(A, B, C)                                                           \ -    do {                                                                                                 \ -        const TString _a(A);                                                                             \ -        const TString _b(B);                                                                             \ -        if (_a == _b) {                                                                                  \ +#define UNIT_ASSERT_STRINGS_UNEQUAL_C(A, B, C)                                                           \  +    do {                                                                                                 \  +        const TString _a(A);                                                                             \  +        const TString _b(B);                                                                             \  +        if (_a == _b) {                                                                                  \               auto&& msg = Sprintf("%s == %s %s", ToString(_a).data(), ToString(_b).data(), (::TStringBuilder() << C).data()); \ -            UNIT_FAIL_IMPL("strings unequal assertion failed", msg);                                     \ -        }                                                                                                \ +            UNIT_FAIL_IMPL("strings unequal assertion failed", msg);                                     \  +        }                                                                                                \       } while (false) - +   #define UNIT_ASSERT_STRINGS_UNEQUAL(A, B) UNIT_ASSERT_STRINGS_UNEQUAL_C(A, B, "")  //bool @@ -478,9 +478,9 @@ public:                       \              UNIT_FAIL_IMPL("assertion failed", Sprintf("(%s) %s", #A, (::TStringBuilder() << C).data())); \          }                                                                                               \      } while (false) - +   #define UNIT_ASSERT(A) UNIT_ASSERT_C(A, "") - +   //general  #define UNIT_ASSERT_EQUAL_C(A, B, C)                                                                                  \      do {                                                                                                              \ @@ -488,16 +488,16 @@ public:                       \              UNIT_FAIL_IMPL("equal assertion failed", Sprintf("%s == %s %s", #A, #B, (::TStringBuilder() << C).data())); \          }                                                                                                             \      } while (false) - +   #define UNIT_ASSERT_EQUAL(A, B) UNIT_ASSERT_EQUAL_C(A, B, "") - +   #define UNIT_ASSERT_UNEQUAL_C(A, B, C)                                                                                 \      do {                                                                                                               \          if ((A) == (B)) {                                                                                              \              UNIT_FAIL_IMPL("unequal assertion failed", Sprintf("%s != %s %s", #A, #B, (::TStringBuilder() << C).data()));\          }                                                                                                              \      } while (false) - +   #define UNIT_ASSERT_UNEQUAL(A, B) UNIT_ASSERT_UNEQUAL_C(A, B, "")  #define UNIT_ASSERT_LT_C(A, B, C)                                                                                        \ @@ -644,86 +644,86 @@ public:                       \  #define UNIT_ASSERT_NO_EXCEPTION_RESULT(A) UNIT_ASSERT_NO_EXCEPTION_RESULT_C(A, "") -#define UNIT_ASSERT_NO_EXCEPTION_C(A, C)                                                                                                                                 \ -    do {                                                                                                                                                                 \ -        try {                                                                                                                                                            \ -            (void)(A);                                                                                                                                                   \ -        } catch (const ::NUnitTest::TAssertException&) {                                                                                                                 \ -            throw;                                                                                                                                                       \ -        } catch (...) {                                                                                                                                                  \ +#define UNIT_ASSERT_NO_EXCEPTION_C(A, C)                                                                                                                                 \  +    do {                                                                                                                                                                 \  +        try {                                                                                                                                                            \  +            (void)(A);                                                                                                                                                   \  +        } catch (const ::NUnitTest::TAssertException&) {                                                                                                                 \  +            throw;                                                                                                                                                       \  +        } catch (...) {                                                                                                                                                  \               UNIT_FAIL_IMPL("exception-free assertion failed", Sprintf("%s throws %s\nException message: %s", #A, (::TStringBuilder() << C).data(), CurrentExceptionMessage().data())); \ -        }                                                                                                                                                                \ +        }                                                                                                                                                                \       } while (false)  #define UNIT_ASSERT_NO_EXCEPTION(A) UNIT_ASSERT_NO_EXCEPTION_C(A, "") -    namespace NPrivate { -        template <class T, class U, bool Integers> -        struct TCompareValuesImpl { -            static inline bool Compare(const T& a, const U& b) { -                return a == b; -            } -        }; - -        template <class T, class U> -        struct TCompareValuesImpl<T, U, true> { -            static inline bool Compare(const T& a, const U& b) { -                return ::ToString(a) == ::ToString(b); -            } -        }; - -        template <class T, class U> +    namespace NPrivate {  +        template <class T, class U, bool Integers>  +        struct TCompareValuesImpl {  +            static inline bool Compare(const T& a, const U& b) {  +                return a == b;  +            }  +        };  +  +        template <class T, class U>  +        struct TCompareValuesImpl<T, U, true> {  +            static inline bool Compare(const T& a, const U& b) {  +                return ::ToString(a) == ::ToString(b);  +            }  +        };  +  +        template <class T, class U>           using TCompareValues = TCompareValuesImpl<T, U, std::is_integral<T>::value && std::is_integral<U>::value>; - -        template <typename T, typename U> -        static inline bool CompareEqual(const T& a, const U& b) { -            return TCompareValues<T, U>::Compare(a, b); -        } - -        static inline bool CompareEqual(const char* a, const char* b) { -            return 0 == strcmp(a, b); -        } - -        // helper method to avoid double evaluation of A and B expressions in UNIT_ASSERT_VALUES_EQUAL_C -        template <typename T, typename U> +  +        template <typename T, typename U>  +        static inline bool CompareEqual(const T& a, const U& b) {  +            return TCompareValues<T, U>::Compare(a, b);  +        }  +  +        static inline bool CompareEqual(const char* a, const char* b) {  +            return 0 == strcmp(a, b);  +        }  +  +        // helper method to avoid double evaluation of A and B expressions in UNIT_ASSERT_VALUES_EQUAL_C  +        template <typename T, typename U>           static inline bool CompareAndMakeStrings(const T& a, const U& b, TString& as, TString& asInd, TString& bs, TString& bsInd, bool& usePlainDiff, bool want) { -            const bool have = CompareEqual(a, b); +            const bool have = CompareEqual(a, b);               usePlainDiff = std::is_integral<T>::value && std::is_integral<U>::value; - -            if (want == have) { -                return true; -            } - -            as = ::TStringBuilder() << ::DbgDump(a); -            bs = ::TStringBuilder() << ::DbgDump(b); -            asInd = ::TStringBuilder() << ::DbgDump(a).SetIndent(true); -            bsInd = ::TStringBuilder() << ::DbgDump(b).SetIndent(true); - -            return false; -        } +  +            if (want == have) {  +                return true;  +            }  +  +            as = ::TStringBuilder() << ::DbgDump(a);  +            bs = ::TStringBuilder() << ::DbgDump(b);  +            asInd = ::TStringBuilder() << ::DbgDump(a).SetIndent(true);  +            bsInd = ::TStringBuilder() << ::DbgDump(b).SetIndent(true);  +  +            return false;  +        }       }  //values -#define UNIT_ASSERT_VALUES_EQUAL_IMPL(A, B, C, EQflag, EQstr, NEQstr)                                                                  \ -    do {                                                                                                                               \ -        TString _as;                                                                                                                   \ -        TString _bs;                                                                                                                   \ -        TString _asInd;                                                                                                                \ -        TString _bsInd;                                                                                                                \ -        bool _usePlainDiff;                                                                                                            \ -        if (!::NUnitTest::NPrivate::CompareAndMakeStrings(A, B, _as, _asInd, _bs, _bsInd, _usePlainDiff, EQflag)) {                    \ +#define UNIT_ASSERT_VALUES_EQUAL_IMPL(A, B, C, EQflag, EQstr, NEQstr)                                                                  \  +    do {                                                                                                                               \  +        TString _as;                                                                                                                   \  +        TString _bs;                                                                                                                   \  +        TString _asInd;                                                                                                                \  +        TString _bsInd;                                                                                                                \  +        bool _usePlainDiff;                                                                                                            \  +        if (!::NUnitTest::NPrivate::CompareAndMakeStrings(A, B, _as, _asInd, _bs, _bsInd, _usePlainDiff, EQflag)) {                    \               auto&& failMsg = Sprintf("(%s %s %s) failed: (%s %s %s) %s", #A, EQstr, #B, _as.data(), NEQstr, _bs.data(), (::TStringBuilder() << C).data()); \ -            if (EQflag && !_usePlainDiff) {                                                                                            \ +            if (EQflag && !_usePlainDiff) {                                                                                            \                   failMsg += ", with diff:\n";                                                                                           \                  failMsg += ::NUnitTest::ColoredDiff(_asInd, _bsInd);                                                                   \ -            }                                                                                                                          \ +            }                                                                                                                          \               UNIT_FAIL_IMPL("assertion failed", failMsg);                                                                               \ -        }                                                                                                                              \ +        }                                                                                                                              \       } while (false)  #define UNIT_ASSERT_VALUES_EQUAL_C(A, B, C) \      UNIT_ASSERT_VALUES_EQUAL_IMPL(A, B, C, true, "==", "!=") - +   #define UNIT_ASSERT_VALUES_UNEQUAL_C(A, B, C) \      UNIT_ASSERT_VALUES_EQUAL_IMPL(A, B, C, false, "!=", "==") @@ -742,7 +742,7 @@ public:                       \              UNIT_FAIL_IMPL("fail test assertion failure",                \                             "code is expected to generate test failure, " \                             "but it throws exception with message: "      \ -                               << CurrentExceptionMessage());            \ +                               << CurrentExceptionMessage());            \           }                                                                \          if (!checker.Failed()) {                                         \              UNIT_FAIL_IMPL("fail test assertion failure",                \ @@ -754,46 +754,46 @@ public:                       \  #define UNIT_ADD_METRIC(name, value) ut_context.Metrics[name] = value -    class TTestFactory { -        friend class TTestBase; -        friend class ITestBaseFactory; - -    public: +    class TTestFactory {  +        friend class TTestBase;  +        friend class ITestBaseFactory;  +  +    public:           static TTestFactory& Instance(); - +           unsigned Execute(); - +           void SetProcessor(ITestSuiteProcessor* processor); - -    private: +  +    private:           void Register(ITestBaseFactory* b) noexcept; - +           ITestSuiteProcessor* Processor() const noexcept; - -    private: +  +    private:           explicit TTestFactory(ITestSuiteProcessor* processor); - +           ~TTestFactory(); - -    private: -        TIntrusiveList<ITestBaseFactory> Items_; -        ITestSuiteProcessor* Processor_; -    }; - -    template <class T> -    class TTestBaseFactory: public ITestBaseFactory { -    public: +  +    private:  +        TIntrusiveList<ITestBaseFactory> Items_;  +        ITestSuiteProcessor* Processor_;  +    };  +  +    template <class T>  +    class TTestBaseFactory: public ITestBaseFactory {  +    public:           ~TTestBaseFactory() override = default; - +           inline TTestBase* ConstructTest() override { -            return new T; -        } - +            return new T;  +        }  +           inline TString Name() const noexcept override {              return T::StaticName(); -        } -    }; - +        }  +    };  +       struct TBaseTestCase {          // NOTE: since EACH test case is instantiated for listing tests, its          // ctor/dtor are not the best place to do heavy preparations in test fixtures. @@ -802,15 +802,15 @@ public:                       \          inline TBaseTestCase()              : TBaseTestCase(nullptr, nullptr, false) -        { -        } +        {  +        }           inline TBaseTestCase(const char* name, std::function<void(TTestContext&)> body, bool forceFork)              : Name_(name)              , Body_(std::move(body))              , ForceFork_(forceFork) -        { -        } +        {  +        }           virtual ~TBaseTestCase() = default; @@ -836,7 +836,7 @@ public:                       \          const char* Name_;          std::function<void(TTestContext&)> Body_;          bool ForceFork_; -    }; +    };       using TBaseFixture = TBaseTestCase; @@ -911,76 +911,76 @@ public:                       \          bool Failed_ = false;      }; -#define UNIT_TEST_SUITE_REGISTRATION(T) \ +#define UNIT_TEST_SUITE_REGISTRATION(T) \       static const ::NUnitTest::TTestBaseFactory<T> Y_GENERATE_UNIQUE_ID(UTREG_); - +   #define Y_UNIT_TEST_SUITE_IMPL_F(N, T, F)                                                                          \ -    namespace NTestSuite##N {                                                                                           \ +    namespace NTestSuite##N {                                                                                           \           class TCurrentTestCase: public F {                                                                              \          };                                                                                                              \ -        class TCurrentTest: public T {                                                                                  \ -        private:                                                                                                        \ +        class TCurrentTest: public T {                                                                                  \  +        private:                                                                                                        \               typedef std::function<THolder<NUnitTest::TBaseTestCase>()> TTestCaseFactory;                                \              typedef TVector<TTestCaseFactory> TTests;                                                                   \ -                                                                                                                        \ -            static TTests& Tests() {                                                                                    \ -                static TTests tests;                                                                                    \ -                return tests;                                                                                           \ -            }                                                                                                           \ -                                                                                                                        \ -        public:                                                                                                         \ -            static TString StaticName() {                                                                               \ -                return #N;                                                                                              \ -            }                                                                                                           \ -            virtual TString Name() const noexcept {                                                                     \ -                return StaticName();                                                                                    \ -            }                                                                                                           \ -                                                                                                                        \ +                                                                                                                        \  +            static TTests& Tests() {                                                                                    \  +                static TTests tests;                                                                                    \  +                return tests;                                                                                           \  +            }                                                                                                           \  +                                                                                                                        \  +        public:                                                                                                         \  +            static TString StaticName() {                                                                               \  +                return #N;                                                                                              \  +            }                                                                                                           \  +            virtual TString Name() const noexcept {                                                                     \  +                return StaticName();                                                                                    \  +            }                                                                                                           \  +                                                                                                                        \               static void AddTest(const char* name,                                                                       \                  const std::function<void(NUnitTest::TTestContext&)>& body, bool forceFork)                              \              {                                                                                                           \                  Tests().push_back([=]{ return MakeHolder<NUnitTest::TBaseTestCase>(name, body, forceFork); });          \ -            }                                                                                                           \ -                                                                                                                        \ +            }                                                                                                           \  +                                                                                                                        \               static void AddTest(TTestCaseFactory testCaseFactory) {                                                     \                  Tests().push_back(std::move(testCaseFactory));                                                          \              }                                                                                                           \                                                                                                                          \ -            virtual void Execute() {                                                                                    \ -                this->AtStart();                                                                                        \ +            virtual void Execute() {                                                                                    \  +                this->AtStart();                                                                                        \                   for (TTests::iterator it = Tests().begin(), ie = Tests().end(); it != ie; ++it) {                       \                      const auto i = (*it)();                                                                             \                      if (!this->CheckAccessTest(i->Name_)) {                                                             \ -                        continue;                                                                                       \ -                    }                                                                                                   \ +                        continue;                                                                                       \  +                    }                                                                                                   \                       NUnitTest::TTestContext context(this->TTestBase::Processor());                                      \ -                    try {                                                                                               \ +                    try {                                                                                               \                           this->BeforeTest(i->Name_);                                                                     \ -                        {                                                                                               \ -                            TCleanUp cleaner(this);                                                                     \ +                        {                                                                                               \  +                            TCleanUp cleaner(this);                                                                     \                               auto testCase = [&i, &context] {                                                            \                                  i->SetUp(context);                                                                      \                                  i->Execute_(context);                                                                   \                                  i->TearDown(context);                                                                   \                              };                                                                                          \                              this->T::Run(testCase, StaticName(), i->Name_, i->ForceFork_);                              \ -                        }                                                                                               \ -                    } catch (const ::NUnitTest::TAssertException&) {                                                    \ -                    } catch (const yexception& e) {                                                                     \ +                        }                                                                                               \  +                    } catch (const ::NUnitTest::TAssertException&) {                                                    \  +                    } catch (const yexception& e) {                                                                     \                           CATCH_REACTION_BT(i->Name_, e, &context);                                                       \ -                    } catch (const std::exception& e) {                                                                 \ +                    } catch (const std::exception& e) {                                                                 \                           CATCH_REACTION(i->Name_, e, &context);                                                          \ -                    } catch (...) {                                                                                     \ -                        this->AddError("non-std exception!", &context);                                                 \ -                    }                                                                                                   \ +                    } catch (...) {                                                                                     \  +                        this->AddError("non-std exception!", &context);                                                 \  +                    }                                                                                                   \                       this->Finish(i->Name_, &context);                                                                   \ -                }                                                                                                       \ -                this->AtEnd();                                                                                          \ -            }                                                                                                           \ -        };                                                                                                              \ -        UNIT_TEST_SUITE_REGISTRATION(TCurrentTest)                                                                      \ -    }                                                                                                                   \ -    namespace NTestSuite##N +                }                                                                                                       \  +                this->AtEnd();                                                                                          \  +            }                                                                                                           \  +        };                                                                                                              \  +        UNIT_TEST_SUITE_REGISTRATION(TCurrentTest)                                                                      \  +    }                                                                                                                   \  +    namespace NTestSuite##N   #define Y_UNIT_TEST_SUITE_IMPL(N, T) Y_UNIT_TEST_SUITE_IMPL_F(N, T, ::NUnitTest::TBaseTestCase)  #define Y_UNIT_TEST_SUITE(N) Y_UNIT_TEST_SUITE_IMPL(N, TTestBase) @@ -1016,7 +1016,7 @@ public:                       \  #define SIMPLE_UNIT_FORKED_TEST(N) Y_UNIT_TEST_IMPL(N, true, TCurrentTestCase)  #define Y_UNIT_TEST_SUITE_IMPLEMENTATION(N) \ -    namespace NTestSuite##N +    namespace NTestSuite##N   #define Y_UNIT_TEST_DECLARE(N) \      struct TTestCase##N @@ -1025,6 +1025,6 @@ public:                       \      friend NTestSuite##N::TTestCase##T \      TString RandomString(size_t len, ui32 seed = 0); -} - +}  +   using ::NUnitTest::TTestBase; diff --git a/library/cpp/testing/unittest/tests_data.cpp b/library/cpp/testing/unittest/tests_data.cpp index b51cbc4b87c..08a4eb0790e 100644 --- a/library/cpp/testing/unittest/tests_data.cpp +++ b/library/cpp/testing/unittest/tests_data.cpp @@ -11,7 +11,7 @@ public:      TPortManagerImpl(bool reservePortsForCurrentTest)          : EnableReservePortsForCurrentTest(reservePortsForCurrentTest)          , DisableRandomPorts(!GetEnv("NO_RANDOM_PORTS").empty()) -    { +    {       }      ui16 GetPort(ui16 port) { diff --git a/library/cpp/testing/unittest/tests_data.h b/library/cpp/testing/unittest/tests_data.h index 6536bc1ae69..2c56bdb3b21 100644 --- a/library/cpp/testing/unittest/tests_data.h +++ b/library/cpp/testing/unittest/tests_data.h @@ -27,7 +27,7 @@ void SetReuseAddressAndPort(const TSocketType& sock) {  #endif  } -class TPortManager: public TNonCopyable { +class TPortManager: public TNonCopyable {   public:      TPortManager(bool reservePortsForCurrentTest = true);      ~TPortManager(); diff --git a/library/cpp/testing/unittest/ut/main.cpp b/library/cpp/testing/unittest/ut/main.cpp index e303e21e30a..cba1681c835 100644 --- a/library/cpp/testing/unittest/ut/main.cpp +++ b/library/cpp/testing/unittest/ut/main.cpp @@ -7,27 +7,27 @@  #include <util/system/env.h>  #include <util/system/fs.h> -TEST(GTest, Test1) { -    UNIT_ASSERT_EQUAL(1, 1); -} - -TEST(GTest, Test2) { -    UNIT_ASSERT_EQUAL(2, 2); -} - -namespace { -    struct TFixture : ::testing::Test { -        TFixture() -            : I(0) -        { -        } - +TEST(GTest, Test1) {  +    UNIT_ASSERT_EQUAL(1, 1);  +}  +  +TEST(GTest, Test2) {  +    UNIT_ASSERT_EQUAL(2, 2);  +}  +  +namespace {  +    struct TFixture : ::testing::Test {  +        TFixture()  +            : I(0)  +        {  +        }  +           void SetUp() override { -            I = 5; -        } - -        int I; -    }; +            I = 5;  +        }  +  +        int I;  +    };       struct TSimpleFixture : public NUnitTest::TBaseFixture {          size_t Value = 24; @@ -50,11 +50,11 @@ namespace {              Magic = 100;          }      }; -} - -TEST_F(TFixture, Test1) { -    ASSERT_EQ(I, 5); -} +}  +  +TEST_F(TFixture, Test1) {  +    ASSERT_EQ(I, 5);  +}   TEST(ETest, Test1) {      UNIT_CHECK_GENERATED_EXCEPTION(ythrow yexception(), yexception); diff --git a/library/cpp/testing/unittest/utmain.cpp b/library/cpp/testing/unittest/utmain.cpp index 305bc6b40fc..9b46bee6ee1 100644 --- a/library/cpp/testing/unittest/utmain.cpp +++ b/library/cpp/testing/unittest/utmain.cpp @@ -1,9 +1,9 @@  #include "plugin.h" -#include "registar.h" -#include "utmain.h" - +#include "registar.h"  +#include "utmain.h"  +   #include <library/cpp/colorizer/colors.h> - +   #include <library/cpp/json/writer/json.h>  #include <library/cpp/json/writer/json_value.h>  #include <library/cpp/testing/common/env.h> @@ -11,45 +11,45 @@  #include <util/datetime/base.h> -#include <util/generic/hash.h> +#include <util/generic/hash.h>   #include <util/generic/hash_set.h>  #include <util/generic/scope.h>  #include <util/generic/string.h> -#include <util/generic/yexception.h> +#include <util/generic/yexception.h>  -#include <util/network/init.h> +#include <util/network/init.h>   #include <util/stream/file.h>  #include <util/stream/output.h>  #include <util/string/join.h>  #include <util/string/util.h> - +   #include <util/system/defaults.h>  #include <util/system/execpath.h>  #include <util/system/valgrind.h>  #include <util/system/shellcommand.h> -#if defined(_win_) -#include <fcntl.h> -#include <io.h> -#include <windows.h> -#include <crtdbg.h> -#endif - -#if defined(_unix_) -#include <unistd.h> -#endif - +#if defined(_win_)  +#include <fcntl.h>  +#include <io.h>  +#include <windows.h>  +#include <crtdbg.h>  +#endif  +  +#if defined(_unix_)  +#include <unistd.h>  +#endif  +   #ifdef WITH_VALGRIND  #define NOTE_IN_VALGRIND(test) VALGRIND_PRINTF("%s::%s", test->unit->name.data(), test->name)  #else -#define NOTE_IN_VALGRIND(test) +#define NOTE_IN_VALGRIND(test)   #endif  const size_t MAX_COMMENT_MESSAGE_LENGTH = 1024 * 1024; // 1 MB -using namespace NUnitTest; - +using namespace NUnitTest;  +   class TNullTraceWriterProcessor: public ITestSuiteProcessor {  }; @@ -107,12 +107,12 @@ private:      virtual TString BuildComment(const char* message, const char* backTrace) {          return NUnitTest::GetFormatTag("bad") + -               TString(message).substr(0, MAX_COMMENT_MESSAGE_LENGTH) + -               NUnitTest::GetResetTag() + -               TString("\n") + -               NUnitTest::GetFormatTag("alt1") + -               TString(backTrace).substr(0, MAX_COMMENT_MESSAGE_LENGTH) + -               NUnitTest::GetResetTag(); +               TString(message).substr(0, MAX_COMMENT_MESSAGE_LENGTH) +  +               NUnitTest::GetResetTag() +  +               TString("\n") +  +               NUnitTest::GetFormatTag("alt1") +  +               TString(backTrace).substr(0, MAX_COMMENT_MESSAGE_LENGTH) +  +               NUnitTest::GetResetTag();       }      void OnBeforeTest(const TTest* test) override { @@ -164,75 +164,75 @@ private:      }  }; -class TColoredProcessor: public ITestSuiteProcessor, public NColorizer::TColors { -public: +class TColoredProcessor: public ITestSuiteProcessor, public NColorizer::TColors {  +public:       inline TColoredProcessor(const TString& appName) -        : PrintBeforeSuite_(true) -        , PrintBeforeTest_(true) +        : PrintBeforeSuite_(true)  +        , PrintBeforeTest_(true)           , PrintAfterTest_(true)          , PrintAfterSuite_(true) -        , PrintTimes_(false) +        , PrintTimes_(false)           , PrintSummary_(true) -        , PrevTime_(TInstant::Now()) +        , PrevTime_(TInstant::Now())           , ShowFails(true) -        , Start(0) -        , End(Max<size_t>()) -        , AppName(appName) -        , ForkTests(false) -        , IsForked(false) -        , Loop(false) -        , ForkExitedCorrectly(false) +        , Start(0)  +        , End(Max<size_t>())  +        , AppName(appName)  +        , ForkTests(false)  +        , IsForked(false)  +        , Loop(false)  +        , ForkExitedCorrectly(false)           , TraceProcessor(new TNullTraceWriterProcessor()) -    { -    } - +    {  +    }  +       ~TColoredProcessor() override { -    } - -    inline void Disable(const char* name) { +    }  +  +    inline void Disable(const char* name) {           size_t colon = TString(name).find("::");          if (colon == TString::npos) { -            DisabledSuites_.insert(name); -        } else { +            DisabledSuites_.insert(name);  +        } else {               TString suite = TString(name).substr(0, colon); -            DisabledTests_.insert(name); -        } -    } - -    inline void Enable(const char* name) { +            DisabledTests_.insert(name);  +        }  +    }  +  +    inline void Enable(const char* name) {           size_t colon = TString(name).rfind("::");          if (colon == TString::npos) { -            EnabledSuites_.insert(name); +            EnabledSuites_.insert(name);               EnabledTests_.insert(TString() + name + "::*"); -        } else { +        } else {               TString suite = TString(name).substr(0, colon); -            EnabledSuites_.insert(suite); +            EnabledSuites_.insert(suite);               EnabledSuites_.insert(name); -            EnabledTests_.insert(name); +            EnabledTests_.insert(name);               EnabledTests_.insert(TString() + name + "::*"); -        } -    } - -    inline void SetPrintBeforeSuite(bool print) { -        PrintBeforeSuite_ = print; -    } +        }  +    }  +  +    inline void SetPrintBeforeSuite(bool print) {  +        PrintBeforeSuite_ = print;  +    }       inline void SetPrintAfterSuite(bool print) {          PrintAfterSuite_ = print;      } -    inline void SetPrintBeforeTest(bool print) { -        PrintBeforeTest_ = print; -    } +    inline void SetPrintBeforeTest(bool print) {  +        PrintBeforeTest_ = print;  +    }       inline void SetPrintAfterTest(bool print) {          PrintAfterTest_ = print;      } -    inline void SetPrintTimes(bool print) { -        PrintTimes_ = print; -    } - +    inline void SetPrintTimes(bool print) {  +        PrintTimes_ = print;  +    }  +       inline void SetPrintSummary(bool print) {          PrintSummary_ = print;      } @@ -241,15 +241,15 @@ public:          return PrintSummary_;      } -    inline void SetShowFails(bool show) { -        ShowFails = show; -    } +    inline void SetShowFails(bool show) {  +        ShowFails = show;  +    }       void SetContinueOnFail(bool val) {          NUnitTest::ContinueOnFail = val;      } -    inline void BeQuiet() { +    inline void BeQuiet() {           SetPrintTimes(false);          SetPrintBeforeSuite(false);          SetPrintAfterSuite(false); @@ -258,117 +258,117 @@ public:          SetPrintSummary(false);      } -    inline void SetStart(size_t val) { -        Start = val; -    } - -    inline void SetEnd(size_t val) { -        End = val; -    } - -    inline void SetForkTests(bool val) { -        ForkTests = val; -    } +    inline void SetStart(size_t val) {  +        Start = val;  +    }  +  +    inline void SetEnd(size_t val) {  +        End = val;  +    }  +  +    inline void SetForkTests(bool val) {  +        ForkTests = val;  +    }       inline bool GetForkTests() const override { -        return ForkTests; -    } +        return ForkTests;  +    }  -    inline void SetIsForked(bool val) { -        IsForked = val; -        SetIsTTY(IsForked || CalcIsTTY(stderr)); -    } +    inline void SetIsForked(bool val) {  +        IsForked = val;  +        SetIsTTY(IsForked || CalcIsTTY(stderr));  +    }       inline bool GetIsForked() const override { -        return IsForked; -    } +        return IsForked;  +    }  -    inline void SetLoop(bool loop) { -        Loop = loop; -    } - -    inline bool IsLoop() const { -        return Loop; -    } +    inline void SetLoop(bool loop) {  +        Loop = loop;  +    }  +    inline bool IsLoop() const {  +        return Loop;  +    }  +       inline void SetTraceProcessor(TAutoPtr<ITestSuiteProcessor> traceProcessor) {          TraceProcessor = traceProcessor;      } -private: +private:       void OnUnitStart(const TUnit* unit) override {          TraceProcessor->UnitStart(*unit); -        if (IsForked) { -            return; +        if (IsForked) {  +            return;           } -        if (PrintBeforeSuite_ || PrintBeforeTest_) { +        if (PrintBeforeSuite_ || PrintBeforeTest_) {               fprintf(stderr, "%s<-----%s %s\n", LightBlueColor().data(), OldColor().data(), unit->name.data()); -        } -    } +        }  +    }       void OnUnitStop(const TUnit* unit) override {          TraceProcessor->UnitStop(*unit); -        if (IsForked) { -            return; +        if (IsForked) {  +            return;           }          if (!PrintAfterSuite_) {              return;          } -        fprintf(stderr, "%s----->%s %s -> ok: %s%u%s", +        fprintf(stderr, "%s----->%s %s -> ok: %s%u%s",                   LightBlueColor().data(), OldColor().data(), unit->name.data(),                  LightGreenColor().data(), GoodTestsInCurrentUnit(), OldColor().data()); -        if (FailTestsInCurrentUnit()) { -            fprintf(stderr, ", err: %s%u%s", +        if (FailTestsInCurrentUnit()) {  +            fprintf(stderr, ", err: %s%u%s",                       LightRedColor().data(), FailTestsInCurrentUnit(), OldColor().data()); -        } -        fprintf(stderr, "\n"); -    } - +        }  +        fprintf(stderr, "\n");  +    }  +       void OnBeforeTest(const TTest* test) override {          TraceProcessor->BeforeTest(*test); -        if (IsForked) { -            return; +        if (IsForked) {  +            return;           } -        if (PrintBeforeTest_) { +        if (PrintBeforeTest_) {               fprintf(stderr, "[%sexec%s] %s::%s...\n", LightBlueColor().data(), OldColor().data(), test->unit->name.data(), test->name); -        } -    } +        }  +    }       void OnError(const TError* descr) override {          TraceProcessor->Error(*descr); -        if (!IsForked && ForkExitedCorrectly) { -            return; -        } +        if (!IsForked && ForkExitedCorrectly) {  +            return;  +        }           if (!PrintAfterTest_) {              return;          }          const TString err = Sprintf("[%sFAIL%s] %s::%s -> %s%s%s\n%s%s%s", LightRedColor().data(), OldColor().data(),                                      descr->test->unit->name.data(), -                                    descr->test->name, +                                    descr->test->name,                                       LightRedColor().data(), descr->msg, OldColor().data(), LightCyanColor().data(), descr->BackTrace.data(), OldColor().data());          const TDuration test_duration = SaveTestDuration(); -        if (ShowFails) { +        if (ShowFails) {               if (PrintTimes_) {                  Fails.push_back(Sprintf("%s %s", test_duration.ToString().data(), err.data()));              } else {                  Fails.push_back(err);              } -        } +        }           fprintf(stderr, "%s", err.data()); -        NOTE_IN_VALGRIND(descr->test); +        NOTE_IN_VALGRIND(descr->test);           PrintTimes(test_duration); -        if (IsForked) { -            fprintf(stderr, "%s", ForkCorrectExitMsg); -        } -    } - +        if (IsForked) {  +            fprintf(stderr, "%s", ForkCorrectExitMsg);  +        }  +    }  +       void OnFinish(const TFinish* descr) override {          TraceProcessor->Finish(*descr); -        if (!IsForked && ForkExitedCorrectly) { -            return; -        } +        if (!IsForked && ForkExitedCorrectly) {  +            return;  +        }           if (!PrintAfterTest_) {              return;          } @@ -382,9 +382,9 @@ private:              if (IsForked) {                  fprintf(stderr, "%s", ForkCorrectExitMsg);              } -        } -    } - +        }  +    }  +       inline TDuration SaveTestDuration() {          const TInstant now = TInstant::Now();          TDuration d = now - PrevTime_; @@ -393,101 +393,101 @@ private:      }      inline void PrintTimes(TDuration d) { -        if (!PrintTimes_) { -            return; -        } - +        if (!PrintTimes_) {  +            return;  +        }  +           Cerr << d << "\n"; -    } - +    }  +       void OnEnd() override {          TraceProcessor->End(); -        if (IsForked) { -            return; -        } +        if (IsForked) {  +            return;  +        }           if (!PrintSummary_) {              return;          } -        fprintf(stderr, "[%sDONE%s] ok: %s%u%s", +        fprintf(stderr, "[%sDONE%s] ok: %s%u%s",                   YellowColor().data(), OldColor().data(),                  LightGreenColor().data(), GoodTests(), OldColor().data()); -        if (FailTests()) -            fprintf(stderr, ", err: %s%u%s", +        if (FailTests())  +            fprintf(stderr, ", err: %s%u%s",                       LightRedColor().data(), FailTests(), OldColor().data()); -        fprintf(stderr, "\n"); +        fprintf(stderr, "\n");  -        if (ShowFails) { -            for (size_t i = 0; i < Fails.size(); ++i) { +        if (ShowFails) {  +            for (size_t i = 0; i < Fails.size(); ++i) {                   printf("%s", Fails[i].data());              } -        } -    } - +        }  +    }  +       bool CheckAccess(TString name, size_t num) override { -        if (num < Start) { -            return false; -        } - -        if (num >= End) { -            return false; -        } - +        if (num < Start) {  +            return false;  +        }  +  +        if (num >= End) {  +            return false;  +        }  +           if (DisabledSuites_.find(name.data()) != DisabledSuites_.end()) { -            return false; -        } - -        if (EnabledSuites_.empty()) { -            return true; -        } - +            return false;  +        }  +  +        if (EnabledSuites_.empty()) {  +            return true;  +        }  +           return EnabledSuites_.find(name.data()) != EnabledSuites_.end(); -    } - +    }  +       bool CheckAccessTest(TString suite, const char* test) override {          TString name = suite + "::" + test; -        if (DisabledTests_.find(name) != DisabledTests_.end()) { -            return false; -        } - -        if (EnabledTests_.empty()) { -            return true; -        } +        if (DisabledTests_.find(name) != DisabledTests_.end()) {  +            return false;  +        }  +  +        if (EnabledTests_.empty()) {  +            return true;  +        }           if (EnabledTests_.find(TString() + suite + "::*") != EnabledTests_.end()) { -            return true; -        } +            return true;  +        }  -        return EnabledTests_.find(name) != EnabledTests_.end(); -    } +        return EnabledTests_.find(name) != EnabledTests_.end();  +    }       void Run(std::function<void()> f, const TString& suite, const char* name, const bool forceFork) override { -        if (!(ForkTests || forceFork) || GetIsForked()) { -            return f(); +        if (!(ForkTests || forceFork) || GetIsForked()) {  +            return f();           }          TList<TString> args(1, "--is-forked-internal");          args.push_back(Sprintf("+%s::%s", suite.data(), name)); -        // stdin is ignored - unittest should not need them... -        TShellCommand cmd(AppName, args, -                          TShellCommandOptions().SetUseShell(false).SetCloseAllFdsOnExec(true).SetAsync(false).SetLatency(1)); -        cmd.Run(); +        // stdin is ignored - unittest should not need them...  +        TShellCommand cmd(AppName, args,  +                          TShellCommandOptions().SetUseShell(false).SetCloseAllFdsOnExec(true).SetAsync(false).SetLatency(1));  +        cmd.Run();           const TString& err = cmd.GetError(); -        const size_t msgIndex = err.find(ForkCorrectExitMsg); +        const size_t msgIndex = err.find(ForkCorrectExitMsg);  -        // everything is printed by parent process except test's result output ("good" or "fail") -        // which is printed by child. If there was no output - parent process prints default message. +        // everything is printed by parent process except test's result output ("good" or "fail")  +        // which is printed by child. If there was no output - parent process prints default message.           ForkExitedCorrectly = msgIndex != TString::npos; -        // TODO: stderr output is always printed after stdout -        Cout.Write(cmd.GetOutput()); -        Cerr.Write(err.c_str(), Min(msgIndex, err.size())); +        // TODO: stderr output is always printed after stdout  +        Cout.Write(cmd.GetOutput());  +        Cerr.Write(err.c_str(), Min(msgIndex, err.size()));  -        // do not use default case, so gcc will warn if new element in enum will be added -        switch (cmd.GetStatus()) { +        // do not use default case, so gcc will warn if new element in enum will be added  +        switch (cmd.GetStatus()) {               case TShellCommand::SHELL_FINISHED: {                  // test could fail with zero status if it calls exit(0) in the middle.                  if (ForkExitedCorrectly) @@ -508,40 +508,40 @@ private:                  ythrow yexception() << "Forked test failed with internal error: " << cmd.GetInternalError();              }          } -    } +    }  -private: -    bool PrintBeforeSuite_; -    bool PrintBeforeTest_; +private:  +    bool PrintBeforeSuite_;  +    bool PrintBeforeTest_;       bool PrintAfterTest_;      bool PrintAfterSuite_; -    bool PrintTimes_; +    bool PrintTimes_;       bool PrintSummary_;      THashSet<TString> DisabledSuites_;      THashSet<TString> EnabledSuites_;      THashSet<TString> DisabledTests_;      THashSet<TString> EnabledTests_; -    TInstant PrevTime_; -    bool ShowFails; +    TInstant PrevTime_;  +    bool ShowFails;       TVector<TString> Fails; -    size_t Start; -    size_t End; +    size_t Start;  +    size_t End;       TString AppName; -    bool ForkTests; -    bool IsForked; -    bool Loop; -    static const char* const ForkCorrectExitMsg; -    bool ForkExitedCorrectly; +    bool ForkTests;  +    bool IsForked;  +    bool Loop;  +    static const char* const ForkCorrectExitMsg;  +    bool ForkExitedCorrectly;       TAutoPtr<ITestSuiteProcessor> TraceProcessor; -}; - -const char* const TColoredProcessor::ForkCorrectExitMsg = "--END--"; - +};  +  +const char* const TColoredProcessor::ForkCorrectExitMsg = "--END--";  +   class TEnumeratingProcessor: public ITestSuiteProcessor {  public:      TEnumeratingProcessor(bool verbose, IOutputStream& stream) noexcept -        : Verbose_(verbose) -        , Stream_(stream) +        : Verbose_(verbose)  +        , Stream_(stream)       {      } @@ -571,7 +571,7 @@ private:  class TWinEnvironment {  public:      TWinEnvironment() -        : OutputCP(GetConsoleOutputCP()) +        : OutputCP(GetConsoleOutputCP())       {          setmode(fileno(stdout), _O_BINARY);          SetConsoleOutputCP(CP_UTF8); @@ -593,7 +593,7 @@ public:          SetConsoleOutputCP(OutputCP); // restore original output CP at program exit      } - +   private:      UINT OutputCP; // original codepage  }; @@ -648,15 +648,15 @@ int NUnitTest::RunMain(int argc, char** argv) {      }  #endif      NTesting::THook::CallBeforeInit(); -    InitNetworkSubSystem(); - -    try { +    InitNetworkSubSystem();  +  +    try {           GetExecPath(); -    } catch (...) { -    } - +    } catch (...) {  +    }  +   #ifndef UT_SKIP_EXCEPTIONS -    try { +    try {   #endif          NTesting::THook::CallBeforeRun();          Y_DEFER { NTesting::THook::CallAfterRun(); }; @@ -667,7 +667,7 @@ int NUnitTest::RunMain(int argc, char** argv) {          TColoredProcessor processor(GetExecPath());          IOutputStream* listStream = &Cout;          THolder<IOutputStream> listFile; - +           enum EListType {              DONT_LIST,              LIST, @@ -675,17 +675,17 @@ int NUnitTest::RunMain(int argc, char** argv) {          };          EListType listTests = DONT_LIST; -        for (size_t i = 1; i < (size_t)argc; ++i) { -            const char* name = argv[i]; - -            if (name && *name) { +        for (size_t i = 1; i < (size_t)argc; ++i) {  +            const char* name = argv[i];  +  +            if (name && *name) {                   if (strcmp(name, "--help") == 0 || strcmp(name, "-h") == 0) {                      return DoUsage(argv[0]);                  } else if (strcmp(name, "--list") == 0 || strcmp(name, "-l") == 0) {                      listTests = LIST;                  } else if (strcmp(name, "--list-verbose") == 0 || strcmp(name, "-A") == 0) {                      listTests = LIST_VERBOSE; -                } else if (strcmp(name, "--print-before-suite=false") == 0) { +                } else if (strcmp(name, "--print-before-suite=false") == 0) {                       processor.SetPrintBeforeSuite(false);                  } else if (strcmp(name, "--print-before-test=false") == 0) {                      processor.SetPrintBeforeTest(false); @@ -699,14 +699,14 @@ int NUnitTest::RunMain(int argc, char** argv) {                      processor.SetShowFails(false);                  } else if (strcmp(name, "--continue-on-fail") == 0) {                      processor.SetContinueOnFail(true); -                } else if (strcmp(name, "--print-times") == 0) { -                    processor.SetPrintTimes(true); -                } else if (strcmp(name, "--from") == 0) { -                    ++i; -                    processor.SetStart(FromString<size_t>(argv[i])); -                } else if (strcmp(name, "--to") == 0) { -                    ++i; -                    processor.SetEnd(FromString<size_t>(argv[i])); +                } else if (strcmp(name, "--print-times") == 0) {  +                    processor.SetPrintTimes(true);  +                } else if (strcmp(name, "--from") == 0) {  +                    ++i;  +                    processor.SetStart(FromString<size_t>(argv[i]));  +                } else if (strcmp(name, "--to") == 0) {  +                    ++i;  +                    processor.SetEnd(FromString<size_t>(argv[i]));                   } else if (strcmp(name, "--fork-tests") == 0) {                      processor.SetForkTests(true);                  } else if (strcmp(name, "--is-forked-internal") == 0) { @@ -735,19 +735,19 @@ int NUnitTest::RunMain(int argc, char** argv) {                  } else if (TString(name).StartsWith("--")) {                      return DoUsage(argv[0]), 1;                  } else if (*name == '-') { -                    processor.Disable(name + 1); -                } else if (*name == '+') { -                    processor.Enable(name + 1); -                } else { -                    processor.Enable(name); -                } -            } +                    processor.Disable(name + 1);  +                } else if (*name == '+') {  +                    processor.Enable(name + 1);  +                } else {  +                    processor.Enable(name);  +                }  +            }           }          if (listTests != DONT_LIST) {              return DoList(listTests == LIST_VERBOSE, *listStream);          } - -        TTestFactory::Instance().SetProcessor(&processor); +  +        TTestFactory::Instance().SetProcessor(&processor);           unsigned ret;          for (;;) { @@ -759,13 +759,13 @@ int NUnitTest::RunMain(int argc, char** argv) {              if (0 != ret || !processor.IsLoop()) {                  break;              } -        } +        }           return ret;  #ifndef UT_SKIP_EXCEPTIONS -    } catch (...) { -        Cerr << "caught exception in test suite(" << CurrentExceptionMessage() << ")" << Endl; -    } +    } catch (...) {  +        Cerr << "caught exception in test suite(" << CurrentExceptionMessage() << ")" << Endl;  +    }   #endif - -    return 1; -} +  +    return 1;  +}  diff --git a/library/cpp/testing/unittest/utmain.h b/library/cpp/testing/unittest/utmain.h index 65e8082ee13..07c288d5a5d 100644 --- a/library/cpp/testing/unittest/utmain.h +++ b/library/cpp/testing/unittest/utmain.h @@ -1,5 +1,5 @@ -#pragma once - -namespace NUnitTest { -    int RunMain(int argc, char** argv); -} +#pragma once  +  +namespace NUnitTest {  +    int RunMain(int argc, char** argv);  +}  diff --git a/library/cpp/testing/unittest/ya.make b/library/cpp/testing/unittest/ya.make index aaa4f2ba851..2d27845bb23 100644 --- a/library/cpp/testing/unittest/ya.make +++ b/library/cpp/testing/unittest/ya.make @@ -1,4 +1,4 @@ -LIBRARY() +LIBRARY()   PROVIDES(test_framework) @@ -6,26 +6,26 @@ OWNER(      pg      galaxycrab  ) - -PEERDIR( +  +PEERDIR(       library/cpp/colorizer      library/cpp/dbg_output      library/cpp/diff      library/cpp/json/writer      library/cpp/testing/common      library/cpp/testing/hook -) - -SRCS( -    gtest.cpp +)  +  +SRCS(  +    gtest.cpp       checks.cpp      plugin.cpp -    registar.cpp +    registar.cpp       tests_data.cpp -    utmain.cpp -) +    utmain.cpp  +)  -END() +END()   RECURSE_FOR_TESTS(      fat | 
