163 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #include <array>
 | |
| 
 | |
| #include <test.hpp>
 | |
| 
 | |
| #include <protozero/types.hpp>
 | |
| 
 | |
| TEST_CASE("default constructed data_view") {
 | |
|     const protozero::data_view view{};
 | |
|     REQUIRE(view.data() == nullptr);
 | |
|     REQUIRE(view.size() == 0); // NOLINT(readability-container-size-empty)
 | |
|     REQUIRE(view.empty());
 | |
| }
 | |
| 
 | |
| TEST_CASE("data_view from C string") {
 | |
|     const protozero::data_view view{"foobar"};
 | |
|     REQUIRE(view.data());
 | |
|     REQUIRE(view.size() == 6);
 | |
|     REQUIRE_FALSE(view.empty());
 | |
| }
 | |
| 
 | |
| TEST_CASE("data_view from std::string") {
 | |
|     const std::string str{"foobar"};
 | |
|     const protozero::data_view view{str};
 | |
|     REQUIRE(view.data());
 | |
|     REQUIRE(view.size() == 6);
 | |
| }
 | |
| 
 | |
| TEST_CASE("data_view from ptr, size") {
 | |
|     const std::string str{"foobar"};
 | |
|     const protozero::data_view view{str.data(), str.size()};
 | |
|     REQUIRE(view.data());
 | |
|     REQUIRE(view.size() == 6);
 | |
| }
 | |
| 
 | |
| TEST_CASE("data_view from C array") {
 | |
|     const char* str = "foobar";
 | |
|     const protozero::data_view view{str};
 | |
|     REQUIRE(view.data());
 | |
|     REQUIRE(view.size() == 6);
 | |
| }
 | |
| 
 | |
| TEST_CASE("data_view from std::array") {
 | |
|     const std::array<char, 7> str{"foobar"};
 | |
|     const protozero::data_view view{str.data(), 6};
 | |
|     REQUIRE(view.data());
 | |
|     REQUIRE(view.size() == 6);
 | |
| }
 | |
| 
 | |
| TEST_CASE("convert data_view to std::string") {
 | |
|     const protozero::data_view view{"foobar"};
 | |
| 
 | |
|     const std::string s = std::string(view);
 | |
|     REQUIRE(s == "foobar");
 | |
|     REQUIRE(std::string(view) == "foobar");
 | |
|     REQUIRE(view.to_string() == "foobar");
 | |
| }
 | |
| 
 | |
| #ifndef PROTOZERO_USE_VIEW
 | |
| // This test only works with our own data_view implementation, because only
 | |
| // that one contains the protozero_assert() which generates the exception.
 | |
