public void Assert(ActionCalledTime expectedActionCalledTime)
 {
     ActionCalledTime
     .Should()
     .Be(expectedActionCalledTime,
         $"{Name} should be called at {expectedActionCalledTime.ToString("g")} " +
         $"but find {ActionCalledTime.ToString("g")}");
 }
        private static ActionCalledTime GetCalledTime(bool predicate, ActionCalledTime actionCalledTime)
        {
            if (actionCalledTime != ActionCalledTime.FirstRun && predicate)
            {
                actionCalledTime = ActionCalledTime.SecondRun;
            }

            return(actionCalledTime);
        }
        public void FlagsCombinationAndAction(
            // Inputs
            bool DOTNET_GENERATE_ASPNET_CERTIFICATE,
            bool DOTNET_CLI_TELEMETRY_OPTOUT,
            //   true to simulate install via installer. The first run is during installer,
            //   silent but has sudo permission
            //   false to simulate install via zip/tar.gz
            bool isFirstRunInstallerRun,
            // Outputs
            ActionCalledTime aspnetCertInstalledTimeShouldBeCalledAt,
            ActionCalledTime printFirstTimeWelcomeMessageShouldBeCalledAt,
            ActionCalledTime printTelemetryMessageShouldBeCalledAt,
            bool telemetryFirstRunShouldBeEnabled,
            bool telemetrySecondRunShouldBeEnabled
            )
        {
            ResetObjectState();

            _environmentProvider
            .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", It.IsAny <bool>()))
            .Returns(DOTNET_GENERATE_ASPNET_CERTIFICATE);
            _environmentProvider
            .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_CLI_TELEMETRY_OPTOUT", It.IsAny <bool>()))
            .Returns(DOTNET_CLI_TELEMETRY_OPTOUT);
            _environmentProvider
            .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_ADD_GLOBAL_TOOLS_TO_PATH", It.IsAny <bool>()))
            .Returns(true);
            _pathAdderMock.Setup(p => p.AddPackageExecutablePathToUserPath()).Verifiable();
            // box a bool so it will be captured by reference in closure
            object generateAspNetCoreDevelopmentCertificateCalled = false;

            _aspNetCoreCertificateGeneratorMock
            .Setup(_ => _.GenerateAspNetCoreDevelopmentCertificate())
            .Callback(() => generateAspNetCoreDevelopmentCertificateCalled = true).Verifiable();

            var aspnetCertInstalledTime
                = new FirstRunExperienceAction(
                      () => (bool)generateAspNetCoreDevelopmentCertificateCalled,
                      "aspnetCertInstalledTime");
            var printFirstTimeWelcomeMessage
                = new FirstRunExperienceAction(
                      () => _reporterMock.Lines.Contains(string.Format(
                                                             Configurer.LocalizableStrings.FirstTimeMessageWelcome,
                                                             DotnetFirstTimeUseConfigurer.DeriveDotnetVersionFromProductVersion(Product.Version),
                                                             Product.Version)) &&
                      _reporterMock.Lines.Contains(LocalizableStrings.FirstTimeMessageMoreInformation),
                      "printFirstTimeWelcomeMessage");
            var printTelemetryMessage
                = new FirstRunExperienceAction(
                      () => _reporterMock.Lines.Contains(LocalizableStrings.TelemetryMessage),
                      "printTelemetryMessage");

            List <FirstRunExperienceAction> firstRunExperienceActions
                = new List <FirstRunExperienceAction>()
                {
                aspnetCertInstalledTime,
                printFirstTimeWelcomeMessage,
                printTelemetryMessage
                };

            // First run
            var telemetryFirstRun = RunConfigUsingMocks(isFirstRunInstallerRun);

            firstRunExperienceActions.ForEach(a => a.EvaluateAfterFirstRun());

            // Second run
            var telemetrySecondRun = RunConfigUsingMocks(false);

            firstRunExperienceActions.ForEach(a => a.EvaluateAfterSecondRun());

            // Assertion
            aspnetCertInstalledTime.Assert(aspnetCertInstalledTimeShouldBeCalledAt);
            printFirstTimeWelcomeMessage.Assert(printFirstTimeWelcomeMessageShouldBeCalledAt);
            printTelemetryMessage.Assert(printTelemetryMessageShouldBeCalledAt);
            telemetryFirstRun.Enabled.Should().Be(telemetryFirstRunShouldBeEnabled);
            telemetrySecondRun.Enabled.Should().Be(telemetrySecondRunShouldBeEnabled);
        }