public void GetRosterDepth_Flex()
        {
            var rosterPositions = _testObjectFactory.CreateDefaultRosterPositions();

            var players = _testObjectFactory.CreatePlayers(
                Position.Quarterback,
                Position.RunningBack,
                Position.RunningBack,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.Quarterback,
                Position.Quarterback,
                Position.Quarterback,
                Position.TightEnd,
                Position.TightEnd,
                Position.TightEnd,
                Position.TightEnd,
                Position.Kicker,
                Position.Defense);

            var analyzer = new RosterDepthAnalyzer(rosterPositions, players);
            var results = analyzer.GetRosterDepth();

            // W/R spot should be adequate, filled by 3rd WR.
            Assert.AreEqual(PositionDepth.Adequate, results[Position.WideReceiverRunningBack]);
        }
        public ActionResult ShowRosterDepth(string teamKey, int? week)
        {
            var roster = this.Fantasizer.GetRosterPlayers(teamKey, week);
            var leagueSettings = this.Fantasizer.GetLeagueSettings(roster.Team.LeagueKey);

            var depthAnalyzer = new RosterDepthAnalyzer(leagueSettings.RosterPositions, roster.Players);

            var rosterDepthModel = new RosterDepthModel(
                roster,
                depthAnalyzer.GetRosterDepth(roster.Week),
                leagueSettings.League.EndWeek);

            return View(rosterDepthModel);
        }
        public ActionResult ShowWeeklyRosterDepth(string teamKey)
        {
            var matchups = this.Fantasizer.GetMatchups(teamKey);
            LeagueSettings leagueSettings = null;

            var weeklyRosterDepthModels = new List<WeeklyRosterDepthModel>();
            foreach (var matchup in matchups)
            {
                var weeklyModel = new WeeklyRosterDepthModel();
                weeklyModel.Week = matchup.Week;

                var rosterSelf = this.Fantasizer.GetRosterPlayers(matchup.TeamKeySelf, matchup.Week);
                if (leagueSettings == null)
                {
                    leagueSettings = this.Fantasizer.GetLeagueSettings(rosterSelf.Team.LeagueKey);
                }
                var depthAnalyzerSelf = new RosterDepthAnalyzer(leagueSettings.RosterPositions, rosterSelf.Players);
                weeklyModel.TeamSelf = new WeeklyTeamRosterDepthModel();
                weeklyModel.TeamSelf.TeamName = rosterSelf.Team.Name;
                weeklyModel.TeamSelf.TeamKey = rosterSelf.Team.Key;
                var positionDepths = new List<PositionDepthModel>();
                foreach (var positionDepth in depthAnalyzerSelf.GetRosterDepth(matchup.Week))
                {
                    if ((int)positionDepth.Value < 3)
                    {
                        var pdModel = new PositionDepthModel();
                        pdModel.PositionName = positionDepth.Key.DisplayName;
                        pdModel.DepthName = positionDepth.Value.ToString();
                        pdModel.DepthValue = positionDepth.Value;
                        positionDepths.Add(pdModel);
                    }
                }
                weeklyModel.TeamSelf.PositionDepths = positionDepths;

                var rosterOpponent = this.Fantasizer.GetRosterPlayers(matchup.TeamKeyOpponent, matchup.Week);
                var depthAnalyzerOpponent = new RosterDepthAnalyzer(leagueSettings.RosterPositions, rosterOpponent.Players);

                weeklyModel.TeamOpponent = new WeeklyTeamRosterDepthModel();
                weeklyModel.TeamOpponent.TeamName = rosterOpponent.Team.Name;
                weeklyModel.TeamOpponent.TeamKey = rosterOpponent.Team.Key;
                var positionDepthsOpponent = new List<PositionDepthModel>();
                foreach (var positionDepth in depthAnalyzerOpponent.GetRosterDepth(matchup.Week))
                {
                    if ((int)positionDepth.Value < 3)
                    {
                        var pdModel = new PositionDepthModel();
                        pdModel.PositionName = positionDepth.Key.DisplayName;
                        pdModel.DepthName = positionDepth.Value.ToString();
                        pdModel.DepthValue = positionDepth.Value;
                        positionDepthsOpponent.Add(pdModel);
                    }
                }
                weeklyModel.TeamOpponent.PositionDepths = positionDepthsOpponent;
                weeklyRosterDepthModels.Add(weeklyModel);
            }

            return View(weeklyRosterDepthModels);
        }
        public void GetRosterDepth_MultiFlex()
        {
            var rosterPositions = new Dictionary<PositionAbbreviation, RosterPosition>();
            rosterPositions.Add(PositionAbbreviation.QB, new RosterPosition(Position.Quarterback, 1));
            rosterPositions.Add(PositionAbbreviation.RB, new RosterPosition(Position.RunningBack, 2));
            rosterPositions.Add(PositionAbbreviation.WR, new RosterPosition(Position.WideReceiver, 2));
            rosterPositions.Add(PositionAbbreviation.W_R, new RosterPosition(Position.WideReceiverRunningBack, 1));
            rosterPositions.Add(PositionAbbreviation.W_T, new RosterPosition(Position.WideReceiverTightEnd, 1));
            rosterPositions.Add(PositionAbbreviation.DEF, new RosterPosition(Position.Defense, 1));
            rosterPositions.Add(PositionAbbreviation.K, new RosterPosition(Position.Kicker, 1));
            rosterPositions.Add(PositionAbbreviation.BN, new RosterPosition(Position.Bench, 4));

            var players = _testObjectFactory.CreatePlayers(
                Position.Quarterback,
                Position.Quarterback,
                Position.RunningBack,
                Position.RunningBack,
                Position.RunningBack,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.Kicker,
                Position.Kicker,
                Position.Defense,
                Position.Defense,
                Position.Defense);

            var analyzer = new RosterDepthAnalyzer(rosterPositions, players);
            var results = analyzer.GetRosterDepth();

            // In this case, the right thing to do is to fill the W/R spot with a RB so the WR can be used for W/T.
            Assert.AreEqual(PositionDepth.Deep, results[Position.Quarterback]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.RunningBack]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.WideReceiver]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.WideReceiverRunningBack]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.WideReceiverTightEnd]);
            Assert.AreEqual(PositionDepth.VeryDeep, results[Position.Defense]);
            Assert.AreEqual(PositionDepth.Deep, results[Position.Kicker]);
        }
        public void GetRosterDepth_WithByeWeek()
        {
            var rosterPositions = _testObjectFactory.CreateDefaultRosterPositions();

            var players = _testObjectFactory.CreatePlayers(
                Position.RunningBack,
                Position.RunningBack,
                Position.RunningBack,
                Position.RunningBack,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.TightEnd,
                Position.TightEnd,
                Position.TightEnd,
                Position.Kicker,
                Position.Defense);

            players.Add(_testObjectFactory.CreatePlayer(Position.Quarterback, byeWeek: 6));

            var analyzer = new RosterDepthAnalyzer(rosterPositions, players);
            var results = analyzer.GetRosterDepth(week: 6);

            // 1 QB spot required, 1 QB player on a bye week. QB position should be shallow.
            Assert.AreEqual(PositionDepth.Shallow, results[Position.Quarterback]);
        }
        public void GetRosterDepth_NoBench()
        {
            var rosterPositions = _testObjectFactory.CreateDefaultRosterPositions();

            var players = _testObjectFactory.CreatePlayers(
                Position.Quarterback,
                Position.RunningBack,
                Position.RunningBack,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.Quarterback,
                Position.Quarterback,
                Position.Quarterback,
                Position.TightEnd,
                Position.TightEnd,
                Position.TightEnd,
                Position.TightEnd,
                Position.Kicker,
                Position.Defense);

            var analyzer = new RosterDepthAnalyzer(rosterPositions, players);
            var results = analyzer.GetRosterDepth();

            // It doesn't make sense to analyze depth for BN spots
            Assert.IsFalse(results.ContainsKey(Position.Bench));
        }
        public void GetRosterDepth_MultiFlex_VaryingConstraint()
        {
            // Verify more constrained flex positions are considered first
            var rosterPositions = new Dictionary<PositionAbbreviation, RosterPosition>();
            rosterPositions.Add(PositionAbbreviation.QB, new RosterPosition(Position.Quarterback, 1));
            rosterPositions.Add(PositionAbbreviation.RB, new RosterPosition(Position.RunningBack, 2));
            rosterPositions.Add(PositionAbbreviation.WR, new RosterPosition(Position.WideReceiver, 2));
            rosterPositions.Add(PositionAbbreviation.W_R_T, new RosterPosition(Position.WideReceiverRunningBackTightEnd, 1));
            rosterPositions.Add(PositionAbbreviation.W_R, new RosterPosition(Position.WideReceiverRunningBack, 1));
            rosterPositions.Add(PositionAbbreviation.DEF, new RosterPosition(Position.Defense, 1));
            rosterPositions.Add(PositionAbbreviation.K, new RosterPosition(Position.Kicker, 1));
            rosterPositions.Add(PositionAbbreviation.BN, new RosterPosition(Position.Bench, 4));

            var players = _testObjectFactory.CreatePlayers(
                Position.Quarterback,
                Position.Quarterback,
                Position.RunningBack,
                Position.RunningBack,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.WideReceiver,
                Position.TightEnd,
                Position.TightEnd,
                Position.TightEnd,
                Position.Kicker,
                Position.Defense,
                Position.Defense);

            var analyzer = new RosterDepthAnalyzer(rosterPositions, players);
            var results = analyzer.GetRosterDepth();

            Assert.AreEqual(PositionDepth.Deep, results[Position.Quarterback]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.RunningBack]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.WideReceiver]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.WideReceiverRunningBack]);
            Assert.AreEqual(PositionDepth.VeryDeep, results[Position.WideReceiverRunningBackTightEnd]);
            Assert.AreEqual(PositionDepth.Deep, results[Position.Defense]);
            Assert.AreEqual(PositionDepth.Adequate, results[Position.Kicker]);
        }