Skip to content

Commit c8352a2

Browse files
authored
implement new game rpc (#504)
1 parent 8c3ea6b commit c8352a2

21 files changed

+478
-62
lines changed

cpp/cards/BUILD.bazel

+21
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,24 @@ cc_test(
3737
"@googletest//:gtest_main",
3838
],
3939
)
40+
41+
cc_library(
42+
name = "card_proto_mapper",
43+
srcs = ["card_proto_mapper.cc"],
44+
hdrs = ["card_proto_mapper.h"],
45+
visibility = ["//visibility:public"],
46+
deps = [
47+
":cards",
48+
"//protos/cards:cards_cc_proto",
49+
],
50+
)
51+
52+
cc_test(
53+
name = "card_proto_mapper_test",
54+
size = "small",
55+
srcs = ["card_proto_mapper_test.cc"],
56+
deps = [
57+
":card_proto_mapper",
58+
"@googletest//:gtest_main",
59+
],
60+
)

cpp/cards/card_proto_mapper.cc

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include "card_proto_mapper.h"
2+
3+
#include "card.h"
4+
#include "protos/cards/cards.pb.h"
5+
namespace cards {
6+
7+
cards_proto::Suit SuitToProto(const Suit& s) {
8+
switch (s) {
9+
case Suit::Clubs:
10+
return cards_proto::Clubs;
11+
case Suit::Diamonds:
12+
return cards_proto::Diamonds;
13+
case Suit::Hearts:
14+
return cards_proto::Hearts;
15+
case Suit::Spades:
16+
return cards_proto::Spades;
17+
}
18+
}
19+
20+
cards_proto::Rank RankToProto(const Rank& r) {
21+
switch (r) {
22+
case Rank::Ace:
23+
return cards_proto::Rank::Ace;
24+
case Rank::Two:
25+
return cards_proto::Rank::Two;
26+
case Rank::Three:
27+
return cards_proto::Rank::Three;
28+
case Rank::Four:
29+
return cards_proto::Rank::Four;
30+
case Rank::Five:
31+
return cards_proto::Rank::Five;
32+
case Rank::Six:
33+
return cards_proto::Rank::Six;
34+
case Rank::Seven:
35+
return cards_proto::Rank::Seven;
36+
case Rank::Eight:
37+
return cards_proto::Rank::Eight;
38+
case Rank::Nine:
39+
return cards_proto::Rank::Nine;
40+
case Rank::Ten:
41+
return cards_proto::Rank::Ten;
42+
case Rank::Jack:
43+
return cards_proto::Rank::Jack;
44+
case Rank::Queen:
45+
return cards_proto::Rank::Queen;
46+
case Rank::King:
47+
return cards_proto::Rank::King;
48+
}
49+
}
50+
51+
} // namespace cards

cpp/cards/card_proto_mapper.h

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef CPP_CARDS_CARD_PROTO_MAPPER_H
2+
#define CPP_CARDS_CARD_PROTO_MAPPER_H
3+
4+
#include "cpp/cards/card.h"
5+
#include "protos/cards/cards.pb.h"
6+
7+
namespace cards {
8+
9+
cards_proto::Suit SuitToProto(const Suit& s);
10+
cards_proto::Rank RankToProto(const Rank& r);
11+
12+
} // namespace cards
13+
14+
#endif

