// RUN: %check_clang_tidy -std=c++98-or-later %s bugprone-non-zero-enum-to-bool-conversion %t -- \
// RUN:   -config="{CheckOptions: [{key: bugprone-non-zero-enum-to-bool-conversion.EnumIgnoreList, value: '::without::issue::IgnoredEnum;IgnoredSecondEnum'}]}"

namespace with::issue {

typedef enum EStatus {
  SUCCESS       = 1,
  FAILURE       = 2,
  INVALID_PARAM = 3,
  UNKNOWN       = 4
} Status;

bool testEnumConversion(EStatus value) {
  // CHECK-MESSAGES: :[[@LINE+1]]:10: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
  return value;
}

bool testTypedefConversion(Status value) {
  // CHECK-MESSAGES: :[[@LINE+1]]:10: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
  return value;
}

bool testExplicitConversion(EStatus value) {
  // CHECK-MESSAGES: :[[@LINE+1]]:28: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
  return static_cast<bool>(value);
}

bool testInIfConversion(EStatus value) {
  // CHECK-MESSAGES: :[[@LINE+1]]:7: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
  if (value) {
    return false;
  }
  return true;
}

bool testWithNegation(EStatus value) {
  // CHECK-MESSAGES: :[[@LINE+1]]:14: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
  return not value;
}

}

namespace without::issue {

enum StatusWithZero {
  UNK  = 0,
  OK   = 1,
  NOT_OK = 2
};

bool testEnumConversion(StatusWithZero value) {
  return value;
}

enum WithDefault {
  Value0,
  Value1
};

bool testEnumConversion(WithDefault value) {
  return value;
}

enum WithNegative : int {
  Nen2 = -2,
  Nen1,
  Nen0
};

bool testEnumConversion(WithNegative value) {
  return value;
}

enum EStatus {
  SUCCESS = 1,
  FAILURE,
  INVALID_PARAM,
  UNKNOWN
};

bool explicitCompare(EStatus value) {
  return value == SUCCESS;
}

bool testEnumeratorCompare() {
  return SUCCESS;
}

enum IgnoredEnum {
  IGNORED_VALUE_1 = 1,
  IGNORED_VALUE_2
};

enum IgnoredSecondEnum {
  IGNORED_SECOND_VALUE_1 = 1,
  IGNORED_SECOND_VALUE_2
};

bool testIgnored(IgnoredEnum value) {
  return value;
}

bool testIgnored(IgnoredSecondEnum value) {
  return value;
}

}
