using System.Collections.Generic;
public DateTime TimeStamp;
public ScoreCard(bool isWin, DateTime timeStamp){IsWin = isWin; TimeStamp = timeStamp;}
public class PlayerEntity
public IEnumerable<ScoreCard> ScoreCards;
public PlayerEntity(int playerId,IEnumerable<ScoreCard> scoreCards)
public interface IUserRepository
IEnumerable<PlayerEntity> GetUsers();
public class FakeUserRepository: IUserRepository
public IEnumerable<PlayerEntity> GetUsers()
return new List<PlayerEntity>(){
new PlayerEntity(1,new []{new ScoreCard(true,DateTime.Now),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddDays(-1))}),
new PlayerEntity(2,new []{new ScoreCard(false,DateTime.Now),
new ScoreCard(false,DateTime.Now.AddHours(-1)),new ScoreCard(false,DateTime.Now.AddDays(-1))}),
new PlayerEntity(3,new []{new ScoreCard(true,DateTime.Now),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1))}),
new PlayerEntity(4,new []{new ScoreCard(true,DateTime.Now),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1))}),
new PlayerEntity(5,new []{new ScoreCard(true,DateTime.Now),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1))}),
new PlayerEntity(6,new []{new ScoreCard(true,DateTime.Now),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1))}),
new PlayerEntity(7,new []{new ScoreCard(true,DateTime.Now), new ScoreCard(true,DateTime.Now),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1)),
new ScoreCard(true,DateTime.Now.AddHours(-1)),new ScoreCard(true,DateTime.Now.AddHours(-1))}),
public interface IPlayerSteakReporter
PlayerStreak GetPlayerStreak(int playerId);
public class PlayerSteakReporter:IPlayerSteakReporter
protected IUserRepository UserRepository;
public PlayerSteakReporter(IUserRepository userRepository)
UserRepository = userRepository;
public PlayerStreak GetPlayerStreak(int playerId)
var user = UserRepository.GetUsers().FirstOrDefault(x=>x.PlayerId == playerId);
throw new PlayerNotFoundException(){PlayerId= playerId};
var maxCount = user.ScoreCards.OrderBy(card => card.TimeStamp).GroupBy(card => card.TimeStamp.Date).First().Count();
if(maxCount >= (int)PlayerStreak.BEYOND_GODLIKE)
return PlayerStreak.BEYOND_GODLIKE;
if(maxCount >= (int)PlayerStreak.GOD_LIKE)
return PlayerStreak.GOD_LIKE;
if(maxCount >= (int)PlayerStreak.UNSTOPPABLE)
return PlayerStreak.UNSTOPPABLE;
if(maxCount >= (int)PlayerStreak.MONSTER_KILL)
return PlayerStreak.MONSTER_KILL;
if(maxCount >= (int)PlayerStreak.KILLING_SPREE)
return PlayerStreak.KILLING_SPREE;
return PlayerStreak.NONE;
public class PlayerSteakReporterTest
public class FakeForUT :IUserRepository{
public IEnumerable<PlayerEntity> GetUsers()
return new List<PlayerEntity>()
new PlayerEntity(1, null),
new PlayerEntity(3, new [] { new ScoreCard(true, DateTime.Now),new ScoreCard(true, DateTime.Now), new ScoreCard(true, DateTime.Now.AddHours(-DateTime.Now.Hour))}),
new PlayerEntity(4, new [] { new ScoreCard(false, DateTime.Now)}),
new PlayerEntity(5, new [] { new ScoreCard(true, DateTime.Now), new ScoreCard(true, DateTime.Now), new ScoreCard(true, DateTime.Now.AddHours(24 - DateTime.Now.Hour))}),
var UnitUnderTest = new PlayerSteakReporter(new FakeForUT());
Assert.IsTrue(UnitUnderTest.GetPlayerStreak(1) == PlayerStreak.NONE);
Assert.IsTrue(UnitUnderTest.GetPlayerStreak(3) == PlayerStreak.KILLING_SPREE);
Assert.IsTrue(UnitUnderTest.GetPlayerStreak(4) == PlayerStreak.NONE);
Assert.IsTrue(UnitUnderTest.GetPlayerStreak(5) == PlayerStreak.KILLING_SPREE);
UnitUnderTest.GetPlayerStreak(2);
catch(PlayerNotFoundException ex)
Assert.IsTrue(ex.PlayerId == 2);
public class InstanceProvider
public static Lazy<InstanceProvider> _lazy = new Lazy<InstanceProvider>(()=>new InstanceProvider());
public static InstanceProvider Instance {get{return _lazy.Value;}}
private readonly Container IoCContainer = new Container();
private InstanceProvider(){IoCRegistration();}
private void IoCRegistration()
IoCContainer.RegisterSingleton<IUserRepository,FakeUserRepository>();
IoCContainer.RegisterSingleton<IPlayerSteakReporter,PlayerSteakReporter>();
public T GetInstance<T>() where T:class
return IoCContainer.GetInstance<T>();
public class PlayerNotFoundException:Exception
public static void Main()
for(var idx=1;idx<=7;++idx)
InstanceProvider.Instance.GetInstance<IPlayerSteakReporter>().GetPlayerStreak(idx);
catch(PlayerNotFoundException ex)
Console.WriteLine("Player "+ ex.PlayerId + " Not Found");