cpp/cards/card_proto_mapper_test.cc

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "cpp/cards/card_proto_mapper.h"
2+
3+
#include <gtest/gtest.h>
4+
5+
#include "cpp/cards/card.h"
6+
#include "protos/cards/cards.pb.h"
7+
8+
using namespace cards;
9+
10+
TEST(CardProtoMapper, SuitToProto) {
11+
auto clubs_proto = SuitToProto(Suit::Clubs);
12+
EXPECT_EQ(clubs_proto, cards_proto::Suit::Clubs);
13+
14+
auto diamonds_proto = SuitToProto(Suit::Diamonds);
15+
EXPECT_EQ(diamonds_proto, cards_proto::Suit::Diamonds);
16+
17+
auto hearts_proto = SuitToProto(Suit::Hearts);
18+
EXPECT_EQ(hearts_proto, cards_proto::Suit::Hearts);
19+
20+
auto spades_proto = SuitToProto(Suit::Spades);
21+
EXPECT_EQ(spades_proto, cards_proto::Suit::Spades);
22+
}
23+
24+
TEST(CardProtoMapper, RankToProto) {
25+
EXPECT_EQ(RankToProto(Rank::Ace), cards_proto::Rank::Ace);
26+
EXPECT_EQ(RankToProto(Rank::Two), cards_proto::Rank::Two);
27+
EXPECT_EQ(RankToProto(Rank::Three), cards_proto::Rank::Three);
28+
EXPECT_EQ(RankToProto(Rank::Four), cards_proto::Rank::Four);
29+
EXPECT_EQ(RankToProto(Rank::Five), cards_proto::Rank::Five);
30+
EXPECT_EQ(RankToProto(Rank::Six), cards_proto::Rank::Six);
31+
EXPECT_EQ(RankToProto(Rank::Seven), cards_proto::Rank::Seven);
32+
EXPECT_EQ(RankToProto(Rank::Eight), cards_proto::Rank::Eight);
33+
EXPECT_EQ(RankToProto(Rank::Nine), cards_proto::Rank::Nine);
34+
EXPECT_EQ(RankToProto(Rank::Ten), cards_proto::Rank::Ten);
35+
EXPECT_EQ(RankToProto(Rank::Jack), cards_proto::Rank::Jack);
36+
EXPECT_EQ(RankToProto(Rank::Queen), cards_proto::Rank::Queen);
37+
EXPECT_EQ(RankToProto(Rank::King), cards_proto::Rank::King);
38+
}

