public void Removes_least_desireable_trait()
        {
            var matchesAll = new SaleBull
                {
                    Calf_Id = "MatchesBWTWWTYWT",
                    BW_ADJ = (BWTMn + BWTMx)/2,
                    WW_ADJ = (WwtMn + WwtMx)/2,
                    YW_ADJ = (YwtMn + YwtMx)/2,
                    SEL_IDX = 1
                };

            var matchesTop2 = new SaleBull
                {
                    Calf_Id = "MatchesBWTWWT",
                    BW_ADJ = matchesAll.BW_ADJ + 1,
                    WW_ADJ = matchesAll.WW_ADJ + 1,
                    YW_ADJ = matchesAll.YW_ADJ + 1000,
                    SEL_IDX = 2
                };

            var matchesTop1 = new SaleBull
                {
                    Calf_Id = "MatchesBWT",
                    BW_ADJ = matchesAll.BW_ADJ + 1,
                    WW_ADJ = matchesAll.WW_ADJ + 1000,
                    YW_ADJ = matchesAll.YW_ADJ + 1000,
                    SEL_IDX = 3
                };

            var bullList = new List<SaleBull>
                {
                    matchesTop1,
                    matchesTop2,
                    matchesAll
                };

            var desiredTraits = new List<TraitVM>
                {
                    new TraitVM
                        {
                            Sequence = 1,
                            BullSaleView = BullSaleViewNameEnum.BW_ADJ,
                            RangeMinValue = BWTMn.ToString(CultureInfo.InvariantCulture),
                            RangeMaxValue = BWTMx.ToString(CultureInfo.InvariantCulture)
                        },
                    new TraitVM
                        {
                            Sequence = 2,
                            BullSaleView = BullSaleViewNameEnum.WW_ADJ,
                            RangeMinValue = WwtMn.ToString(CultureInfo.InvariantCulture),
                            RangeMaxValue = WwtMx.ToString(CultureInfo.InvariantCulture)
                        },
                    new TraitVM
                        {
                            Sequence = 3,
                            BullSaleView = BullSaleViewNameEnum.YW_ADJ,
                            RangeMinValue = YwtMn.ToString(CultureInfo.InvariantCulture),
                            RangeMaxValue = YwtMx.ToString(CultureInfo.InvariantCulture)
                        }
                };
            var search = new PredictabullServices.Search(bullList, desiredTraits, null);
            var results = search.QualifyBulls();
            Assert.AreEqual(3, results.Count);
            Assert.AreEqual(3, results.First().Bull.SEL_IDX);
            Assert.AreEqual(1, results.Last().Bull.SEL_IDX);
        }
        public void FindsAll()
        {
            var bulls = _SaleBulls.Where(x => x.Calf_SN == 1000).ToList();
            Assert.AreEqual(1, bulls.Count());

            var allMatchingTraits = new List<TraitVM>
                {
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.BW_ADJ,
                            RangeMinValue = "89",
                            RangeMaxValue = "91"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.WW_ADJ,
                            RangeMinValue = "499",
                            RangeMaxValue = "501"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.YW_ADJ,
                            RangeMinValue = "999",
                            RangeMaxValue = "1001"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.H18MW_ADJ,
                            RangeMinValue = "1499",
                            RangeMaxValue = "1501"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.ADG_BW_ADJ,
                            RangeMinValue = "2.4",
                            RangeMaxValue = "2.6"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.BACKFAT_ADJ,
                            RangeMinValue = "8.0",
                            RangeMaxValue = "8.2"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.SCROTCIRC_ADJ,
                            RangeMinValue = "40.0",
                            RangeMaxValue = "41.0"
                        },
                };

            var sut = new PredictabullServices.Search(bulls, allMatchingTraits, null);
            IEnumerable<QualifiedBull> result = sut.QualifyBulls();
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(allMatchingTraits.Count, result.First().BullTraits.Count(x => x.Qualifies));
        }
        public void FindsAll()
        {
            var bulls = _SaleBulls.Where(x => x.Calf_SN == 1000).ToList();
            Assert.AreEqual(1, bulls.Count());

            var traits = new List<TraitVM>
                {
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.FFHH,
                            RangeMinValue = "1",
                            RangeMaxValue = "3"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.FLHL,
                            RangeMinValue = "2",
                            RangeMaxValue = "4"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Morph,
                            RangeMinValue = "69",
                            RangeMaxValue = "71"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Motil,
                            RangeMinValue = "79",
                            RangeMaxValue = "81"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Conc,
                            RangeMinValue = "1",
                            RangeMaxValue = "3"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Disp,
                            RangeMinValue = "2",
                            RangeMaxValue = "4"
                        },                
                };

            var sut = new PredictabullServices.Search(bulls, traits, null);
            IEnumerable<QualifiedBull> result = sut.QualifyBulls();
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(traits.Count, result.First().BullTraits.Count());
            Assert.AreEqual(traits.Count, result.First().BullTraits.Count(x => x.Qualifies));
        }
        public void FindsAll()
        {
            var bulls = _SaleBulls.Where(x => x.Calf_SN == 1000).ToList();
            Assert.AreEqual(1, bulls.Count());

            var traits = new List<TraitVM>
                {
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.HideColour_Code,
                            ExactValue = "BLK"
                        },
                    new TraitVM
                        {
                            BullSaleView =BullSaleViewNameEnum.TagColour,
                            ExactValue = "ORANGE"
                        },
                };

            var sut = new PredictabullServices.Search(bulls, traits, null);
            IEnumerable<QualifiedBull> result = sut.QualifyBulls();
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(traits.Count, result.First().BullTraits.Count());
            Assert.AreEqual(traits.Count, result.First().BullTraits.Count(x => x.Qualifies));
        }
        public void FindsAll()
        {
            var bulls = _SaleBulls.Where(x => x.Calf_SN == 1000).ToList();
            Assert.AreEqual(1, bulls.Count());

            var traits = new List<TraitVM>
                {
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.AgeOfDam,
                            RangeMinValue = "3",
                            RangeMaxValue = "5"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Dam_Wt,
                            RangeMinValue = "1499",
                            RangeMaxValue = "1501"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Teat,
                            RangeMinValue = "1",
                            RangeMaxValue = "3"
                        },
                    new TraitVM
                        {
                            BullSaleView = BullSaleViewNameEnum.Udder,
                            RangeMinValue = "1",
                            RangeMaxValue = "3"
                        },
              };

            var sut = new PredictabullServices.Search(bulls, traits, null);
            IEnumerable<QualifiedBull> result = sut.QualifyBulls();
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(traits.Count, result.First().BullTraits.Count());
            Assert.AreEqual(traits.Count, result.First().BullTraits.Count(x => x.Qualifies));
        }