blob: ffa61a6fb01443d38cb485b149d9219a826bbf85 [file] [log] [blame]
// Copyright 2021 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.
#ifndef ZXTEST_CPP_ASSERT_STREAMS_H_
#define ZXTEST_CPP_ASSERT_STREAMS_H_
#include <zxtest/cpp/internal.h>
#include "streams_helper.h"
// Basic assert macro implementation with stream support.
#define LIB_ZXTEST_CHECK_VAR(op, expected, actual, fatal, file, line, desc, ...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); true) \
if (StreamableAssertion assertion = StreamableAssertion( \
actual, expected, #actual, #expected, {.filename = file, .line_number = line}, fatal, \
LIB_ZXTEST_COMPARE_FN(op), LIB_ZXTEST_DEFAULT_PRINTER, LIB_ZXTEST_DEFAULT_PRINTER, \
zxtest::Runner::GetInstance()->GetScopedTraces()); \
assertion.IsTriggered()) \
LIB_ZXTEST_RETURN_TAG(fatal) assertion << desc << " "
#define LIB_ZXTEST_CHECK_VAR_STATUS(op, expected, actual, fatal, file, line, desc, ...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); true) \
if (StreamableAssertion assertion = StreamableAssertion( \
GetStatus(actual), GetStatus(expected), #actual, #expected, \
{.filename = file, .line_number = line}, fatal, LIB_ZXTEST_COMPARE_FN(op), \
LIB_ZXTEST_STATUS_PRINTER, LIB_ZXTEST_STATUS_PRINTER, \
zxtest::Runner::GetInstance()->GetScopedTraces()); \
assertion.IsTriggered()) \
LIB_ZXTEST_RETURN_TAG(fatal) assertion << desc << " "
#define LIB_ZXTEST_CHECK_VAR_COERCE(op, expected, actual, coerce_type, fatal, file, line, desc, \
...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); true) \
if (StreamableAssertion assertion = StreamableAssertion( \
actual, expected, #actual, #expected, {.filename = file, .line_number = line}, fatal, \
[&](const auto& expected_, const auto& actual_) { \
using DecayType = typename std::decay<coerce_type>::type; \
return op(static_cast<const DecayType&>(actual_), \
static_cast<const DecayType&>(expected_)); \
}, \
LIB_ZXTEST_DEFAULT_PRINTER, LIB_ZXTEST_DEFAULT_PRINTER, \
zxtest::Runner::GetInstance()->GetScopedTraces()); \
assertion.IsTriggered()) \
LIB_ZXTEST_RETURN_TAG(fatal) assertion << desc << " "
#define LIB_ZXTEST_CHECK_VAR_BYTES(op, expected, actual, size, fatal, file, line, desc, ...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); true) \
if (size_t byte_count = size; true) \
if (StreamableAssertion assertion = StreamableAssertion( \
zxtest::internal::ToPointer(actual), zxtest::internal::ToPointer(expected), #actual, \
#expected, {.filename = file, .line_number = line}, fatal, \
LIB_ZXTEST_COMPARE_3_FN(op, byte_count), LIB_ZXTEST_HEXDUMP_PRINTER(byte_count), \
LIB_ZXTEST_HEXDUMP_PRINTER(byte_count), \
zxtest::Runner::GetInstance()->GetScopedTraces()); \
assertion.IsTriggered()) \
LIB_ZXTEST_RETURN_TAG(fatal) assertion << desc << " "
#define LIB_ZXTEST_FAIL_NO_RETURN(fatal, desc, ...) \
StreamableFail({.filename = __FILE__, .line_number = __LINE__}, fatal, \
zxtest::Runner::GetInstance()->GetScopedTraces()) \
<< desc << " "
#define LIB_ZXTEST_ASSERT_ERROR(has_errors, fatal, desc, ...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); has_errors) \
LIB_ZXTEST_RETURN_TAG(fatal) LIB_ZXTEST_FAIL_NO_RETURN(fatal, desc, ##__VA_ARGS__)
#define FAIL(...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); true) \
return Tag() & LIB_ZXTEST_FAIL_NO_RETURN(true, "", ##__VA_ARGS__)
#define ZXTEST_SKIP(...) \
if ([]() { LIB_ZXTEST_CHECK_RUNNING(); }(); true) \
return Tag() & StreamableSkip({.filename = __FILE__, .line_number = __LINE__})
#endif // ZXTEST_CPP_ASSERT_STREAMS_H_