-- 70b243f160a2f0f222066f62e06cc4346aea683d by Gennadiy Civil <misterg@google.com>: Replace tests with new googletest Test Suite APIs PiperOrigin-RevId: 228901526 -- 28fe449f416c3d3fe882ef3dfa4289b94be5f8af by CJ Johnson <johnsoncj@google.com>: Changes the style of enable_if on InlinedVector::insert(...) to match all others PiperOrigin-RevId: 228878640 -- 5b4732f783d16cfb19c8c42962201aafe12b3c0f by Abseil Team <absl-team@google.com>: Update the absl::FromDateTime() deprecation message to refer to absl::FromCivil(), the recommended replacement despite a slight change in behavior for skipped civil times. PiperOrigin-RevId: 228820837 -- ee77056d753bb8665236a173064af85d935acfc4 by Gennadiy Civil <misterg@google.com>: Bump googletest to the latest PiperOrigin-RevId: 228792994 -- aebc04f76b83a26432dba8e6199c971d5b69df0f by CJ Johnson <johnsoncj@google.com>: Switches InlinedVector input/forward iterator tagged dispatch from callsite to template decorator PiperOrigin-RevId: 228771063 GitOrigin-RevId: 70b243f160a2f0f222066f62e06cc4346aea683d Change-Id: I5f8cd05685ff642eff81187b8e207a0bdbcf073a
		
			
				
	
	
		
			126 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright 2018 The Abseil Authors.
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
//      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
#include "absl/container/flat_hash_set.h"
 | 
						|
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include "absl/container/internal/hash_generator_testing.h"
 | 
						|
#include "absl/container/internal/unordered_set_constructor_test.h"
 | 
						|
#include "absl/container/internal/unordered_set_lookup_test.h"
 | 
						|
#include "absl/container/internal/unordered_set_modifiers_test.h"
 | 
						|
#include "absl/memory/memory.h"
 | 
						|
#include "absl/strings/string_view.h"
 | 
						|
 | 
						|
namespace absl {
 | 
						|
namespace container_internal {
 | 
						|
namespace {
 | 
						|
 | 
						|
using ::absl::container_internal::hash_internal::Enum;
 | 
						|
using ::absl::container_internal::hash_internal::EnumClass;
 | 
						|
using ::testing::Pointee;
 | 
						|
using ::testing::UnorderedElementsAre;
 | 
						|
using ::testing::UnorderedElementsAreArray;
 | 
						|
 | 
						|
template <class T>
 | 
						|
using Set =
 | 
						|
    absl::flat_hash_set<T, StatefulTestingHash, StatefulTestingEqual, Alloc<T>>;
 | 
						|
 | 
						|
using SetTypes =
 | 
						|
    ::testing::Types<Set<int>, Set<std::string>, Set<Enum>, Set<EnumClass>>;
 | 
						|
 | 
						|
INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, ConstructorTest, SetTypes);
 | 
						|
INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, LookupTest, SetTypes);
 | 
						|
INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, ModifiersTest, SetTypes);
 | 
						|
 | 
						|
TEST(FlatHashSet, EmplaceString) {
 | 
						|
  std::vector<std::string> v = {"a", "b"};
 | 
						|
  absl::flat_hash_set<absl::string_view> hs(v.begin(), v.end());
 | 
						|
  EXPECT_THAT(hs, UnorderedElementsAreArray(v));
 | 
						|
}
 | 
						|
 | 
						|
TEST(FlatHashSet, BitfieldArgument) {
 | 
						|
  union {
 | 
						|
    int n : 1;
 | 
						|
  };
 | 
						|
  n = 0;
 | 
						|
  absl::flat_hash_set<int> s = {n};
 | 
						|
  s.insert(n);
 | 
						|
  s.insert(s.end(), n);
 | 
						|
  s.insert({n});
 | 
						|
  s.erase(n);
 | 
						|
  s.count(n);
 | 
						|
  s.prefetch(n);
 | 
						|
  s.find(n);
 | 
						|
  s.contains(n);
 | 
						|
  s.equal_range(n);
 | 
						|
}
 | 
						|
 | 
						|
TEST(FlatHashSet, MergeExtractInsert) {
 | 
						|
  struct Hash {
 | 
						|
    size_t operator()(const std::unique_ptr<int>& p) const { return *p; }
 | 
						|
  };
 | 
						|
  struct Eq {
 | 
						|
    bool operator()(const std::unique_ptr<int>& a,
 | 
						|
                    const std::unique_ptr<int>& b) const {
 | 
						|
      return *a == *b;
 | 
						|
    }
 | 
						|
  };
 | 
						|
  absl::flat_hash_set<std::unique_ptr<int>, Hash, Eq> set1, set2;
 | 
						|
  set1.insert(absl::make_unique<int>(7));
 | 
						|
  set1.insert(absl::make_unique<int>(17));
 | 
						|
 | 
						|
  set2.insert(absl::make_unique<int>(7));
 | 
						|
  set2.insert(absl::make_unique<int>(19));
 | 
						|
 | 
						|
  EXPECT_THAT(set1, UnorderedElementsAre(Pointee(7), Pointee(17)));
 | 
						|
  EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7), Pointee(19)));
 | 
						|
 | 
						|
  set1.merge(set2);
 | 
						|
 | 
						|
  EXPECT_THAT(set1, UnorderedElementsAre(Pointee(7), Pointee(17), Pointee(19)));
 | 
						|
  EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7)));
 | 
						|
 | 
						|
  auto node = set1.extract(absl::make_unique<int>(7));
 | 
						|
  EXPECT_TRUE(node);
 | 
						|
  EXPECT_THAT(node.value(), Pointee(7));
 | 
						|
  EXPECT_THAT(set1, UnorderedElementsAre(Pointee(17), Pointee(19)));
 | 
						|
 | 
						|
  auto insert_result = set2.insert(std::move(node));
 | 
						|
  EXPECT_FALSE(node);
 | 
						|
  EXPECT_FALSE(insert_result.inserted);
 | 
						|
  EXPECT_TRUE(insert_result.node);
 | 
						|
  EXPECT_THAT(insert_result.node.value(), Pointee(7));
 | 
						|
  EXPECT_EQ(**insert_result.position, 7);
 | 
						|
  EXPECT_NE(insert_result.position->get(), insert_result.node.value().get());
 | 
						|
  EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7)));
 | 
						|
 | 
						|
  node = set1.extract(absl::make_unique<int>(17));
 | 
						|
  EXPECT_TRUE(node);
 | 
						|
  EXPECT_THAT(node.value(), Pointee(17));
 | 
						|
  EXPECT_THAT(set1, UnorderedElementsAre(Pointee(19)));
 | 
						|
 | 
						|
  node.value() = absl::make_unique<int>(23);
 | 
						|
 | 
						|
  insert_result = set2.insert(std::move(node));
 | 
						|
  EXPECT_FALSE(node);
 | 
						|
  EXPECT_TRUE(insert_result.inserted);
 | 
						|
  EXPECT_FALSE(insert_result.node);
 | 
						|
  EXPECT_EQ(**insert_result.position, 23);
 | 
						|
  EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7), Pointee(23)));
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace
 | 
						|
}  // namespace container_internal
 | 
						|
}  // namespace absl
 |