Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- [x] Yanlış tahminde limit
- [x] İnsan figürü
- [x] [Animasyon gecikmeleri](work/hangman/animasyon-gecikmeleri.md)
- [x] Oyun sonu seçenekleri
- [ ] Ana Menü
- [x] [Başlangıç Menüsü](work/hangman/ana-menu.md)
- [ ] [Ayarlar Menüsü](work/hangman/ayarlar-menusu.md)
Expand Down
33 changes: 33 additions & 0 deletions src/learn-console/Learn.Hangman.Test/EndMenuTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Moq;
using System;
using System.Collections.Generic;
using Xunit;

namespace Learn.Hangman.Test
{
public class EndMenuTest : TestBase
{
[Fact]
public void Menuler_parantez_icinde_menu_basliginin_bas_harfi_ile_menu_basligi_listelenir()
{
var endMenu = AnEndMenu(
Play(),
Exit());
var actual = endMenu.Render();
var expected = "Play['P'], Exit['E']";

Assert.Equal(expected, actual);
}

[Fact]
public void Listelenen_menulerin_bas_harfine_basildiginda_basilan_menu_calistirilir()
{
var menuOption = Exit();
var endMenu = AnEndMenu(menuOption);

endMenu.Option(AKey(ConsoleKey.E));

Mock.Get(menuOption).Verify(m => m.Select(), Times.Once());
}
}
}
4 changes: 2 additions & 2 deletions src/learn-console/Learn.Hangman.Test/HangmanTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -218,12 +218,12 @@ public void Geri_sayim_animasyonu_ustte_cizilir()

var actual = game.Render();

Assert.StartsWith($"first{Environment.NewLine}", actual);
Assert.StartsWith($"first", actual);

game.ProcessKey(ConsoleKey.A);
actual = game.Render();

Assert.StartsWith($"first{Environment.NewLine}", actual);
Assert.StartsWith($"first", actual);
}
}
}
29 changes: 14 additions & 15 deletions src/learn-console/Learn.Hangman.Test/MainMenuTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ public void Kullanici_ilk_secenek_secili_degilken_sol_ok_tusuna_basar_bir_onceki
var menu = AMenu(
Play(),
Exit());
menu.Right();

menu.Left();
menu.Option(AKey(ConsoleKey.RightArrow));
menu.Option(AKey(ConsoleKey.LeftArrow));

Assert.Contains("Play", menu.Render());
}
Expand All @@ -36,7 +36,7 @@ public void Kullanici_ilk_secenek_secili_degiliyken_sol_ok_tusuna_basar_aynı_se
Play(),
Exit());

menu.Left();
menu.Option(AKey(ConsoleKey.LeftArrow));

Assert.Contains("Play", menu.Render());
}
Expand All @@ -48,7 +48,7 @@ public void Kullanici_sondaki_secenek_secili_degilken_sag_ok_tusuna_basar_sonrak
Play(),
Exit());

menu.Right();
menu.Option(AKey(ConsoleKey.RightArrow));

Assert.Contains("Exit", menu.Render());
}
Expand All @@ -59,38 +59,37 @@ public void Kullanici_sondaki_secenek_seciliyken_sag_ok_tusuna_basar_aynı_secen
var menu = AMenu(
Play(),
Exit());
menu.Right();

menu.Right();
menu.Option(AKey(ConsoleKey.RightArrow));

Assert.Contains("Exit", menu.Render());
}

[Fact]
public void Kullanici_Play_secenegini_secer_secenekteki_action_calisir()
{
var game = AGame();
var playMenu = Play();
var menu = AMenu(
Play(game, AConsole(lastKey: ConsoleKey.Enter)),
playMenu,
Exit());

menu.Enter();
menu.Option(AKey(ConsoleKey.Enter));

Mock.Get(game).Verify(g => g.Render(), Times.AtLeast(1));
Mock.Get(playMenu).Verify(m => m.Select(), Times.AtLeast(1));
}

[Fact]
public void Kullanici_Exit_secenegini_secer_program_sonlanir()
{
var console = AConsole(lastKey: ConsoleKey.Enter);
var exit = Exit(isClickEnter: true);
var menu = AMenu(
Play(),
Exit(console));
menu.Right();
exit);
menu.Option(AKey(ConsoleKey.RightArrow));

menu.Enter();
menu.Option(AKey(ConsoleKey.Enter));

Mock.Get(console).Verify(g => g.Exit(), Times.AtLeast(1));
Mock.Get(exit).Verify(g => g.Select(), Times.AtLeast(1));
}
}
}
16 changes: 7 additions & 9 deletions src/learn-console/Learn.Hangman.Test/MenuRunnerTest.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using Learn.Hangman.MenuOptions;
using Moq;
using Moq;
using System;
using System.Collections.Generic;
using Xunit;

namespace Learn.Hangman.Test
Expand All @@ -11,15 +9,15 @@ public class MenuRunnerTest : TestBase
[Fact]
public void MenuRunner_calisir_verilen_menu_render_olur()
{
var game = AGame();
var menu = AMenu(
Play(game, AConsole()),
Exit(AConsole()));
var menuRunner = new MenuRunner(menu, AConsole(lastKey: ConsoleKey.Enter));
var menu = Menu();
var menuRunner = new MenuRunner(
menu,
menu,
AConsole(keys: new[] { ConsoleKey.Escape }));

menuRunner.Run();

Mock.Get(game).Verify(t => t.Render(), Times.AtLeastOnce());
Mock.Get(menu).Verify(m => m.Render(), Times.AtLeastOnce());
}
}
}
68 changes: 60 additions & 8 deletions src/learn-console/Learn.Hangman.Test/TestBase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Learn.Hangman.MenuOptions;
using Moq;
using Moq;
using System;
using System.Collections.Generic;

