blob: e8aa0e48c887106a34c6baa4aaec5e60c650d953 [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/cmdline.h"
#include <string>
#include <vector>
#include "rs_bindings_from_cc/bazel_types.h"
#include "testing/base/public/gmock.h"
#include "testing/base/public/gunit.h"
#include "util/task/status_macros.h"
namespace rs_bindings_from_cc {
namespace {
using ::testing::AllOf;
using ::testing::ElementsAre;
using ::testing::HasSubstr;
using ::testing::Pair;
using ::testing::UnorderedElementsAre;
using ::testing::status::StatusIs;
namespace {
absl::StatusOr<Cmdline> TestCmdline(std::vector<std::string> public_headers,
const std::string& targets_and_headers) {
return Cmdline::CreateForTesting("cc_out", "rs_out", "ir_out",
/* do_nothing= */ false, public_headers,
targets_and_headers);
}
} // namespace
TEST(CmdlineTest, BasicCorrectInput) {
ASSERT_OK_AND_ASSIGN(
Cmdline cmdline,
Cmdline::CreateForTesting("cc_out", "rs_out", "ir_out",
/* do_nothing= */ false, {"h1"},
R"([{"t": "t1", "h": ["h1", "h2"]}])"));
EXPECT_EQ(cmdline.cc_out(), "cc_out");
EXPECT_EQ(cmdline.rs_out(), "rs_out");
EXPECT_EQ(cmdline.ir_out(), "ir_out");
EXPECT_EQ(cmdline.do_nothing(), false);
EXPECT_EQ(cmdline.current_target().value(), "t1");
EXPECT_THAT(cmdline.public_headers(), ElementsAre(HeaderName("h1")));
EXPECT_THAT(cmdline.headers_to_targets(),
UnorderedElementsAre(Pair(HeaderName("h1"), BlazeLabel("t1")),
Pair(HeaderName("h2"), BlazeLabel("t1"))));
}
TEST(CmdlineTest, TargetsAndHeadersEmpty) {
ASSERT_THAT(TestCmdline({"h1"}, ""),
StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("please specify --targets_and_headers")));
}
TEST(CmdlineTest, TargetsAndHeadersIntInsteadOfTopLevelArray) {
ASSERT_THAT(
TestCmdline({"h1"}, "123"),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("--targets_and_headers"), HasSubstr("array"))));
}
TEST(CmdlineTest, TargetsAndHeadersIntInsteadOfHeadersArray) {
ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "t1", "h": 123}])"),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("--targets_and_headers"),
HasSubstr("`h`"), HasSubstr("array"))));
}
TEST(CmdlineTest, PublicHeadersEmpty) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(TestCmdline({}, kTargetsAndHeaders),
StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("please specify --public_headers")));
}
TEST(CmdlineTest, PublicHeadersWhereFirstHeaderMissingInMap) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(TestCmdline({"missing-in-map.h"}, kTargetsAndHeaders),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("missing-in-map.h"),
HasSubstr("Couldn't find"))));
}
TEST(CmdlineTest, PublicHeadersWhereSecondHeaderMissingInMap) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
TestCmdline({"a.h", "missing.h"}, kTargetsAndHeaders),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("missing.h"), HasSubstr("Couldn't find"))));
}
TEST(CmdlineTest, PublicHeadersCoveringMultipleTargets) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]},
{"t": "target2", "h": ["c.h", "d.h"]}
])";
ASSERT_THAT(TestCmdline({"a.h", "c.h"}, kTargetsAndHeaders),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("Expected all public headers to belong "
"to the current target"),
HasSubstr("target1"), HasSubstr("target2"),
HasSubstr("c.h"))));
}
TEST(CmdlineTest, CcOutEmpty) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(Cmdline::CreateForTesting(
/* cc_out= */ "", "rs_out", "ir_out", /* do_nothing= */ false,
{"a.h"}, kTargetsAndHeaders),
StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("please specify --cc_out")));
}
TEST(CmdlineTest, RsOutEmpty) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(Cmdline::CreateForTesting("cc_out", /* rs_out= */ "", "ir_out",
/* do_nothing= */ false, {"a.h"},
kTargetsAndHeaders),
StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("please specify --rs_out")));
}
TEST(CmdlineTest, IrOutEmpty) {
constexpr char kTargetsAndHeaders[] = R"([
{"t": "target1", "h": ["a.h", "b.h"]}
])";
ASSERT_OK(Cmdline::CreateForTesting("cc_out", "rs_out", /* ir_out= */ "",
/* do_nothing= */ false, {"a.h"},
kTargetsAndHeaders));
}
} // namespace
} // namespace rs_bindings_from_cc