cpp/doc_db_client/BUILD.bazel

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ cc_library(
77
visibility = ["//visibility:public"],
88
deps = [
99
"//cpp/futility/status",
10+
"//protos/doc_db:doc_db_cc_grpc",
1011
"//protos/doc_db:doc_db_cc_proto",
1112
"@com_github_grpc_grpc//:grpc++",
1213
"@com_google_absl//absl/status:statusor",
@@ -20,6 +21,7 @@ cc_test(
2021
visibility = ["//visibility:public"],
2122
deps = [
2223
"doc_db_client",
24+
"//protos/doc_db:doc_db_cc_grpc",
2325
"//protos/doc_db:doc_db_cc_proto",
2426
"@googletest//:gtest_main",
2527
],

cpp/example_service/BUILD.bazel

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ cc_library(
88
hdrs = ["example_service.h"],
99
visibility = ["//visibility:public"],
1010
deps = [
11-
"//protos/example_service:example_service_proto",
11+
"//protos/example_service:example_service_cc_grpc",
12+
"//protos/example_service:example_service_cc_proto",
1213
"@com_github_grpc_grpc//:grpc++",
1314
],
1415
)

cpp/golf_grpc/client/BUILD.bazel

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ cc_library(
77
visibility = ["//visibility:public"],
88
deps = [
99
"//cpp/futility/status",
10+
"//protos/golf_grpc:golf_grpc_cc_grpc",
1011
"//protos/golf_grpc:golf_grpc_cc_proto",
1112
"@com_github_grpc_grpc//:grpc++",
1213
"@com_google_absl//absl/status",
@@ -21,6 +22,7 @@ cc_test(
2122
visibility = ["//visibility:public"],
2223
deps = [
2324
":golf_grpc_client",
25+
"//protos/golf_grpc:golf_grpc_cc_grpc",
2426
"//protos/golf_grpc:golf_grpc_cc_proto",
2527
"@googletest//:gtest_main",
2628
],

cpp/golf_grpc/client/golf_grpc_client.cc

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "golf_grpc_client.h"
22

3+
#include <grpcpp/client_context.h>
4+
35
#include "cpp/futility/status/status.h"
46

57
namespace golf_grpc {
@@ -9,7 +11,7 @@ using std::string;
911

1012
using futility::status::GrpcToAbseil;
1113

12-
absl::Status GolfClient::RegisterUser(const string& user_id) {
14+
absl::Status GolfClient::RegisterUser(const string& user_id) const {
1315
RegisterUserRequest request;
1416
request.set_user_id(user_id);
1517

@@ -20,4 +22,19 @@ absl::Status GolfClient::RegisterUser(const string& user_id) {
2022
return GrpcToAbseil(rpc_status);
2123
}
2224

25+
absl::StatusOr<GameState> GolfClient::NewGame(const std::string& user_id, int number_of_players) const {
26+
NewGameRequest request;
27+
request.set_user_id(user_id);
28+
request.set_number_of_players(number_of_players);
29+
30+
NewGameResponse rpc_reply;
31+
ClientContext context;
32+
33+
auto rpc_status = stub_->NewGame(&context, request, &rpc_reply);
34+
if (!rpc_status.ok()) {
35+
return GrpcToAbseil(rpc_status);
36+
}
37+
return rpc_reply.game_state();
38+
}
39+
2340
} // namespace golf_grpc

cpp/golf_grpc/client/golf_grpc_client.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#ifndef CPP_GOLF_GRPC_CLIENT_GOLF_GRPC_CLIENT_H
22
#define CPP_GOLF_GRPC_CLIENT_GOLF_GRPC_CLIENT_H
33

4-
#include <memory>
54
#include <string>
65

76
#include "absl/status/status.h"
7+
#include "absl/status/statusor.h"
88
#include "protos/golf_grpc/golf.grpc.pb.h"
99

1010
namespace golf_grpc {
@@ -13,7 +13,8 @@ class GolfClient {
1313
public:
1414
explicit GolfClient(std::shared_ptr<Golf::StubInterface> stub) : stub_(std::move(stub)) {}
1515

16-
absl::Status RegisterUser(const std::string& user_id);
16+
absl::Status RegisterUser(const std::string& user_id) const;
17+
absl::StatusOr<GameState> NewGame(const std::string& user_id, int number_of_players) const;
1718

1819
private:
1920
std::shared_ptr<Golf::StubInterface> stub_;

cpp/golf_grpc/client/golf_grpc_client_test.cc

+32-1
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,36 @@ TEST(GolfClient, RegisterUserRpcFailure) {
3838

3939
// Assert
4040
EXPECT_FALSE(status.ok());
41-
EXPECT_EQ(status.code(), absl::StatusCode(grpc::StatusCode::CANCELLED));
41+
EXPECT_EQ(status.code(), absl::StatusCode::kCancelled);
42+
}
43+
44+
TEST(GolfClient, NewGameRpcSuccess) {
45+
// Arrange
46+
NewGameResponse resp;
47+
48+
auto stub = std::make_shared<MockGolfStub>();
49+
ON_CALL(*stub, NewGame(_, _, _))
50+
.WillByDefault(DoAll(SetArgPointee<2>(resp), Return(grpc::Status::OK)));
51+
52+
GolfClient client(stub);
53+
54+
// Act
55+
auto status_or_game = client.NewGame("Tippy", 2);
56+
57+
// Assert
58+
EXPECT_TRUE(status_or_game.ok());
59+
}
60+
61+
TEST(GolfClient, NewGameRpcFailure) {
62+
// Arrange
63+
auto stub = std::make_shared<MockGolfStub>();
64+
ON_CALL(*stub, NewGame(_, _, _)).WillByDefault(Return(grpc::Status::CANCELLED));
65+
GolfClient client(stub);
66+
67+
// Act
68+
auto status_or_game = client.NewGame("Tippy", 2);
69+
70+
// Assert
71+
EXPECT_FALSE(status_or_game.ok());
72+
EXPECT_EQ(status_or_game.status().code(), absl::StatusCode::kCancelled);
4273
}

cpp/golf_grpc/server/BUILD.bazel

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ cc_library(
88
hdrs = ["golf_grpc_service.h"],
99
visibility = ["//visibility:public"],
1010
deps = [
11+
"//cpp/cards:card_proto_mapper",
1112
"//cpp/cards/golf",
1213
"//cpp/futility/status",
14+
"//protos/golf_grpc:golf_grpc_cc_grpc",
1315
"//protos/golf_grpc:golf_grpc_cc_proto",
1416
"@com_github_grpc_grpc//:grpc++",
1517
],
@@ -33,10 +35,14 @@ cc_binary(
3335
cc_test(
3436
name = "golf_grpc_service_test",
3537
size = "small",
36-
srcs = ["golf_grpc_service_test.cc"],
38+
srcs = [
39+
"golf_grpc_service_test.cc",
40+
"test_helpers.h",
41+
],
3742
deps = [
3843
":golf_grpc_service_lib",
3944
"//cpp/cards/golf:in_memory_game_store",
45+
"//cpp/golf_grpc/client:golf_grpc_client",
4046
"@googletest//:gtest_main",
4147
],
4248
)

0 commit comments

Comments
 (0)