diff options
| author | Anton Samokhvalov <[email protected]> | 2022-02-10 16:45:17 +0300 | 
|---|---|---|
| committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:45:17 +0300 | 
| commit | d3a398281c6fd1d3672036cb2d63f842d2cb28c5 (patch) | |
| tree | dd4bd3ca0f36b817e96812825ffaf10d645803f2 /library/cpp/testing/unittest | |
| parent | 72cb13b4aff9bc9cf22e49251bc8fd143f82538f (diff) | |
Restoring authorship annotation for Anton Samokhvalov <[email protected]>. Commit 2 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 95baf5c9c21..c5712ae9d21 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 568a1c8e8fb..4807539ab28 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 52790f1fc6d..bcc1ce33f05 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 38f29dcdf8c..ebad1ea4d67 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 9db9e89757b..b6768b1bf0b 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 f03484a0893..543112f7ac6 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 f030654f975..102f2c1469e 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 606e18cefd0..3679b768ed4 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 3307ba7e551..44517a00924 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 NPrivate {  +namespace NUnitTest { +    class TTestBase; + +    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 08a4eb0790e..b51cbc4b87c 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 2c56bdb3b21..6536bc1ae69 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 cba1681c835..e303e21e30a 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 9b46bee6ee1..305bc6b40fc 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 void SetLoop(bool loop) { +        Loop = loop; +    } + +    inline bool IsLoop() const { +        return 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 07c288d5a5d..65e8082ee13 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 2d27845bb23..aaa4f2ba851 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 | 
