// Copyright (C) 2017 Jonathan Müller // This file is subject to the license terms in the LICENSE file // found in the top-level directory of this distribution. #include #include "test_parser.hpp" using namespace cppast; TEST_CASE("cpp_namespace") { auto code = R"( namespace a {} inline namespace b {} namespace c { namespace d {} } )"; auto file = parse({}, "cpp_namespace.cpp", code); auto count = test_visit(*file, [&](const cpp_namespace& ns) { auto no_children = count_children(ns); if (ns.name() == "a") { REQUIRE(!ns.is_inline()); REQUIRE(no_children == 0u); } else if (ns.name() == "b") { REQUIRE(ns.is_inline()); REQUIRE(no_children == 0u); } else if (ns.name() == "c") { REQUIRE(!ns.is_inline()); REQUIRE(no_children == 1u); } else if (ns.name() == "d") { check_parent(ns, "c", "c::d"); REQUIRE(!ns.is_inline()); REQUIRE(no_children == 0u); } else REQUIRE(false); }); REQUIRE(count == 4u); } TEST_CASE("cpp_namespace_alias") { auto code = R"( namespace ns1 {} namespace ns2 {} namespace a = ns1; namespace b = ns2; namespace outer { namespace ns {} namespace c = ns; namespace d = ns1; } namespace e = outer::ns; namespace f = outer::c; )"; cpp_entity_index idx; auto check_alias = [&](const cpp_namespace_alias& alias, const char* target_name, const char* target_full_name) { auto& target = alias.target(); REQUIRE(target.name() == target_name); auto entity = target.get(idx); REQUIRE(entity); REQUIRE(full_name(entity.value()) == target_full_name); }; auto file = parse(idx, "cpp_namespace_alias.cpp", code); auto count = test_visit(*file, [&](const cpp_namespace_alias& alias) { if (alias.name() == "a") check_alias(alias, "ns1", "ns1"); else if (alias.name() == "b") check_alias(alias, "ns2", "ns2"); else if (alias.name() == "c") { check_parent(alias, "outer", "outer::c"); check_alias(alias, "ns", "outer::ns"); } else if (alias.name() == "d") { check_parent(alias, "outer", "outer::d"); check_alias(alias, "ns1", "ns1"); } else if (alias.name() == "e") check_alias(alias, "outer::ns", "outer::ns"); else if (alias.name() == "f") check_alias(alias, "outer::c", "outer::ns"); else REQUIRE(false); }); REQUIRE(count == 6u); }