changing text in notices & readme. adding terminate handler for tests

This commit is contained in:
Jordan Maples [MSFT] 2019-12-12 10:55:26 -08:00
parent ec05ecd6b1
commit 4f6f05d463
15 changed files with 450 additions and 215 deletions

View File

@ -18,7 +18,7 @@ other platforms. Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for more inform
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
# Usage of Third Party Libraries # Usage of Third Party Libraries
This project makes use of the [Catch](https://github.com/philsquared/catch) testing library. Please see the [ThirdPartyNotices.txt](./ThirdPartyNotices.txt) file for details regarding the licensing of Catch. This project makes use of the [Google Test](https://github.com/google/gooletest) testing library. Please see the [ThirdPartyNotices.txt](./ThirdPartyNotices.txt) file for details regarding the licensing of Google Test.
# Quick Start # Quick Start
## Supported Platforms ## Supported Platforms

View File

@ -3,8 +3,6 @@ THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
Do Not Translate or Localize Do Not Translate or Localize
GSL: Guidelines Support Library incorporates third party material from the projects listed below. GSL: Guidelines Support Library incorporates third party material from the projects listed below.
The original copyright notice and the license under which Microsoft received such third party material are set forth below.
Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Software: Google Test Software: Google Test

View File

@ -188,5 +188,5 @@ function(add_gsl_test_noexcept name)
set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests_noexcept") set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests_noexcept")
endfunction() endfunction()
# add_gsl_test_noexcept(no_exception_throw_tests) add_gsl_test_noexcept(no_exception_throw_tests)
# add_gsl_test_noexcept(no_exception_ensure_tests) add_gsl_test_noexcept(no_exception_ensure_tests)

View File

@ -21,7 +21,7 @@
#endif #endif
#if __clang__ || __GNUC__ #if __clang__ || __GNUC__
//disable warnings from gtest // disable warnings from gtest
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wundef" #pragma GCC diagnostic ignored "-Wundef"
#endif #endif
@ -34,13 +34,18 @@
#include <gsl/gsl_algorithm> // for copy #include <gsl/gsl_algorithm> // for copy
#include <gsl/span> // for span #include <gsl/span> // for span
#include <array> // for array #include <array> // for array
#include <string_view>
#include <cstddef> // for size_t #include <cstddef> // for size_t
namespace gsl { namespace{
constexpr std::string_view deathstring("Expected Death");
}
namespace gsl
{
struct fail_fast; struct fail_fast;
} // namespace gsl } // namespace gsl
using namespace std; using namespace std;
using namespace gsl; using namespace gsl;
@ -58,7 +63,8 @@ TEST(algorithm_tests, same_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -75,7 +81,8 @@ TEST(algorithm_tests, same_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -92,7 +99,8 @@ TEST(algorithm_tests, same_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -109,7 +117,8 @@ TEST(algorithm_tests, same_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -129,7 +138,8 @@ TEST(algorithm_tests, compatible_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -146,7 +156,8 @@ TEST(algorithm_tests, compatible_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -163,7 +174,8 @@ TEST(algorithm_tests, compatible_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -180,7 +192,8 @@ TEST(algorithm_tests, compatible_type)
copy(src_span, dst_span); copy(src_span, dst_span);
copy(src_span, dst_span.subspan(src_span.size())); copy(src_span, dst_span.subspan(src_span.size()));
for (std::size_t i = 0; i < src.size(); ++i) { for (std::size_t i = 0; i < src.size(); ++i)
{
EXPECT_TRUE(dst[i] == src[i]); EXPECT_TRUE(dst[i] == src[i]);
EXPECT_TRUE(dst[i + src.size()] == src[i]); EXPECT_TRUE(dst[i + src.size()] == src[i]);
} }
@ -208,6 +221,11 @@ TEST(algorithm_tests, incompatible_type)
TEST(algorithm_tests, small_destination_span) TEST(algorithm_tests, small_destination_span)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. small_destination_span";
std::abort();
});
std::array<int, 12> src{1, 2, 3, 4}; std::array<int, 12> src{1, 2, 3, 4};
std::array<int, 4> dst{}; std::array<int, 4> dst{};
@ -216,9 +234,9 @@ TEST(algorithm_tests, small_destination_span)
const span<int> dst_span_dyn(dst); const span<int> dst_span_dyn(dst);
const span<int, 4> dst_span_static(dst); const span<int, 4> dst_span_static(dst);
EXPECT_DEATH(copy(src_span_dyn, dst_span_dyn), ".*"); EXPECT_DEATH(copy(src_span_dyn, dst_span_dyn), deathstring.data());
EXPECT_DEATH(copy(src_span_dyn, dst_span_static), ".*"); EXPECT_DEATH(copy(src_span_dyn, dst_span_static), deathstring.data());
EXPECT_DEATH(copy(src_span_static, dst_span_dyn), ".*"); EXPECT_DEATH(copy(src_span_static, dst_span_dyn), deathstring.data());
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
copy(src_span_static, dst_span_static); copy(src_span_static, dst_span_static);

View File

@ -34,7 +34,7 @@
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <gsl/gsl_assert> // for fail_fast (ptr only), Ensures, Expects #include <gsl/gsl_assert> // for fail_fast (ptr only), Ensures, Expects
#include <string_view>
using namespace gsl; using namespace gsl;
namespace namespace
@ -51,19 +51,31 @@ int g(int i)
Ensures(i > 0 && i < 10); Ensures(i > 0 && i < 10);
return i; return i;
} }
constexpr std::string_view deathstring("Expected Death");
} // namespace } // namespace
TEST(assertion_tests, expects) TEST(assertion_tests, expects)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. expects";
std::abort();
});
EXPECT_TRUE(f(2) == 2); EXPECT_TRUE(f(2) == 2);
EXPECT_DEATH(f(10), ".*"); EXPECT_DEATH(f(10), deathstring.data());
} }
TEST(assertion_tests, ensures) TEST(assertion_tests, ensures)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. ensures";
std::abort();
});
EXPECT_TRUE(g(2) == 3); EXPECT_TRUE(g(2) == 3);
EXPECT_DEATH(g(9), ".*"); EXPECT_DEATH(g(9), deathstring.data());
} }
#if __clang__ || __GNUC__ #if __clang__ || __GNUC__

View File

@ -40,6 +40,10 @@
#include <initializer_list> // for initializer_list #include <initializer_list> // for initializer_list
#include <vector> // for vector #include <vector> // for vector
namespace{
constexpr std::string_view deathstring("Expected Death");
}
TEST(at_tests, static_array) TEST(at_tests, static_array)
{ {
int a[4] = {1, 2, 3, 4}; int a[4] = {1, 2, 3, 4};
@ -50,10 +54,15 @@ TEST(at_tests, static_array)
EXPECT_TRUE(&gsl::at(c_a, i) == &a[i]); EXPECT_TRUE(&gsl::at(c_a, i) == &a[i]);
} }
EXPECT_DEATH(gsl::at(a, -1), ".*"); std::set_terminate([] {
EXPECT_DEATH(gsl::at(a, 4), ".*"); std::cerr << "Expected Death. static_array";
EXPECT_DEATH(gsl::at(c_a, -1), ".*"); std::abort();
EXPECT_DEATH(gsl::at(c_a, 4), ".*"); });
EXPECT_DEATH(gsl::at(a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(a, 4), deathstring.data());
EXPECT_DEATH(gsl::at(c_a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(c_a, 4), deathstring.data());
} }
TEST(at_tests, std_array) TEST(at_tests, std_array)
@ -66,13 +75,18 @@ TEST(at_tests, std_array)
EXPECT_TRUE(&gsl::at(c_a, i) == &a[static_cast<std::size_t>(i)]); EXPECT_TRUE(&gsl::at(c_a, i) == &a[static_cast<std::size_t>(i)]);
} }
EXPECT_DEATH(gsl::at(a, -1), ".*"); std::set_terminate([] {
EXPECT_DEATH(gsl::at(a, 4), ".*"); std::cerr << "Expected Death. std_array";
EXPECT_DEATH(gsl::at(c_a, -1), ".*"); std::abort();
EXPECT_DEATH(gsl::at(c_a, 4), ".*"); });
EXPECT_DEATH(gsl::at(a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(a, 4), deathstring.data());
EXPECT_DEATH(gsl::at(c_a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(c_a, 4), deathstring.data());
} }
TEST(at_tests, StdVector) TEST(at_tests, std_vector)
{ {
std::vector<int> a = {1, 2, 3, 4}; std::vector<int> a = {1, 2, 3, 4};
const std::vector<int>& c_a = a; const std::vector<int>& c_a = a;
@ -82,10 +96,15 @@ TEST(at_tests, StdVector)
EXPECT_TRUE(&gsl::at(c_a, i) == &a[static_cast<std::size_t>(i)]); EXPECT_TRUE(&gsl::at(c_a, i) == &a[static_cast<std::size_t>(i)]);
} }
EXPECT_DEATH(gsl::at(a, -1), ".*"); std::set_terminate([] {
EXPECT_DEATH(gsl::at(a, 4), ".*"); std::cerr << "Expected Death. std_vector";
EXPECT_DEATH(gsl::at(c_a, -1), ".*"); std::abort();
EXPECT_DEATH(gsl::at(c_a, 4), ".*"); });
EXPECT_DEATH(gsl::at(a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(a, 4), deathstring.data());
EXPECT_DEATH(gsl::at(c_a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(c_a, 4), deathstring.data());
} }
TEST(at_tests, InitializerList) TEST(at_tests, InitializerList)
@ -97,10 +116,15 @@ TEST(at_tests, InitializerList)
EXPECT_TRUE(gsl::at({1, 2, 3, 4}, i) == i + 1); EXPECT_TRUE(gsl::at({1, 2, 3, 4}, i) == i + 1);
} }
EXPECT_DEATH(gsl::at(a, -1), ".*"); std::set_terminate([] {
EXPECT_DEATH(gsl::at(a, 4), ".*"); std::cerr << "Expected Death. InitializerList";
EXPECT_DEATH(gsl::at({1, 2, 3, 4}, -1), ".*"); std::abort();
EXPECT_DEATH(gsl::at({1, 2, 3, 4}, 4), ".*"); });
EXPECT_DEATH(gsl::at(a, -1), deathstring.data());
EXPECT_DEATH(gsl::at(a, 4), deathstring.data());
EXPECT_DEATH(gsl::at({1, 2, 3, 4}, -1), deathstring.data());
EXPECT_DEATH(gsl::at({1, 2, 3, 4}, 4), deathstring.data());
} }
#if !defined(_MSC_VER) || defined(__clang__) || _MSC_VER >= 1910 #if !defined(_MSC_VER) || defined(__clang__) || _MSC_VER >= 1910

