blob: 8fc45654083bbfb0fd35c10153482c801785966b [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 "error_test.h"
#include "fidl/diagnostics_json.h"
#include "fidl/experimental_flags.h"
#include "test_library.h"
#include "unittest_helpers.h"
namespace fidl {
namespace {
#define ASSERT_JSON(DIAGS, JSON) ASSERT_NO_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;
type Table = table {
1: nullable_string string:optional;
};
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& diagnostics = library.Diagnostics();
ASSERT_JSON(diagnostics, R"JSON([
{
"category": "fidlc/error",
"message": "Table members cannot be optional",
"path": "example.fidl",
"start_line": 5,
"start_char": 7,
"end_line": 5,
"end_char": 22
}
])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": 0,
"end_line": 4,
"end_char": 17
}
])JSON");
}
TEST(JsonDiagnosticsTests, BadMultipleErrors) {
TestLibrary library(R"FIDL(
library example;
type Foo = enum : string { // Error: enums may only be of integral primitive type
A = 1;
};
type Bar = table {
2: x uint32; // Error: missing ordinal 1 (ordinals must be dense)
};
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& diagnostics = library.Diagnostics();
ASSERT_JSON(diagnostics, R"JSON([
{
"category": "fidlc/error",
"message": "enums may only be of integral primitive type, found string",
"path": "example.fidl",
"start_line": 4,
"start_char": 5,
"end_line": 4,
"end_char": 8
},
{
"category": "fidlc/error",
"message": "missing ordinal 1 (ordinals must be dense); consider marking it reserved",
"path": "example.fidl",
"start_line": 9,
"start_char": 4,
"end_line": 9,
"end_char": 6
}
])JSON");
}
TEST(JsonDiagnosticsTests, BadSpanIsEOF) {
TestLibrary library(R"FIDL(
library example;
type Table = table {
1: foo string;
}
)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