// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <zircon/exception.h>

#include <zxtest/zxtest.h>

namespace {

TEST(ExceptionGetString, AllOfEm) {
  for (uint32_t i = 0; i < UINT16_MAX; i++) {
    switch (i) {
      case ZX_EXCP_GENERAL:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_GENERAL");
        continue;
      case ZX_EXCP_FATAL_PAGE_FAULT:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_FATAL_PAGE_FAULT");
        continue;
      case ZX_EXCP_UNDEFINED_INSTRUCTION:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_UNDEFINED_INSTRUCTION");
        continue;
      case ZX_EXCP_SW_BREAKPOINT:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_SW_BREAKPOINT");
        continue;
      case ZX_EXCP_HW_BREAKPOINT:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_HW_BREAKPOINT");
        continue;
      case ZX_EXCP_UNALIGNED_ACCESS:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_UNALIGNED_ACCESS");
        continue;
      case ZX_EXCP_THREAD_STARTING:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_THREAD_STARTING");
        continue;
      case ZX_EXCP_THREAD_EXITING:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_THREAD_EXITING");
        continue;
      case ZX_EXCP_POLICY_ERROR:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_POLICY_ERROR");
        continue;
      case ZX_EXCP_PROCESS_STARTING:
        EXPECT_STREQ(zx_exception_get_string(i), "ZX_EXCP_PROCESS_STARTING");
        continue;
      default:
        EXPECT_STREQ(zx_exception_get_string(i), "(UNKNOWN)");
        continue;
    }
  }
}

}  // namespace
