Skip to content

Commit 85fcf5c

Browse files
authored
[golf_grpc] implement PeekAtDrawPile operation (#529)
* peek rpc * joingame rpc and client call (needs tests) * client unit tests * add some tests
1 parent c6b64e7 commit 85fcf5c

29 files changed

+545
-125
lines changed

.clwb/.bazelproject

+1-20
Original file line numberDiff line numberDiff line change
@@ -1,20 +1 @@
1-
directories:
2-
cpp
3-
protos
4-
rust
5-
6-
# Automatically includes all relevant targets under the 'directories' above
7-
derive_targets_from_directories: true
8-
9-
targets:
10-
# If source code isn't resolving, add additional targets that compile it here
11-
12-
additional_languages:
13-
# Uncomment any additional languages you want supported
14-
# dart
15-
# javascript
16-
# python
17-
# typescript
18-
19-
build_flags:
20-
--enable_workspace
1+
import intellij/clion.bazelproject

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
target
22
*.iml
33
.ijwb
4+
.clwb
45
bazel-*
56
.DS_Store
67
out

MODULE.bazel.lock

+26-26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cpp/cards/BUILD.bazel

+21
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,24 @@ cc_test(
5858
"@googletest//:gtest_main",
5959
],
6060
)
61+
62+
cc_library(
63+
name = "dealer",
64+
srcs = ["dealer.cc"],
65+
hdrs = ["dealer.h"],
66+
visibility = ["//visibility:public"],
67+
deps = [
68+
":cards",
69+
"//protos/cards:cards_cc_proto",
70+
],
71+
)
72+
73+
cc_test(
74+
name = "dealer_test",
75+
size = "small",
76+
srcs = ["dealer_test.cc"],
77+
deps = [
78+
":dealer",
79+
"@googletest//:gtest_main",
80+
],
81+
)

