blob: 5b028eeb405c451ea72547609443b9c2567ccc33 [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.
#include <lib/elfldltl/diagnostics.h>
#include <sstream>
#include <string>
#include <vector>
#include <zxtest/zxtest.h>
namespace {
#ifndef ASSERT_DEATH
#define ASSERT_DEATH(...) // Not available on host.
#endif
TEST(ElfldltlDiagnosticsTests, Trap) {
auto diag = elfldltl::TrapDiagnostics();
EXPECT_EQ(1, diag.errors());
ASSERT_DEATH([diag]() mutable { diag.FormatError("errors are fatal"); });
EXPECT_EQ(1, diag.warnings());
ASSERT_DEATH([diag]() mutable { diag.FormatWarning("warnings are fatal"); });
}
TEST(ElfldltlDiagnosticsTests, Panic) {
auto diag = elfldltl::PanicDiagnostics();
EXPECT_EQ(1, diag.errors());
ASSERT_DEATH([diag]() mutable { diag.FormatError("errors are fatal"); });
EXPECT_EQ(1, diag.warnings());
ASSERT_DEATH([diag]() mutable { diag.FormatWarning("warnings are fatal"); });
}
TEST(ElfldltlDiagnosticsTests, OneString) {
std::string error = "no error";
auto diag = elfldltl::OneStringDiagnostics(error);
EXPECT_FALSE(diag.FormatError("first error"));
EXPECT_STREQ(error, "first error");
EXPECT_EQ(1, diag.errors());
EXPECT_FALSE(diag.FormatError("second error"));
EXPECT_STREQ(error, "second error");
EXPECT_EQ(2, diag.errors());
EXPECT_FALSE(diag.FormatWarning("warning"));
EXPECT_STREQ(error, "warning");
EXPECT_EQ(1, diag.warnings());
EXPECT_EQ(2, diag.errors());
}
TEST(ElfldltlDiagnosticsTests, CollectStrings) {
std::vector<std::string> errors;
const elfldltl::DiagnosticsFlags flags = {.multiple_errors = true};
auto diag = elfldltl::CollectStringsDiagnostics(errors, flags);
EXPECT_EQ(0, diag.errors());
EXPECT_EQ(0, diag.warnings());
EXPECT_TRUE(diag.FormatError("first error"));
EXPECT_EQ(1, errors.size());
EXPECT_EQ(0, diag.warnings());
EXPECT_EQ(1, diag.errors());
EXPECT_TRUE(diag.FormatError("second error"));
EXPECT_EQ(2, errors.size());
EXPECT_EQ(0, diag.warnings());
EXPECT_EQ(2, diag.errors());
EXPECT_TRUE(diag.FormatWarning("warning"));
EXPECT_EQ(3, errors.size());
EXPECT_EQ(1, diag.warnings());
EXPECT_EQ(2, diag.errors());
ASSERT_GE(errors.size(), 3);
EXPECT_STREQ(errors[0], "first error");
EXPECT_STREQ(errors[1], "second error");
EXPECT_STREQ(errors[2], "warning");
}
TEST(ElfldltlDiagnosticsTests, Ostream) {
std::stringstream sstr;
const elfldltl::DiagnosticsFlags flags = {.multiple_errors = true};
auto diag = elfldltl::OstreamDiagnostics(sstr, flags, 'a', 1, ":");
EXPECT_EQ(0, diag.errors());
EXPECT_EQ(0, diag.warnings());
EXPECT_TRUE(diag.FormatError("first error"));
EXPECT_EQ(1, diag.errors());
EXPECT_TRUE(diag.FormatError("second error"));
EXPECT_EQ(2, diag.errors());
EXPECT_TRUE(diag.FormatWarning("warning"));
EXPECT_EQ(1, diag.warnings());
EXPECT_EQ(2, diag.errors());
EXPECT_STREQ(sstr.str(),
"a1:first error\n"
"a1:second error\n"
"a1:warning\n");
}
} // namespace