diff options
author | Jacques Lucke <jacques@blender.org> | 2020-09-07 20:36:24 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-09-07 21:04:00 +0300 |
commit | d2911124f42fd58d42b1b734c852980d5dbde401 (patch) | |
tree | 4849cefd96ace6d618c7fb8278738e9463aa395f /source/blender/blenlib/tests/BLI_vector_set_test.cc | |
parent | 6b436b80a45c947d49ab5fbda515fb02877eefd4 (diff) |
BLI: improve exception safety of VectorSet
For more information see rB2aff45146f1464ba8899368ad004522cb6a1a98c.
Diffstat (limited to 'source/blender/blenlib/tests/BLI_vector_set_test.cc')
-rw-r--r-- | source/blender/blenlib/tests/BLI_vector_set_test.cc | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/source/blender/blenlib/tests/BLI_vector_set_test.cc b/source/blender/blenlib/tests/BLI_vector_set_test.cc index 8f3db8d8403..320cb15f450 100644 --- a/source/blender/blenlib/tests/BLI_vector_set_test.cc +++ b/source/blender/blenlib/tests/BLI_vector_set_test.cc @@ -1,5 +1,6 @@ /* Apache License, Version 2.0 */ +#include "BLI_exception_safety_test_utils.hh" #include "BLI_strict_flags.h" #include "BLI_vector_set.hh" #include "testing/testing.h" @@ -161,4 +162,74 @@ TEST(vector_set, Remove) EXPECT_FALSE(set.contains(5)); } +TEST(vector_set, SpanConstructorExceptions) +{ + std::array<ExceptionThrower, 5> array = {1, 2, 3, 4, 5}; + array[3].throw_during_copy = true; + Span<ExceptionThrower> span = array; + + EXPECT_ANY_THROW({ VectorSet<ExceptionThrower> set(span); }); +} + +TEST(vector_set, CopyConstructorExceptions) +{ + VectorSet<ExceptionThrower> set = {1, 2, 3, 4, 5}; + set[3].throw_during_copy = true; + + EXPECT_ANY_THROW({ VectorSet<ExceptionThrower> set_copy(set); }); +} + +TEST(vector_set, MoveConstructorExceptions) +{ + VectorSet<ExceptionThrower> set = {1, 2, 3, 4, 5}; + set[3].throw_during_copy = true; + set[3].throw_during_move = true; + /* Currently never throws on move, because values are separately allocated. */ + VectorSet<ExceptionThrower> set_moved(std::move(set)); + EXPECT_EQ(set.size(), 0); /* NOLINT: bugprone-use-after-move */ + set.add_multiple({4, 5, 6, 7, 8}); + EXPECT_EQ(set.size(), 5); +} + +TEST(vector_set, AddNewExceptions) +{ + VectorSet<ExceptionThrower> set; + ExceptionThrower value; + value.throw_during_copy = true; + EXPECT_ANY_THROW({ set.add_new(value); }); + EXPECT_EQ(set.size(), 0); + EXPECT_ANY_THROW({ set.add_new(value); }); + EXPECT_EQ(set.size(), 0); +} + +TEST(vector_set, AddExceptions) +{ + VectorSet<ExceptionThrower> set; + ExceptionThrower value; + value.throw_during_copy = true; + EXPECT_ANY_THROW({ set.add(value); }); + EXPECT_EQ(set.size(), 0); + EXPECT_ANY_THROW({ set.add(value); }); + EXPECT_EQ(set.size(), 0); +} + +TEST(vector_set, ReserveExceptions) +{ + VectorSet<ExceptionThrower> set; + set.add_multiple({1, 2, 3, 4, 5}); + set[2].throw_during_move = true; + EXPECT_ANY_THROW({ set.reserve(100); }); +} + +TEST(vector_set, PopExceptions) +{ + VectorSet<ExceptionThrower> set = {1, 2, 3}; + set.as_span().last().throw_during_move = true; + EXPECT_EQ(set.size(), 3); + EXPECT_ANY_THROW({ set.pop(); }); /* NOLINT: bugprone-throw-keyword-missing */ + EXPECT_EQ(set.size(), 3); + set.add(10); + EXPECT_EQ(set.size(), 4); +} + } // namespace blender::tests |