blob: 11dbedffa0f6e9b83d88e5987e1a0575f400ff01 [file] [log] [blame]
// Copyright 2020 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 <fstream>
#include <fidl/diagnostics_json.h>
#include "test_library.h"
#include "unittest_helpers.h"
namespace fidl {
namespace {
using diagnostics::Diagnostic;
#define ASSERT_JSON(DIAGS, JSON) ASSERT_NO_FATAL_FAILURES(ExpectJson(DIAGS, JSON))
void ExpectJson(std::vector<Diagnostic*> diagnostics, std::string expected_json) {
std::string actual_json = DiagnosticsJson(diagnostics).Produce().str();
if (expected_json != actual_json) {
std::ofstream output_actual("json_diagnostics_tests_actual.txt");
output_actual << actual_json;
output_actual.close();
std::ofstream output_expected("json_diagnostics_tests_expected.txt");
output_expected << expected_json;
output_expected.close();
}
EXPECT_STRING_EQ(
expected_json, actual_json,
"To compare results, run:\n\n diff ./json_diagnostics_tests_{expected,actual}.txt\n");
}
TEST(JsonDiagnosticsTests, BadError) {
TestLibrary library(R"FIDL(
library example;
table Table {
1: string? nullable_string;
};
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& diagnostics = library.diagnostics();
ASSERT_JSON(diagnostics, R"JSON([
{
"category": "fidlc/error",
"message": "Table members cannot be nullable",
"path": "example.fidl",
"start_line": 5,
"start_char": 4,
"end_line": 5,
"end_char": 30
}
])JSON");
}
TEST(JsonDiagnosticsTests, WarnPassed) {
TestLibrary library(R"FIDL(
library example;
[Layort = "Simple"]
protocol Protocol {
Method();
};
)FIDL");
ASSERT_TRUE(library.Compile());
const auto& diagnostics = library.diagnostics();
ASSERT_JSON(diagnostics, R"JSON([
{
"category": "fidlc/warning",
"message": "suspect attribute with name 'Layort'; did you mean 'Layout'?",
"path": "example.fidl",
"start_line": 4,
"start_char": 1,
"end_line": 4,
"end_char": 18
}
])JSON");
}
TEST(JsonDiagnosticsTests, BadMultipleErrors) {
TestLibrary library(R"FIDL(
library example;
protocol P {};
protocol P {}; // Error: name collision
table Table {
1: string? s; // Error: nullable table member
};
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& diagnostics = library.diagnostics();
ASSERT_JSON(diagnostics, R"JSON([
{
"category": "fidlc/error",
"message": "multiple declarations of 'P'; also declared at example.fidl:4:10",
"path": "example.fidl",
"start_line": 5,
"start_char": 9,
"end_line": 5,
"end_char": 10
},
{
"category": "fidlc/error",
"message": "Table members cannot be nullable",
"path": "example.fidl",
"start_line": 8,
"start_char": 4,
"end_line": 8,
"end_char": 16
}
])JSON");
}
TEST(JsonDiagnosticsTests, BadSpanIsEOF) {
TestLibrary library(R"FIDL(
library example;
table Table {
1: string foo;
}
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& diagnostics = library.diagnostics();
ASSERT_JSON(diagnostics, R"JSON([
{
"category": "fidlc/error",
"message": "unexpected token EndOfFile, was expecting Semicolon",
"path": "example.fidl",
"start_line": 7,
"start_char": 0,
"end_line": 7,
"end_char": 0
}
])JSON");
}
} // namespace
} // namespace fidl