View File

@ -107,6 +107,11 @@ TEST(bounds_tests, bounds_convertible)
static_bounds<dynamic_range> b5; static_bounds<dynamic_range> b5;
static_bounds<34> b6; static_bounds<34> b6;
std::set_terminate([] {
std::cerr << "Expected Death. bounds_convertible";
std::abort();
});
b5 = static_bounds<20>(); b5 = static_bounds<20>();
EXPECT_DEATH(b6 = b5, ".*"); EXPECT_DEATH(b6 = b5, ".*");
b5 = static_bounds<34>(); b5 = static_bounds<34>();

View File

@ -138,6 +138,8 @@ void fn(const Bounds&)
{ {
static_assert(Bounds::static_size == 60, "static bounds is wrong size"); static_assert(Bounds::static_size == 60, "static bounds is wrong size");
} }
constexpr std::string_view deathstring("Expected Death");
} // namespace } // namespace
TEST(multi_span_test, default_constructor) TEST(multi_span_test, default_constructor)
@ -253,20 +255,25 @@ TEST(multi_span_test, from_nullptr_length_constructor) {
EXPECT_TRUE(cs.data() == nullptr); EXPECT_TRUE(cs.data() == nullptr);
} }
std::set_terminate([] {
std::cerr << "Expected Death. from_nullptr_length_constructor";
std::abort();
});
{ {
auto workaround_macro = []() { const multi_span<int> s{nullptr, 1}; }; auto workaround_macro = []() { const multi_span<int> s{nullptr, 1}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
auto const_workaround_macro = []() { const multi_span<const int> cs{nullptr, 1}; }; auto const_workaround_macro = []() { const multi_span<const int> cs{nullptr, 1}; };
EXPECT_DEATH(const_workaround_macro(), ".*"); EXPECT_DEATH(const_workaround_macro(), deathstring.data());
} }
{ {
auto workaround_macro = []() { const multi_span<int, 0> s{nullptr, 1}; }; auto workaround_macro = []() { const multi_span<int, 0> s{nullptr, 1}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
auto const_workaround_macro = []() { const multi_span<const int, 0> s{nullptr, 1}; }; auto const_workaround_macro = []() { const multi_span<const int, 0> s{nullptr, 1}; };
EXPECT_DEATH(const_workaround_macro(), ".*"); EXPECT_DEATH(const_workaround_macro(), deathstring.data());
} }
{ {
@ -370,10 +377,15 @@ TEST(multi_span_test, from_pointer_length_constructor)
EXPECT_TRUE(s.data() == nullptr); EXPECT_TRUE(s.data() == nullptr);
} }
std::set_terminate([] {
std::cerr << "Expected Death. from_pointer_length_constructor";
std::abort();
});
{ {
int* p = nullptr; int* p = nullptr;
auto workaround_macro = [=]() { const multi_span<int> s{p, 2}; }; auto workaround_macro = [=]() { const multi_span<int> s{p, 2}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
} }
@ -409,27 +421,33 @@ TEST(multi_span_test, from_pointer_pointer_constructor)
EXPECT_TRUE(s.data() == &arr[0]); EXPECT_TRUE(s.data() == &arr[0]);
} }
std::set_terminate([] {
std::cerr << "Expected Death. from_pointer_pointer_constructor";
std::abort();
});
{ {
auto workaround_macro = [&]() { const multi_span<int> s{&arr[1], &arr[0]}; }; auto workaround_macro = [&]() { const multi_span<int> s{&arr[1], &arr[0]}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
int* p = nullptr; int* p = nullptr;
auto workaround_macro = [&]() { const multi_span<int> s{&arr[0], p}; }; auto workaround_macro = [&]() { const multi_span<int> s{&arr[0], p}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
int* p = nullptr; int* p = nullptr;
auto workaround_macro = [&]() { const multi_span<int> s{p, p}; }; auto workaround_macro = [&]() { const multi_span<int> s{p, p}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
int* p = nullptr; int* p = nullptr;
auto workaround_macro = [&]() { const multi_span<int> s{&arr[0], p}; }; auto workaround_macro = [&]() { const multi_span<int> s{&arr[0], p}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
} }
@ -578,11 +596,16 @@ TEST(multi_span_test, from_dynamic_array_constructor)
{ {
double(*arr)[3][4] = new double[100][3][4]; double(*arr)[3][4] = new double[100][3][4];
std::set_terminate([] {
std::cerr << "Expected Death. from_nullptr_length_constructor";
std::abort();
});
{ {
multi_span<double, dynamic_range, 3, 4> s(arr, 10); multi_span<double, dynamic_range, 3, 4> s(arr, 10);
EXPECT_TRUE(s.length() == 120); EXPECT_TRUE(s.length() == 120);
EXPECT_TRUE(s.data() == &arr[0][0][0]); EXPECT_TRUE(s.data() == &arr[0][0][0]);
EXPECT_DEATH(s[10][3][4], ".*"); EXPECT_DEATH(s[10][3][4], deathstring.data());
} }
{ {
@ -809,8 +832,13 @@ TEST(multi_span_test, from_convertible_span_constructor)
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
multi_span<int, 7, 4, 2> av1(nullptr, b1); multi_span<int, 7, 4, 2> av1(nullptr, b1);
std::set_terminate([] {
std::cerr << "Expected Death. from_convertible_span_constructor";
std::abort();
});
auto f = [&]() { multi_span<int, 7, 4, 2> av1(nullptr); }; auto f = [&]() { multi_span<int, 7, 4, 2> av1(nullptr); };
EXPECT_DEATH(f(), ".*"); EXPECT_DEATH(f(), deathstring.data());
#endif #endif
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
@ -910,7 +938,13 @@ TEST(multi_span_test, first)
EXPECT_TRUE(av.first<6>().length() == 6); EXPECT_TRUE(av.first<6>().length() == 6);
EXPECT_TRUE(av.first<-1>().length() == -1); EXPECT_TRUE(av.first<-1>().length() == -1);
#endif #endif
EXPECT_DEATH(av.first(6).length(), ".*");
std::set_terminate([] {
std::cerr << "Expected Death. first";
std::abort();
});
EXPECT_DEATH(av.first(6).length(), deathstring.data());
} }
{ {
@ -952,7 +986,13 @@ TEST(multi_span_test, last)
EXPECT_TRUE(av.last<6>().bounds() == static_bounds<6>()); EXPECT_TRUE(av.last<6>().bounds() == static_bounds<6>());
EXPECT_TRUE(av.last<6>().length() == 6); EXPECT_TRUE(av.last<6>().length() == 6);
#endif #endif
EXPECT_DEATH(av.last(6).length(), ".*");
std::set_terminate([] {
std::cerr << "Expected Death. last";
std::abort();
});
EXPECT_DEATH(av.last(6).length(), deathstring.data());
} }
{ {
@ -982,13 +1022,18 @@ TEST(multi_span_test, subspan)
EXPECT_TRUE(av.subspan(0, 0).length() == 0); EXPECT_TRUE(av.subspan(0, 0).length() == 0);
} }
std::set_terminate([] {
std::cerr << "Expected Death. subspan";
std::abort();
});
{ {
multi_span<int, 5> av = arr; multi_span<int, 5> av = arr;
EXPECT_TRUE((av.subspan<0, 5>().bounds()) == static_bounds<5>()); EXPECT_TRUE((av.subspan<0, 5>().bounds()) == static_bounds<5>());
EXPECT_TRUE((av.subspan<0, 5>().length()) == 5); EXPECT_TRUE((av.subspan<0, 5>().length()) == 5);
EXPECT_TRUE(av.subspan(0, 5).length() == 5); EXPECT_TRUE(av.subspan(0, 5).length() == 5);
EXPECT_DEATH(av.subspan(0, 6).length(), ".*"); EXPECT_DEATH(av.subspan(0, 6).length(), deathstring.data());
EXPECT_DEATH(av.subspan(1, 5).length(), ".*"); EXPECT_DEATH(av.subspan(1, 5).length(), deathstring.data());
} }
{ {
@ -996,7 +1041,7 @@ TEST(multi_span_test, subspan)
EXPECT_TRUE((av.subspan<5, 0>().bounds()) == static_bounds<0>()); EXPECT_TRUE((av.subspan<5, 0>().bounds()) == static_bounds<0>());
EXPECT_TRUE((av.subspan<5, 0>().length()) == 0); EXPECT_TRUE((av.subspan<5, 0>().length()) == 0);
EXPECT_TRUE(av.subspan(5, 0).length() == 0); EXPECT_TRUE(av.subspan(5, 0).length() == 0);
EXPECT_DEATH(av.subspan(6, 0).length(), ".*"); EXPECT_DEATH(av.subspan(6, 0).length(), deathstring.data());
} }
{ {
@ -1004,13 +1049,13 @@ TEST(multi_span_test, subspan)
EXPECT_TRUE((av.subspan<0, 0>().bounds()) == static_bounds<0>()); EXPECT_TRUE((av.subspan<0, 0>().bounds()) == static_bounds<0>());
EXPECT_TRUE((av.subspan<0, 0>().length()) == 0); EXPECT_TRUE((av.subspan<0, 0>().length()) == 0);
EXPECT_TRUE(av.subspan(0, 0).length() == 0); EXPECT_TRUE(av.subspan(0, 0).length() == 0);
EXPECT_DEATH((av.subspan<1, 0>().length()), ".*"); EXPECT_DEATH((av.subspan<1, 0>().length()), deathstring.data());
} }
{ {
multi_span<int> av; multi_span<int> av;
EXPECT_TRUE(av.subspan(0).length() == 0); EXPECT_TRUE(av.subspan(0).length() == 0);
EXPECT_DEATH(av.subspan(1).length(), ".*"); EXPECT_DEATH(av.subspan(1).length(), deathstring.data());
} }
{ {
@ -1019,7 +1064,7 @@ TEST(multi_span_test, subspan)
EXPECT_TRUE(av.subspan(1).length() == 4); EXPECT_TRUE(av.subspan(1).length() == 4);
EXPECT_TRUE(av.subspan(4).length() == 1); EXPECT_TRUE(av.subspan(4).length() == 1);
EXPECT_TRUE(av.subspan(5).length() == 0); EXPECT_TRUE(av.subspan(5).length() == 0);
EXPECT_DEATH(av.subspan(6).length(), ".*"); EXPECT_DEATH(av.subspan(6).length(), deathstring.data());
auto av2 = av.subspan(1); auto av2 = av.subspan(1);
for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2); for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2);
} }
@ -1030,7 +1075,7 @@ TEST(multi_span_test, subspan)
EXPECT_TRUE(av.subspan(1).length() == 4); EXPECT_TRUE(av.subspan(1).length() == 4);
EXPECT_TRUE(av.subspan(4).length() == 1); EXPECT_TRUE(av.subspan(4).length() == 1);
EXPECT_TRUE(av.subspan(5).length() == 0); EXPECT_TRUE(av.subspan(5).length() == 0);
EXPECT_DEATH(av.subspan(6).length(), ".*"); EXPECT_DEATH(av.subspan(6).length(), deathstring.data());
auto av2 = av.subspan(1); auto av2 = av.subspan(1);
for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2); for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2);
} }
@ -1059,11 +1104,16 @@ TEST(multi_span_test, rank)
TEST(multi_span_test, extent) TEST(multi_span_test, extent)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. extent";
std::abort();
});
{ {
multi_span<int> s; multi_span<int> s;
EXPECT_TRUE(s.extent() == 0); EXPECT_TRUE(s.extent() == 0);
EXPECT_TRUE(s.extent(0) == 0); EXPECT_TRUE(s.extent(0) == 0);
EXPECT_DEATH(s.extent(1), ".*"); EXPECT_DEATH(s.extent(1), deathstring.data());
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
EXPECT_TRUE(s.extent<1>() == 0); EXPECT_TRUE(s.extent<1>() == 0);
#endif #endif
@ -1073,7 +1123,7 @@ TEST(multi_span_test, extent)
multi_span<int, 0> s; multi_span<int, 0> s;
EXPECT_TRUE(s.extent() == 0); EXPECT_TRUE(s.extent() == 0);
EXPECT_TRUE(s.extent(0) == 0); EXPECT_TRUE(s.extent(0) == 0);
EXPECT_DEATH(s.extent(1), ".*"); EXPECT_DEATH(s.extent(1), deathstring.data());
} }
{ {
@ -1085,7 +1135,7 @@ TEST(multi_span_test, extent)
EXPECT_TRUE(s.extent<1>() == 2); EXPECT_TRUE(s.extent<1>() == 2);
EXPECT_TRUE(s.extent(0) == 1); EXPECT_TRUE(s.extent(0) == 1);
EXPECT_TRUE(s.extent(1) == 2); EXPECT_TRUE(s.extent(1) == 2);
EXPECT_DEATH(s.extent(3), ".*"); EXPECT_DEATH(s.extent(3), deathstring.data());
} }
{ {
@ -1097,7 +1147,7 @@ TEST(multi_span_test, extent)
EXPECT_TRUE(s.extent<1>() == 2); EXPECT_TRUE(s.extent<1>() == 2);
EXPECT_TRUE(s.extent(0) == 0); EXPECT_TRUE(s.extent(0) == 0);
EXPECT_TRUE(s.extent(1) == 2); EXPECT_TRUE(s.extent(1) == 2);
EXPECT_DEATH(s.extent(3), ".*"); EXPECT_DEATH(s.extent(3), deathstring.data());
} }
} }
@ -1105,10 +1155,15 @@ TEST(multi_span_test, operator_function_call)
{ {
int arr[4] = {1, 2, 3, 4}; int arr[4] = {1, 2, 3, 4};
std::set_terminate([] {
std::cerr << "Expected Death. operator_function_call";
std::abort();
});
{ {
multi_span<int> s = arr; multi_span<int> s = arr;
EXPECT_TRUE(s(0) == 1); EXPECT_TRUE(s(0) == 1);
EXPECT_DEATH(s(5), ".*"); EXPECT_DEATH(s(5), deathstring.data());
} }
int arr2d[2][3] = {1, 2, 3, 4, 5, 6}; int arr2d[2][3] = {1, 2, 3, 4, 5, 6};
@ -1261,18 +1316,23 @@ TEST(multi_span_test, bounds_checks)
av[2][0] = 1; av[2][0] = 1;
av[1][1] = 3; av[1][1] = 3;
std::set_terminate([] {
std::cerr << "Expected Death. bounds_check";
std::abort();
});
// out of bounds // out of bounds
EXPECT_DEATH(av[1][3] = 3, ".*"); EXPECT_DEATH(av[1][3] = 3, deathstring.data());
EXPECT_DEATH((av[{1, 3}] = 3), ".*"); EXPECT_DEATH((av[{1, 3}] = 3), deathstring.data());
EXPECT_DEATH(av[10][2], ".*"); EXPECT_DEATH(av[10][2], deathstring.data());
EXPECT_DEATH((av[{10, 2}]), ".*"); EXPECT_DEATH((av[{10, 2}]), deathstring.data());
EXPECT_DEATH(av[-1][0], ".*"); EXPECT_DEATH(av[-1][0], deathstring.data());
EXPECT_DEATH((av[{-1, 0}]), ".*"); EXPECT_DEATH((av[{-1, 0}]), deathstring.data());
EXPECT_DEATH(av[0][-1], ".*"); EXPECT_DEATH(av[0][-1], deathstring.data());
EXPECT_DEATH((av[{0, -1}]), ".*"); EXPECT_DEATH((av[{0, -1}]), deathstring.data());
} }
TEST(multi_span_test, span_parameter_test) TEST(multi_span_test, span_parameter_test)
@ -1390,13 +1450,18 @@ TEST(multi_span_test, as_multi_span)
TEST(multi_span_test, empty_spans) TEST(multi_span_test, empty_spans)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. empty_spans";
std::abort();
});
{ {
multi_span<int, 0> empty_av(nullptr); multi_span<int, 0> empty_av(nullptr);
EXPECT_TRUE(empty_av.bounds().index_bounds() == multi_span_index<1>{0}); EXPECT_TRUE(empty_av.bounds().index_bounds() == multi_span_index<1>{0});
EXPECT_DEATH(empty_av[0], ".*"); EXPECT_DEATH(empty_av[0], deathstring.data());
EXPECT_DEATH(empty_av.begin()[0], ".*"); EXPECT_DEATH(empty_av.begin()[0], deathstring.data());
EXPECT_DEATH(empty_av.cbegin()[0], ".*"); EXPECT_DEATH(empty_av.cbegin()[0], deathstring.data());
for (auto& v : empty_av) for (auto& v : empty_av)
{ {
(void) v; (void) v;
@ -1407,9 +1472,9 @@ TEST(multi_span_test, empty_spans)
{ {
multi_span<int> empty_av = {}; multi_span<int> empty_av = {};
EXPECT_TRUE(empty_av.bounds().index_bounds() == multi_span_index<1>{0}); EXPECT_TRUE(empty_av.bounds().index_bounds() == multi_span_index<1>{0});
EXPECT_DEATH(empty_av[0], ".*"); EXPECT_DEATH(empty_av[0], deathstring.data());
EXPECT_DEATH(empty_av.begin()[0], ".*"); EXPECT_DEATH(empty_av.begin()[0], deathstring.data());
EXPECT_DEATH(empty_av.cbegin()[0], ".*"); EXPECT_DEATH(empty_av.cbegin()[0], deathstring.data());
for (auto& v : empty_av) for (auto& v : empty_av)
{ {
(void) v; (void) v;
@ -1639,7 +1704,12 @@ TEST(multi_span_test, span_structure_size)
}; };
EXPECT_TRUE(sizeof(av1) == sizeof(EffectiveStructure)); EXPECT_TRUE(sizeof(av1) == sizeof(EffectiveStructure));
EXPECT_DEATH(av1[10][3][4], ".*"); std::set_terminate([] {
std::cerr << "Expected Death. span_structure_size";
std::abort();
});
EXPECT_DEATH(av1[10][3][4], deathstring.data());
multi_span<const double, dynamic_range, 6, 4> av2 = multi_span<const double, dynamic_range, 6, 4> av2 =
as_multi_span(av1, dim(5), dim<6>(), dim<4>()); as_multi_span(av1, dim(5), dim<6>(), dim<4>());
@ -1727,12 +1797,18 @@ TEST(multi_span_test, fixed_size_conversions)
multi_span<int, 4> av4 = av2; multi_span<int, 4> av4 = av2;
} }
#endif #endif
std::set_terminate([] {
std::cerr << "Expected Death. fixed_size_conversions";
std::abort();
});
{ {
auto f = [&]() { auto f = [&]() {
const multi_span<int, 4> av9 = {arr2, 2}; const multi_span<int, 4> av9 = {arr2, 2};
(void) av9; (void) av9;
}; };
EXPECT_DEATH(f(), ".*"); EXPECT_DEATH(f(), deathstring.data());
} }
// this should fail - we are trying to assign a small dynamic a_v to a fixed_size larger one // this should fail - we are trying to assign a small dynamic a_v to a fixed_size larger one
@ -1741,7 +1817,7 @@ TEST(multi_span_test, fixed_size_conversions)
const multi_span<int, 4> av2 = av; const multi_span<int, 4> av2 = av;
(void) av2; (void) av2;
}; };
EXPECT_DEATH(f(), ".*"); EXPECT_DEATH(f(), deathstring.data());
} }
TEST(multi_span_test, as_writeable_bytes) TEST(multi_span_test, as_writeable_bytes)