| TEST_CASE("converting default constructed data_view to string fails") {
 | |
|     const protozero::data_view view{};
 | |
|     REQUIRE_THROWS_AS(view.to_string(), const assert_error&);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| TEST_CASE("swapping data_view") {
 | |
|     protozero::data_view view1{"foo"};
 | |
|     protozero::data_view view2{"bar"};
 | |
| 
 | |
|     REQUIRE(view1.to_string() == "foo");
 | |
|     REQUIRE(view2.to_string() == "bar");
 | |
| 
 | |
|     using std::swap;
 | |
|     swap(view1, view2);
 | |
| 
 | |
|     REQUIRE(view2.to_string() == "foo");
 | |
|     REQUIRE(view1.to_string() == "bar");
 | |
| }
 | |
| 
 | |
| TEST_CASE("comparing data_views") {
 | |
|     const protozero::data_view v1{"foo"};
 | |
|     const protozero::data_view v2{"bar"};
 | |
|     const protozero::data_view v3{"foox"};
 | |
|     const protozero::data_view v4{"foo"};
 | |
|     const protozero::data_view v5{"fooooooo", 3};
 | |
|     const protozero::data_view v6{"f\0o", 3};
 | |
|     const protozero::data_view v7{"f\0obar", 3};
 | |
| 
 | |
|     REQUIRE_FALSE(v1 == v2);
 | |
|     REQUIRE_FALSE(v1 == v3);
 | |
|     REQUIRE(v1 == v4);
 | |
|     REQUIRE(v1 == v5);
 | |
|     REQUIRE_FALSE(v1 == v6);
 | |
|     REQUIRE_FALSE(v1 == v7);
 | |
|     REQUIRE_FALSE(v2 == v3);
 | |
|     REQUIRE_FALSE(v2 == v4);
 | |
|     REQUIRE_FALSE(v3 == v4);
 | |
|     REQUIRE(v4 == v5);
 | |
|     REQUIRE(v6 == v7);
 | |
| 
 | |
|     REQUIRE(v1 != v2);
 | |
|     REQUIRE(v1 != v3);
 | |
|     REQUIRE_FALSE(v1 != v4);
 | |
|     REQUIRE_FALSE(v1 != v5);
 | |
|     REQUIRE(v1 != v6);
 | |
|     REQUIRE(v1 != v7);
 | |
|     REQUIRE(v2 != v3);
 | |
|     REQUIRE(v2 != v4);
 | |
|     REQUIRE(v3 != v4);
 | |
|     REQUIRE_FALSE(v4 != v5);
 | |
|     REQUIRE_FALSE(v6 != v7);
 | |
| }
 | |
| 
 | |
| TEST_CASE("ordering of data_views") {
 | |
|     const protozero::data_view v1{"foo"};
 | |
|     const protozero::data_view v2{"foo"};
 | |
|     const protozero::data_view v3{"bar"};
 | |
|     const protozero::data_view v4{"foox"};
 | |
|     const protozero::data_view v5{"zzz"};
 | |
| 
 | |
|     REQUIRE(v1.compare(v1) == 0);
 | |
|     REQUIRE(v1.compare(v2) == 0);
 | |
|     REQUIRE(v1.compare(v3) > 0);
 | |
|     REQUIRE(v1.compare(v4) < 0);
 | |
|     REQUIRE(v1.compare(v5) < 0);
 | |
| 
 | |
|     REQUIRE(v2.compare(v1) == 0);
 | |
|     REQUIRE(v2.compare(v2) == 0);
 | |
|     REQUIRE(v2.compare(v3) > 0);
 | |
|     REQUIRE(v2.compare(v4) < 0);
 | |
|     REQUIRE(v2.compare(v5) < 0);
 | |
| 
 | |
|     REQUIRE(v3.compare(v1) < 0);
 | |
|     REQUIRE(v3.compare(v2) < 0);
 | |
|     REQUIRE(v3.compare(v3) == 0);
 | |
|     REQUIRE(v3.compare(v4) < 0);
 | |
|     REQUIRE(v3.compare(v5) < 0);
 | |
| 
 | |
|     REQUIRE(v4.compare(v1) > 0);
 | |
|     REQUIRE(v4.compare(v2) > 0);
 | |
|     REQUIRE(v4.compare(v3) > 0);
 | |
|     REQUIRE(v4.compare(v4) == 0);
 | |
|     REQUIRE(v4.compare(v5) < 0);
 | |
| 
 | |
|     REQUIRE(v5.compare(v1) > 0);
 | |
|     REQUIRE(v5.compare(v2) > 0);
 | |
|     REQUIRE(v5.compare(v3) > 0);
 | |
|     REQUIRE(v5.compare(v4) > 0);
 | |
|     REQUIRE(v5.compare(v5) == 0);
 | |
| 
 | |
|     REQUIRE(v1 == v2);
 | |
|     REQUIRE(v1 <= v2);
 | |
|     REQUIRE(v1 >= v2);
 | |
|     REQUIRE(v1 < v4);
 | |
|     REQUIRE(v3 < v1);
 | |
|     REQUIRE(v3 <= v1);
 | |
|     REQUIRE(v5 > v1);
 | |
|     REQUIRE(v5 >= v1);
 | |
| }
 | |
| 
 |