cpp/cards/card.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ class Card {
1414
Card(const Suit _suit, const Rank _rank) : suit(_suit), rank(_rank) {}
1515

1616
explicit Card(const int shuffleIndex)
17-
: suit(static_cast<Suit>(shuffleIndex % 4)), rank(static_cast<Rank>(shuffleIndex % 13)) {}
17+
: suit(static_cast<Suit>(shuffleIndex % 4)), rank(static_cast<Rank>(shuffleIndex / 4)) {}
1818

1919
[[nodiscard]] const Suit& getSuit() const { return suit; }
2020
[[nodiscard]] const Rank& getRank() const { return rank; }
21+
[[nodiscard]] int intValue() const { return static_cast<int>(rank) * 4 + static_cast<int>(suit); }
2122
bool operator==(const Card& o) const { return suit == o.suit && rank == o.rank; }
2223

2324
private:

cpp/cards/card_mapper_test.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ TEST(CardMapper, CardToString) {
1515
TEST(CardMapper, CardsToString) {
1616
CardMapper cm;
1717
std::vector<Card> cards{Card{0}, Card{1}};
18-
EXPECT_EQ(cm.cardsToString(cards), R"(["2_C","3_D"])");
18+
EXPECT_EQ(cm.cardsToString(cards), R"(["2_C","2_D"])");
1919
}

cpp/cards/card_test.cc

+7-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
#include <gtest/gtest.h>
44

55
TEST(CARD_TEST, BasicAssertions) {
6-
cards::Card c(0);
7-
EXPECT_EQ(cards::Suit::Clubs, c.getSuit());
8-
EXPECT_EQ(cards::Rank::Two, c.getRank());
6+
cards::Card c_0(0);
7+
EXPECT_EQ(cards::Suit::Clubs, c_0.getSuit());
8+
EXPECT_EQ(cards::Rank::Two, c_0.getRank());
9+
10+
cards::Card c_1(1);
11+
EXPECT_EQ(cards::Suit::Diamonds, c_1.getSuit());
12+
EXPECT_EQ(cards::Rank::Two, c_1.getRank());
913
}

cpp/cards/dealer.cc

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "dealer.h"
2+
3+
#include <deque>
4+
#include <random>
5+
#include <vector>
6+
7+
using std::deque;
8+
using std::vector;
9+
10+
namespace cards {
11+
deque<Card> Dealer::DealNewUnshuffledDeck() {
12+
deque<Card> deck{};
13+
for (int i = 0; i < 52; i++) {
14+
deck.emplace_back(i);
15+
}
16+
return deck;
17+
}
18+
19+
void Dealer::ShuffleDeck(deque<Card>& deck) {
20+
vector<int> cards{};
21+
while (!deck.empty()) {
22+
cards.emplace_back(deck.front().intValue());
23+
deck.pop_front();
24+
}
25+
std::ranges::shuffle(cards, generator_);
26+
27+
for (auto& card : cards) {
28+
deck.emplace_back(card);
29+
}
30+
}
31+
32+
void NoShuffleDealer::ShuffleDeck(deque<Card>& deck) {}
33+
34+
} // namespace cards

cpp/cards/dealer.h

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef CPP_CARDS_DEALER_H
2+
#define CPP_CARDS_DEALER_H
3+
4+
#include <deque>
5+
#include <random>
6+
7+
#include "cpp/cards/card.h"
8+
#include "protos/cards/cards.pb.h"
9+
10+
namespace cards {
11+
12+
class Dealer {
13+
public:
14+
virtual ~Dealer() = default;
15+
std::deque<Card> DealNewUnshuffledDeck();
16+
virtual void ShuffleDeck(std::deque<Card>& deck);
17+
18+
private:
19+
std::random_device rd_;
20+
std::mt19937 generator_{rd_()};
21+
};
22+
23+
class NoShuffleDealer : public Dealer {
24+
public:
25+
void ShuffleDeck(std::deque<Card>& deck) override;
26+
};
27+
28+
} // namespace cards
29+
30+
#endif

cpp/cards/dealer_test.cc

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "cpp/cards/dealer.h"
2+
3+
#include <gtest/gtest.h>
4+
5+
using namespace cards;
6+
7+
TEST(Dealer, DealNewUnshuffledDeck) {
8+
Dealer dealer;
9+
auto unshuffled = dealer.DealNewUnshuffledDeck();
10+
11+
EXPECT_EQ(unshuffled.front().getSuit(), cards::Suit::Clubs);
12+
EXPECT_EQ(unshuffled.front().getRank(), cards::Rank::Two);
13+
14+
EXPECT_EQ(unshuffled.back().getSuit(), cards::Suit::Spades);
15+
EXPECT_EQ(unshuffled.back().getRank(), cards::Rank::Ace);
16+
}
17+
18+
TEST(Dealer, ShuffledDeck) {
19+
Dealer dealer;
20+
auto deck = dealer.DealNewUnshuffledDeck();
21+
dealer.ShuffleDeck(deck);
22+
23+
auto unshuffled = dealer.DealNewUnshuffledDeck();
24+
25+
EXPECT_NE(deck, unshuffled);
26+
}

cpp/cards/golf/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ cc_library(
1515
":game_store",
1616
":player",
1717
"//cpp/cards",
18+
"//cpp/cards:dealer",
1819
"@com_google_absl//absl/status:statusor",
1920
],
2021
)

cpp/cards/golf/game_manager.cc

+2-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#include "cpp/cards/golf/game_manager.h"
22

3-
#include <algorithm>
4-
#include <random>
53
#include <unordered_set>
64
#include <vector>
75

@@ -50,20 +48,8 @@ StatusOr<string> GameManager::registerUser(const string& user_id) {
5048
}
5149

5250
deque<Card> GameManager::shuffleNewDeck() {
53-
vector<int> cards{};
54-
cards.reserve(52);
55-
for (int i = 0; i < 52; i++) {
56-
cards.push_back(i);
57-
}
58-
59-
std::random_device rd;
60-
std::mt19937 g(rd());
61-
std::shuffle(cards.begin(), cards.end(), g);
62-
63-
deque<Card> deck{};
64-
for (auto c : cards) {
65-
deck.emplace_back(c);
66-
}
51+
auto deck = dealer_->DealNewUnshuffledDeck();
52+
dealer_->ShuffleDeck(deck);
6753
return deck;
6854
}
6955

0 commit comments

Comments
 (0)