blob: 5b8c6c75d1cd16e650fdc7d725c9f6765df48c8a [file] [log] [blame]
// Copyright 2018 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 <unittest/unittest.h>
#include <fidl/flat_ast.h>
#include <fidl/lexer.h>
#include <fidl/parser.h>
#include <fidl/source_file.h>
#include "test_library.h"
namespace {
// Test that using properly allows referring to symbols in dependent library.
bool valid_using_without_alias_test() {
BEGIN_TEST;
TestLibrary dependency("dependent.fidl", R"FIDL(
library fidl.test.uzing.dependent;
struct Bar {
int8 s;
};
)FIDL");
ASSERT_TRUE(dependency.Compile());
TestLibrary library("uzing.fidl", R"FIDL(
library fidl.test.uzing;
using fidl.test.uzing.dependent;
struct Foo {
fidl.test.uzing.dependent.Bar dep;
};
)FIDL");
ASSERT_TRUE(library.AddDependentLibrary(dependency));
EXPECT_TRUE(library.Compile());
END_TEST;
}
// Test that using properly allows referring to symbols in dependent library,
// using the aliased name of the dependent library, or the fully qualified name
// of the dependent library.
bool valid_using_with_alias_test() {
BEGIN_TEST;
TestLibrary dependency("dependent.fidl", R"FIDL(
library fidl.test.uzing.dependent;
struct Bar {
int8 s;
};
)FIDL");
ASSERT_TRUE(dependency.Compile());
TestLibrary library("uzing.fidl", R"FIDL(
library fidl.test.uzing;
using fidl.test.uzing.dependent as dependent_alias;
struct Foo {
fidl.test.uzing.dependent.Bar dep1;
dependent_alias.Bar dep2;
};
)FIDL");
ASSERT_TRUE(library.AddDependentLibrary(dependency));
ASSERT_TRUE(library.Compile());
END_TEST;
}
// Test that an unknown dependency is properly reported.
bool invalid_did_not_declare_dependency_with_using() {
BEGIN_TEST;
TestLibrary library("uzing.fidl", R"FIDL(
library fidl.test.uzing;
// missing using.
struct Foo {
fidl.test.uzing.dependent.Bar dep;
};
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& errors = library.errors();
ASSERT_EQ(1, errors.size());
ASSERT_STR_STR(errors[0].c_str(),
"Unknown dependent library fidl.test.uzing.dependent. Did you require it with `using`?");
END_TEST;
}
// Test that a duplicated using declaration is the same file is reported as an
// error.
bool invalid_duplicate_using() {
BEGIN_TEST;
TestLibrary dependency("dependent.fidl", R"FIDL(
library fidl.test.uzing.dependent;
)FIDL");
ASSERT_TRUE(dependency.Compile());
TestLibrary library("uzing.fidl", R"FIDL(
library fidl.test.uzing;
using fidl.test.uzing.dependent;
using fidl.test.uzing.dependent; // duplicated
)FIDL");
ASSERT_TRUE(library.AddDependentLibrary(dependency));
ASSERT_FALSE(library.Compile());
const auto& errors = library.errors();
ASSERT_EQ(1, errors.size());
ASSERT_STR_STR(errors[0].c_str(),
"Library fidl.test.uzing.dependent already imported. Did you require it twice?");
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(using_tests);
RUN_TEST(valid_using_without_alias_test);
RUN_TEST(valid_using_with_alias_test);
RUN_TEST(invalid_did_not_declare_dependency_with_using);
RUN_TEST(invalid_duplicate_using);
END_TEST_CASE(using_tests);