From 56c8ad237aa4088e61be09ca30830ee704f10018 Mon Sep 17 00:00:00 2001 From: Konstantin Boyarinov Date: Sat, 27 Nov 2021 01:24:16 +0300 Subject: [PATCH] [libcxx][NFC] Add tests for associative containers key_comp and value_comp Add missing tests to improve associative containers code coverage: - Tests for key_comp() and value_comp() observers - Tests for std::map and std::multimap value_compare member class Reviewed by: ldionne, rarutyun, #libc Differential Revision: https://reviews.llvm.org/D113998 --- .../associative/map/map.cons/compare.pass.cpp | 2 - .../map/map.observers/key_comp.pass.cpp | 30 ++++++++++++++ .../map/map.observers/value_comp.pass.cpp | 30 ++++++++++++++ .../map/map.value_compare/invoke.pass.cpp | 47 ++++++++++++++++++++++ .../map/map.value_compare/types.pass.cpp | 30 ++++++++++++++ .../multimap/multimap.cons/compare.pass.cpp | 2 - .../multimap/multimap.observers/key_comp.pass.cpp | 30 ++++++++++++++ .../multimap.observers/value_comp.pass.cpp | 30 ++++++++++++++ .../multimap.value_compare/invoke.pass.cpp | 47 ++++++++++++++++++++++ .../multimap/multimap.value_compare/types.pass.cpp | 30 ++++++++++++++ .../multiset/multiset.cons/compare.pass.cpp | 6 +-- .../multiset/multiset.observers/comp.pass.cpp | 33 +++++++++++++++ .../associative/set/set.cons/compare.pass.cpp | 6 +-- .../associative/set/set.observers/comp.pass.cpp | 33 +++++++++++++++ 14 files changed, 342 insertions(+), 14 deletions(-) create mode 100644 libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp create mode 100644 libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp create mode 100644 libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp create mode 100644 libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp create mode 100644 libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp create mode 100644 libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp create mode 100644 libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp create mode 100644 libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp create mode 100644 libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp create mode 100644 libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp diff --git a/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp index 4e55490..04702f3 100644 --- a/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp +++ b/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp @@ -12,8 +12,6 @@ // explicit map(const key_compare& comp); -// key_compare key_comp() const; - #include #include diff --git a/libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp b/libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp new file mode 100644 index 0000000..f44e78f --- /dev/null +++ b/libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// key_compare key_comp() const; + +#include +#include +#include + +int main(int, char**) { + typedef std::map map_type; + + map_type m; + std::pair p1 = m.insert(map_type::value_type(1, "abc")); + std::pair p2 = m.insert(map_type::value_type(2, "abc")); + + const map_type& cm = m; + + assert(cm.key_comp()(p1.first->first, p2.first->first)); + assert(!cm.key_comp()(p2.first->first, p1.first->first)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp b/libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp new file mode 100644 index 0000000..02b9659 --- /dev/null +++ b/libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// value_compare value_comp() const; + +#include +#include +#include + +int main(int, char**) { + typedef std::map map_type; + + map_type m; + std::pair p1 = m.insert(map_type::value_type(1, "abc")); + std::pair p2 = m.insert(map_type::value_type(2, "abc")); + + const map_type& cm = m; + + assert(cm.value_comp()(*p1.first, *p2.first)); + assert(!cm.value_comp()(*p2.first, *p1.first)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp b/libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp new file mode 100644 index 0000000..2cfbb2a --- /dev/null +++ b/libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// class value_compare + +// bool operator()( const value_type& lhs, const value_type& rhs ) const; + +#include +#include +#include +#include + +template +struct CallCompMember : Map::value_compare { + CallCompMember(const typename Map::value_compare& vc) : Map::value_compare(vc) {} + + typedef typename Map::value_type value_type; + bool operator()(const value_type& value1, const value_type& value2) const { + return this->comp(value1.first, value2.first); + } +}; + +int main(int, char**) { + typedef std::map map_type; + + map_type m; + std::pair p1 = m.insert(map_type::value_type(1, "abc")); + std::pair p2 = m.insert(map_type::value_type(2, "abc")); + + const map_type::value_compare vc = m.value_comp(); + CallCompMember call_comp = m.value_comp(); + + assert(vc(*p1.first, *p2.first)); + assert(call_comp(*p1.first, *p2.first)); + + assert(!vc(*p2.first, *p1.first)); + assert(!call_comp(*p2.first, *p1.first)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp b/libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp new file mode 100644 index 0000000..1d60699 --- /dev/null +++ b/libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// class value_compare + +// REQUIRES: c++98 || c++03 || c++11 || c++14 + +#include +#include + +#include "test_macros.h" + +int main(int, char**) { + typedef std::map map_type; + typedef map_type::value_compare value_compare; + typedef map_type::value_type value_type; + + ASSERT_SAME_TYPE(value_compare::result_type, bool); + ASSERT_SAME_TYPE(value_compare::first_argument_type, value_type); + ASSERT_SAME_TYPE(value_compare::second_argument_type, value_type); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp index 5cf4b5d..ebe1c9d 100644 --- a/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp +++ b/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp @@ -12,8 +12,6 @@ // explicit multimap(const key_compare& comp); -// key_compare key_comp() const; - #include #include diff --git a/libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp new file mode 100644 index 0000000..cc6b18c --- /dev/null +++ b/libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// key_compare key_comp() const; + +#include +#include +#include + +int main(int, char**) { + typedef std::multimap map_type; + + map_type m; + map_type::iterator i1 = m.insert(map_type::value_type(1, "abc")); + map_type::iterator i2 = m.insert(map_type::value_type(2, "abc")); + + const map_type& cm = m; + + assert(cm.key_comp()(i1->first, i2->first)); + assert(!cm.key_comp()(i2->first, i1->first)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp new file mode 100644 index 0000000..3b9ed80 --- /dev/null +++ b/libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// value_compare value_comp() const; + +#include +#include +#include + +int main(int, char**) { + typedef std::multimap map_type; + + map_type m; + map_type::iterator i1 = m.insert(map_type::value_type(1, "abc")); + map_type::iterator i2 = m.insert(map_type::value_type(2, "abc")); + + const map_type& cm = m; + + assert(cm.value_comp()(*i1, *i2)); + assert(!cm.value_comp()(*i2, *i1)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp new file mode 100644 index 0000000..75a1114 --- /dev/null +++ b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// class value_compare + +// bool operator()( const value_type& lhs, const value_type& rhs ) const; + +#include +#include +#include +#include + +template +struct CallCompMember : MMap::value_compare { + CallCompMember(const typename MMap::value_compare& vc) : MMap::value_compare(vc) {} + + typedef typename MMap::value_type value_type; + bool operator()(const value_type& value1, const value_type& value2) const { + return this->comp(value1.first, value2.first); + } +}; + +int main(int, char**) { + typedef std::multimap map_type; + + map_type m; + map_type::iterator i1 = m.insert(map_type::value_type(1, "abc")); + map_type::iterator i2 = m.insert(map_type::value_type(2, "abc")); + + const map_type::value_compare vc = m.value_comp(); + CallCompMember call_comp = m.value_comp(); + + assert(vc(*i1, *i2)); + assert(call_comp(*i1, *i2)); + + assert(!vc(*i2, *i1)); + assert(!call_comp(*i2, *i1)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp new file mode 100644 index 0000000..6ecaf92 --- /dev/null +++ b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// class value_compare + +// REQUIRES: c++98 || c++03 || c++11 || c++14 + +#include +#include + +#include "test_macros.h" + +int main(int, char**) { + typedef std::multimap map_type; + typedef map_type::value_compare value_compare; + typedef map_type::value_type value_type; + + ASSERT_SAME_TYPE(value_compare::result_type, bool); + ASSERT_SAME_TYPE(value_compare::first_argument_type, value_type); + ASSERT_SAME_TYPE(value_compare::second_argument_type, value_type); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp index e9a78b6..6debbd6 100644 --- a/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp +++ b/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp @@ -10,11 +10,7 @@ // class multiset -// explicit multiset(const value_compare& comp); -// value_compare and key_compare are the same type for set/multiset - -// key_compare key_comp() const; -// value_compare value_comp() const; +// explicit multiset(const key_compare& comp); #include #include diff --git a/libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp b/libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp new file mode 100644 index 0000000..ad2a304 --- /dev/null +++ b/libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// key_compare key_comp() const; +// value_compare value_comp() const; + +#include +#include + +int main(int, char**) { + typedef std::multiset set_type; + + set_type s; + set_type::iterator i1 = s.insert(1); + set_type::iterator i2 = s.insert(2); + + const set_type& cs = s; + + assert(cs.key_comp()(*i1, *i2)); + assert(!cs.key_comp()(*i2, *i1)); + + assert(cs.value_comp()(*i1, *i2)); + assert(!cs.value_comp()(*i2, *i1)); + + return 0; +} diff --git a/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp index 2db093a..4cd3f30 100644 --- a/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp +++ b/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp @@ -10,11 +10,7 @@ // class set -// explicit set(const value_compare& comp) const; -// value_compare and key_compare are the same type for set/multiset - -// key_compare key_comp() const; -// value_compare value_comp() const; +// explicit set(const key_compare& comp) const; #include #include diff --git a/libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp b/libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp new file mode 100644 index 0000000..6f573a5 --- /dev/null +++ b/libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// key_compare key_comp() const; +// value_compare value_comp() const; + +#include +#include + +int main(int, char**) { + typedef std::set set_type; + + set_type s; + std::pair p1 = s.insert(1); + std::pair p2 = s.insert(2); + + const set_type& cs = s; + + assert(cs.key_comp()(*p1.first, *p2.first)); + assert(!cs.key_comp()(*p2.first, *p1.first)); + + assert(cs.value_comp()(*p1.first, *p2.first)); + assert(!cs.value_comp()(*p2.first, *p1.first)); + + return 0; +} -- 2.7.4