xref: /llvm-project/libcxx/test/std/strings/basic.string/string.nonmembers/string.cmp/comparison.pass.cpp (revision fb855eb941b6d740cc6560297d0b4d3201dcaf9f)
122b5adffSMark de Wever //===----------------------------------------------------------------------===//
222b5adffSMark de Wever //
322b5adffSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
422b5adffSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
522b5adffSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
622b5adffSMark de Wever //
722b5adffSMark de Wever //===----------------------------------------------------------------------===//
822b5adffSMark de Wever 
922b5adffSMark de Wever // Starting with C++20 the spaceship operator was included. This tests
1022b5adffSMark de Wever // comparison in that context, thus doesn't support older language versions.
1122b5adffSMark de Wever // These are tested per operator.
1222b5adffSMark de Wever 
1322b5adffSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
1422b5adffSMark de Wever 
1522b5adffSMark de Wever // <string>
1622b5adffSMark de Wever 
1722b5adffSMark de Wever // template<class charT, class traits, class Allocator>
1822b5adffSMark de Wever //   see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,
1922b5adffSMark de Wever //                         const basic_string<charT, traits, Allocator>& rhs) noexcept;
2022b5adffSMark de Wever // template<class charT, class traits, class Allocator>
2122b5adffSMark de Wever //   see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,
2222b5adffSMark de Wever //                         const charT* rhs);
2322b5adffSMark de Wever 
2422b5adffSMark de Wever #include <string>
2522b5adffSMark de Wever 
2622b5adffSMark de Wever #include <array>
2722b5adffSMark de Wever #include <cassert>
2822b5adffSMark de Wever #include <string_view>
2922b5adffSMark de Wever 
3022b5adffSMark de Wever #include "constexpr_char_traits.h"
3122b5adffSMark de Wever #include "make_string.h"
3222b5adffSMark de Wever #include "test_comparisons.h"
3322b5adffSMark de Wever #include "test_macros.h"
3422b5adffSMark de Wever 
3522b5adffSMark de Wever #define STR(S) MAKE_STRING(CharT, S)
3622b5adffSMark de Wever 
3722b5adffSMark de Wever template <class T, class Ordering = std::strong_ordering>
test()3822b5adffSMark de Wever constexpr void test() {
3922b5adffSMark de Wever   AssertOrderAreNoexcept<T>();
4022b5adffSMark de Wever   AssertOrderReturn<Ordering, T>();
4122b5adffSMark de Wever 
4222b5adffSMark de Wever   using CharT = typename T::value_type;
4322b5adffSMark de Wever   AssertOrderReturn<Ordering, T, const CharT*>();
4422b5adffSMark de Wever 
4522b5adffSMark de Wever   // sorted values
4622b5adffSMark de Wever   std::array v{
4722b5adffSMark de Wever       STR(""),
4822b5adffSMark de Wever       STR("abc"),
4922b5adffSMark de Wever       STR("abcdef"),
5022b5adffSMark de Wever       STR("acb"),
5122b5adffSMark de Wever   };
5222b5adffSMark de Wever 
5322b5adffSMark de Wever   // sorted values with embedded NUL character
5422b5adffSMark de Wever   std::array vn{
5522b5adffSMark de Wever       STR("abc"),
5622b5adffSMark de Wever       STR("abc\0"),
5722b5adffSMark de Wever       STR("abc\0def"),
5822b5adffSMark de Wever       STR("acb\0"),
5922b5adffSMark de Wever   };
6022b5adffSMark de Wever   static_assert(v.size() == vn.size());
6122b5adffSMark de Wever 
62*fb855eb9SMark de Wever   for (std::size_t i = 0; i < v.size(); ++i) {
63*fb855eb9SMark de Wever     for (std::size_t j = 0; j < v.size(); ++j) {
6422b5adffSMark de Wever       assert(testOrder(v[i], v[j], i == j ? Ordering::equivalent : i < j ? Ordering::less : Ordering::greater));
6522b5adffSMark de Wever 
6622b5adffSMark de Wever       assert(testOrder(
6722b5adffSMark de Wever           v[i],
6822b5adffSMark de Wever           std::basic_string<CharT>{v[j]}.c_str(),
6922b5adffSMark de Wever           i == j  ? Ordering::equivalent
7022b5adffSMark de Wever           : i < j ? Ordering::less
7122b5adffSMark de Wever                   : Ordering::greater));
7222b5adffSMark de Wever 
7322b5adffSMark de Wever       // NUL test omitted for c-strings since it will fail.
7422b5adffSMark de Wever       assert(testOrder(vn[i], vn[j], i == j ? Ordering::equivalent : i < j ? Ordering::less : Ordering::greater));
7522b5adffSMark de Wever     }
7622b5adffSMark de Wever   }
7722b5adffSMark de Wever }
7822b5adffSMark de Wever 
test_all_types()7922b5adffSMark de Wever constexpr bool test_all_types() {
8022b5adffSMark de Wever   test<std::string>();
8122b5adffSMark de Wever   test<std::basic_string<char, constexpr_char_traits<char>>, std::weak_ordering>();
8222b5adffSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
8322b5adffSMark de Wever   test<std::wstring>();
8422b5adffSMark de Wever   test<std::basic_string<wchar_t, constexpr_char_traits<wchar_t>>, std::weak_ordering>();
8522b5adffSMark de Wever #endif
8622b5adffSMark de Wever   test<std::u8string>();
8722b5adffSMark de Wever   test<std::basic_string<char8_t, constexpr_char_traits<char8_t>>, std::weak_ordering>();
8822b5adffSMark de Wever   test<std::u16string>();
8922b5adffSMark de Wever   test<std::basic_string<char16_t, constexpr_char_traits<char16_t>>, std::weak_ordering>();
9022b5adffSMark de Wever   test<std::u32string>();
9122b5adffSMark de Wever   test<std::basic_string<char32_t, constexpr_char_traits<char32_t>>, std::weak_ordering>();
9222b5adffSMark de Wever 
9322b5adffSMark de Wever   return true;
9422b5adffSMark de Wever }
9522b5adffSMark de Wever 
main(int,char **)9622b5adffSMark de Wever int main(int, char**) {
9722b5adffSMark de Wever   test_all_types();
9822b5adffSMark de Wever   static_assert(test_all_types());
9922b5adffSMark de Wever 
10022b5adffSMark de Wever   return 0;
10122b5adffSMark de Wever }
102