blob: 3b2ed008e7f30be3731c8f7e2f38083c164cf0bc [file] [log] [blame]
// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "rs_bindings_from_cc/collect_namespaces.h"
#include "gmock/gmock.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "rs_bindings_from_cc/ir.h"
#include "rs_bindings_from_cc/ir_from_cc.h"
namespace crubit {
namespace {
using ::testing::ElementsAre;
using ::testing::IsEmpty;
using ::testing::StrEq;
MATCHER_P(NameIs, name, "") { return arg.name == name; }
TEST(CollectNamespacesTest, Namespaces) {
absl::string_view file = R"(
namespace top_level_one {
namespace inner {}
}
namespace top_level_two {}
)";
ASSERT_OK_AND_ASSIGN(IR ir, IrFromCc({file}));
auto namespace_hierarchy = CollectNamespaces(ir);
auto top_level_namespaces = namespace_hierarchy.namespaces;
ASSERT_THAT(top_level_namespaces.size(), 2);
EXPECT_THAT(top_level_namespaces,
ElementsAre(NameIs("top_level_one"), NameIs("top_level_two")));
ASSERT_THAT(top_level_namespaces[0].children.size(), 1);
EXPECT_THAT(top_level_namespaces[0].children[0], NameIs("inner"));
ASSERT_THAT(namespace_hierarchy.label.value(),
StrEq("//test:testing_target"));
}
TEST(CollectNamespacesTest, ReopenedNamespaces) {
absl::string_view file = R"(
namespace top_level {
namespace inner {}
}
namespace top_level {
namespace inner {}
}
)";
ASSERT_OK_AND_ASSIGN(IR ir, IrFromCc({file}));
auto top_level_namespaces = CollectNamespaces(ir).namespaces;
ASSERT_THAT(top_level_namespaces.size(), 1);
EXPECT_THAT(top_level_namespaces, ElementsAre(NameIs("top_level")));
EXPECT_THAT(top_level_namespaces[0].children, ElementsAre(NameIs("inner")));
}
TEST(CollectNamespacesTest, InlineNamespaces) {
absl::string_view file = R"(
inline namespace top_level {
inline namespace inner {}
}
)";
ASSERT_OK_AND_ASSIGN(IR ir, IrFromCc({file}));
auto top_level_namespaces = CollectNamespaces(ir).namespaces;
ASSERT_THAT(top_level_namespaces.size(), 1);
EXPECT_THAT(top_level_namespaces, ElementsAre(NameIs("top_level")));
EXPECT_THAT(top_level_namespaces[0].children, ElementsAre(NameIs("inner")));
}
TEST(CollectNamespacesTest, AnonymousNamespaces) {
absl::string_view file = R"(
namespace {}
)";
ASSERT_OK_AND_ASSIGN(IR ir, IrFromCc({file}));
auto top_level_namespaces = CollectNamespaces(ir).namespaces;
EXPECT_THAT(top_level_namespaces, IsEmpty());
}
TEST(CollectNamespacesTest, SameNameDifferentParent) {
absl::string_view file = R"(
namespace top_level_one {
namespace middle {
namespace inner_one {}
}
}
namespace top_level_two {
namespace middle {
namespace inner_two {}
}
}
)";
ASSERT_OK_AND_ASSIGN(IR ir, IrFromCc({file}));
auto top_level_namespaces = CollectNamespaces(ir).namespaces;
ASSERT_THAT(top_level_namespaces.size(), 2);
EXPECT_THAT(top_level_namespaces,
ElementsAre(NameIs("top_level_one"), NameIs("top_level_two")));
ASSERT_THAT(top_level_namespaces[0].children.size(), 1);
EXPECT_THAT(top_level_namespaces[0].children, ElementsAre(NameIs("middle")));
auto should_contain_only_d = top_level_namespaces[0].children[0].children;
ASSERT_THAT(should_contain_only_d.size(), 1);
EXPECT_THAT(should_contain_only_d[0], NameIs("inner_one"));
}
} // namespace
} // namespace crubit