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