View File

@ -52,6 +52,10 @@ struct fail_fast;
using namespace gsl; using namespace gsl;
namespace{
constexpr std::string_view deathstring("Expected Death");
}
struct MyBase struct MyBase
{ {
}; };
@ -163,6 +167,10 @@ TEST(notnull_tests, TestNotNullConstructors)
#endif #endif
} }
std::set_terminate([] {
std::cerr << "Expected Death. TestNotNullConstructors";
std::abort();
});
{ {
// from shared pointer // from shared pointer
int i = 12; int i = 12;
@ -174,7 +182,7 @@ TEST(notnull_tests, TestNotNullConstructors)
std::make_shared<int>(10)); // shared_ptr<int> is nullptr assignable std::make_shared<int>(10)); // shared_ptr<int> is nullptr assignable
int* pi = nullptr; int* pi = nullptr;
EXPECT_DEATH((not_null<decltype(pi)>(pi)), ".*"); EXPECT_DEATH((not_null<decltype(pi)>(pi)), deathstring.data());
} }
{ {
@ -231,8 +239,8 @@ TEST(notnull_tests, TestNotNullConstructors)
{ {
// from returned pointer // from returned pointer
EXPECT_DEATH(helper(return_pointer()), ".*"); EXPECT_DEATH(helper(return_pointer()), deathstring.data());
EXPECT_DEATH(helper_const(return_pointer()), ".*"); EXPECT_DEATH(helper_const(return_pointer()), deathstring.data());
} }
} }
@ -292,12 +300,17 @@ TEST(notnull_tests, TestNotNullCasting)
TEST(notnull_tests, TestNotNullAssignment) TEST(notnull_tests, TestNotNullAssignment)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. TestNotNullAssignmentd";
std::abort();
});
int i = 12; int i = 12;
not_null<int*> p(&i); not_null<int*> p(&i);
EXPECT_TRUE(helper(p)); EXPECT_TRUE(helper(p));
int* q = nullptr; int* q = nullptr;
EXPECT_DEATH(p = not_null<int*>(q), ".*"); EXPECT_DEATH(p = not_null<int*>(q), deathstring.data());
} }
TEST(notnull_tests, TestNotNullRawPointerComparison) TEST(notnull_tests, TestNotNullRawPointerComparison)
@ -446,12 +459,17 @@ TEST(notnull_tests, TestNotNullConstructorTypeDeduction)
EXPECT_TRUE(*x == 42); EXPECT_TRUE(*x == 42);
} }
std::set_terminate([] {
std::cerr << "Expected Death. TestNotNullConstructorTypeDeduction";
std::abort();
});
{ {
auto workaround_macro = []() { auto workaround_macro = []() {
int* p1 = nullptr; int* p1 = nullptr;
const not_null x{p1}; const not_null x{p1};
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
@ -459,14 +477,14 @@ TEST(notnull_tests, TestNotNullConstructorTypeDeduction)
const int* p1 = nullptr; const int* p1 = nullptr;
const not_null x{p1}; const not_null x{p1};
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
int* p = nullptr; int* p = nullptr;
EXPECT_DEATH(helper(not_null{p}), ".*"); EXPECT_DEATH(helper(not_null{p}), deathstring.data());
EXPECT_DEATH(helper_const(not_null{p}), ".*"); EXPECT_DEATH(helper_const(not_null{p}), deathstring.data());
} }
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
@ -502,13 +520,18 @@ TEST(notnull_tests, TestMakeNotNull)
EXPECT_TRUE(*x == 42); EXPECT_TRUE(*x == 42);
} }
std::set_terminate([] {
std::cerr << "Expected Death. TestMakeNotNull";
std::abort();
});
{ {
const auto workaround_macro = []() { const auto workaround_macro = []() {
int* p1 = nullptr; int* p1 = nullptr;
const auto x = make_not_null(p1); const auto x = make_not_null(p1);
EXPECT_TRUE(*x == 42); EXPECT_TRUE(*x == 42);
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
@ -517,21 +540,21 @@ TEST(notnull_tests, TestMakeNotNull)
const auto x = make_not_null(p1); const auto x = make_not_null(p1);
EXPECT_TRUE(*x == 42); EXPECT_TRUE(*x == 42);
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
int* p = nullptr; int* p = nullptr;
EXPECT_DEATH(helper(make_not_null(p)), ".*"); EXPECT_DEATH(helper(make_not_null(p)), deathstring.data());
EXPECT_DEATH(helper_const(make_not_null(p)), ".*"); EXPECT_DEATH(helper_const(make_not_null(p)), deathstring.data());
} }
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
{ {
EXPECT_DEATH(make_not_null(nullptr), ".*"); EXPECT_DEATH(make_not_null(nullptr), deathstring.data());
EXPECT_DEATH(helper(make_not_null(nullptr)), ".*"); EXPECT_DEATH(helper(make_not_null(nullptr)), deathstring.data());
EXPECT_DEATH(helper_const(make_not_null(nullptr)), ".*"); EXPECT_DEATH(helper_const(make_not_null(nullptr)), deathstring.data());
} }
#endif #endif
} }

