// 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_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_GENERAL");
        continue;
      case ZX_EXCP_FATAL_PAGE_FAULT:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_FATAL_PAGE_FAULT");
        continue;
      case ZX_EXCP_UNDEFINED_INSTRUCTION:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_UNDEFINED_INSTRUCTION");
        continue;
      case ZX_EXCP_SW_BREAKPOINT:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_SW_BREAKPOINT");
        continue;
      case ZX_EXCP_HW_BREAKPOINT:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_HW_BREAKPOINT");
        continue;
      case ZX_EXCP_UNALIGNED_ACCESS:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_UNALIGNED_ACCESS");
        continue;
      case ZX_EXCP_THREAD_STARTING:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_THREAD_STARTING");
        continue;
      case ZX_EXCP_THREAD_EXITING:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_THREAD_EXITING");
        continue;
      case ZX_EXCP_POLICY_ERROR:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_POLICY_ERROR");
        continue;
      case ZX_EXCP_PROCESS_STARTING:
        EXPECT_STR_EQ(zx_exception_get_string(i), "ZX_EXCP_PROCESS_STARTING");
        continue;
      default:
        EXPECT_STR_EQ(zx_exception_get_string(i), "(UNKNOWN)");
        continue;
    }
  }
}

}  // namespace
