// Copyright 2021 The Cobalt Authors. All Rights Reserved.
//
// 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 aLicense 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 <utility>

#include "starboard/configuration.h"
#include "starboard/types.h"

namespace starboard::foo::bar::baz {

constexpr int life() {
  return 42;
}

}  // namespace starboard::foo::bar::baz

namespace starboard {
namespace nplb {
namespace {

// Test Structured bindings support, P0217R3

#ifndef __cpp_structured_bindings
#error "Structured bindings support is required"
#endif

constexpr char test_structured_bindings() {
  auto [a, b] = std::pair<int, char>(42, 'A');
  return b;
}

static_assert(test_structured_bindings() == 'A',
              "Structured bindings support is required");

// Test UTF-8 literal support, N4267

#ifndef __cpp_unicode_literals
#error "Unicode literal support is required"
#endif

static_assert('A' == u8'A', "Unicode literal support is required");

// Test constexpr lambda support, P0170R1

constexpr int add_one(int n) {
  return [n] { return n + 1; }();
}

static_assert(add_one(1) == 2, "Constexpr lambdas support is required");

// Test Nested Namespaces support

static_assert(starboard::foo::bar::baz::life() == 42,
              "Nested Namespaces support is required");

// Test fallthrough support

constexpr int test_fallthrough(int n) {
  switch (n) {
    case 1:
      return 1;
      break;
    case 2:
      [[fallthrough]];  // intentional fallthrough
    case 3:
      return 3;
      break;
  }

  return 0;
}

static_assert(test_fallthrough(2) == 3,
              "[fallthrough]] attribute support is required");

}  // namespace
}  // namespace nplb
}  // namespace starboard
