string_view_test.cc 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <cstring>
  5. #include <map>
  6. #include <stdexcept>
  7. #include <string>
  8. #include <utility>
  9. #include "opentelemetry/nostd/string_view.h"
  10. using opentelemetry::nostd::string_view;
  11. TEST(StringViewTest, DefaultConstruction)
  12. {
  13. string_view ref;
  14. EXPECT_EQ(ref.data(), nullptr);
  15. EXPECT_EQ(ref.length(), 0);
  16. }
  17. TEST(StringViewTest, CStringInitialization)
  18. {
  19. const char *val = "hello world";
  20. string_view ref(val);
  21. EXPECT_EQ(ref.data(), val);
  22. EXPECT_EQ(ref.length(), std::strlen(val));
  23. }
  24. TEST(StringViewTest, StdStringInitialization)
  25. {
  26. const std::string val = "hello world";
  27. string_view ref(val);
  28. EXPECT_EQ(ref.data(), val.data());
  29. EXPECT_EQ(ref.length(), val.size());
  30. }
  31. TEST(StringViewTest, Copy)
  32. {
  33. const std::string val = "hello world";
  34. string_view ref(val);
  35. string_view cpy(ref);
  36. EXPECT_EQ(cpy.data(), val);
  37. EXPECT_EQ(cpy.length(), val.length());
  38. EXPECT_EQ(cpy, val);
  39. }
  40. TEST(StringViewTest, Accessor)
  41. {
  42. string_view s = "abc123";
  43. EXPECT_EQ(s.data(), &s[0]);
  44. EXPECT_EQ(s.data() + 1, &s[1]);
  45. }
  46. TEST(StringViewTest, ExplicitStdStringConversion)
  47. {
  48. std::string s = static_cast<std::string>(string_view{"abc"});
  49. EXPECT_EQ(s, "abc");
  50. }
  51. TEST(StringViewTest, SubstrPortion)
  52. {
  53. string_view s = "abc123";
  54. EXPECT_EQ("123", s.substr(3));
  55. EXPECT_EQ("12", s.substr(3, 2));
  56. }
  57. TEST(StringViewTest, SubstrOutOfRange)
  58. {
  59. string_view s = "abc123";
  60. #if __EXCEPTIONS || (defined(OPENTELEMETRY_STL_VERSION) && (OPENTELEMETRY_STL_VERSION >= 2017))
  61. EXPECT_THROW((void)s.substr(10), std::out_of_range);
  62. #else
  63. EXPECT_DEATH({ s.substr(10); }, "");
  64. #endif
  65. }
  66. TEST(StringViewTest, FindSingleCharacter)
  67. {
  68. string_view s = "abc";
  69. // starting from 0-th position (default)
  70. EXPECT_EQ(s.find('a'), 0);
  71. EXPECT_EQ(s.find('b'), 1);
  72. EXPECT_EQ(s.find('c'), 2);
  73. EXPECT_EQ(s.find('d'), -1); // FIXME: string_view:npos - problem with linker
  74. // starting from given index
  75. EXPECT_EQ(s.find('a', 1), -1);
  76. EXPECT_EQ(s.find('b', 1), 1);
  77. // out of index
  78. EXPECT_EQ(s.find('a', 10), -1);
  79. }
  80. TEST(StringViewTest, Compare)
  81. {
  82. string_view s1 = "aaa";
  83. string_view s2 = "bbb";
  84. string_view s3 = "aaa";
  85. // Equals
  86. EXPECT_EQ(s1, s3);
  87. EXPECT_EQ(s1, s1);
  88. // Less then
  89. EXPECT_LT(s1, s2);
  90. // Greater then
  91. EXPECT_GT(s2, s1);
  92. }
  93. TEST(StringViewTest, MapKeyOrdering)
  94. {
  95. std::map<string_view, size_t> m = {{"bbb", 2}, {"aaa", 1}, {"ccc", 3}};
  96. size_t i = 1;
  97. for (const auto &kv : m)
  98. {
  99. EXPECT_EQ(kv.second, i);
  100. i++;
  101. }
  102. }