1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include "context.h"
- #include <library/cpp/testing/unittest/registar.h>
- #include <util/generic/deque.h>
- #include <util/generic/yexception.h>
- Y_UNIT_TEST_SUITE(TestContext) {
- template <class F>
- static TContClosure Wrap(F& f) {
- struct TW: public ITrampoLine {
- inline TW(F* ff) noexcept
- : F_(ff)
- {
- }
- void DoRun() override {
- (*F_)();
- }
- F* F_;
- char Buf[1000000];
- };
- static TDeque<TW> w;
- auto& tw = w.emplace_back(&f);
- return {&tw, TArrayRef(tw.Buf, sizeof(tw.Buf))};
- }
- Y_UNIT_TEST(TestExceptionSafety) {
- TExceptionSafeContext main;
- TExceptionSafeContext* volatile nextPtr = nullptr;
- bool hasUncaught = true;
- auto func = [&]() {
- hasUncaught = UncaughtException();
- nextPtr->SwitchTo(&main);
- };
- auto closure = Wrap(func);
- TExceptionSafeContext next(closure);
- nextPtr = &next;
- struct THelper {
- inline ~THelper() {
- M->SwitchTo(N);
- }
- TExceptionSafeContext* M;
- TExceptionSafeContext* N;
- };
- bool throwed = false;
- try {
- THelper helper{&main, &next};
- throw 1;
- } catch (...) {
- throwed = true;
- }
- UNIT_ASSERT(throwed);
- UNIT_ASSERT(!hasUncaught);
- }
- } // Y_UNIT_TEST_SUITE(TestContext)
|