From c8c0b27d6ad47edbffe96e2b6f4f21769c26f4ca Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 21 Jul 2022 06:55:15 +0200 Subject: [PATCH] Mostly finished implementation of the new deck? ALso added some tests --- src/Nadeko.Econ/{ => Deck}/Deck.cs | 2 - src/Nadeko.Econ/Deck/NewCard.cs | 15 ++++++ src/Nadeko.Econ/Deck/NewDeck.cs | 51 ++++++++++++++++++++ src/Nadeko.Econ/Deck/Regular/RegularCard.cs | 17 +++++++ src/Nadeko.Econ/Deck/Regular/RegularDeck.cs | 5 ++ src/Nadeko.Econ/Deck/Regular/RegularSuit.cs | 9 ++++ src/Nadeko.Econ/Deck/Regular/RegularValue.cs | 18 +++++++ src/Nadeko.Econ/NewDeck.cs | 35 -------------- src/NadekoBot.Tests/NadekoBot.Tests.csproj | 1 + src/NadekoBot.Tests/NewDeckTests.cs | 51 ++++++++++++++++++++ 10 files changed, 167 insertions(+), 37 deletions(-) rename src/Nadeko.Econ/{ => Deck}/Deck.cs (99%) create mode 100644 src/Nadeko.Econ/Deck/NewCard.cs create mode 100644 src/Nadeko.Econ/Deck/NewDeck.cs create mode 100644 src/Nadeko.Econ/Deck/Regular/RegularCard.cs create mode 100644 src/Nadeko.Econ/Deck/Regular/RegularDeck.cs create mode 100644 src/Nadeko.Econ/Deck/Regular/RegularSuit.cs create mode 100644 src/Nadeko.Econ/Deck/Regular/RegularValue.cs delete mode 100644 src/Nadeko.Econ/NewDeck.cs create mode 100644 src/NadekoBot.Tests/NewDeckTests.cs diff --git a/src/Nadeko.Econ/Deck.cs b/src/Nadeko.Econ/Deck/Deck.cs similarity index 99% rename from src/Nadeko.Econ/Deck.cs rename to src/Nadeko.Econ/Deck/Deck.cs index 171288cc6..930f47d30 100644 --- a/src/Nadeko.Econ/Deck.cs +++ b/src/Nadeko.Econ/Deck/Deck.cs @@ -1,6 +1,4 @@ #nullable disable -using Nadeko.Common; - namespace Nadeko.Econ; public class Deck diff --git a/src/Nadeko.Econ/Deck/NewCard.cs b/src/Nadeko.Econ/Deck/NewCard.cs new file mode 100644 index 000000000..9422a0cbe --- /dev/null +++ b/src/Nadeko.Econ/Deck/NewCard.cs @@ -0,0 +1,15 @@ +namespace Nadeko.Econ; + +public abstract class NewCard + where TSuit : struct, Enum + where TValue : struct, Enum +{ + public TSuit Suit { get; } + public TValue Value { get; } + + public NewCard(TSuit suit, TValue value) + { + Suit = suit; + Value = value; + } +} \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/NewDeck.cs b/src/Nadeko.Econ/Deck/NewDeck.cs new file mode 100644 index 000000000..992d7048c --- /dev/null +++ b/src/Nadeko.Econ/Deck/NewDeck.cs @@ -0,0 +1,51 @@ +namespace Nadeko.Econ; + +public abstract class NewDeck + where TCard: NewCard + where TSuit : struct, Enum + where TValue : struct, Enum +{ + public virtual int CurrentCount + => _cards.Count; + + public virtual int TotalCount { get; } + + private readonly LinkedList _cards = new(); + public NewDeck() + { + var suits = Enum.GetValues(); + var values = Enum.GetValues(); + + TotalCount = suits.Length * values.Length; + + foreach (var suit in suits) + { + foreach (var val in values) + { + _cards.AddLast((TCard)Activator.CreateInstance(typeof(TCard), suit, val)!); + } + } + } + + public virtual TCard? Draw() + { + var first = _cards.First; + if (first is not null) + { + _cards.RemoveFirst(); + return first.Value; + } + + return null; + } + + public virtual void Shuffle() + { + var cards = _cards.ToList(); + cards.Shuffle(); + + _cards.Clear(); + foreach (var card in cards) + _cards.AddFirst(card); + } +} \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/Regular/RegularCard.cs b/src/Nadeko.Econ/Deck/Regular/RegularCard.cs new file mode 100644 index 000000000..467cc4e66 --- /dev/null +++ b/src/Nadeko.Econ/Deck/Regular/RegularCard.cs @@ -0,0 +1,17 @@ +namespace Nadeko.Econ; + +public sealed class RegularCard : NewCard +{ + public RegularCard(RegularSuit suit, RegularValue value) : base(suit, value) + { + } + + private bool Equals(RegularCard other) + => other.Suit == this.Suit && other.Value == this.Value; + + public override bool Equals(object? obj) + => ReferenceEquals(this, obj) || obj is RegularCard other && Equals(other); + + public override int GetHashCode() + => Suit.GetHashCode() * 17 + Value.GetHashCode(); +} \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs b/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs new file mode 100644 index 000000000..28eebd8a0 --- /dev/null +++ b/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs @@ -0,0 +1,5 @@ +namespace Nadeko.Econ; + +public sealed class RegularDeck : NewDeck +{ +} \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/Regular/RegularSuit.cs b/src/Nadeko.Econ/Deck/Regular/RegularSuit.cs new file mode 100644 index 000000000..f4d88c291 --- /dev/null +++ b/src/Nadeko.Econ/Deck/Regular/RegularSuit.cs @@ -0,0 +1,9 @@ +namespace Nadeko.Econ; + +public enum RegularSuit +{ + Hearts, + Diamonds, + Clubs, + Spades +} \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/Regular/RegularValue.cs b/src/Nadeko.Econ/Deck/Regular/RegularValue.cs new file mode 100644 index 000000000..12c766890 --- /dev/null +++ b/src/Nadeko.Econ/Deck/Regular/RegularValue.cs @@ -0,0 +1,18 @@ +namespace Nadeko.Econ; + +public enum RegularValue +{ + A = 1, + Two = 2, + Three = 3, + Four = 4, + Five = 5, + Six = 6, + Seven = 7, + Eight = 8, + Nine = 9, + Ten = 10, + Jack = 12, + Queen = 13, + King = 14, +} \ No newline at end of file diff --git a/src/Nadeko.Econ/NewDeck.cs b/src/Nadeko.Econ/NewDeck.cs deleted file mode 100644 index 3d62dbc44..000000000 --- a/src/Nadeko.Econ/NewDeck.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Nadeko.Econ; - -public abstract class NewDeck - where TCard: NewCard - where TSuit : Enum -{ - public int CurrentCount { get; } - public int TotalCount { get; } - - public abstract TCard Draw(); -} - -public abstract class NewCard - where TSuit: Enum -{ - -} - -public sealed class RegularCard : NewCard -{ - -} - -public enum RegularSuit -{ - -} - -public sealed class RegularDeck : NewDeck -{ - public override RegularCard Draw() - => throw new NotImplementedException(); -} - - diff --git a/src/NadekoBot.Tests/NadekoBot.Tests.csproj b/src/NadekoBot.Tests/NadekoBot.Tests.csproj index 64ca56022..054f46437 100644 --- a/src/NadekoBot.Tests/NadekoBot.Tests.csproj +++ b/src/NadekoBot.Tests/NadekoBot.Tests.csproj @@ -15,6 +15,7 @@ + diff --git a/src/NadekoBot.Tests/NewDeckTests.cs b/src/NadekoBot.Tests/NewDeckTests.cs new file mode 100644 index 000000000..a6b927f0d --- /dev/null +++ b/src/NadekoBot.Tests/NewDeckTests.cs @@ -0,0 +1,51 @@ +using Nadeko.Econ; +using NUnit.Framework; + +namespace NadekoBot.Tests; + +public class NewDeckTests +{ + private RegularDeck _deck; + + [SetUp] + public void Setup() + { + _deck = new RegularDeck(); + } + + [Test] + public void TestCount() + { + Assert.AreEqual(52, _deck.TotalCount); + Assert.AreEqual(52, _deck.CurrentCount); + } + + [Test] + public void TestDeckDraw() + { + var card = _deck.Draw(); + + Assert.IsNotNull(card); + Assert.AreEqual(card.Suit, RegularSuit.Hearts); + Assert.AreEqual(card.Value, RegularValue.A); + Assert.AreEqual(_deck.CurrentCount, _deck.TotalCount - 1); + } + + [Test] + public void TestDeckSpent() + { + for (var i = 0; i < _deck.TotalCount - 1; ++i) + { + _deck.Draw(); + } + + var lastCard = _deck.Draw(); + + Assert.IsNotNull(lastCard); + Assert.AreEqual(lastCard, new RegularCard(RegularSuit.Spades, RegularValue.King)); + + var noCard = _deck.Draw(); + + Assert.IsNull(noCard); + } +} \ No newline at end of file