Dictionary <ProBuilderMesh, HashSet <Face> > TestFacePick(PickerOptions options)
    {
        try
        {
            Rect selectionRect = new Rect(camera.pixelRect);
            selectionRect.width  /= EditorGUIUtility.pixelsPerPoint;
            selectionRect.height /= EditorGUIUtility.pixelsPerPoint;

            var faces = UnityEngine.ProBuilder.SelectionPicker.PickFacesInRect(
                camera,
                selectionRect,
                selectables,
                options,
                EditorGUIUtility.pixelsPerPoint);

            LogAssert.NoUnexpectedReceived();

            return(faces);
        }
        catch (System.Exception e)
        {
            Debug.LogError(e.ToString());
            return(null);
        }
    }
        public static Dictionary <ProBuilderMesh, HashSet <int> > PickVerticesInRect(
            Camera cam,
            Rect rect,
            Rect uiRootRect,
            IList <ProBuilderMesh> selectable,
            PickerOptions options,
            float pixelsPerPoint = 1f)
        {
            if (options.depthTest)
            {
                return(m_renderer.PickVerticesInRect(
                           cam,
                           rect,
                           selectable,
                           true,
                           (int)(uiRootRect.width / pixelsPerPoint),
                           (int)(uiRootRect.height / pixelsPerPoint)));
            }

            // while the selectionpicker render path supports no depth test picking, it's usually faster to skip
            // the render. also avoids issues with vertex billboards obscuring one another.
            var selected = new Dictionary <ProBuilderMesh, HashSet <int> >();

            foreach (var pb in selectable)
            {
                if (!pb.selectable)
                {
                    continue;
                }

                IList <SharedVertex> sharedIndexes = pb.sharedVertices;
                HashSet <int>        inRect        = new HashSet <int>();
                IList <Vector3>      positions     = pb.positions;
                var   trs         = pb.transform;
                float pixelHeight = uiRootRect.height;

                for (int n = 0; n < sharedIndexes.Count; n++)
                {
                    Vector3 v = trs.TransformPoint(positions[sharedIndexes[n][0]]);
                    Vector3 p = cam.WorldToScreenPoint(v);

                    if (p.z < cam.nearClipPlane)
                    {
                        continue;
                    }

                    p.x /= pixelsPerPoint;
                    p.y  = (pixelHeight - p.y) / pixelsPerPoint;

                    if (rect.Contains(p))
                    {
                        inRect.Add(n);
                    }
                }

                selected.Add(pb, inRect);
            }

            return(selected);
        }
        /// <summary>
        ///   Creates a Bootstrap date time picker control
        /// </summary>
        /// <param name="html">HtmlHelper extension</param>
        /// <param name="name">Name of HTML control</param>
        /// <param name="options">
        ///   [Optional] Date time picker options. Defaults to
        ///   <see cref="BootstrapSettings.DateTimePickerOptions" />
        /// </param>
        /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param>
        /// <returns>A Bootstrap date time picker control</returns>
        public static IExtendedHtmlString DateTimeTextBox(this HtmlHelpers html,
                                                          string name, PickerOptions options = null,
                                                          object htmlAttributes = null)
        {
            IHtmlComponent control = new DateTimePickerHtmlComponent(name, name, options, htmlAttributes);

            return(new ExtendedHtmlString(control));
        }
        /// <summary>
        ///   Creates a Bootstrap date time picker control
        /// </summary>
        /// <typeparam name="TModel">Type to be scanned</typeparam>
        /// <typeparam name="TValue">Property to be scanned</typeparam>
        /// <param name="html">HtmlHelper extension</param>
        /// <param name="expression">The property lamba expression</param>
        /// <param name="options">Date time picker options</param>
        /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param>
        /// <returns>A Bootstrap date time picker control</returns>
        public static IExtendedHtmlString DateTimeTextBoxFor <TModel, TValue>(this HtmlHelpers <TModel> html,
                                                                              Expression <Func <TModel, TValue> > expression,
                                                                              PickerOptions options, object htmlAttributes)
        {
            MemberExpression mex = expression.Body as MemberExpression;

            string id   = WebExtrasUtil.GetFieldIdFromExpression(mex);
            string name = WebExtrasUtil.GetFieldNameFromExpression(mex);

            IHtmlComponent control = new DateTimePickerHtmlComponent(name, id, options, htmlAttributes);

            return(new ExtendedHtmlString(control));
        }
    Dictionary <ProBuilderMesh, HashSet <int> > TestVertexPick(PickerOptions options)
    {
        try
        {
            Rect selectionRect = new Rect(camera.pixelRect);
            selectionRect.width  /= EditorGUIUtility.pixelsPerPoint;
            selectionRect.height /= EditorGUIUtility.pixelsPerPoint;

            var vertices = UnityEngine.ProBuilder.SelectionPicker.PickVerticesInRect(
                camera,
                selectionRect,
                selectables,
                options,
                EditorGUIUtility.pixelsPerPoint);

            LogAssert.NoUnexpectedReceived();

            return(vertices);
        }
        catch
        {
            return(null);
        }
    }
        public static void DoMouseDrag(Rect mouseDragRect, SelectMode selectionMode, ScenePickerPreferences scenePickerPreferences)
        {
            var pickingOptions = new PickerOptions()
            {
                depthTest      = scenePickerPreferences.cullMode == CullingMode.Back,
                rectSelectMode = scenePickerPreferences.rectSelectMode
            };

            UndoUtility.RecordSelection("Drag Select");
            bool isAppendModifier = EditorHandleUtility.IsAppendModifier(Event.current.modifiers);

            if (!isAppendModifier)
            {
                MeshSelection.ClearElementSelection();
            }

            bool elementsInDragRect = false;

            switch (selectionMode)
            {
            case SelectMode.Vertex:
            case SelectMode.TextureVertex:
            {
                Dictionary <ProBuilderMesh, HashSet <int> > selected = SelectionPicker.PickVerticesInRect(
                    SceneView.lastActiveSceneView.camera,
                    mouseDragRect,
                    MeshSelection.topInternal,
                    pickingOptions,
                    EditorGUIUtility.pixelsPerPoint);

                foreach (var kvp in selected)
                {
                    var            mesh          = kvp.Key;
                    SharedVertex[] sharedIndexes = mesh.sharedVerticesInternal;
                    HashSet <int>  common;

                    if (isAppendModifier)
                    {
                        common = mesh.GetSharedVertexHandles(mesh.selectedIndexesInternal);

                        if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Add)
                        {
                            common.UnionWith(kvp.Value);
                        }
                        else if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Subtract)
                        {
                            common.RemoveWhere(x => kvp.Value.Contains(x));
                        }
                        else if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Difference)
                        {
                            common.SymmetricExceptWith(kvp.Value);
                        }
                    }
                    else
                    {
                        common = kvp.Value;
                    }

                    elementsInDragRect |= kvp.Value.Any();
                    mesh.SetSelectedVertices(common.SelectMany(x => sharedIndexes[x]));
                }

                break;
            }

            case SelectMode.Face:
            case SelectMode.TextureFace:
            {
                Dictionary <ProBuilderMesh, HashSet <Face> > selected = SelectionPicker.PickFacesInRect(
                    SceneView.lastActiveSceneView.camera,
                    mouseDragRect,
                    MeshSelection.topInternal,
                    pickingOptions,
                    EditorGUIUtility.pixelsPerPoint);

                foreach (var kvp in selected)
                {
                    HashSet <Face> current;

                    if (isAppendModifier)
                    {
                        current = new HashSet <Face>(kvp.Key.selectedFacesInternal);

                        if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Add)
                        {
                            current.UnionWith(kvp.Value);
                        }
                        else if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Subtract)
                        {
                            current.RemoveWhere(x => kvp.Value.Contains(x));
                        }
                        else if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Difference)
                        {
                            current.SymmetricExceptWith(kvp.Value);
                        }
                    }
                    else
                    {
                        current = kvp.Value;
                    }

                    elementsInDragRect |= kvp.Value.Any();
                    kvp.Key.SetSelectedFaces(current);
                }

                break;
            }

            case SelectMode.Edge:
            case SelectMode.TextureEdge:
            {
                var selected = SelectionPicker.PickEdgesInRect(
                    SceneView.lastActiveSceneView.camera,
                    mouseDragRect,
                    MeshSelection.topInternal,
                    pickingOptions,
                    EditorGUIUtility.pixelsPerPoint);

                foreach (var kvp in selected)
                {
                    ProBuilderMesh        mesh          = kvp.Key;
                    Dictionary <int, int> common        = mesh.sharedVertexLookup;
                    HashSet <EdgeLookup>  selectedEdges = EdgeLookup.GetEdgeLookupHashSet(kvp.Value, common);
                    HashSet <EdgeLookup>  current;

                    if (isAppendModifier)
                    {
                        current = EdgeLookup.GetEdgeLookupHashSet(mesh.selectedEdges, common);

                        if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Add)
                        {
                            current.UnionWith(selectedEdges);
                        }
                        else if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Subtract)
                        {
                            current.RemoveWhere(x => selectedEdges.Contains(x));
                        }
                        else if (scenePickerPreferences.selectionModifierBehavior == SelectionModifierBehavior.Difference)
                        {
                            current.SymmetricExceptWith(selectedEdges);
                        }
                    }
                    else
                    {
                        current = selectedEdges;
                    }

                    elementsInDragRect |= kvp.Value.Any();
                    mesh.SetSelectedEdges(current.Select(x => x.local));
                }

                break;
            }
            }

            // if nothing was selected in the drag rect, clear the object selection too
            if (!elementsInDragRect && !isAppendModifier)
            {
                MeshSelection.ClearElementAndObjectSelection();
            }

            ProBuilderEditor.Refresh();
            SceneView.RepaintAll();
        }
        /// <summary>
        ///   Creates a Bootstrap date time picker control
        /// </summary>
        /// <typeparam name="TModel">Type to be scanned</typeparam>
        /// <typeparam name="TValue">Property to be scanned</typeparam>
        /// <param name="html">HtmlHelper extension</param>
        /// <param name="expression">The property lamba expression</param>
        /// <param name="options">Date time picker options</param>
        /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param>
        /// <returns>A Bootstrap date time picker control</returns>
        public static IExtendedHtmlStringLegacy DateTimeTextBoxFor <TModel, TValue>(this HtmlHelper <TModel> html,
                                                                                    Expression <Func <TModel, TValue> > expression, PickerOptions options,
                                                                                    object htmlAttributes = (IDictionary <string, object>) null)
        {
            MemberExpression exp = expression.Body as MemberExpression;

            PickerOptions pickerOptions =
                options.GetHashCode() == BootstrapSettings.DateTimePickerOptions.GetHashCode()
          ? options.DeepClone()
          : options;

            pickerOptions = pickerOptions.TryFontAwesomeIcons();

            var model = ((DateTime?)ModelMetadata.FromLambdaExpression(expression, html.ViewData).Model);

            if (model.HasValue && model.Value > DateTime.MinValue)
            {
                pickerOptions.defaultDate = model;
            }

            string fieldId   = WebExtrasUtil.GetFieldIdFromExpression(exp);
            string fieldName = WebExtrasUtil.GetFieldNameFromExpression(exp);

            // create the text box
            HtmlComponent input   = new HtmlComponent(EHtmlTag.Input);
            var           attribs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
                                    .ToDictionary(k => k.Key, v => v.Value.ToString());

            input.Attributes.Add(attribs);
            input.Attributes["type"] = "text";
            input.Attributes["name"] = fieldName;

            if (input.Attributes.ContainsKey("class"))
            {
                input.Attributes["class"] += " form-control";
            }
            else
            {
                input.Attributes["class"] = "form-control";
            }

            // create icon
            HtmlComponent icon = new HtmlComponent(EHtmlTag.I);

            if (WebExtrasSettings.FontAwesomeVersion == EFontAwesomeVersion.V4)
            {
                icon.CssClasses.Add("fa fa-calendar");
            }
            else if (WebExtrasSettings.FontAwesomeVersion == EFontAwesomeVersion.V3)
            {
                icon.CssClasses.Add("icon-calendar");
            }
            else
            {
                icon.CssClasses.Add("glyphicon glyphicon-calendar");
            }

            // create addon
            HtmlComponent addOn = new HtmlComponent(EHtmlTag.Span);

            addOn.CssClasses.Add("input-group-addon");
            addOn.AppendTags.Add(icon);

            // create JSON dictionary of the picker options
            string op = pickerOptions.ToJson(new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore
            });

            HtmlComponent script = new HtmlComponent(EHtmlTag.Script);

            script.Attributes["type"] = "text/javascript";
            script.InnerHtml          = "$(function(){ $('#" + fieldId + "').datetimepicker(" + op + "); });";

            // create the final component
            IHtmlComponent control;

            if (pickerOptions.useAddonField.Equals(false))
            {
                NullWrapperComponent wrapper = new NullWrapperComponent();

                input.Attributes["id"] = fieldId;
                wrapper.Components.Add(input);

                wrapper.Components.Add(script);

                control = wrapper;
            }
            else
            {
                control = new HtmlComponent(EHtmlTag.Div);
                control.Attributes["id"]    = fieldId;
                control.Attributes["class"] = "input-group date";
                control.AppendTags.Add(input);
                control.AppendTags.Add(addOn);
                control.AppendTags.Add(script);
            }

            return(new HtmlElement(control));
        }
        /// <summary>
        ///   Creates a Bootstrap date time picker control
        /// </summary>
        /// <typeparam name="TModel">Type to be scanned</typeparam>
        /// <typeparam name="TValue">Property to be scanned</typeparam>
        /// <param name="html">HtmlHelper extension</param>
        /// <param name="expression">The property lamba expression</param>
        /// <param name="options">Date time picker options</param>
        /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param>
        /// <returns>A Bootstrap date time picker control</returns>
        public static MvcHtmlString DateTimeTextBoxFor <TModel, TValue>(this HtmlHelper <TModel> html,
                                                                        Expression <Func <TModel, TValue> > expression, PickerOptions options,
                                                                        object htmlAttributes = (IDictionary <string, object>) null)
        {
            MemberExpression exp = expression.Body as MemberExpression;

            PickerOptions pickerOptions =
                options.GetHashCode() == BootstrapSettings.DateTimePickerOptions.GetHashCode()
          ? options.DeepClone()
          : options;

            pickerOptions = pickerOptions.UpdateOptionsBasedOnView();

            string fieldId        = WebExtrasUtil.GetFieldIdFromExpression(exp);
            string fieldName      = WebExtrasUtil.GetFieldNameFromExpression(exp);
            string datetimeformat = ConvertToCsDateFormat(pickerOptions.format);

            // create the text box
            TagBuilder input = new TagBuilder("input");

            input.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
            input.Attributes["type"]  = "text";
            input.Attributes["value"] =
                ((DateTime)ModelMetadata.FromLambdaExpression(expression, html.ViewData).Model).ToString(datetimeformat);
            input.Attributes["name"] = fieldName;

            if (input.Attributes.ContainsKey("class"))
            {
                input.Attributes["class"] += " form-control";
            }
            else
            {
                input.Attributes["class"] = "form-control";
            }

            // create addon
            TagBuilder addOn = new TagBuilder("span");

            addOn.AddCssClass("add-on");

            TagBuilder icons = new TagBuilder("i");

            icons.AddCssClass("icon-calendar");

            TagBuilder control = new TagBuilder("div");

            control.Attributes["id"]    = fieldId;
            control.Attributes["class"] = "input-append date form_datetime";

            addOn.InnerHtml   = icons.ToString(TagRenderMode.Normal);
            control.InnerHtml = input.ToString(TagRenderMode.SelfClosing) + addOn.ToString(TagRenderMode.Normal);

            // create JSON dictionary of the picker options
            string op = pickerOptions.ToJson();

            TagBuilder script = new TagBuilder("script");

            script.Attributes["type"] = "text/javascript";
            script.InnerHtml          = "$(function(){ $('#" + fieldId + "').datetimepicker(" + op + "); });";

            return(MvcHtmlString.Create(control.ToString(TagRenderMode.Normal) + script.ToString(TagRenderMode.Normal)));
        }
 public PickerModel(List<IExchangeRecord> values, PickerOptions pickerOption)
 {
     _values = values;
     _pickerOption = pickerOption;
 }
        public static Dictionary <ProBuilderMesh, HashSet <Edge> > PickEdgesInRect(
            Camera cam,
            Rect rect,
            Rect uiRootRect,
            IList <ProBuilderMesh> selectable,
            PickerOptions options,
            float pixelsPerPoint = 1f)
        {
            if (/*options.depthTest &&*/ options.rectSelectMode == RectSelectMode.Partial)
            {
                return(m_renderer.PickEdgesInRect(
                           cam,
                           rect,
                           selectable,
                           options.depthTest,
                           (int)(uiRootRect.width / pixelsPerPoint),
                           (int)(uiRootRect.height / pixelsPerPoint)));
            }

            var selected = new Dictionary <ProBuilderMesh, HashSet <Edge> >();

            foreach (var pb in selectable)
            {
                if (!pb.selectable)
                {
                    continue;
                }

                Transform trs           = pb.transform;
                var       selectedEdges = new HashSet <Edge>();

                IList <Face>    faces     = pb.faces;
                IList <Vector3> positions = pb.positions;
                for (int i = 0, fc = pb.faceCount; i < fc; i++)
                {
                    var edges = faces[i].edges;

                    for (int n = 0, ec = edges.Count; n < ec; n++)
                    {
                        var edge = edges[n];

                        var posA = trs.TransformPoint(positions[edge.a]);
                        var posB = trs.TransformPoint(positions[edge.b]);

                        Vector3 a = ScreenToGuiPoint(uiRootRect, cam.WorldToScreenPoint(posA), pixelsPerPoint);
                        Vector3 b = ScreenToGuiPoint(uiRootRect, cam.WorldToScreenPoint(posB), pixelsPerPoint);

                        switch (options.rectSelectMode)
                        {
                        case RectSelectMode.Complete:
                        {
                            // if either of the positions are clipped by the camera we cannot possibly select both, skip it
                            if ((a.z < cam.nearClipPlane || b.z < cam.nearClipPlane))
                            {
                                continue;
                            }

                            if (rect.Contains(a) && rect.Contains(b))
                            {
                                if (!options.depthTest || !PBUtility.PointIsOccluded(cam, pb, (posA + posB) * .5f))
                                {
                                    selectedEdges.Add(edge);
                                }
                            }

                            break;
                        }

                        case RectSelectMode.Partial:
                        {
                            // partial + depth test is covered earlier
                            if (RectIntersectsLineSegment(rect, a, b))
                            {
                                selectedEdges.Add(edge);
                            }

                            break;
                        }
                        }
                    }
                }

                selected.Add(pb, selectedEdges);
            }

            return(selected);
        }
        public void Setup()
        {
            var cache = new RedisCacheRepository(
                connectionString: "localhost,abortConnect=false",
                environment: "local",
                functionalArea: "bts",
                serializer: new XmlSerializer(),
                logger: new FakeCacheLogger(),
                expire: false);
            var pitcherRepo = new CachedPitcherRepository(
                new PitcherRepository(),
                cache);
            var lineupRepo = new CachedLineupRepository(
                new LineupRepository(),
                cache);
            var statsRepo = new CachedPlayerStatsRepository(
                new PlayerStatsRepository(),
                cache);
            var teamStatsRepo = new CachedTeamStatsRepository(
                new TeamStatsRepository(),
                cache);
            var opposingPitcher = new OpposingPitcher(
                pitcherRepo);
            var lineupProjector = new LineupProjector(
                lineupRepo,
                opposingPitcher,
                new FakeLogger(),
                daysToGoBack: 10);
            var gameLogRepository = new CachedGameLogRepository(
                new GameLogRepository(),
                cache);
            var obaCalculator = new CalculateOpponentOba(
                new FakeLogger(),
                gameLogRepository);

            _resultChecker = new ResultChecker(statsRepo);
            var options = new Dictionary <string, string>
            {
                { Constants.Options.HomePitchersOnly, "on" },
                { Constants.Options.LineupPositions, "4" },
                { Constants.Options.NoDaysOff, "on" },
                { Constants.Options.DaysOffDaysBack, "3" },
                { Constants.Options.HotBatters, "off" },
                { Constants.Options.HotBattersDaysBack, "30" },
                { Constants.Options.HotBattersMendozaLine, ".289" },
                { Constants.Options.PitchersMendozaLine, ".259" },
                { Constants.Options.PitcherDaysBack, "30" },
                { Constants.Options.TeamClip, "off" },
                { Constants.Options.PitchersTeamMendozaLine, ".555" },
                { Constants.Options.BattersTeamMendozaLine, ".399" },
            };
            var pickerOptions = new PickerOptions(options);

            _picker = new DefaultPicker(
                options: pickerOptions,
                lineupRepository: lineupRepo,
                pitcherRepository: pitcherRepo,
                playerStatsRepository: statsRepo,
                teamStatsRepository: teamStatsRepo,
                lineupProjector: lineupProjector,
                calculateOpponentOba: obaCalculator,
                logger: new FakeLogger());

            _sut = new CalculateStreak(_picker, _resultChecker);
        }
