1// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This is a "No Compile Test" suite.
6// http://dev.chromium.org/developers/testing/no-compile-tests
7
8#include "base/traits_bag.h"
9
10namespace base {
11
12enum class RequiredTrait {
13  A,
14  B,
15  C
16};
17
18struct BooleanTrait {};
19
20struct NotAValidTrait {};
21
22struct TestTraits {
23  // List of traits that are valid inputs for the constructor below.
24  struct ValidTrait {
25    ValidTrait(RequiredTrait);
26    ValidTrait(BooleanTrait);
27  };
28
29  template <class... ArgTypes,
30            class CheckArgumentsAreValid = std::enable_if_t<
31                trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value>>
32  constexpr TestTraits(ArgTypes... args)
33      : required_trait(trait_helpers::GetEnum<RequiredTrait>(args...)),
34        boolean_trait(trait_helpers::HasTrait<BooleanTrait, ArgTypes...>()) {}
35
36  const RequiredTrait required_trait;
37  const bool boolean_trait;
38};
39
40#if defined(NCTEST_TRAITS_BAG_REQUIRED_TRAIT_NOT_SET)  // [r"The traits bag is missing a required trait."]
41constexpr TestTraits traits = {};
42#elif defined(NCTEST_TRAITS_BAG_INVALID_TRAIT)  // [r"no matching constructor for initialization of 'const base::TestTraits'"]
43constexpr TestTraits traits = {RequiredTrait::A, NotAValidTrait{}};
44#elif defined(NCTEST_TASK_TRAITS_MULTIPLE_REQUIRED_TRAIT)  // [r"The traits bag contains multiple traits of the same type."]
45constexpr TestTraits traits = {RequiredTrait::A, RequiredTrait::B};
46#elif defined(NCTEST_TASK_TRAITS_REDUNDANT_BOOLEAN_TRAIT)  // [r"The traits bag contains multiple traits of the same type."]
47constexpr TestTraits traits = {RequiredTrait::A, BooleanTrait(),
48                               BooleanTrait()};
49#endif
50
51}  // namespace base
52