//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14)

// <string_view>

// template<class charT, class traits>
//   constexpr bool operator>(basic_string_view<charT, traits> lhs, basic_string_view<charT, traits> rhs);
// (plus "sufficient additional overloads" to make implicit conversions work as intended)

#include <string_view>
#include <cassert>
#include <string>

#include "test_macros.h"
#include "constexpr_char_traits.h"
#include "make_string.h"

template <class T>
struct ConvertibleTo {
  T t_;
  TEST_CONSTEXPR explicit ConvertibleTo(T t) : t_(t) {}
  TEST_CONSTEXPR operator T() const { return t_; }
};

template <class SV>
TEST_CONSTEXPR_CXX14 bool test() {
  typedef typename SV::value_type CharT;
  typedef typename SV::traits_type Traits;

  // Test the behavior of the operator, both with and without implicit conversions.
  SV v[] = {
      SV(MAKE_CSTRING(CharT, "")),
      SV(MAKE_CSTRING(CharT, "abc")),
      SV(MAKE_CSTRING(CharT, "abcdef")),
      SV(MAKE_CSTRING(CharT, "acb")),
  };
  for (int i = 0; i < 4; ++i) {
    for (int j = 0; j < 4; ++j) {
      // See http://eel.is/c++draft/string.view#tab:string.view.comparison.overloads
      bool expected = (i > j);
      assert((v[i] > v[j]) == expected);
      assert((v[i].data() > v[j]) == expected);
      assert((v[i] > v[j].data()) == expected);
      assert((ConvertibleTo<SV>(v[i]) > v[j]) == expected);
      assert((v[i] > ConvertibleTo<SV>(v[j])) == expected);

      if (TEST_STD_AT_LEAST_20_OR_RUNTIME_EVALUATED) {
        assert((std::basic_string<CharT, Traits>(v[i]) > v[j]) == expected);
        assert((v[i] > std::basic_string<CharT, Traits>(v[j])) == expected);
      }
    }
  }

  // Test its behavior with embedded null bytes.
  SV abc     = SV(MAKE_CSTRING(CharT, "abc"));
  SV abc0def = SV(MAKE_CSTRING(CharT, "abc\0def"), 7);
  SV abcdef  = SV(MAKE_CSTRING(CharT, "abcdef"));
  assert((abc > abc0def) == false);
  assert((abc > abcdef) == false);
  assert((abc0def > abc) == true);
  assert((abc0def > abcdef) == false);
  assert((abcdef > abc) == true);
  assert((abcdef > abc0def) == true);

  assert((abc.data() > abc0def) == false);
  assert((abc0def > abc.data()) == true);

  if (TEST_STD_AT_LEAST_20_OR_RUNTIME_EVALUATED) {
    assert((std::basic_string<CharT, Traits>(abc) > abc0def) == false);
    assert((abc0def > std::basic_string<CharT, Traits>(abc)) == true);
  }

  return true;
}

int main(int, char**) {
  test<std::string_view>();
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
  test<std::wstring_view>();
#endif
#if TEST_STD_VER >= 11
  test<std::u16string_view>();
  test<std::u32string_view>();
#endif
#if TEST_STD_VER > 14
  static_assert(test<std::string_view>(), "");
#  ifndef TEST_HAS_NO_WIDE_CHARACTERS
  static_assert(test<std::wstring_view>(), "");
#  endif
  static_assert(test<std::u16string_view>(), "");
  static_assert(test<std::u32string_view>(), "");
#endif

#if TEST_STD_VER > 11
  test<std::basic_string_view<char, constexpr_char_traits<char>>>();
  static_assert(test<std::basic_string_view<char, constexpr_char_traits<char>>>(), "");
#endif

#if TEST_STD_VER > 17
  test<std::u8string_view>();
  static_assert(test<std::u8string_view>());
#endif

  return 0;
}