View File

@ -75,6 +75,7 @@ struct AddressOverloaded
return {}; return {};
} }
}; };
constexpr std::string_view deathstring("Expected Death");
} // namespace } // namespace
TEST(span_test, constructors) TEST(span_test, constructors)
@ -121,6 +122,10 @@ TEST(span_test, size_optimization)
TEST(span_test, from_nullptr_size_constructor) TEST(span_test, from_nullptr_size_constructor)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. from_nullptr_size_constructor";
std::abort();
});
{ {
span<int> s{nullptr, narrow_cast<span<int>::index_type>(0)}; span<int> s{nullptr, narrow_cast<span<int>::index_type>(0)};
EXPECT_TRUE(s.size() == 0); EXPECT_TRUE(s.size() == 0);
@ -134,21 +139,21 @@ TEST(span_test, from_nullptr_size_constructor)
auto workaround_macro = []() { auto workaround_macro = []() {
const span<int, 1> s{nullptr, narrow_cast<span<int>::index_type>(0)}; const span<int, 1> s{nullptr, narrow_cast<span<int>::index_type>(0)};
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
auto workaround_macro = []() { const span<int> s{nullptr, 1}; }; auto workaround_macro = []() { const span<int> s{nullptr, 1}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
auto const_workaround_macro = []() { const span<const int> s{nullptr, 1}; }; auto const_workaround_macro = []() { const span<const int> s{nullptr, 1}; };
EXPECT_DEATH(const_workaround_macro(), ".*"); EXPECT_DEATH(const_workaround_macro(), deathstring.data());
} }
{ {
auto workaround_macro = []() { const span<int, 0> s{nullptr, 1}; }; auto workaround_macro = []() { const span<int, 0> s{nullptr, 1}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
auto const_workaround_macro = []() { const span<const int, 0> s{nullptr, 1}; }; auto const_workaround_macro = []() { const span<const int, 0> s{nullptr, 1}; };
EXPECT_DEATH(const_workaround_macro(), ".*"); EXPECT_DEATH(const_workaround_macro(), deathstring.data());
} }
{ {
span<int*> s{nullptr, narrow_cast<span<int>::index_type>(0)}; span<int*> s{nullptr, narrow_cast<span<int>::index_type>(0)};
@ -163,6 +168,10 @@ TEST(span_test, from_nullptr_size_constructor)
TEST(span_test, from_pointer_length_constructor) TEST(span_test, from_pointer_length_constructor)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. from_pointer_length_constructor";
std::abort();
});
int arr[4] = {1, 2, 3, 4}; int arr[4] = {1, 2, 3, 4};
{ {
@ -214,7 +223,7 @@ TEST(span_test, from_pointer_length_constructor)
{ {
int* p = nullptr; int* p = nullptr;
auto workaround_macro = [=]() { const span<int> s{p, 2}; }; auto workaround_macro = [=]() { const span<int> s{p, 2}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
@ -235,7 +244,7 @@ TEST(span_test, from_pointer_length_constructor)
{ {
int* p = nullptr; int* p = nullptr;
auto workaround_macro = [=]() { make_span(p, 2); }; auto workaround_macro = [=]() { make_span(p, 2); };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
} }
@ -273,14 +282,14 @@ TEST(span_test, from_pointer_pointer_construction)
// this will fail the std::distance() precondition, which asserts on MSVC debug builds // this will fail the std::distance() precondition, which asserts on MSVC debug builds
//{ //{
// auto workaround_macro = [&]() { span<int> s{&arr[1], &arr[0]}; }; // auto workaround_macro = [&]() { span<int> s{&arr[1], &arr[0]}; };
// EXPECT_DEATH(workaround_macro(), ".*"); // EXPECT_DEATH(workaround_macro(), deathstring.data());
//} //}
// this will fail the std::distance() precondition, which asserts on MSVC debug builds // this will fail the std::distance() precondition, which asserts on MSVC debug builds
//{ //{
// int* p = nullptr; // int* p = nullptr;
// auto workaround_macro = [&]() { span<int> s{&arr[0], p}; }; // auto workaround_macro = [&]() { span<int> s{&arr[0], p}; };
// EXPECT_DEATH(workaround_macro(), ".*"); // EXPECT_DEATH(workaround_macro(), deathstring.data());
//} //}
{ {
@ -301,7 +310,7 @@ TEST(span_test, from_pointer_pointer_construction)
//{ //{
// int* p = nullptr; // int* p = nullptr;
// auto workaround_macro = [&]() { span<int> s{&arr[0], p}; }; // auto workaround_macro = [&]() { span<int> s{&arr[0], p}; };
// EXPECT_DEATH(workaround_macro(), ".*"); // EXPECT_DEATH(workaround_macro(), deathstring.data());
//} //}
{ {
@ -823,6 +832,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, first) TEST(span_test, first)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. first";
std::abort();
});
int arr[5] = {1, 2, 3, 4, 5}; int arr[5] = {1, 2, 3, 4, 5};
{ {
@ -849,7 +862,7 @@ TEST(span_test, from_array_constructor)
EXPECT_TRUE(av.first<6>().size() == 6); EXPECT_TRUE(av.first<6>().size() == 6);
EXPECT_TRUE(av.first<-1>().size() == -1); EXPECT_TRUE(av.first<-1>().size() == -1);
#endif #endif
EXPECT_DEATH(av.first(6).size(), ".*"); EXPECT_DEATH(av.first(6).size(), deathstring.data());
} }
{ {
@ -861,6 +874,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, last) TEST(span_test, last)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. last";
std::abort();
});
int arr[5] = {1, 2, 3, 4, 5}; int arr[5] = {1, 2, 3, 4, 5};
{ {
@ -886,7 +903,7 @@ TEST(span_test, from_array_constructor)
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
EXPECT_TRUE(av.last<6>().size() == 6); EXPECT_TRUE(av.last<6>().size() == 6);
#endif #endif
EXPECT_DEATH(av.last(6).size(), ".*"); EXPECT_DEATH(av.last(6).size(), deathstring.data());
} }
{ {
@ -898,6 +915,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, subspan) TEST(span_test, subspan)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. subspan";
std::abort();
});
int arr[5] = {1, 2, 3, 4, 5}; int arr[5] = {1, 2, 3, 4, 5};
{ {
@ -921,8 +942,8 @@ TEST(span_test, from_array_constructor)
EXPECT_TRUE(decltype(av.subspan<0, 5>())::extent == 5); EXPECT_TRUE(decltype(av.subspan<0, 5>())::extent == 5);
EXPECT_TRUE(av.subspan(0, 5).size() == 5); EXPECT_TRUE(av.subspan(0, 5).size() == 5);
EXPECT_DEATH(av.subspan(0, 6).size(), ".*"); EXPECT_DEATH(av.subspan(0, 6).size(), deathstring.data());
EXPECT_DEATH(av.subspan(1, 5).size(), ".*"); EXPECT_DEATH(av.subspan(1, 5).size(), deathstring.data());
} }
{ {
@ -931,7 +952,7 @@ TEST(span_test, from_array_constructor)
EXPECT_TRUE(decltype(av.subspan<4, 0>())::extent == 0); EXPECT_TRUE(decltype(av.subspan<4, 0>())::extent == 0);
EXPECT_TRUE(av.subspan(4, 0).size() == 0); EXPECT_TRUE(av.subspan(4, 0).size() == 0);
EXPECT_TRUE(av.subspan(5, 0).size() == 0); EXPECT_TRUE(av.subspan(5, 0).size() == 0);
EXPECT_DEATH(av.subspan(6, 0).size(), ".*"); EXPECT_DEATH(av.subspan(6, 0).size(), deathstring.data());
} }
{ {
@ -945,13 +966,13 @@ TEST(span_test, from_array_constructor)
EXPECT_TRUE((av.subspan<0, 0>().size()) == 0); EXPECT_TRUE((av.subspan<0, 0>().size()) == 0);
EXPECT_TRUE(decltype(av.subspan<0, 0>())::extent == 0); EXPECT_TRUE(decltype(av.subspan<0, 0>())::extent == 0);
EXPECT_TRUE(av.subspan(0, 0).size() == 0); EXPECT_TRUE(av.subspan(0, 0).size() == 0);
EXPECT_DEATH((av.subspan<1, 0>().size()), ".*"); EXPECT_DEATH((av.subspan<1, 0>().size()), deathstring.data());
} }
{ {
span<int> av; span<int> av;
EXPECT_TRUE(av.subspan(0).size() == 0); EXPECT_TRUE(av.subspan(0).size() == 0);
EXPECT_DEATH(av.subspan(1).size(), ".*"); EXPECT_DEATH(av.subspan(1).size(), deathstring.data());
} }
{ {
@ -960,7 +981,7 @@ TEST(span_test, from_array_constructor)
EXPECT_TRUE(av.subspan(1).size() == 4); EXPECT_TRUE(av.subspan(1).size() == 4);
EXPECT_TRUE(av.subspan(4).size() == 1); EXPECT_TRUE(av.subspan(4).size() == 1);
EXPECT_TRUE(av.subspan(5).size() == 0); EXPECT_TRUE(av.subspan(5).size() == 0);
EXPECT_DEATH(av.subspan(6).size(), ".*"); EXPECT_DEATH(av.subspan(6).size(), deathstring.data());
const auto av2 = av.subspan(1); const auto av2 = av.subspan(1);
for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2); for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2);
} }
@ -971,7 +992,7 @@ TEST(span_test, from_array_constructor)
EXPECT_TRUE(av.subspan(1).size() == 4); EXPECT_TRUE(av.subspan(1).size() == 4);
EXPECT_TRUE(av.subspan(4).size() == 1); EXPECT_TRUE(av.subspan(4).size() == 1);
EXPECT_TRUE(av.subspan(5).size() == 0); EXPECT_TRUE(av.subspan(5).size() == 0);
EXPECT_DEATH(av.subspan(6).size(), ".*"); EXPECT_DEATH(av.subspan(6).size(), deathstring.data());
const auto av2 = av.subspan(1); const auto av2 = av.subspan(1);
for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2); for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2);
} }
@ -979,12 +1000,16 @@ TEST(span_test, from_array_constructor)
TEST(span_test, at_call) TEST(span_test, at_call)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. at_call";
std::abort();
});
int arr[4] = {1, 2, 3, 4}; int arr[4] = {1, 2, 3, 4};
{ {
span<int> s = arr; span<int> s = arr;
EXPECT_TRUE(s.at(0) == 1); EXPECT_TRUE(s.at(0) == 1);
EXPECT_DEATH(s.at(5), ".*"); EXPECT_DEATH(s.at(5), deathstring.data());
} }
{ {
@ -992,18 +1017,22 @@ TEST(span_test, from_array_constructor)
span<int, 2> s = arr2d; span<int, 2> s = arr2d;
EXPECT_TRUE(s.at(0) == 1); EXPECT_TRUE(s.at(0) == 1);
EXPECT_TRUE(s.at(1) == 6); EXPECT_TRUE(s.at(1) == 6);
EXPECT_DEATH(s.at(2), ".*"); EXPECT_DEATH(s.at(2), deathstring.data());
} }
} }
TEST(span_test, operator_function_call) TEST(span_test, operator_function_call)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. operator_function_call";
std::abort();
});
int arr[4] = {1, 2, 3, 4}; int arr[4] = {1, 2, 3, 4};
{ {
span<int> s = arr; span<int> s = arr;
EXPECT_TRUE(s(0) == 1); EXPECT_TRUE(s(0) == 1);
EXPECT_DEATH(s(5), ".*"); EXPECT_DEATH(s(5), deathstring.data());
} }
{ {
@ -1011,7 +1040,7 @@ TEST(span_test, from_array_constructor)
span<int, 2> s = arr2d; span<int, 2> s = arr2d;
EXPECT_TRUE(s(0) == 1); EXPECT_TRUE(s(0) == 1);
EXPECT_TRUE(s(1) == 6); EXPECT_TRUE(s(1) == 6);
EXPECT_DEATH(s(2), ".*"); EXPECT_DEATH(s(2), deathstring.data());
} }
} }
@ -1100,6 +1129,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, begin_end) TEST(span_test, begin_end)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. begin_end";
std::abort();
});
{ {
int a[] = {1, 2, 3, 4}; int a[] = {1, 2, 3, 4};
span<int> s = a; span<int> s = a;
@ -1124,7 +1157,7 @@ TEST(span_test, from_array_constructor)
auto beyond = s.end(); auto beyond = s.end();
EXPECT_TRUE(it != beyond); EXPECT_TRUE(it != beyond);
EXPECT_DEATH(*beyond, ".*"); EXPECT_DEATH(*beyond, deathstring.data());
EXPECT_TRUE(beyond - first == 4); EXPECT_TRUE(beyond - first == 4);
EXPECT_TRUE(first - first == 0); EXPECT_TRUE(first - first == 0);
@ -1154,6 +1187,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, cbegin_cend) TEST(span_test, cbegin_cend)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. cbegin_cend";
std::abort();
});
{ {
int a[] = {1, 2, 3, 4}; int a[] = {1, 2, 3, 4};
span<int> s = a; span<int> s = a;
@ -1178,7 +1215,7 @@ TEST(span_test, from_array_constructor)
auto beyond = s.cend(); auto beyond = s.cend();
EXPECT_TRUE(it != beyond); EXPECT_TRUE(it != beyond);
EXPECT_DEATH(*beyond, ".*"); EXPECT_DEATH(*beyond, deathstring.data());
EXPECT_TRUE(beyond - first == 4); EXPECT_TRUE(beyond - first == 4);
EXPECT_TRUE(first - first == 0); EXPECT_TRUE(first - first == 0);
@ -1207,6 +1244,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, rbegin_rend) TEST(span_test, rbegin_rend)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. rbegin_rend";
std::abort();
});
{ {
int a[] = {1, 2, 3, 4}; int a[] = {1, 2, 3, 4};
span<int> s = a; span<int> s = a;
@ -1218,7 +1259,7 @@ TEST(span_test, from_array_constructor)
auto beyond = s.rend(); auto beyond = s.rend();
EXPECT_TRUE(it != beyond); EXPECT_TRUE(it != beyond);
EXPECT_DEATH(auto _ = *beyond , ".*"); EXPECT_DEATH(auto _ = *beyond , deathstring.data());
EXPECT_TRUE(beyond - first == 4); EXPECT_TRUE(beyond - first == 4);
EXPECT_TRUE(first - first == 0); EXPECT_TRUE(first - first == 0);
@ -1248,6 +1289,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, crbegin_crend) TEST(span_test, crbegin_crend)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. crbegin_crend";
std::abort();
});
{ {
int a[] = {1, 2, 3, 4}; int a[] = {1, 2, 3, 4};
span<int> s = a; span<int> s = a;
@ -1259,7 +1304,7 @@ TEST(span_test, from_array_constructor)
auto beyond = s.crend(); auto beyond = s.crend();
EXPECT_TRUE(it != beyond); EXPECT_TRUE(it != beyond);
EXPECT_DEATH(auto _ = *beyond, ".*"); EXPECT_DEATH(auto _ = *beyond, deathstring.data());
EXPECT_TRUE(beyond - first == 4); EXPECT_TRUE(beyond - first == 4);
EXPECT_TRUE(first - first == 0); EXPECT_TRUE(first - first == 0);
@ -1472,6 +1517,10 @@ TEST(span_test, from_array_constructor)
TEST(span_test, fixed_size_conversions) TEST(span_test, fixed_size_conversions)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. fixed_size_conversions";
std::abort();
});
int arr[] = {1, 2, 3, 4}; int arr[] = {1, 2, 3, 4};
// converting to an span from an equal size array is ok // converting to an span from an equal size array is ok
@ -1503,7 +1552,7 @@ TEST(span_test, from_array_constructor)
const span<int, 2> s2 = s; const span<int, 2> s2 = s;
static_cast<void>(s2); static_cast<void>(s2);
}; };
EXPECT_DEATH(f(), ".*"); EXPECT_DEATH(f(), deathstring.data());
} }
// but doing so explicitly is ok // but doing so explicitly is ok
@ -1542,7 +1591,7 @@ TEST(span_test, from_array_constructor)
const span<int, 4> _s4 = {arr2, 2}; const span<int, 4> _s4 = {arr2, 2};
static_cast<void>(_s4); static_cast<void>(_s4);
}; };
EXPECT_DEATH(f(), ".*"); EXPECT_DEATH(f(), deathstring.data());
} }
// this should fail - we are trying to assign a small dynamic span to a fixed_size larger one // this should fail - we are trying to assign a small dynamic span to a fixed_size larger one
@ -1550,7 +1599,7 @@ TEST(span_test, from_array_constructor)
const span<int, 4> _s4 = av; const span<int, 4> _s4 = av;
static_cast<void>(_s4); static_cast<void>(_s4);
}; };
EXPECT_DEATH(f(), ".*"); EXPECT_DEATH(f(), deathstring.data());
} }
TEST(span_test, interop_with_std_regex) TEST(span_test, interop_with_std_regex)

