span_test.cc 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* Copyright (c) 2017, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <stdio.h>
  15. #include <vector>
  16. #include <gtest/gtest.h>
  17. #include <openssl/ssl.h>
  18. BSSL_NAMESPACE_BEGIN
  19. namespace {
  20. static void TestCtor(Span<int> s, const int *ptr, size_t size) {
  21. EXPECT_EQ(s.data(), ptr);
  22. EXPECT_EQ(s.size(), size);
  23. }
  24. static void TestConstCtor(Span<const int> s, const int *ptr, size_t size) {
  25. EXPECT_EQ(s.data(), ptr);
  26. EXPECT_EQ(s.size(), size);
  27. }
  28. TEST(SpanTest, CtorEmpty) {
  29. Span<int> s;
  30. TestCtor(s, nullptr, 0);
  31. }
  32. TEST(SpanTest, CtorFromPtrAndSize) {
  33. std::vector<int> v = {7, 8, 9, 10};
  34. Span<int> s(v.data(), v.size());
  35. TestCtor(s, v.data(), v.size());
  36. }
  37. TEST(SpanTest, CtorFromVector) {
  38. std::vector<int> v = {1, 2};
  39. // Const ctor is implicit.
  40. TestConstCtor(v, v.data(), v.size());
  41. // Mutable is explicit.
  42. Span<int> s(v);
  43. TestCtor(s, v.data(), v.size());
  44. }
  45. TEST(SpanTest, CtorConstFromArray) {
  46. int v[] = {10, 11};
  47. // Array ctor is implicit for const and mutable T.
  48. TestConstCtor(v, v, 2);
  49. TestCtor(v, v, 2);
  50. }
  51. TEST(SpanTest, MakeSpan) {
  52. std::vector<int> v = {100, 200, 300};
  53. TestCtor(MakeSpan(v), v.data(), v.size());
  54. TestCtor(MakeSpan(v.data(), v.size()), v.data(), v.size());
  55. TestConstCtor(MakeSpan(v.data(), v.size()), v.data(), v.size());
  56. TestConstCtor(MakeSpan(v), v.data(), v.size());
  57. }
  58. TEST(SpanTest, MakeConstSpan) {
  59. std::vector<int> v = {100, 200, 300};
  60. TestConstCtor(MakeConstSpan(v), v.data(), v.size());
  61. TestConstCtor(MakeConstSpan(v.data(), v.size()), v.data(), v.size());
  62. // But not:
  63. // TestConstCtor(MakeSpan(v), v.data(), v.size());
  64. }
  65. TEST(SpanTest, Accessor) {
  66. std::vector<int> v({42, 23, 5, 101, 80});
  67. Span<int> s(v);
  68. for (size_t i = 0; i < s.size(); ++i) {
  69. EXPECT_EQ(s[i], v[i]);
  70. EXPECT_EQ(s.at(i), v.at(i));
  71. }
  72. EXPECT_EQ(s.begin(), v.data());
  73. EXPECT_EQ(s.end(), v.data() + v.size());
  74. }
  75. } // namespace
  76. BSSL_NAMESPACE_END