tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

extension_test.cc (3285B)


      1 //
      2 // Copyright 2017 The Abseil Authors.
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      https://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "absl/strings/internal/str_format/extension.h"
     18 
     19 #include <random>
     20 #include <string>
     21 
     22 #include "gmock/gmock.h"
     23 #include "gtest/gtest.h"
     24 #include "absl/strings/str_format.h"
     25 #include "absl/strings/string_view.h"
     26 
     27 namespace my_namespace {
     28 class UserDefinedType {
     29 public:
     30  UserDefinedType() = default;
     31 
     32  void Append(absl::string_view str) { value_.append(str.data(), str.size()); }
     33  const std::string& Value() const { return value_; }
     34 
     35  friend void AbslFormatFlush(UserDefinedType* x, absl::string_view str) {
     36    x->Append(str);
     37  }
     38 
     39 private:
     40  std::string value_;
     41 };
     42 }  // namespace my_namespace
     43 
     44 namespace {
     45 
     46 std::string MakeRandomString(size_t len) {
     47  std::random_device rd;
     48  std::mt19937 gen(rd());
     49  std::uniform_int_distribution<> dis('a', 'z');
     50  std::string s(len, '0');
     51  for (char& c : s) {
     52    c = dis(gen);
     53  }
     54  return s;
     55 }
     56 
     57 TEST(FormatExtensionTest, SinkAppendSubstring) {
     58  for (size_t chunk_size : {1, 10, 100, 1000, 10000}) {
     59    std::string expected, actual;
     60    absl::str_format_internal::FormatSinkImpl sink(&actual);
     61    for (size_t chunks = 0; chunks < 10; ++chunks) {
     62      std::string rand = MakeRandomString(chunk_size);
     63      expected += rand;
     64      sink.Append(rand);
     65    }
     66    sink.Flush();
     67    EXPECT_EQ(actual, expected);
     68  }
     69 }
     70 
     71 TEST(FormatExtensionTest, SinkAppendChars) {
     72  for (size_t chunk_size : {1, 10, 100, 1000, 10000}) {
     73    std::string expected, actual;
     74    absl::str_format_internal::FormatSinkImpl sink(&actual);
     75    for (size_t chunks = 0; chunks < 10; ++chunks) {
     76      std::string rand = MakeRandomString(1);
     77      expected.append(chunk_size, rand[0]);
     78      sink.Append(chunk_size, rand[0]);
     79    }
     80    sink.Flush();
     81    EXPECT_EQ(actual, expected);
     82  }
     83 }
     84 
     85 TEST(FormatExtensionTest, VerifyEnumEquality) {
     86 #define X_VAL(id)                           \
     87  EXPECT_EQ(absl::FormatConversionChar::id, \
     88            absl::str_format_internal::FormatConversionCharInternal::id);
     89  ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(X_VAL, );
     90 #undef X_VAL
     91 
     92 #define X_VAL(id)                              \
     93  EXPECT_EQ(absl::FormatConversionCharSet::id, \
     94            absl::str_format_internal::FormatConversionCharSetInternal::id);
     95  ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(X_VAL, );
     96 #undef X_VAL
     97 }
     98 
     99 TEST(FormatExtensionTest, SetConversionChar) {
    100  absl::str_format_internal::FormatConversionSpecImpl spec;
    101  EXPECT_EQ(spec.conversion_char(),
    102            absl::str_format_internal::FormatConversionCharInternal::kNone);
    103  spec.set_conversion_char(
    104      absl::str_format_internal::FormatConversionCharInternal::d);
    105  EXPECT_EQ(spec.conversion_char(),
    106            absl::str_format_internal::FormatConversionCharInternal::d);
    107 }
    108 
    109 }  // namespace