View File

@ -42,6 +42,10 @@ namespace gsl
struct fail_fast; struct fail_fast;
} // namespace gsl } // namespace gsl
namespace{
constexpr std::string_view deathstring("Expected Death");
}
using namespace gsl; using namespace gsl;
GSL_SUPPRESS(f.4) // NO-FORMAT: attribute GSL_SUPPRESS(f.4) // NO-FORMAT: attribute
@ -146,6 +150,11 @@ TEST(strict_notnull_tests, TestStrictNotNull)
TEST(strict_notnull_tests, TestStrictNotNullConstructorTypeDeduction) TEST(strict_notnull_tests, TestStrictNotNullConstructorTypeDeduction)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. TestStrictNotNullConstructorTypeDeduction";
std::abort();
});
{ {
int i = 42; int i = 42;
@ -172,7 +181,7 @@ TEST(strict_notnull_tests, TestStrictNotNullConstructorTypeDeduction)
int* p1 = nullptr; int* p1 = nullptr;
const strict_not_null x{p1}; const strict_not_null x{p1};
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
@ -180,14 +189,14 @@ TEST(strict_notnull_tests, TestStrictNotNullConstructorTypeDeduction)
const int* p1 = nullptr; const int* p1 = nullptr;
const strict_not_null x{p1}; const strict_not_null x{p1};
}; };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
{ {
int* p = nullptr; int* p = nullptr;
EXPECT_DEATH(helper(strict_not_null{p}), ".*"); EXPECT_DEATH(helper(strict_not_null{p}), deathstring.data());
EXPECT_DEATH(helper_const(strict_not_null{p}), ".*"); EXPECT_DEATH(helper_const(strict_not_null{p}), deathstring.data());
} }
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS

