1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <unittest/unittest.h>
6
7 #include <fidl/flat_ast.h>
8 #include <fidl/lexer.h>
9 #include <fidl/parser.h>
10 #include <fidl/source_file.h>
11
12 #include "test_library.h"
13
14 namespace {
15
16 // Test that using properly allows referring to symbols in dependent library.
valid_using_without_alias_test()17 bool valid_using_without_alias_test() {
18 BEGIN_TEST;
19
20 TestLibrary dependency("dependent.fidl", R"FIDL(
21 library fidl.test.uzing.dependent;
22
23 struct Bar {
24 int8 s;
25 };
26
27 )FIDL");
28 ASSERT_TRUE(dependency.Compile());
29
30 TestLibrary library("uzing.fidl", R"FIDL(
31 library fidl.test.uzing;
32
33 using fidl.test.uzing.dependent;
34
35 struct Foo {
36 fidl.test.uzing.dependent.Bar dep;
37 };
38
39 )FIDL");
40 ASSERT_TRUE(library.AddDependentLibrary(dependency));
41 EXPECT_TRUE(library.Compile());
42
43 END_TEST;
44 }
45
46 // Test that using properly allows referring to symbols in dependent library,
47 // using the aliased name of the dependent library, or the fully qualified name
48 // of the dependent library.
valid_using_with_alias_test()49 bool valid_using_with_alias_test() {
50 BEGIN_TEST;
51
52 TestLibrary dependency("dependent.fidl", R"FIDL(
53 library fidl.test.uzing.dependent;
54
55 struct Bar {
56 int8 s;
57 };
58
59 )FIDL");
60 ASSERT_TRUE(dependency.Compile());
61
62 TestLibrary library("uzing.fidl", R"FIDL(
63 library fidl.test.uzing;
64
65 using fidl.test.uzing.dependent as dependent_alias;
66
67 struct Foo {
68 fidl.test.uzing.dependent.Bar dep1;
69 dependent_alias.Bar dep2;
70 };
71
72 )FIDL");
73 ASSERT_TRUE(library.AddDependentLibrary(dependency));
74 ASSERT_TRUE(library.Compile());
75
76 END_TEST;
77 }
78
79 // Test that an unknown dependency is properly reported.
invalid_did_not_declare_dependency_with_using()80 bool invalid_did_not_declare_dependency_with_using() {
81 BEGIN_TEST;
82
83 TestLibrary library("uzing.fidl", R"FIDL(
84 library fidl.test.uzing;
85
86 // missing using.
87
88 struct Foo {
89 fidl.test.uzing.dependent.Bar dep;
90 };
91
92 )FIDL");
93 ASSERT_FALSE(library.Compile());
94 const auto& errors = library.errors();
95 ASSERT_EQ(1, errors.size());
96 ASSERT_STR_STR(errors[0].c_str(),
97 "Unknown dependent library fidl.test.uzing.dependent. Did you require it with `using`?");
98
99 END_TEST;
100 }
101
102 // Test that a duplicated using declaration is the same file is reported as an
103 // error.
invalid_duplicate_using()104 bool invalid_duplicate_using() {
105 BEGIN_TEST;
106
107 TestLibrary dependency("dependent.fidl", R"FIDL(
108 library fidl.test.uzing.dependent;
109
110 )FIDL");
111 ASSERT_TRUE(dependency.Compile());
112
113 TestLibrary library("uzing.fidl", R"FIDL(
114 library fidl.test.uzing;
115
116 using fidl.test.uzing.dependent;
117 using fidl.test.uzing.dependent; // duplicated
118
119 )FIDL");
120 ASSERT_TRUE(library.AddDependentLibrary(dependency));
121 ASSERT_FALSE(library.Compile());
122 const auto& errors = library.errors();
123 ASSERT_EQ(1, errors.size());
124 ASSERT_STR_STR(errors[0].c_str(),
125 "Library fidl.test.uzing.dependent already imported. Did you require it twice?");
126
127 END_TEST;
128 }
129
130 } // namespace
131
132 BEGIN_TEST_CASE(using_tests);
133 RUN_TEST(valid_using_without_alias_test);
134 RUN_TEST(valid_using_with_alias_test);
135 RUN_TEST(invalid_did_not_declare_dependency_with_using);
136 RUN_TEST(invalid_duplicate_using);
137 END_TEST_CASE(using_tests);
138