Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2020-09-07 20:36:24 +0300
committerJacques Lucke <jacques@blender.org>2020-09-07 21:04:00 +0300
commitd2911124f42fd58d42b1b734c852980d5dbde401 (patch)
tree4849cefd96ace6d618c7fb8278738e9463aa395f /source/blender/blenlib/tests/BLI_vector_set_test.cc
parent6b436b80a45c947d49ab5fbda515fb02877eefd4 (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.cc71
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