| // Copyright 2022 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 <zxtest/zxtest.h> |
| |
| #include "error_test.h" |
| #include "fidl/diagnostics.h" |
| #include "test_library.h" |
| |
| // This file tests ways of interleaving the availability of a source element |
| // with that of a target element that it references. See also |
| // versioning_tests.cc and decomposition_tests.cc. |
| |
| namespace { |
| |
| struct TestCase { |
| // A code describing how to order the availabilities relative to each other, |
| // using the characters (a, d, r) for the source and (A, D, R) for the target: |
| // |
| // source: @available(added=a, deprecated=d, removed=r) |
| // target: @available(added=A, deprecated=D, removed=R) |
| // |
| // For example, "AadrR" means: add target, add source, deprecate source, |
| // remove source, remove target. Additionally, the character "=" is used to |
| // align two values. For example, "a=A" means the source and target are added |
| // at the same version, and never deprecated/removed. |
| // |
| // Must contain at least "a" and "A", but all others are optional. |
| std::string_view code; |
| |
| // Expected errors. The order does not matter, and the list does not need to |
| // be complete, because this file contains a large number of test cases and |
| // stricter requirements would make it painful to update when errors change. |
| std::vector<const fidl::DiagnosticDef*> errors = {}; |
| |
| struct Attributes { |
| std::string source_available; |
| std::string target_available; |
| }; |
| |
| // Generates the @available attributes for source and target. |
| Attributes Format() const { |
| std::stringstream source, target; |
| source << "@available("; |
| target << "@available("; |
| int version = 1; |
| for (auto c : code) { |
| switch (c) { |
| case 'a': |
| source << "added=" << version; |
| break; |
| case 'd': |
| source << ", deprecated=" << version; |
| break; |
| case 'r': |
| source << ", removed=" << version; |
| break; |
| case 'A': |
| target << "added=" << version; |
| break; |
| case 'D': |
| target << ", deprecated=" << version; |
| break; |
| case 'R': |
| target << ", removed=" << version; |
| break; |
| case '=': |
| version -= 2; |
| break; |
| } |
| ++version; |
| } |
| source << ")"; |
| target << ")"; |
| return Attributes{source.str(), target.str()}; |
| } |
| |
| // Compiles the library and asserts that it conforms to the test case. |
| void CompileAndAssert(TestLibrary& library) const { |
| if (errors.empty()) { |
| ASSERT_COMPILED(library); |
| return; |
| } |
| ASSERT_FALSE(library.Compile()); |
| std::set<std::string_view> actual_errors; |
| for (auto& actual_error : library.errors()) { |
| actual_errors.insert(actual_error->def.msg); |
| } |
| for (auto expected_error : errors) { |
| EXPECT_TRUE(actual_errors.count(expected_error->msg), "missing error '%.*s'", |
| static_cast<int>(expected_error->msg.size()), expected_error->msg.data()); |
| } |
| } |
| }; |
| |
| // These cases were generated with the following Python code: |
| // |
| // def go(x, y): |
| // if x is None or y is None: |
| // return set() |
| // if not (x or y): |
| // return {""} |
| // rest = lambda x: x[1:] if x else None |
| // rx, ry, rxy = go(rest(x), y), go(x, rest(y)), go(rest(x), rest(y)) |
| // return {*rx, *ry, *rxy, *(x[0] + s for s in rx), *(y[0] + s for s in ry), |
| // *(f"{x[0]}={y[0]}{s}" for s in rxy)} |
| // |
| // print("\n".join(sorted(s for s in go("adr", "ADR") if "a" in s and "A" in s))) |
| // |
| const TestCase kTestCases[] = { |
| {"ADRa", {&fidl::ErrNameNotFound}}, |
| {"ADRad", {&fidl::ErrNameNotFound}}, |
| {"ADRadr", {&fidl::ErrNameNotFound}}, |
| {"ADRar", {&fidl::ErrNameNotFound}}, |
| {"ADa", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADa=R", {&fidl::ErrNameNotFound}}, |
| {"ADa=Rd", {&fidl::ErrNameNotFound}}, |
| {"ADa=Rdr", {&fidl::ErrNameNotFound}}, |
| {"ADa=Rr", {&fidl::ErrNameNotFound}}, |
| {"ADaR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADaRd", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADaRdr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADaRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADad", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADad=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADad=Rr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADadR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADadRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"ADadr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADadr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADadrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADar", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADar=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ADarR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"ARa", {&fidl::ErrNameNotFound}}, |
| {"ARad", {&fidl::ErrNameNotFound}}, |
| {"ARadr", {&fidl::ErrNameNotFound}}, |
| {"ARar", {&fidl::ErrNameNotFound}}, |
| {"Aa"}, |
| {"Aa=D", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=DR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=DRd", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=DRdr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=DRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=Dd", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=Dd=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=Dd=Rr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=DdR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=DdRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"Aa=Ddr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=Ddr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=DdrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=Dr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=Dr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=DrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"Aa=R", {&fidl::ErrNameNotFound}}, |
| {"Aa=Rd", {&fidl::ErrNameNotFound}}, |
| {"Aa=Rdr", {&fidl::ErrNameNotFound}}, |
| {"Aa=Rr", {&fidl::ErrNameNotFound}}, |
| {"AaD", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDRd", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDRdr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDd", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDd=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDd=Rr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDdR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDdRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"AaDdr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDdr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDdrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaDrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"AaR", {&fidl::ErrNameNotFound}}, |
| {"AaRd", {&fidl::ErrNameNotFound}}, |
| {"AaRdr", {&fidl::ErrNameNotFound}}, |
| {"AaRr", {&fidl::ErrNameNotFound}}, |
| {"Aad"}, |
| {"Aad=D"}, |
| {"Aad=DR", {&fidl::ErrNameNotFound}}, |
| {"Aad=DRr", {&fidl::ErrNameNotFound}}, |
| {"Aad=Dr"}, |
| {"Aad=Dr=R"}, |
| {"Aad=DrR"}, |
| {"Aad=R", {&fidl::ErrNameNotFound}}, |
| {"Aad=Rr", {&fidl::ErrNameNotFound}}, |
| {"AadD"}, |
| {"AadDR", {&fidl::ErrNameNotFound}}, |
| {"AadDRr", {&fidl::ErrNameNotFound}}, |
| {"AadDr"}, |
| {"AadDr=R"}, |
| {"AadDrR"}, |
| {"AadR", {&fidl::ErrNameNotFound}}, |
| {"AadRr", {&fidl::ErrNameNotFound}}, |
| {"Aadr"}, |
| {"Aadr=D"}, |
| {"Aadr=DR"}, |
| {"Aadr=R"}, |
| {"AadrD"}, |
| {"AadrDR"}, |
| {"AadrR"}, |
| {"Aar"}, |
| {"Aar=D"}, |
| {"Aar=DR"}, |
| {"Aar=R"}, |
| {"AarD"}, |
| {"AarDR"}, |
| {"AarR"}, |
| {"a=A"}, |
| {"a=AD", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADRd", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADRdr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADd", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADd=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADd=Rr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADdR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADdRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"a=ADdr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADdr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADdrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADr", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADr=R", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=ADrR", {&fidl::ErrInvalidReferenceToDeprecated}}, |
| {"a=AR", {&fidl::ErrNameNotFound}}, |
| {"a=ARd", {&fidl::ErrNameNotFound}}, |
| {"a=ARdr", {&fidl::ErrNameNotFound}}, |
| {"a=ARr", {&fidl::ErrNameNotFound}}, |
| {"a=Ad"}, |
| {"a=Ad=D"}, |
| {"a=Ad=DR", {&fidl::ErrNameNotFound}}, |
| {"a=Ad=DRr", {&fidl::ErrNameNotFound}}, |
| {"a=Ad=Dr"}, |
| {"a=Ad=Dr=R"}, |
| {"a=Ad=DrR"}, |
| {"a=Ad=R", {&fidl::ErrNameNotFound}}, |
| {"a=Ad=Rr", {&fidl::ErrNameNotFound}}, |
| {"a=AdD"}, |
| {"a=AdDR", {&fidl::ErrNameNotFound}}, |
| {"a=AdDRr", {&fidl::ErrNameNotFound}}, |
| {"a=AdDr"}, |
| {"a=AdDr=R"}, |
| {"a=AdDrR"}, |
| {"a=AdR", {&fidl::ErrNameNotFound}}, |
| {"a=AdRr", {&fidl::ErrNameNotFound}}, |
| {"a=Adr"}, |
| {"a=Adr=D"}, |
| {"a=Adr=DR"}, |
| {"a=Adr=R"}, |
| {"a=AdrD"}, |
| {"a=AdrDR"}, |
| {"a=AdrR"}, |
| {"a=Ar"}, |
| {"a=Ar=D"}, |
| {"a=Ar=DR"}, |
| {"a=Ar=R"}, |
| {"a=ArD"}, |
| {"a=ArDR"}, |
| {"a=ArR"}, |
| {"aA", {&fidl::ErrNameNotFound}}, |
| {"aAD", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADRd", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADRdr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADd", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADd=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADd=Rr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADdR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADdRr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADdr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADdr=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADdrR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADr", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADr=R", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aADrR", {&fidl::ErrInvalidReferenceToDeprecated, &fidl::ErrNameNotFound}}, |
| {"aAR", {&fidl::ErrNameNotFound}}, |
| {"aARd", {&fidl::ErrNameNotFound}}, |
| {"aARdr", {&fidl::ErrNameNotFound}}, |
| {"aARr", {&fidl::ErrNameNotFound}}, |
| {"aAd", {&fidl::ErrNameNotFound}}, |
| {"aAd=D", {&fidl::ErrNameNotFound}}, |
| {"aAd=DR", {&fidl::ErrNameNotFound}}, |
| {"aAd=DRr", {&fidl::ErrNameNotFound}}, |
| {"aAd=Dr", {&fidl::ErrNameNotFound}}, |
| {"aAd=Dr=R", {&fidl::ErrNameNotFound}}, |
| {"aAd=DrR", {&fidl::ErrNameNotFound}}, |
| {"aAd=R", {&fidl::ErrNameNotFound}}, |
| {"aAd=Rr", {&fidl::ErrNameNotFound}}, |
| {"aAdD", {&fidl::ErrNameNotFound}}, |
| {"aAdDR", {&fidl::ErrNameNotFound}}, |
| {"aAdDRr", {&fidl::ErrNameNotFound}}, |
| {"aAdDr", {&fidl::ErrNameNotFound}}, |
| {"aAdDr=R", {&fidl::ErrNameNotFound}}, |
| {"aAdDrR", {&fidl::ErrNameNotFound}}, |
| {"aAdR", {&fidl::ErrNameNotFound}}, |
| {"aAdRr", {&fidl::ErrNameNotFound}}, |
| {"aAdr", {&fidl::ErrNameNotFound}}, |
| {"aAdr=D", {&fidl::ErrNameNotFound}}, |
| {"aAdr=DR", {&fidl::ErrNameNotFound}}, |
| {"aAdr=R", {&fidl::ErrNameNotFound}}, |
| {"aAdrD", {&fidl::ErrNameNotFound}}, |
| {"aAdrDR", {&fidl::ErrNameNotFound}}, |
| {"aAdrR", {&fidl::ErrNameNotFound}}, |
| {"aAr", {&fidl::ErrNameNotFound}}, |
| {"aAr=D", {&fidl::ErrNameNotFound}}, |
| {"aAr=DR", {&fidl::ErrNameNotFound}}, |
| {"aAr=R", {&fidl::ErrNameNotFound}}, |
| {"aArD", {&fidl::ErrNameNotFound}}, |
| {"aArDR", {&fidl::ErrNameNotFound}}, |
| {"aArR", {&fidl::ErrNameNotFound}}, |
| {"ad=A", {&fidl::ErrNameNotFound}}, |
| {"ad=AD", {&fidl::ErrNameNotFound}}, |
| {"ad=ADR", {&fidl::ErrNameNotFound}}, |
| {"ad=ADRr", {&fidl::ErrNameNotFound}}, |
| {"ad=ADr", {&fidl::ErrNameNotFound}}, |
| {"ad=ADr=R", {&fidl::ErrNameNotFound}}, |
| {"ad=ADrR", {&fidl::ErrNameNotFound}}, |
| {"ad=AR", {&fidl::ErrNameNotFound}}, |
| {"ad=ARr", {&fidl::ErrNameNotFound}}, |
| {"ad=Ar", {&fidl::ErrNameNotFound}}, |
| {"ad=Ar=D", {&fidl::ErrNameNotFound}}, |
| {"ad=Ar=DR", {&fidl::ErrNameNotFound}}, |
| {"ad=Ar=R", {&fidl::ErrNameNotFound}}, |
| {"ad=ArD", {&fidl::ErrNameNotFound}}, |
| {"ad=ArDR", {&fidl::ErrNameNotFound}}, |
| {"ad=ArR", {&fidl::ErrNameNotFound}}, |
| {"adA", {&fidl::ErrNameNotFound}}, |
| {"adAD", {&fidl::ErrNameNotFound}}, |
| {"adADR", {&fidl::ErrNameNotFound}}, |
| {"adADRr", {&fidl::ErrNameNotFound}}, |
| {"adADr", {&fidl::ErrNameNotFound}}, |
| {"adADr=R", {&fidl::ErrNameNotFound}}, |
| {"adADrR", {&fidl::ErrNameNotFound}}, |
| {"adAR", {&fidl::ErrNameNotFound}}, |
| {"adARr", {&fidl::ErrNameNotFound}}, |
| {"adAr", {&fidl::ErrNameNotFound}}, |
| {"adAr=D", {&fidl::ErrNameNotFound}}, |
| {"adAr=DR", {&fidl::ErrNameNotFound}}, |
| {"adAr=R", {&fidl::ErrNameNotFound}}, |
| {"adArD", {&fidl::ErrNameNotFound}}, |
| {"adArDR", {&fidl::ErrNameNotFound}}, |
| {"adArR", {&fidl::ErrNameNotFound}}, |
| {"adr=A", {&fidl::ErrNameNotFound}}, |
| {"adr=AD", {&fidl::ErrNameNotFound}}, |
| {"adr=ADR", {&fidl::ErrNameNotFound}}, |
| {"adr=AR", {&fidl::ErrNameNotFound}}, |
| {"adrA", {&fidl::ErrNameNotFound}}, |
| {"adrAD", {&fidl::ErrNameNotFound}}, |
| {"adrADR", {&fidl::ErrNameNotFound}}, |
| {"adrAR", {&fidl::ErrNameNotFound}}, |
| {"ar=A", {&fidl::ErrNameNotFound}}, |
| {"ar=AD", {&fidl::ErrNameNotFound}}, |
| {"ar=ADR", {&fidl::ErrNameNotFound}}, |
| {"ar=AR", {&fidl::ErrNameNotFound}}, |
| {"arA", {&fidl::ErrNameNotFound}}, |
| {"arAD", {&fidl::ErrNameNotFound}}, |
| {"arADR", {&fidl::ErrNameNotFound}}, |
| {"arAR", {&fidl::ErrNameNotFound}}, |
| }; |
| |
| // Substitutes replacement for placeholder in str. |
| void substitute(std::string& str, std::string_view placeholder, std::string_view replacement) { |
| str.replace(str.find(placeholder), placeholder.size(), replacement); |
| } |
| |
| TEST(AvailabilityInterleavingTests, SameLibrary) { |
| for (auto& test_case : kTestCases) { |
| auto attributes = test_case.Format(); |
| std::string fidl = R"FIDL( |
| @available(added=1) |
| library example; |
| |
| ${source_available} |
| const SOURCE bool = TARGET; |
| |
| ${target_available} |
| const TARGET bool = false; |
| )FIDL"; |
| substitute(fidl, "${source_available}", attributes.source_available); |
| substitute(fidl, "${target_available}", attributes.target_available); |
| TestLibrary library(fidl); |
| ASSERT_NO_FAILURES(test_case.CompileAndAssert(library), "code: %.*s, fidl:\n\n%s", |
| static_cast<int>(test_case.code.size()), test_case.code.data(), |
| fidl.c_str()); |
| } |
| } |
| |
| // Tests compilation of example_fidl and dependency_fidl after substituting |
| // ${source_available} in example_fidl and ${target_available} in |
| // dependency_fidl using the values from test_case. |
| void TestExternalLibrary(const TestCase& test_case, std::string example_fidl, |
| std::string dependency_fidl) { |
| SharedAmongstLibraries shared; |
| auto attributes = test_case.Format(); |
| substitute(dependency_fidl, "${target_available}", attributes.target_available); |
| TestLibrary dependency(&shared, "dependency.fidl", dependency_fidl); |
| ASSERT_COMPILED(dependency); |
| substitute(example_fidl, "${source_available}", attributes.source_available); |
| TestLibrary example(&shared, "example.fidl", example_fidl); |
| ASSERT_NO_FAILURES(test_case.CompileAndAssert(example), |
| "code: %.*s, dependency.fidl:\n\n%s\n\nexample.fidl:\n\n%s", |
| static_cast<int>(test_case.code.size()), test_case.code.data(), |
| dependency_fidl.c_str(), example_fidl.c_str()); |
| } |
| |
| TEST(AvailabilityInterleavingTests, DeclToDeclExternal) { |
| std::string example_fidl = R"FIDL( |
| @available(added=1) |
| library platform.example; |
| |
| using platform.dependency; |
| |
| ${source_available} |
| const SOURCE bool = platform.dependency.TARGET; |
| )FIDL"; |
| std::string dependency_fidl = R"FIDL( |
| @available(added=1) |
| library platform.dependency; |
| |
| ${target_available} |
| const TARGET bool = false; |
| )FIDL"; |
| for (auto& test_case : kTestCases) { |
| ASSERT_NO_FAILURES(TestExternalLibrary(test_case, example_fidl, dependency_fidl)); |
| } |
| } |
| |
| TEST(AvailabilityInterleavingTests, LibraryToLibraryExternal) { |
| std::string example_fidl = R"FIDL( |
| ${source_available} |
| library platform.example; |
| |
| using platform.dependency; |
| |
| const SOURCE bool = platform.dependency.TARGET; |
| )FIDL"; |
| std::string dependency_fidl = R"FIDL( |
| ${target_available} |
| library platform.dependency; |
| |
| const TARGET bool = false; |
| )FIDL"; |
| for (auto& test_case : kTestCases) { |
| ASSERT_NO_FAILURES(TestExternalLibrary(test_case, example_fidl, dependency_fidl)); |
| } |
| } |
| |
| TEST(AvailabilityInterleavingTests, LibraryToDeclExternal) { |
| std::string example_fidl = R"FIDL( |
| ${source_available} |
| library platform.example; |
| |
| using platform.dependency; |
| |
| const SOURCE bool = platform.dependency.TARGET; |
| )FIDL"; |
| std::string dependency_fidl = R"FIDL( |
| @available(added=1) |
| library platform.dependency; |
| |
| ${target_available} |
| const TARGET bool = false; |
| )FIDL"; |
| for (auto& test_case : kTestCases) { |
| ASSERT_NO_FAILURES(TestExternalLibrary(test_case, example_fidl, dependency_fidl)); |
| } |
| } |
| |
| TEST(AvailabilityInterleavingTests, DeclToLibraryExternal) { |
| std::string example_fidl = R"FIDL( |
| @available(added=1) |
| library platform.example; |
| |
| using platform.dependency; |
| |
| ${source_available} |
| const SOURCE bool = platform.dependency.TARGET; |
| )FIDL"; |
| std::string dependency_fidl = R"FIDL( |
| ${target_available} |
| library platform.dependency; |
| |
| const TARGET bool = false; |
| )FIDL"; |
| for (auto& test_case : kTestCases) { |
| ASSERT_NO_FAILURES(TestExternalLibrary(test_case, example_fidl, dependency_fidl)); |
| } |
| } |
| |
| } // namespace |