View File

@ -56,6 +56,7 @@ using namespace gsl;
namespace namespace
{ {
constexpr std::string_view deathstring("Expected Death");
struct BaseClass struct BaseClass
{ {
}; };
@ -420,18 +421,23 @@ TEST(strided_span_tests, strided_span_bounds)
int arr[] = {0, 1, 2, 3}; int arr[] = {0, 1, 2, 3};
multi_span<int> av(arr); multi_span<int> av(arr);
std::set_terminate([] {
std::cerr << "Expected Death. strided_span_bounds";
std::abort();
});
{ {
// incorrect sections // incorrect sections
EXPECT_DEATH(av.section(0, 0)[0], ".*"); EXPECT_DEATH(av.section(0, 0)[0], deathstring.data());
EXPECT_DEATH(av.section(1, 0)[0], ".*"); EXPECT_DEATH(av.section(1, 0)[0], deathstring.data());
EXPECT_DEATH(av.section(1, 1)[1], ".*"); EXPECT_DEATH(av.section(1, 1)[1], deathstring.data());
EXPECT_DEATH(av.section(2, 5), ".*"); EXPECT_DEATH(av.section(2, 5), deathstring.data());
EXPECT_DEATH(av.section(5, 2), ".*"); EXPECT_DEATH(av.section(5, 2), deathstring.data());
EXPECT_DEATH(av.section(5, 0), ".*"); EXPECT_DEATH(av.section(5, 0), deathstring.data());
EXPECT_DEATH(av.section(0, 5), ".*"); EXPECT_DEATH(av.section(0, 5), deathstring.data());
EXPECT_DEATH(av.section(5, 5), ".*"); EXPECT_DEATH(av.section(5, 5), deathstring.data());
} }
{ {
@ -439,19 +445,19 @@ TEST(strided_span_tests, strided_span_bounds)
strided_span<int, 1> sav{av, {{4}, {}}}; strided_span<int, 1> sav{av, {{4}, {}}};
EXPECT_TRUE(sav[0] == 0); EXPECT_TRUE(sav[0] == 0);
EXPECT_TRUE(sav[3] == 0); EXPECT_TRUE(sav[3] == 0);
EXPECT_DEATH(sav[4], ".*"); EXPECT_DEATH(sav[4], deathstring.data());
} }
{ {
// zero extent // zero extent
strided_span<int, 1> sav{av, {{}, {1}}}; strided_span<int, 1> sav{av, {{}, {1}}};
EXPECT_DEATH(sav[0], ".*"); EXPECT_DEATH(sav[0], deathstring.data());
} }
{ {
// zero extent and stride // zero extent and stride
strided_span<int, 1> sav{av, {{}, {}}}; strided_span<int, 1> sav{av, {{}, {}}};
EXPECT_DEATH(sav[0], ".*"); EXPECT_DEATH(sav[0], deathstring.data());
} }
{ {
@ -459,7 +465,7 @@ TEST(strided_span_tests, strided_span_bounds)
strided_span<int, 1> sav{arr, {4, 1}}; strided_span<int, 1> sav{arr, {4, 1}};
EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{4}); EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{4});
EXPECT_TRUE(sav[3] == 3); EXPECT_TRUE(sav[3] == 3);
EXPECT_DEATH(sav[4], ".*"); EXPECT_DEATH(sav[4], deathstring.data());
} }
{ {
@ -467,7 +473,7 @@ TEST(strided_span_tests, strided_span_bounds)
strided_span<int, 1> sav{arr, {2, 1}}; strided_span<int, 1> sav{arr, {2, 1}};
EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2}); EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});
EXPECT_TRUE(sav[1] == 1); EXPECT_TRUE(sav[1] == 1);
EXPECT_DEATH(sav[2], ".*"); EXPECT_DEATH(sav[2], deathstring.data());
} }
{ {
@ -476,35 +482,35 @@ TEST(strided_span_tests, strided_span_bounds)
EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2}); EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});
EXPECT_TRUE(sav[0] == 0); EXPECT_TRUE(sav[0] == 0);
EXPECT_TRUE(sav[1] == 3); EXPECT_TRUE(sav[1] == 3);
EXPECT_DEATH(sav[2], ".*"); EXPECT_DEATH(sav[2], deathstring.data());
} }
{ {
// bounds cross data boundaries - from static arrays // bounds cross data boundaries - from static arrays
EXPECT_DEATH((strided_span<int, 1>{arr, {3, 2}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{arr, {3, 2}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{arr, {3, 3}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{arr, {3, 3}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{arr, {4, 5}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{arr, {4, 5}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{arr, {5, 1}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{arr, {5, 1}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{arr, {5, 5}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{arr, {5, 5}}), deathstring.data());
} }
{ {
// bounds cross data boundaries - from array view // bounds cross data boundaries - from array view
EXPECT_DEATH((strided_span<int, 1>{av, {3, 2}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av, {3, 2}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av, {3, 3}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av, {3, 3}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av, {4, 5}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av, {4, 5}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av, {5, 1}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av, {5, 1}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av, {5, 5}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av, {5, 5}}), deathstring.data());
} }
{ {
// bounds cross data boundaries - from dynamic arrays // bounds cross data boundaries - from dynamic arrays
EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {3, 2}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {3, 2}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {3, 3}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {3, 3}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {4, 5}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {4, 5}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {5, 1}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {5, 1}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {5, 5}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {5, 5}}), deathstring.data());
EXPECT_DEATH((strided_span<int, 1>{av.data(), 2, {2, 2}}), ".*"); EXPECT_DEATH((strided_span<int, 1>{av.data(), 2, {2, 2}}), deathstring.data());
} }
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
@ -536,6 +542,11 @@ TEST(strided_span_tests, strided_span_type_conversion)
int arr[] = {0, 1, 2, 3}; int arr[] = {0, 1, 2, 3};
multi_span<int> av(arr); multi_span<int> av(arr);
std::set_terminate([] {
std::cerr << "Expected Death. strided_span_type_conversion";
std::abort();
});
{ {
strided_span<int, 1> sav{av.data(), av.size(), {av.size() / 2, 2}}; strided_span<int, 1> sav{av.data(), av.size(), {av.size() / 2, 2}};
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
@ -558,8 +569,8 @@ TEST(strided_span_tests, strided_span_type_conversion)
strided_span<const int, 2> sav3 = sav2.as_strided_span<const int>(); strided_span<const int, 2> sav3 = sav2.as_strided_span<const int>();
EXPECT_TRUE(sav3[0][0] == 0); EXPECT_TRUE(sav3[0][0] == 0);
EXPECT_TRUE(sav3[1][0] == 2); EXPECT_TRUE(sav3[1][0] == 2);
EXPECT_DEATH(sav3[1][1], ".*"); EXPECT_DEATH(sav3[1][1], deathstring.data());
EXPECT_DEATH(sav3[0][1], ".*"); EXPECT_DEATH(sav3[0][1], deathstring.data());
} }
// retype strided array with regular strides - from multi_span // retype strided array with regular strides - from multi_span
@ -571,8 +582,8 @@ TEST(strided_span_tests, strided_span_type_conversion)
strided_span<int, 2> sav3 = sav2.as_strided_span<int>(); strided_span<int, 2> sav3 = sav2.as_strided_span<int>();
EXPECT_TRUE(sav3[0][0] == 0); EXPECT_TRUE(sav3[0][0] == 0);
EXPECT_TRUE(sav3[1][0] == 2); EXPECT_TRUE(sav3[1][0] == 2);
EXPECT_DEATH(sav3[1][1], ".*"); EXPECT_DEATH(sav3[1][1], deathstring.data());
EXPECT_DEATH(sav3[0][1], ".*"); EXPECT_DEATH(sav3[0][1], deathstring.data());
} }
// retype strided array with not enough elements - last dimension of the array is too small // retype strided array with not enough elements - last dimension of the array is too small
@ -581,7 +592,7 @@ TEST(strided_span_tests, strided_span_type_conversion)
multi_span<const byte, 2, dynamic_range> bytes2 = multi_span<const byte, 2, dynamic_range> bytes2 =
as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2)); as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));
strided_span<const byte, 2> sav2{bytes2, bounds}; strided_span<const byte, 2> sav2{bytes2, bounds};
EXPECT_DEATH(sav2.as_strided_span<int>(), ".*"); EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring.data());
} }
// retype strided array with not enough elements - strides are too small // retype strided array with not enough elements - strides are too small
@ -590,7 +601,7 @@ TEST(strided_span_tests, strided_span_type_conversion)
multi_span<const byte, 2, dynamic_range> bytes2 = multi_span<const byte, 2, dynamic_range> bytes2 =
as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2)); as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));
strided_span<const byte, 2> sav2{bytes2, bounds}; strided_span<const byte, 2> sav2{bytes2, bounds};
EXPECT_DEATH(sav2.as_strided_span<int>(), ".*"); EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring.data());
} }
// retype strided array with not enough elements - last dimension does not divide by the new // retype strided array with not enough elements - last dimension does not divide by the new
@ -600,7 +611,7 @@ TEST(strided_span_tests, strided_span_type_conversion)
multi_span<const byte, 2, dynamic_range> bytes2 = multi_span<const byte, 2, dynamic_range> bytes2 =
as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2)); as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));
strided_span<const byte, 2> sav2{bytes2, bounds}; strided_span<const byte, 2> sav2{bytes2, bounds};
EXPECT_DEATH(sav2.as_strided_span<int>(), ".*"); EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring.data());
} }
// retype strided array with not enough elements - strides does not divide by the new // retype strided array with not enough elements - strides does not divide by the new
@ -610,35 +621,40 @@ TEST(strided_span_tests, strided_span_type_conversion)
multi_span<const byte, 2, dynamic_range> bytes2 = multi_span<const byte, 2, dynamic_range> bytes2 =
as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2)); as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));
strided_span<const byte, 2> sav2{bytes2, bounds}; strided_span<const byte, 2> sav2{bytes2, bounds};
EXPECT_DEATH(sav2.as_strided_span<int>(), ".*"); EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring.data());
} }
// retype strided array with irregular strides - from raw data // retype strided array with irregular strides - from raw data
{ {
strided_bounds<1> bounds{bytes.size() / 2, 2}; strided_bounds<1> bounds{bytes.size() / 2, 2};
strided_span<const byte, 1> sav2{bytes.data(), bytes.size(), bounds}; strided_span<const byte, 1> sav2{bytes.data(), bytes.size(), bounds};
EXPECT_DEATH(sav2.as_strided_span<int>(), ".*"); EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring.data());
} }
// retype strided array with irregular strides - from multi_span // retype strided array with irregular strides - from multi_span
{ {
strided_bounds<1> bounds{bytes.size() / 2, 2}; strided_bounds<1> bounds{bytes.size() / 2, 2};
strided_span<const byte, 1> sav2{bytes, bounds}; strided_span<const byte, 1> sav2{bytes, bounds};
EXPECT_DEATH(sav2.as_strided_span<int>(), ".*"); EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring.data());
} }
} }
TEST(strided_span_tests, empty_strided_spans) TEST(strided_span_tests, empty_strided_spans)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. empty_strided_spans";
std::abort();
});
{ {
multi_span<int, 0> empty_av(nullptr); multi_span<int, 0> empty_av(nullptr);
strided_span<int, 1> empty_sav{empty_av, {0, 1}}; strided_span<int, 1> empty_sav{empty_av, {0, 1}};
EXPECT_TRUE(empty_sav.bounds().index_bounds() == multi_span_index<1>{0}); EXPECT_TRUE(empty_sav.bounds().index_bounds() == multi_span_index<1>{0});
EXPECT_TRUE(empty_sav.empty()); EXPECT_TRUE(empty_sav.empty());
EXPECT_DEATH(empty_sav[0], ".*"); EXPECT_DEATH(empty_sav[0], deathstring.data());
EXPECT_DEATH(empty_sav.begin()[0], ".*"); EXPECT_DEATH(empty_sav.begin()[0], deathstring.data());
EXPECT_DEATH(empty_sav.cbegin()[0], ".*"); EXPECT_DEATH(empty_sav.cbegin()[0], deathstring.data());
for (const auto& v : empty_sav) { for (const auto& v : empty_sav) {
(void) v; (void) v;
@ -650,9 +666,9 @@ TEST(strided_span_tests, empty_strided_spans)
strided_span<int, 1> empty_sav{nullptr, 0, {0, 1}}; strided_span<int, 1> empty_sav{nullptr, 0, {0, 1}};
EXPECT_TRUE(empty_sav.bounds().index_bounds() == multi_span_index<1>{0}); EXPECT_TRUE(empty_sav.bounds().index_bounds() == multi_span_index<1>{0});
EXPECT_DEATH(empty_sav[0], ".*"); EXPECT_DEATH(empty_sav[0], deathstring.data());
EXPECT_DEATH(empty_sav.begin()[0], ".*"); EXPECT_DEATH(empty_sav.begin()[0], deathstring.data());
EXPECT_DEATH(empty_sav.cbegin()[0], ".*"); EXPECT_DEATH(empty_sav.cbegin()[0], deathstring.data());
for (const auto& v : empty_sav) { for (const auto& v : empty_sav) {
(void) v; (void) v;
@ -740,6 +756,11 @@ TEST(strided_span_tests, dynamic_strided_span_section_iteration_3d)
TEST(strided_span_tests, strided_span_conversion) TEST(strided_span_tests, strided_span_conversion)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. strided_span_conversion";
std::abort();
});
// get an multi_span of 'c' values from the list of X's // get an multi_span of 'c' values from the list of X's
struct X struct X
@ -783,7 +804,7 @@ TEST(strided_span_tests, strided_span_conversion)
strided_span<int, 1> result = transposed[0]; strided_span<int, 1> result = transposed[0];
EXPECT_TRUE(result.bounds().index_bounds()[0] == 4); EXPECT_TRUE(result.bounds().index_bounds()[0] == 4);
EXPECT_DEATH(result.bounds().index_bounds()[1], ".*"); EXPECT_DEATH(result.bounds().index_bounds()[1], deathstring.data());
int i = 0; int i = 0;
for (auto& num : result) { for (auto& num : result) {

View File

@ -72,6 +72,7 @@ auto strnlen(const CharT* s, std::size_t n)
namespace namespace
{ {
constexpr std::string_view deathstring("Expected Death");
template <typename T> template <typename T>
T move_wrapper(T&& t) T move_wrapper(T&& t)
@ -964,6 +965,10 @@ TEST(string_span_tests, Conversion)
TEST(string_span_tests, zstring) TEST(string_span_tests, zstring)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. zstring";
std::abort();
});
// create zspan from zero terminated string // create zspan from zero terminated string
{ {
@ -983,7 +988,7 @@ TEST(string_span_tests, zstring)
buf[0] = 'a'; buf[0] = 'a';
auto workaround_macro = [&]() { const zstring_span<> zspan({buf, 1}); }; auto workaround_macro = [&]() { const zstring_span<> zspan({buf, 1}); };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
// usage scenario: create zero-terminated temp file name and pass to a legacy API // usage scenario: create zero-terminated temp file name and pass to a legacy API
@ -1001,6 +1006,10 @@ TEST(string_span_tests, zstring)
TEST(string_span_tests, wzstring) TEST(string_span_tests, wzstring)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. wzstring";
std::abort();
});
// create zspan from zero terminated string // create zspan from zero terminated string
{ {
@ -1020,7 +1029,7 @@ TEST(string_span_tests, wzstring)
buf[0] = L'a'; buf[0] = L'a';
const auto workaround_macro = [&]() { const wzstring_span<> zspan({buf, 1}); }; const auto workaround_macro = [&]() { const wzstring_span<> zspan({buf, 1}); };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
// usage scenario: create zero-terminated temp file name and pass to a legacy API // usage scenario: create zero-terminated temp file name and pass to a legacy API
@ -1038,6 +1047,10 @@ TEST(string_span_tests, wzstring)
TEST(string_span_tests, u16zstring) TEST(string_span_tests, u16zstring)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. u16zstring";
std::abort();
});
// create zspan from zero terminated string // create zspan from zero terminated string
{ {
@ -1057,7 +1070,7 @@ TEST(string_span_tests, u16zstring)
buf[0] = u'a'; buf[0] = u'a';
const auto workaround_macro = [&]() { const u16zstring_span<> zspan({buf, 1}); }; const auto workaround_macro = [&]() { const u16zstring_span<> zspan({buf, 1}); };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
// usage scenario: create zero-terminated temp file name and pass to a legacy API // usage scenario: create zero-terminated temp file name and pass to a legacy API
@ -1075,6 +1088,10 @@ TEST(string_span_tests, u16zstring)
TEST(string_span_tests, u32zstring) TEST(string_span_tests, u32zstring)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. u31zstring";
std::abort();
});
// create zspan from zero terminated string // create zspan from zero terminated string
{ {
@ -1094,7 +1111,7 @@ TEST(string_span_tests, u32zstring)
buf[0] = u'a'; buf[0] = u'a';
const auto workaround_macro = [&]() { const u32zstring_span<> zspan({buf, 1}); }; const auto workaround_macro = [&]() { const u32zstring_span<> zspan({buf, 1}); };
EXPECT_DEATH(workaround_macro(), ".*"); EXPECT_DEATH(workaround_macro(), deathstring.data());
} }
// usage scenario: create zero-terminated temp file name and pass to a legacy API // usage scenario: create zero-terminated temp file name and pass to a legacy API

View File

@ -1,26 +0,0 @@
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2015 Microsoft Corporation. All rights reserved.
//
// This code is licensed under the MIT License (MIT).
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
///////////////////////////////////////////////////////////////////////////////
#define CATCH_CONFIG_MAIN
#ifdef _MSC_VER
// blanket turn off warnings from CppCoreCheck from catch
// so people aren't annoyed by them when running the tool.
#include <CodeAnalysis/Warnings.h>
#pragma warning(disable : ALL_CODE_ANALYSIS_WARNINGS) // from catch
#endif // _MSC_VER

View File

@ -44,9 +44,13 @@
using namespace gsl; using namespace gsl;
namespace{
constexpr std::string_view deathstring("Expected Death");
void f(int& i) { i += 1; } void f(int& i) { i += 1; }
static int j = 0; static int j = 0;
void g() { j += 1; } void g() { j += 1; }
}
TEST(utils_tests, sanity_check_for_gsl_index_typedef) TEST(utils_tests, sanity_check_for_gsl_index_typedef)
{ {
@ -116,12 +120,17 @@ TEST(utils_tests, narrow_cast)
TEST(utils_tests, narrow) TEST(utils_tests, narrow)
{ {
std::set_terminate([] {
std::cerr << "Expected Death. narrow";
std::abort();
});
int n = 120; int n = 120;
const char c = narrow<char>(n); const char c = narrow<char>(n);
EXPECT_TRUE(c == 120); EXPECT_TRUE(c == 120);
n = 300; n = 300;
EXPECT_DEATH(narrow<char>(n), ".*"); EXPECT_DEATH(narrow<char>(n), deathstring.data());
const auto int32_max = std::numeric_limits<int32_t>::max(); const auto int32_max = std::numeric_limits<int32_t>::max();
const auto int32_min = std::numeric_limits<int32_t>::min(); const auto int32_min = std::numeric_limits<int32_t>::min();
@ -130,11 +139,11 @@ TEST(utils_tests, narrow)
EXPECT_TRUE(narrow<uint32_t>(int32_t(1)) == 1); EXPECT_TRUE(narrow<uint32_t>(int32_t(1)) == 1);
EXPECT_TRUE(narrow<uint32_t>(int32_max) == static_cast<uint32_t>(int32_max)); EXPECT_TRUE(narrow<uint32_t>(int32_max) == static_cast<uint32_t>(int32_max));
EXPECT_DEATH(narrow<uint32_t>(int32_t(-1)), ".*"); EXPECT_DEATH(narrow<uint32_t>(int32_t(-1)), deathstring.data());
EXPECT_DEATH(narrow<uint32_t>(int32_min), ".*"); EXPECT_DEATH(narrow<uint32_t>(int32_min), deathstring.data());
n = -42; n = -42;
EXPECT_DEATH(narrow<unsigned>(n), ".*"); EXPECT_DEATH(narrow<unsigned>(n), deathstring.data());
#if GSL_CONSTEXPR_NARROW #if GSL_CONSTEXPR_NARROW
static_assert(narrow<char>(120) == 120, "Fix GSL_CONSTEXPR_NARROW"); static_assert(narrow<char>(120) == 120, "Fix GSL_CONSTEXPR_NARROW");