Expand All @@ -18,18 +17,71 @@ protected virtual MainMenu AMenu(params IMenuOption[] options)
return new MainMenu(menuOptions);
}

protected virtual IConsole AConsole(ConsoleKey lastKey = ConsoleKey.Enter)
protected ConsoleKeyInfo AKey(ConsoleKey key = default, char charKey = '0') => new ConsoleKeyInfo(charKey, key, false, false, false);

protected virtual IMenu Menu()
{
var key = AKey();
var mock = new Mock<IMenu>();
mock.Setup(m => m.Render());
mock.Setup(m => m.Option(key));

return mock.Object;
}

protected virtual IConsole AConsole(ConsoleKey[] keys)
{
var mock = new Mock<IConsole>();
var key = new ConsoleKeyInfo(keyChar: 'a', key: lastKey, false, false, false);
mock.Setup(t => t.ReadKey()).Returns(key);
mock.Setup(t => t.Exit());
var setup = mock.SetupSequence(t => t.ReadKey());
foreach (var key in keys)
{
setup = setup.Returns(new ConsoleKeyInfo(keyChar: 'k', key: key, false, false, false));
}
return mock.Object;
}

protected virtual IGame AGame(int remainingRounds = 1, GameStatus lastStatus = GameStatus.Won)
{
var mock = new Mock<IGame>();
var setup = mock.SetupSequence(t => t.GameStatus);
for (var i = 0; i < remainingRounds; i++)
{
setup = setup.Returns(GameStatus.Play);
}

setup.Returns(lastStatus);

return mock.Object;
}

protected virtual IGame AGame() => new Mock<IGame>().Object;
protected virtual EndMenu AnEndMenu(params IMenuOption[] options)
{
var menuOptions = new List<IMenuOption>();
foreach (var option in options)
{
menuOptions.Add(option);
}

return new EndMenu(menuOptions);
}

protected virtual IMenuOption Play(IGame game = null, IConsole console = null) => new Play(new GameRunner(game ?? AGame(), console ?? AConsole()));
protected virtual IMenuOption Play(bool isClickEnter = false)
{
var mock = new Mock<IMenuOption>();
mock.Setup(m => m.Title).Returns("Play");
if (isClickEnter) mock.Setup(m => m.Select());

return mock.Object;
}

protected virtual IMenuOption Exit(IConsole console = null) => new Exit(console ?? AConsole());
protected virtual IMenuOption Exit(bool isClickEnter = false)
{
var mock = new Mock<IMenuOption>();
mock.Setup(m => m.Title).Returns("Exit");
if (isClickEnter) mock.Setup(m => m.Select());

return mock.Object;
}
}
}
Binary file modified src/learn-console/Learn.Hangman/Assets/gameplay.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 8 additions & 9 deletions src/learn-console/Learn.Hangman/Consoles/SystemConsole.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
namespace Learn.Hangman.Consoles
namespace Learn.Hangman.Consoles;

public class SystemConsole : IConsole
{
public class SystemConsole : IConsole
{
public void Clear() => Console.Clear();
public void Clear() => Console.Clear();

public void Exit() => Environment.Exit(0);
public void Exit() => Environment.Exit(0);

public ConsoleKeyInfo ReadKey() => Console.ReadKey();
public ConsoleKeyInfo ReadKey() => Console.ReadKey();

public void Sleep(int milliseconds) => Thread.Sleep(milliseconds);
public void Sleep(int milliseconds) => Thread.Sleep(milliseconds);

public void WriteLine(string message) => Console.WriteLine(message);
}
public void WriteLine(string message) => Console.WriteLine(message);
}
19 changes: 19 additions & 0 deletions src/learn-console/Learn.Hangman/EndMenu.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace Learn.Hangman;

public class EndMenu: IMenu
{
private readonly List<IMenuOption> menuOptions;
public EndMenu(List<IMenuOption> menuOptions)
{
this.menuOptions = menuOptions;
}

public void Option(ConsoleKeyInfo keyInfo)
{
var option = menuOptions.Where(x => char.ToLower(x.Title[0]) == char.ToLower(keyInfo.Key.ToString().First()));

option.First().Select();
}

public string Render() => string.Join(", ", menuOptions.Select(x => x.Title + $"['{x.Title.First()}']"));
}
28 changes: 14 additions & 14 deletions src/learn-console/Learn.Hangman/Enums.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
namespace Learn.Hangman
namespace Learn.Hangman;

public enum GameStatus
{
public enum GameStatus
{
MainMenu,
Exit,
Play,
Over,
Won
}
public enum MainMenuStatus
{
Play,
Exit
}
MainMenu,
Exit,
Play,
Over,
Won
}
public enum MenuStatus
{
OnOptions,
OnMenu,
Done
}
17 changes: 8 additions & 9 deletions src/learn-console/Learn.Hangman/Extensions.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
namespace Learn.Hangman
namespace Learn.Hangman;

public static class Extensions
{
public static class Extensions
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
foreach (var item in source)
{
foreach (var item in source)
{
action(item);
}

return source;
action(item);
}

return source;
}
}
Loading