public void NoDoubles_ResultGivenBack()
        {
            var results = new DoubleApplication(_outcome, 0).Get();

            Assert.Single(results);
            Assert.Equal(_outcome, results[0]);
        }
        public void OneDoubleWithNoApplicableToken_OneOpenDouble()
        {
            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Single(results);
            Assert.Single(results[0].Tokens);
            Assert.Equal(RawTokenType.OpenDouble, results[0].Tokens[0].Type);
        }
        public void DoubleWithTwoDamage_GoesToFourQuantity()
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Damage, Quantity = 2
            });

            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Equal(4, results[0].Tokens[0].Quantity);
        }
        public void DoubleWithATacticsDamageToken_OpenDoubleAdded()
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Damage, WasTactics = true
            });

            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Equal(2, results[0].Tokens.Count);
            Assert.Equal(RawTokenType.OpenDouble, results[0].Tokens[1].Type);
        }
        public void DoubleWithAnAlreadyDoubleApplicableToken_AddsOpenDouble()
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Damage, WasDoubled = true
            });

            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Equal(2, results[0].Tokens.Count);
            Assert.Equal(1, results[0].Tokens[0].Quantity);
            Assert.Equal(RawTokenType.OpenDouble, results[0].Tokens[1].Type);
        }
        public void DoubleWithApplicableToken_DoublesUpTheQuantity(RawTokenType type)
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = type
            });

            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Single(results);
            Assert.Single(results[0].Tokens);
            Assert.Equal(2, results[0].Tokens[0].Quantity);
        }
        public void DoubleWithOneOtherNonApplicableToken_AddsOpenDouble(RawTokenType type)
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = type
            });

            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Single(results);
            Assert.Equal(2, results[0].Tokens.Count);
            Assert.Equal(RawTokenType.OpenDouble, results[0].Tokens[1].Type);
        }
        public void TwoDoublesWithOneApplicableToken_TokenDoubledAndOpenDoubledAdded()
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Damage
            });

            var results = new DoubleApplication(_outcome, 2).Get();

            Assert.Single(results);
            Assert.Equal(2, results[0].Tokens.Count);
            Assert.Contains(results[0].Tokens, x => x.WasDoubled && x.Type == RawTokenType.Damage && x.Quantity == 2);
            Assert.Contains(results[0].Tokens, x => x.Type == RawTokenType.OpenDouble);
        }
        public void DoubleWithMultipleValueTypes_EachPermutationProduced()
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Damage
            });
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Block
            });

            var results = new DoubleApplication(_outcome, 1).Get();

            Assert.Contains(results, x => x.Tokens.First(token => token.WasDoubled).Type == RawTokenType.Damage);
            Assert.Contains(results, x => x.Tokens.First(token => token.WasDoubled).Type == RawTokenType.Block);
        }
        public void TwoDoublesWithThreeApplicableTokens_ThreeResultsProduced()
        {
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Damage
            });
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Block
            });
            _outcome.Tokens.Add(new RawTokenResult {
                Type = RawTokenType.Surge
            });

            var results = new DoubleApplication(_outcome, 2).Get();

            Assert.Equal(3, results.Count);
        }
        private CalculatedOutcome CalculateBestOutcome(List <Token> tokens)
        {
            var outcome = new RawOutcome {
                Initiative = new InitiativeCalculation(tokens).Get()
            };
            var wingOutcomes = new WingsApplication(tokens, outcome).Get();
            var outcomes     = wingOutcomes.SelectMany(x =>
            {
                var simpleOutcome   = new SimpleApplication(x.Tokens, x.Outcome).Get();
                var doubledOutcomes = new DoubleApplication(simpleOutcome,
                                                            x.Tokens.Count(token => token.FaceUp.Type == TokenSideType.Double)).Get();
                var tacticsOutcomes = doubledOutcomes.SelectMany(doubledOutcome => new TacticsApplication(doubledOutcome,
                                                                                                          x.Tokens.Count(token => token.FaceUp.Type == TokenSideType.Tactics)).Get()).ToList();
                return(tacticsOutcomes);
            }).ToList();
            var calculatedOutcomes = outcomes.Select(x => new RawOutcomeCalculation(_evaluators, x).Get());

            return(calculatedOutcomes.OrderByDescending(x => x.Value).First());
        }