示例#12
0
        static void Main(string[] args)
        {
            CalculateVersionInfo(
                out Version versionInfo,
                out DateTime computedDate);

            var logger = new Implementations.NLogAdaptor();

            logger.Info("-------------------------------------------------------------------------------------");
            logger.Info($@"Beat The Streak  ver:{
				versionInfo
				} built {
				computedDate.ToLongDateString()
				} Working Directory:{
				Directory.GetCurrentDirectory()
				}"                );

            var cacheLogger = new Cache.NLogAdaptor();
            var cache       = new RedisCacheRepository(
                connectionString: "localhost,abortConnect=false",
                environment: "local",
                functionalArea: "bts",
                serializer: new XmlSerializer(),
                logger: cacheLogger,
                expire: false);
            var pitcherRepo = new CachedPitcherRepository(
                new PitcherRepository(),
                cache);
            var lineupRepo = new CachedLineupRepository(
                new LineupRepository(),
                cache);
            var statsRepo = new CachedPlayerStatsRepository(
                new PlayerStatsRepository(),
                cache);
            var teamStatsRepo = new CachedTeamStatsRepository(
                new TeamStatsRepository(),
                cache);
            var opposingPitcher = new OpposingPitcher(
                pitcherRepo);
            var lineupProjector = new LineupProjector(
                lineupRepo,
                opposingPitcher,
                logger,
                daysToGoBack: 10);
            var resultChecker     = new ResultChecker(statsRepo);
            var configReader      = new ConfigReader();
            var mm                = new MailMan2(configReader, logger);
            var mailer            = new MailBatterReport(mailMan: mm, logger: logger);
            var gameLogRepository = new CachedGameLogRepository(
                new GameLogRepository(),
                cache);
            var obaCalculator = new CalculateOpponentOba(
                logger: logger,
                gameLogRepository: gameLogRepository);
            var options = new Dictionary <string, string>
            {
                { Constants.Options.HomePitchersOnly, "on" },
                { Constants.Options.LineupPositions, "3" },
                { Constants.Options.NoDaysOff, "off" },
                { Constants.Options.DaysOffDaysBack, "3" },
                { Constants.Options.HotBatters, "off" },
                { Constants.Options.HotBattersDaysBack, "30" },
                { Constants.Options.HotBattersMendozaLine, ".289" },
                { Constants.Options.PitchersMendozaLine, ".259" },
                { Constants.Options.PitcherDaysBack, "30" },
                { Constants.Options.BattersToPick, "2" },
                { Constants.Options.TeamClip, "off" },
                { Constants.Options.PitchersTeamMendozaLine, ".555" },
                { Constants.Options.BattersTeamMendozaLine, ".455" },
            };
            var pickerOptions = new PickerOptions(options);
            var sut           = new DefaultPicker(
                pickerOptions,
                lineupRepo,
                pitcherRepo,
                statsRepo,
                teamStatsRepo,
                lineupProjector,
                obaCalculator,
                logger);
            var gameDate = DateTime.Now;              // US Date

            try
            {
                var result = sut.Choose(
                    gameDate: gameDate,
                    numberRequired: 2);
                if (Utility.GamePlayed(gameDate))
                {
                    foreach (var selection in result.Selections)
                    {
                        selection.Result = resultChecker.Result(
                            selection.Batter,
                            gameDate);
                    }
                }
                result.Dump();
                mailer.MailReport(result);
                logger.Info("-------------------------------------------------------------------------------------");
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                Environment.FailFast(message: null);
                throw;
            }
        }