public void Calculates_correct_percentages(int daisyMaeSellPrice, int[] nookBuyPrices, float[] expected)
        {
            var exampleData = new CurrentWeekData(daisyMaeSellPrice, nookBuyPrices);

            var actual = exampleData.GetPercentages();

            actual.Should().ContainInOrder(expected);
        }
Beispiel #2
0
        public bool MatchesFor(CurrentWeekData data)
        {
            var priceChanges =
                data.NookBuyPrices
                .Zip(data.NookBuyPrices.Skip(1), (first, second) => second - first);

            var everyDayDecreases = priceChanges.All(priceChange => priceChange < 0);

            return(!everyDayDecreases);
        }
Beispiel #3
0
        public bool MatchesFor(CurrentWeekData data)
        {
            if (data.NookBuyPrices.Count() < dayIndex + 1)
            {
                return(false);
            }

            var specificPercentage = data.GetPercentages().ElementAt(dayIndex);

            return(specificPercentage < lower || specificPercentage > upper);
        }
Beispiel #4
0
        private bool OnePatternIsProven(CurrentWeekData data, IEnumerable <PatternValidator> validators, out StalkPattern?provenPattern)
        {
            try
            {
                var provenValidator = validators.SingleOrDefault(validator => validator.IsProvenFor(data));

                provenPattern = provenValidator?.Pattern;

                return(provenValidator != null);
            }
            catch (InvalidOperationException)
            {
                // More than one validator claims to be proven, that's impossible!

                var provenValidatorPatterns = validators
                                              .Where(validator => validator.IsProvenFor(data))
                                              .Select(validator => validator.Pattern);
                var names = String.Join(", ", provenValidatorPatterns);

                throw new Exception($"More than one pattern is proven! (${names})");
            }
        }
Beispiel #5
0
        public IEnumerable <StalkPattern> GetPossibleStalkPatterns(CurrentWeekData data)
        {
            var validators = PatternValidatorFactory.GetPatternValidators();

            // Look for a proven pattern

            if (OnePatternIsProven(data, validators, out StalkPattern? pattern))
            {
                return(new StalkPattern[] { pattern.Value });
            }

            // Get all possible patterns

            IEnumerable <StalkPattern> possibleStalkPatterns = Enum.GetValues(typeof(StalkPattern)).Cast <StalkPattern>().ToList();

            // Subtract any disproven patterns

            var disprovenPatterns = validators
                                    .Where(validator => validator.IsDisprovenFor(data))
                                    .Select(validator => validator.Pattern);

            return(possibleStalkPatterns.Except(disprovenPatterns));
        }
Beispiel #6
0
 public bool IsPossibleFor(CurrentWeekData data) => !IsProvenFor(data) && !IsDisprovenFor(data);
Beispiel #7
0
 public bool IsDisprovenFor(CurrentWeekData data) => Disprovers.Any(disprover => disprover.MatchesFor(data));
Beispiel #8
0
 public bool IsProvenFor(CurrentWeekData data) => Provers.Any(prover => prover.MatchesFor(data));
Beispiel #9
0
 public bool MatchesFor(CurrentWeekData data)
 {
     return(data.GetPercentages().Any(percentage => percentage < lower || percentage > upper));
 }
Beispiel #10
0
 public static IEnumerable <float> GetPercentages(this CurrentWeekData data)
 {
     return(data.NookBuyPrices.Select(buyPrice => (float)(buyPrice * 100) / data.DaisyMaeSellPrice));
 }