├── .appveyor.yml
├── .gitignore
├── .sonarqube-analysisproperties.xml
├── .vscode
├── extensions.json
├── settings.json
└── tasks.json
├── CSF.Screenplay.Abstractions
├── Abilities
│ └── UseAStopwatch.cs
├── Actor.abilities.cs
├── Actor.cs
├── Actor.disposable.cs
├── Actor.events.cs
├── Actor.performer.cs
├── Actor.phases.cs
├── ActorExtensions.abilities.cs
├── ActorExtensions.performableBuilders.cs
├── Actors
│ ├── ActorEventArgs.cs
│ ├── GainAbilityEventArgs.cs
│ ├── ICanPerformGiven.cs
│ ├── ICanPerformThen.cs
│ ├── ICanPerformWhen.cs
│ ├── IHasPerformableEvents.cs
│ ├── PerformableAssetEventArgs.cs
│ ├── PerformableEventArgs.cs
│ ├── PerformableFailureEventArgs.cs
│ ├── PerformableResultEventArgs.cs
│ └── PerformancePhase.cs
├── CSF.Screenplay.Abstractions.csproj
├── CastExtensions.cs
├── ICanPerform.cs
├── ICanReport.cs
├── ICast.cs
├── IFormatsReportFragment.cs
├── IHasAbilities.cs
├── IHasName.cs
├── IHasPerformanceIdentity.cs
├── IHasServiceProvider.cs
├── IHostsPerformance.cs
├── IPerformable.cs
├── IPerformableWithResult.cs
├── IPerformableWithResult.generic.cs
├── IPerformance.cs
├── IPersona.cs
├── IStage.cs
├── Performables
│ ├── IGetsPerformable.cs
│ ├── IGetsPerformableWithResult.cs
│ ├── IGetsPerformableWithResult.generic.cs
│ ├── IProvidesTimeSpan.cs
│ ├── PerformableException.cs
│ ├── ReadTheStopwatch.cs
│ ├── ResetTheStopwatch.cs
│ ├── StartTheStopwatch.cs
│ ├── StopTheStopwatch.cs
│ ├── StopwatchBuilder.cs
│ ├── TimeSpanBuilder.cs
│ └── TimeSpanBuilder.generic.cs
├── PerformanceStarter.cs
├── Performances
│ ├── IBeginsAndEndsPerformance.cs
│ ├── ICreatesPerformance.cs
│ ├── IHasPerformanceEvents.cs
│ ├── IRelaysPerformanceEvents.cs
│ ├── IdentifierAndName.cs
│ ├── PerformanceCompleteEventArgs.cs
│ ├── PerformanceEventArgs.cs
│ ├── PerformanceScopeEventArgs.cs
│ └── PerformanceState.cs
├── ReportFragment.cs
├── Reporting
│ ├── IFormattableValue.cs
│ ├── IFormatterRegistry.cs
│ ├── IGetsReportFormat.cs
│ ├── IGetsValueFormatter.cs
│ ├── IReporter.cs
│ ├── IValueFormatter.cs
│ ├── NameAndValue.cs
│ ├── ReportFormat.cs
│ └── ValueFormatterExtensions.cs
├── Resources
│ ├── AbilityReportStrings.cs
│ ├── AbilityReportStrings.restext
│ ├── PerformableReportStrings.cs
│ └── PerformableReportStrings.restext
└── StageExtensions.cs
├── CSF.Screenplay.Docs
├── .nojekyll
├── CSF.Screenplay.Docs.proj
├── README.md
├── docfx.json
├── docs
│ ├── GettingReports.md
│ ├── HowScreenplayAndPerformanceRelate.md
│ ├── MakeupOfAScreenplay.md
│ ├── ScreenplayInTheTestingStack.md
│ ├── StandaloneScreenplay.md
│ ├── SuitabilityAsATestingTool.md
│ ├── WritingTests.md
│ ├── builderPattern
│ │ ├── ConsumingBuilders.md
│ │ ├── WritingBuilders.md
│ │ ├── index.md
│ │ └── toc.yml
│ ├── dependencyInjection
│ │ ├── AddingServices.md
│ │ ├── DependencyInjectionScope.md
│ │ ├── InjectableServices.md
│ │ ├── InjectingServices.md
│ │ ├── Performables.md
│ │ └── index.md
│ ├── extendingScreenplay
│ │ ├── AbilitiesActionsAndQuestions.md
│ │ ├── EventHandlers.md
│ │ ├── ReportFormtters.md
│ │ ├── TestIntegrations.md
│ │ └── index.md
│ ├── nUnitTutorial
│ │ ├── BestPractices.md
│ │ └── index.md
│ ├── performables
│ │ ├── WebApis.md
│ │ ├── index.md
│ │ └── toc.yml
│ ├── specFlowTutorial
│ │ └── index.md
│ ├── toc.yml
│ └── writingPerformables
│ │ ├── AllowCooperativeCancellation.md
│ │ ├── AvoidBranchingLogic.md
│ │ ├── DoNotUseDiFrameworks.md
│ │ ├── ImplementICanReport.md
│ │ ├── ImplementOnePerformableInterface.md
│ │ ├── ParameterizeLowLevelPerformables.md
│ │ ├── PureFunctionalTasks.md
│ │ ├── StatefulButImmutable.md
│ │ ├── TasksDoNotUseAbilities.md
│ │ ├── WriteABuilder.md
│ │ └── index.md
├── glossary
│ ├── Ability.md
│ ├── Action.md
│ ├── Asset.md
│ ├── Feature.md
│ ├── Integration.md
│ ├── Performable.md
│ ├── Persona.md
│ ├── Question.md
│ ├── Report.md
│ ├── Scenario.md
│ ├── Spotlight.md
│ ├── Task.md
│ ├── index.md
│ └── toc.yml
├── index.md
└── toc.yml
├── CSF.Screenplay.JsonToHtmlReport.Template
├── CSF.Screenplay.JsonToHtmlReport.Template.proj
├── README.md
└── src
│ ├── .node-version
│ ├── babel.config.js
│ ├── css
│ ├── content.css
│ ├── layers.css
│ ├── layout.css
│ ├── reset.css
│ ├── scenarioList.css
│ ├── spinner.css
│ └── summaryTable.css
│ ├── index.js
│ ├── jest.config.js
│ ├── js
│ ├── ReportLoader.js
│ ├── ReportLoader.spec.js
│ ├── ReportWriter
│ │ ├── FeatureElementCreator.js
│ │ ├── ReportWriter.js
│ │ ├── ReportWriter.spec.js
│ │ ├── ReportableElementCreator.js
│ │ ├── ScenarioElementCreator.js
│ │ ├── index.js
│ │ └── setContentOrRemove.js
│ ├── ScenarioAggregator.js
│ ├── ScenarioAggregator.spec.js
│ ├── SummaryDataGenerator.js
│ ├── SummaryDataGenerator.spec.js
│ ├── SummaryGenerator.js
│ ├── SummaryGenerator.spec.js
│ ├── activatePage.js
│ ├── activatePage.spec.js
│ ├── getElementById.js
│ ├── updateReportTime.js
│ └── updateReportTime.spec.js
│ ├── package-lock.json
│ ├── package.json
│ ├── template.html
│ └── webpack.config.js
├── CSF.Screenplay.JsonToHtmlReport
├── CSF.Screenplay.JsonToHtmlReport.csproj
├── IConvertsReportJsonToHtml.cs
├── IGetsHtmlTemplate.cs
├── Program.cs
├── ReportConverter.cs
├── ReportConverterApplication.cs
├── ReportConverterOptions.cs
├── ServiceRegistrations.cs
└── TemplateReader.cs
├── CSF.Screenplay.NUnit
├── CSF.Screenplay.NUnit.csproj
├── ScreenplayAssemblyAttribute.cs
├── ScreenplayAttribute.cs
└── ScreenplayLocator.cs
├── CSF.Screenplay.SpecFlow
├── CSF.Screenplay.SpecFlow.csproj
├── Properties
│ └── RuntimePluginInfo.cs
├── ScenarioAndFeatureContextKey.cs
├── ScreenplayBinding.cs
├── ScreenplayPlugin.cs
├── ScreenplaySteps.cs
├── ServiceCollectionAdapter.cs
└── ServiceProviderAdapter.cs
├── CSF.Screenplay.WebApis
├── CSF.Screenplay.WebApis.csproj
├── CommonHttpRequestLogic.cs
├── Endpoint.cs
├── Endpoint.withResult.cs
├── EndpointBase.cs
├── HttpRequestMessageBuilder.cs
├── HttpRequestMessageBuilder.generic.cs
├── HttpResponseMessageAndResponseType.cs
├── JsonEndpoint.cs
├── JsonEndpoint.withResult.cs
├── MakeWebApiRequests.cs
├── NameValueRecordCollection.cs
├── ParameterizedEndpoint.cs
├── ParameterizedEndpoint.withResult.cs
├── Resources
│ ├── PerformableReportStrings.cs
│ └── PerformableReportStrings.restext
├── SendTheHttpRequest.cs
├── SendTheHttpRequestAndGetJsonResponse.cs
├── SendTheHttpRequestAndGetTheResponse.cs
└── WebApiBuilder.cs
├── CSF.Screenplay.sln
├── CSF.Screenplay
├── Actors
│ ├── Cast.cs
│ └── Stage.cs
├── CSF.Screenplay.csproj
├── IGetsScreenplay.cs
├── Performance.cs
├── Performances
│ ├── PerformanceEventBus.cs
│ └── PerformanceFactory.cs
├── ReportFragmentFormatter.cs
├── ReportModel
│ ├── ActorCreatedReport.cs
│ ├── ActorGainedAbilityReport.cs
│ ├── ActorSpotlitReport.cs
│ ├── IdentifierAndNameModel.cs
│ ├── PerformableAsset.cs
│ ├── PerformableReport.cs
│ ├── PerformanceReport.cs
│ ├── ReportMetadata.cs
│ ├── ReportableModelBase.cs
│ ├── ScreenplayReport.cs
│ └── SpotlightTurnedOffReport.cs
├── Reporting
│ ├── FormattableFormatter.cs
│ ├── HumanizerFormatter.cs
│ ├── IDeserializesReport.cs
│ ├── ITestsPathForWritePermissions.cs
│ ├── JsonScreenplayReportReader.cs
│ ├── JsonScreenplayReporter.cs
│ ├── NameFormatter.cs
│ ├── NoOpReporter.cs
│ ├── PerformanceReportBuilder.cs
│ ├── ReportFormatCreator.cs
│ ├── ScreenplayReportBuilder.cs
│ ├── ToStringFormatter.cs
│ ├── ValueFormatterProvider.cs
│ ├── ValueFormatterRegistry.cs
│ └── WritePermissionTester.cs
├── Resources
│ ├── FormatterStrings.cs
│ ├── FormatterStrings.restext
│ ├── ReportStrings.cs
│ └── ReportStrings.restext
├── ScopeAndPerformance.cs
├── Screenplay.cs
├── ScreenplayExtensions.cs
├── ScreenplayOptions.cs
└── ScreenplayServiceCollectionExtensions.cs
├── LICENSE
├── README.md
├── Tests
├── CSF.Screenplay.NUnit.Tests
│ ├── CSF.Screenplay.NUnit.Tests.csproj
│ ├── GlobalUsings.cs
│ ├── Properties
│ │ └── ScreenplayAttributes.cs
│ ├── ScreenplayFactory.cs
│ ├── TestWithDescription.cs
│ └── TestWithoutDescription.cs
├── CSF.Screenplay.SpecFlow.Tests
│ ├── AddingUp.feature
│ ├── AddingUp
│ │ ├── AddNumbers.cs
│ │ ├── AddTheNumber.cs
│ │ ├── AddThreeNumbers.cs
│ │ ├── AddingUpBuilder.cs
│ │ ├── GetTheNumber.cs
│ │ └── SetTheNumber.cs
│ ├── CSF.Screenplay.SpecFlow.Tests.csproj
│ ├── GlobalUsings.cs
│ ├── Mathias.cs
│ ├── ServiceCollectionAdapterTests.cs
│ └── StepDefinitions
│ │ └── AddingUpSteps.cs
└── CSF.Screenplay.Tests
│ ├── ActorExtensionsTests.cs
│ ├── ActorTests.cs
│ ├── Actors
│ ├── CastTests.cs
│ ├── NamedActorAttribute.cs
│ ├── NamedActorCustomization.cs
│ └── StageTests.cs
│ ├── AutoMoqDataAttribute.cs
│ ├── AutofixtureServicesAttribute.cs
│ ├── AutofixtureServicesCustomization.cs
│ ├── CSF.Screenplay.Tests.csproj
│ ├── DefaultScreenplayAttribute.cs
│ ├── DefaultScreenplayCustomization.cs
│ ├── GlobalUsings.cs
│ ├── Integration
│ ├── EventBusIntegrationTests.cs
│ └── PerformanceIntegrationTests.cs
│ ├── JsonToHtmlReport
│ └── TemplateReaderTests.cs
│ ├── Performables
│ ├── StopwatchTests.cs
│ └── TimeSpanBuilderTests.cs
│ ├── PerformanceTests.cs
│ ├── ReportFragmentFormatterTests.cs
│ ├── Reporting
│ ├── FormattableFormatterTests.cs
│ ├── HumanizerFormatterTests.cs
│ ├── JsonScreenplayReportReaderTests.cs
│ ├── JsonScreenplayReporterTests.cs
│ ├── NameFormatterTests.cs
│ ├── PerformanceReportBuilderTests.cs
│ ├── ReportFormatCreatorTests.cs
│ ├── ToStringFormatterTests.cs
│ ├── ValueFormatterProviderTests.cs
│ ├── ValueFormatterRegistryTests.cs
│ ├── WithMemoryStreamAttribute.cs
│ ├── WithMemoryStreamCustomization.cs
│ └── WritePermissionTesterTests.cs
│ ├── ScreenplayExtensionsTests.cs
│ ├── ScreenplayTests.cs
│ ├── Stubs
│ ├── SampleAction.cs
│ ├── SampleGenericQuestion.cs
│ ├── SampleQuestion.cs
│ └── ThrowingAction.cs
│ └── WebApis
│ ├── HttpRequestMessageBuilderTests.cs
│ ├── MakeWebApiRequestsTests.cs
│ ├── NameValueRecordCollectionTests.cs
│ ├── SendTheHttpRequestAndGetJsonResponseTests.cs
│ ├── SendTheHttpRequestAndGetTheResponseTests.cs
│ ├── SendTheHttpRequestTests.cs
│ ├── SendsMockHttpRequestsAttribute.cs
│ └── WebApiBuilderTests.cs
├── Tools
├── appveyor-upload-test-results.ps1
├── appveyor_publish_docs.ps1
└── run-tests-with-coverage.ps1
└── docs
├── .nojekyll
├── api
├── CSF.Screenplay.Abilities.UseAStopwatch.html
├── CSF.Screenplay.Abilities.html
├── CSF.Screenplay.Actor.html
├── CSF.Screenplay.ActorExtensions.html
├── CSF.Screenplay.Actors.ActorEventArgs.html
├── CSF.Screenplay.Actors.Cast.html
├── CSF.Screenplay.Actors.GainAbilityEventArgs.html
├── CSF.Screenplay.Actors.ICanPerformGiven.html
├── CSF.Screenplay.Actors.ICanPerformThen.html
├── CSF.Screenplay.Actors.ICanPerformWhen.html
├── CSF.Screenplay.Actors.IHasPerformableEvents.html
├── CSF.Screenplay.Actors.PerformableAssetEventArgs.html
├── CSF.Screenplay.Actors.PerformableEventArgs.html
├── CSF.Screenplay.Actors.PerformableFailureEventArgs.html
├── CSF.Screenplay.Actors.PerformableResultEventArgs.html
├── CSF.Screenplay.Actors.PerformancePhase.html
├── CSF.Screenplay.Actors.Stage.html
├── CSF.Screenplay.Actors.html
├── CSF.Screenplay.CastExtensions.html
├── CSF.Screenplay.ICanPerform.html
├── CSF.Screenplay.ICanReport.html
├── CSF.Screenplay.ICast.html
├── CSF.Screenplay.IFormatsReportFragment.html
├── CSF.Screenplay.IGetsScreenplay.html
├── CSF.Screenplay.IHasAbilities.html
├── CSF.Screenplay.IHasName.html
├── CSF.Screenplay.IHasPerformanceIdentity.html
├── CSF.Screenplay.IHasServiceProvider.html
├── CSF.Screenplay.IHostsPerformance.html
├── CSF.Screenplay.IPerformable.html
├── CSF.Screenplay.IPerformableWithResult-1.html
├── CSF.Screenplay.IPerformableWithResult.html
├── CSF.Screenplay.IPerformance.html
├── CSF.Screenplay.IPersona.html
├── CSF.Screenplay.IStage.html
├── CSF.Screenplay.JsonToHtmlReport.IConvertsReportJsonToHtml.html
├── CSF.Screenplay.JsonToHtmlReport.IGetsHtmlTemplate.html
├── CSF.Screenplay.JsonToHtmlReport.Program.html
├── CSF.Screenplay.JsonToHtmlReport.ReportConverter.html
├── CSF.Screenplay.JsonToHtmlReport.ReportConverterApplication.html
├── CSF.Screenplay.JsonToHtmlReport.ReportConverterOptions.html
├── CSF.Screenplay.JsonToHtmlReport.ServiceRegistrations.html
├── CSF.Screenplay.JsonToHtmlReport.TemplateReader.html
├── CSF.Screenplay.JsonToHtmlReport.html
├── CSF.Screenplay.Performables.IGetsPerformable.html
├── CSF.Screenplay.Performables.IGetsPerformableWithResult-1.html
├── CSF.Screenplay.Performables.IGetsPerformableWithResult.html
├── CSF.Screenplay.Performables.IProvidesTimeSpan.html
├── CSF.Screenplay.Performables.PerformableException.html
├── CSF.Screenplay.Performables.ReadTheStopwatch.html
├── CSF.Screenplay.Performables.ResetTheStopwatch.html
├── CSF.Screenplay.Performables.StartTheStopwatch.html
├── CSF.Screenplay.Performables.StopTheStopwatch.html
├── CSF.Screenplay.Performables.StopwatchBuilder.html
├── CSF.Screenplay.Performables.TimeSpanBuilder-1.html
├── CSF.Screenplay.Performables.TimeSpanBuilder.html
├── CSF.Screenplay.Performables.html
├── CSF.Screenplay.Performance.html
├── CSF.Screenplay.PerformanceStarter.html
├── CSF.Screenplay.Performances.IBeginsAndEndsPerformance.html
├── CSF.Screenplay.Performances.ICreatesPerformance.html
├── CSF.Screenplay.Performances.IHasPerformanceEvents.html
├── CSF.Screenplay.Performances.IRelaysPerformanceEvents.html
├── CSF.Screenplay.Performances.IdentifierAndName.html
├── CSF.Screenplay.Performances.PerformanceEventArgs.html
├── CSF.Screenplay.Performances.PerformanceEventBus.html
├── CSF.Screenplay.Performances.PerformanceFactory.html
├── CSF.Screenplay.Performances.PerformanceFinishedEventArgs.html
├── CSF.Screenplay.Performances.PerformanceScopeEventArgs.html
├── CSF.Screenplay.Performances.PerformanceState.html
├── CSF.Screenplay.Performances.html
├── CSF.Screenplay.ReportFragment.html
├── CSF.Screenplay.ReportFragmentFormatter.html
├── CSF.Screenplay.ReportModel.ActorCreatedReport.html
├── CSF.Screenplay.ReportModel.ActorGainedAbilityReport.html
├── CSF.Screenplay.ReportModel.ActorSpotlitReport.html
├── CSF.Screenplay.ReportModel.IdentifierAndNameModel.html
├── CSF.Screenplay.ReportModel.PerformableAsset.html
├── CSF.Screenplay.ReportModel.PerformableReport.html
├── CSF.Screenplay.ReportModel.PerformanceReport.html
├── CSF.Screenplay.ReportModel.ReportMetadata.html
├── CSF.Screenplay.ReportModel.ReportableModelBase.html
├── CSF.Screenplay.ReportModel.ScreenplayReport.html
├── CSF.Screenplay.ReportModel.SpotlightTurnedOffReport.html
├── CSF.Screenplay.ReportModel.html
├── CSF.Screenplay.Reporting.FormattableFormatter.html
├── CSF.Screenplay.Reporting.HumanizerFormatter.html
├── CSF.Screenplay.Reporting.IDeserializesReport.html
├── CSF.Screenplay.Reporting.IFormattableValue.html
├── CSF.Screenplay.Reporting.IFormatterRegistry.html
├── CSF.Screenplay.Reporting.IGetsReportFormat.html
├── CSF.Screenplay.Reporting.IGetsValueFormatter.html
├── CSF.Screenplay.Reporting.IReporter.html
├── CSF.Screenplay.Reporting.ITestsPathForWritePermissions.html
├── CSF.Screenplay.Reporting.IValueFormatter.html
├── CSF.Screenplay.Reporting.JsonScreenplayReportReader.html
├── CSF.Screenplay.Reporting.JsonScreenplayReporter.html
├── CSF.Screenplay.Reporting.NameAndValue.html
├── CSF.Screenplay.Reporting.NameFormatter.html
├── CSF.Screenplay.Reporting.NoOpReporter.html
├── CSF.Screenplay.Reporting.PerformanceReportBuilder.html
├── CSF.Screenplay.Reporting.ReportFormat.html
├── CSF.Screenplay.Reporting.ReportFormatCreator.html
├── CSF.Screenplay.Reporting.ScreenplayReportBuilder.html
├── CSF.Screenplay.Reporting.ToStringFormatter.html
├── CSF.Screenplay.Reporting.ValueFormatterExtensions.html
├── CSF.Screenplay.Reporting.ValueFormatterProvider.html
├── CSF.Screenplay.Reporting.ValueFormatterRegistry.html
├── CSF.Screenplay.Reporting.WritePermissionTester.html
├── CSF.Screenplay.Reporting.html
├── CSF.Screenplay.ScopeAndPerformance.html
├── CSF.Screenplay.Screenplay.html
├── CSF.Screenplay.ScreenplayAssemblyAttribute.html
├── CSF.Screenplay.ScreenplayAttribute.html
├── CSF.Screenplay.ScreenplayBinding.html
├── CSF.Screenplay.ScreenplayExtensions.html
├── CSF.Screenplay.ScreenplayLocator.html
├── CSF.Screenplay.ScreenplayOptions.html
├── CSF.Screenplay.ScreenplayPlugin.html
├── CSF.Screenplay.ScreenplayServiceCollectionExtensions.html
├── CSF.Screenplay.ScreenplaySteps.html
├── CSF.Screenplay.ServiceCollectionAdapter.html
├── CSF.Screenplay.ServiceProviderAdapter.html
├── CSF.Screenplay.StageExtensions.html
├── CSF.Screenplay.WebApis.Endpoint-1.html
├── CSF.Screenplay.WebApis.Endpoint.html
├── CSF.Screenplay.WebApis.EndpointBase.html
├── CSF.Screenplay.WebApis.HttpRequestMessageBuilder-1.html
├── CSF.Screenplay.WebApis.HttpRequestMessageBuilder.html
├── CSF.Screenplay.WebApis.HttpResponseMessageAndResponseType-1.html
├── CSF.Screenplay.WebApis.JsonEndpoint-1.html
├── CSF.Screenplay.WebApis.JsonEndpoint-2.html
├── CSF.Screenplay.WebApis.MakeWebApiRequests.html
├── CSF.Screenplay.WebApis.NameValueRecordCollection-2.html
├── CSF.Screenplay.WebApis.ParameterizedEndpoint-1.html
├── CSF.Screenplay.WebApis.ParameterizedEndpoint-2.html
├── CSF.Screenplay.WebApis.SendTheHttpRequest.html
├── CSF.Screenplay.WebApis.SendTheHttpRequestAndGetJsonResponse-1.html
├── CSF.Screenplay.WebApis.SendTheHttpRequestAndGetTheResponse-1.html
├── CSF.Screenplay.WebApis.WebApiBuilder.html
├── CSF.Screenplay.WebApis.html
├── CSF.Screenplay.html
├── toc.html
└── toc.json
├── docs
├── GettingReports.html
├── HowScreenplayAndPerformanceRelate.html
├── MakeupOfAScreenplay.html
├── ScreenplayInTheTestingStack.html
├── StandaloneScreenplay.html
├── SuitabilityAsATestingTool.html
├── WritingTests.html
├── builderPattern
│ ├── ConsumingBuilders.html
│ ├── WritingBuilders.html
│ ├── index.html
│ ├── toc.html
│ └── toc.json
├── dependencyInjection
│ ├── AddingServices.html
│ ├── DependencyInjectionScope.html
│ ├── InjectableServices.html
│ ├── InjectingServices.html
│ ├── Performables.html
│ └── index.html
├── extendingScreenplay
│ ├── AbilitiesActionsAndQuestions.html
│ ├── EventHandlers.html
│ ├── ReportFormtters.html
│ ├── TestIntegrations.html
│ └── index.html
├── nUnitTutorial
│ ├── BestPractices.html
│ └── index.html
├── performables
│ ├── WebApis.html
│ ├── index.html
│ ├── toc.html
│ └── toc.json
├── specFlowTutorial
│ └── index.html
├── toc.html
├── toc.json
└── writingPerformables
│ ├── AllowCooperativeCancellation.html
│ ├── AvoidBranchingLogic.html
│ ├── DoNotUseDiFrameworks.html
│ ├── ImplementICanReport.html
│ ├── ImplementOnePerformableInterface.html
│ ├── ParameterizeLowLevelPerformables.html
│ ├── PureFunctionalTasks.html
│ ├── StatefulButImmutable.html
│ ├── TasksDoNotUseAbilities.html
│ ├── WriteABuilder.html
│ └── index.html
├── favicon.ico
├── glossary
├── Ability.html
├── Action.html
├── Asset.html
├── Feature.html
├── Integration.html
├── Performable.html
├── Persona.html
├── Question.html
├── Report.html
├── Scenario.html
├── Spotlight.html
├── Task.html
├── index.html
├── toc.html
└── toc.json
├── index.html
├── index.json
├── logo.svg
├── manifest.json
├── public
├── architecture-I3QFYML2-NK53GYGD.min.js
├── architecture-I3QFYML2-NK53GYGD.min.js.map
├── architectureDiagram-AYX4OTIS-UEH2Z7UQ.min.js
├── architectureDiagram-AYX4OTIS-UEH2Z7UQ.min.js.map
├── blockDiagram-XN6IQ5JY-VK3M7PUD.min.js
├── blockDiagram-XN6IQ5JY-VK3M7PUD.min.js.map
├── bootstrap-icons-OCU552PF.woff
├── bootstrap-icons-X6UQXWUS.woff2
├── c4Diagram-GPMAACGM-P3DMZBSW.min.js
├── c4Diagram-GPMAACGM-P3DMZBSW.min.js.map
├── chunk-24EG6CQZ.min.js
├── chunk-24EG6CQZ.min.js.map
├── chunk-2TAJJIOM.min.js
├── chunk-2TAJJIOM.min.js.map
├── chunk-2YMHYP32.min.js
├── chunk-2YMHYP32.min.js.map
├── chunk-3Z74ZUXG.min.js
├── chunk-3Z74ZUXG.min.js.map
├── chunk-45RMNOPF.min.js
├── chunk-45RMNOPF.min.js.map
├── chunk-53EALYMI.min.js
├── chunk-53EALYMI.min.js.map
├── chunk-5KKNARB2.min.js
├── chunk-5KKNARB2.min.js.map
├── chunk-7JZIB2XU.min.js
├── chunk-7JZIB2XU.min.js.map
├── chunk-B5WF4DA4.min.js
├── chunk-B5WF4DA4.min.js.map
├── chunk-CIWIECNU.min.js
├── chunk-CIWIECNU.min.js.map
├── chunk-CM5D5KZN.min.js
├── chunk-CM5D5KZN.min.js.map
├── chunk-CXRPJJJE.min.js
├── chunk-CXRPJJJE.min.js.map
├── chunk-DBPRPEV6.min.js
├── chunk-DBPRPEV6.min.js.map
├── chunk-DFMVIMQJ.min.js
├── chunk-DFMVIMQJ.min.js.map
├── chunk-DTUU2GN4.min.js
├── chunk-DTUU2GN4.min.js.map
├── chunk-DXUQFVLL.min.js
├── chunk-DXUQFVLL.min.js.map
├── chunk-HOCACIQT.min.js
├── chunk-HOCACIQT.min.js.map
├── chunk-IQQ46AC6.min.js
├── chunk-IQQ46AC6.min.js.map
├── chunk-K7PO6CNQ.min.js
├── chunk-K7PO6CNQ.min.js.map
├── chunk-KF4CENUX.min.js
├── chunk-KF4CENUX.min.js.map
├── chunk-LDPOAEOH.min.js
├── chunk-LDPOAEOH.min.js.map
├── chunk-MJXJ7UGT.min.js
├── chunk-MJXJ7UGT.min.js.map
├── chunk-NRRWWJ3P.min.js
├── chunk-NRRWWJ3P.min.js.map
├── chunk-OSRY5VT3.min.js
├── chunk-OSRY5VT3.min.js.map
├── chunk-P2C2SEUI.min.js
├── chunk-P2C2SEUI.min.js.map
├── chunk-PYBRKFQJ.min.js
├── chunk-PYBRKFQJ.min.js.map
├── chunk-R7DHUQMU.min.js
├── chunk-R7DHUQMU.min.js.map
├── chunk-TERFBH2B.min.js
├── chunk-TERFBH2B.min.js.map
├── chunk-TOQ6ACLX.min.js
├── chunk-TOQ6ACLX.min.js.map
├── chunk-U4DUTLYF.min.js
├── chunk-U4DUTLYF.min.js.map
├── chunk-UOD6J27N.min.js
├── chunk-UOD6J27N.min.js.map
├── chunk-WMZJ2DJX.min.js
├── chunk-WMZJ2DJX.min.js.map
├── chunk-XBNRW4G3.min.js
├── chunk-XBNRW4G3.min.js.map
├── chunk-ZU5APUIQ.min.js
├── chunk-ZU5APUIQ.min.js.map
├── classDiagram-FEGYTUDG-YCLVHNZU.min.js
├── classDiagram-FEGYTUDG-YCLVHNZU.min.js.map
├── classDiagram-v2-R65JCUOM-VFGJ2XXK.min.js
├── classDiagram-v2-R65JCUOM-VFGJ2XXK.min.js.map
├── dagre-SWNTG5WE-7BA3SWK2.min.js
├── dagre-SWNTG5WE-7BA3SWK2.min.js.map
├── diagram-NZMEDLQF-NYTRB6HN.min.js
├── diagram-NZMEDLQF-NYTRB6HN.min.js.map
├── docfx.min.css
├── docfx.min.css.map
├── docfx.min.js
├── docfx.min.js.map
├── erDiagram-WO52GFNT-Y4NFVIDE.min.js
├── erDiagram-WO52GFNT-Y4NFVIDE.min.js.map
├── es-4I4X6RME.min.js
├── es-4I4X6RME.min.js.map
├── flowDiagram-TSWR6T2D-H32UQL2W.min.js
├── flowDiagram-TSWR6T2D-H32UQL2W.min.js.map
├── ganttDiagram-FAOCOTIY-GFLLTKXL.min.js
├── ganttDiagram-FAOCOTIY-GFLLTKXL.min.js.map
├── gitGraph-YCYPL57B-C4NBXIBD.min.js
├── gitGraph-YCYPL57B-C4NBXIBD.min.js.map
├── gitGraphDiagram-5C7YHVU6-2F4DKEGL.min.js
├── gitGraphDiagram-5C7YHVU6-2F4DKEGL.min.js.map
├── info-46DW6VJ7-MWRO75OW.min.js
├── info-46DW6VJ7-MWRO75OW.min.js.map
├── infoDiagram-P5D6MX3V-EFUDKNDH.min.js
├── infoDiagram-P5D6MX3V-EFUDKNDH.min.js.map
├── journeyDiagram-UIGPPNLY-FB6FUBJH.min.js
├── journeyDiagram-UIGPPNLY-FB6FUBJH.min.js.map
├── kanban-definition-KMT3NSR2-K4PM5M4E.min.js
├── kanban-definition-KMT3NSR2-K4PM5M4E.min.js.map
├── katex-NVDEX37K.min.js
├── katex-NVDEX37K.min.js.map
├── lunr.ar-A6ZT2INA.min.js
├── lunr.ar-A6ZT2INA.min.js.map
├── lunr.da-WWM276CR.min.js
├── lunr.da-WWM276CR.min.js.map
├── lunr.de-XXPRKDAY.min.js
├── lunr.de-XXPRKDAY.min.js.map
├── lunr.du-NO4L2LL3.min.js
├── lunr.du-NO4L2LL3.min.js.map
├── lunr.el-5ZSSJVMA.min.js
├── lunr.el-5ZSSJVMA.min.js.map
├── lunr.es-ZH6Q76E6.min.js
├── lunr.es-ZH6Q76E6.min.js.map
├── lunr.fi-S7WJSBCP.min.js
├── lunr.fi-S7WJSBCP.min.js.map
├── lunr.fr-H2QNBELV.min.js
├── lunr.fr-H2QNBELV.min.js.map
├── lunr.he-TTLAK4MN.min.js
├── lunr.he-TTLAK4MN.min.js.map
├── lunr.hi-PWWMAGLU.min.js
├── lunr.hi-PWWMAGLU.min.js.map
├── lunr.hu-DLG2DSVM.min.js
├── lunr.hu-DLG2DSVM.min.js.map
├── lunr.hy-FFQJAR7M.min.js
├── lunr.hy-FFQJAR7M.min.js.map
├── lunr.it-VQNLJLPR.min.js
├── lunr.it-VQNLJLPR.min.js.map
├── lunr.ja-J6QHZSR2.min.js
├── lunr.ja-J6QHZSR2.min.js.map
├── lunr.jp-M45D3XJE.min.js
├── lunr.jp-M45D3XJE.min.js.map
├── lunr.kn-ASLXFRTC.min.js
├── lunr.kn-ASLXFRTC.min.js.map
├── lunr.ko-RHF2BDE4.min.js
├── lunr.ko-RHF2BDE4.min.js.map
├── lunr.nl-2BITG354.min.js
├── lunr.nl-2BITG354.min.js.map
├── lunr.no-WPLSHWFO.min.js
├── lunr.no-WPLSHWFO.min.js.map
├── lunr.pt-V2XEBELC.min.js
├── lunr.pt-V2XEBELC.min.js.map
├── lunr.ro-O76266FJ.min.js
├── lunr.ro-O76266FJ.min.js.map
├── lunr.ru-G56UDXYH.min.js
├── lunr.ru-G56UDXYH.min.js.map
├── lunr.sa-LD5PRAIS.min.js
├── lunr.sa-LD5PRAIS.min.js.map
├── lunr.sv-7VRY4UDB.min.js
├── lunr.sv-7VRY4UDB.min.js.map
├── lunr.ta-OWB7AURB.min.js
├── lunr.ta-OWB7AURB.min.js.map
├── lunr.te-JGGL3BFP.min.js
├── lunr.te-JGGL3BFP.min.js.map
├── lunr.th-O4JBL3IY.min.js
├── lunr.th-O4JBL3IY.min.js.map
├── lunr.tr-WXUV733C.min.js
├── lunr.tr-WXUV733C.min.js.map
├── lunr.vi-3U4A337N.min.js
├── lunr.vi-3U4A337N.min.js.map
├── main.css
├── main.js
├── mermaid.core-RYVCAQML.min.js
├── mermaid.core-RYVCAQML.min.js.map
├── mindmap-definition-R7LC4OIY-2USVTKSJ.min.js
├── mindmap-definition-R7LC4OIY-2USVTKSJ.min.js.map
├── packet-W2GHVCYJ-73RTG6VT.min.js
├── packet-W2GHVCYJ-73RTG6VT.min.js.map
├── pie-BEWT4RHE-6E5EOTAQ.min.js
├── pie-BEWT4RHE-6E5EOTAQ.min.js.map
├── pieDiagram-BLWKPB35-RRRLPZVM.min.js
├── pieDiagram-BLWKPB35-RRRLPZVM.min.js.map
├── quadrantDiagram-QXWEEFXS-PKSQMH6W.min.js
├── quadrantDiagram-QXWEEFXS-PKSQMH6W.min.js.map
├── requirementDiagram-XAUNFCZY-5ZWIDLT6.min.js
├── requirementDiagram-XAUNFCZY-5ZWIDLT6.min.js.map
├── sankeyDiagram-LVV36NHA-T6DVYUKQ.min.js
├── sankeyDiagram-LVV36NHA-T6DVYUKQ.min.js.map
├── search-worker.min.js
├── search-worker.min.js.map
├── sequenceDiagram-D25TJ2OB-6R64PNA2.min.js
├── sequenceDiagram-D25TJ2OB-6R64PNA2.min.js.map
├── stateDiagram-GNSP7T6Y-QRHXVCK2.min.js
├── stateDiagram-GNSP7T6Y-QRHXVCK2.min.js.map
├── stateDiagram-v2-HP6YRVRG-XMVPP43U.min.js
├── stateDiagram-v2-HP6YRVRG-XMVPP43U.min.js.map
├── tex-svg-full-SL33OL2J.min.js
├── tex-svg-full-SL33OL2J.min.js.map
├── timeline-definition-27KQCCZ3-MKUJTCR4.min.js
├── timeline-definition-27KQCCZ3-MKUJTCR4.min.js.map
├── xychartDiagram-MYLB5AYS-IFQ4BEB4.min.js
└── xychartDiagram-MYLB5AYS-IFQ4BEB4.min.js.map
├── toc.html
├── toc.json
└── xrefmap.yml
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/
2 | obj/
3 | /CSF.Screenplay.Docs/api/
4 | TestResults/
5 | Tests/**/*.feature.cs
6 | node_modules/
7 | /CSF.Screenplay.JsonToHtmlReport/template/
8 | /CSF.Screenplay.JsonToHtmlReport.Template/src/output/
9 |
--------------------------------------------------------------------------------
/.sonarqube-analysisproperties.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | Tests/**/*,**/*Exception.cs,*_old/**/*,**/*.spec.js,**/*.config.js
6 | Tests/**/*,*_old/**/*,**/*.spec.js
7 | Tests\**\TestResults.xml
8 | TestResults\*.opencover.xml
9 | false
10 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "alexkrechik.cucumberautocomplete",
4 | "ms-dotnettools.csdevkit",
5 | "bierner.markdown-mermaid",
6 | "davidanson.vscode-markdownlint",
7 | "bpruitt-goddard.mermaid-markdown-syntax-highlighting"
8 | ]
9 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cucumberautocomplete.steps": [ "Tests/CSF.Screenplay.SpecFlow.Tests/StepDefinitions/**/*.cs" ],
3 | "cucumberautocomplete.strictGherkinCompletion": true,
4 | }
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "type": "dotnet",
6 | "task": "build",
7 | "group": {
8 | "kind": "build",
9 | "isDefault": true
10 | },
11 | "problemMatcher": [],
12 | "label": "dotnet: build"
13 | },
14 | {
15 | "group": {
16 | "kind": "test",
17 | "isDefault": true
18 | },
19 | "command": "dotnet",
20 | "args": ["test"],
21 | "problemMatcher": [],
22 | "label": "dotnet: test"
23 | },
24 | {
25 | "group": {
26 | "kind": "test"
27 | },
28 | "type": "shell",
29 | "command": "npm",
30 | "args": ["test"],
31 | "problemMatcher": [],
32 | "label": "npm: test (Javascript)",
33 | "options": {
34 | "cwd": "${workspaceFolder}/CSF.Screenplay.JsonToHtmlReport.Template/src"
35 | }
36 | },
37 | {
38 | "group": {
39 | "kind": "build"
40 | },
41 | "command": "dotnet",
42 | "args": ["build", "-c", "Docs"],
43 | "problemMatcher": [],
44 | "label": "Build docs website",
45 | "options": {"cwd": "${workspaceFolder}"}
46 | },
47 | {
48 | "group": {
49 | "kind": "build"
50 | },
51 | "command": "docfx",
52 | "args": ["CSF.Screenplay.Docs/docfx.json", "--serve"],
53 | "problemMatcher": [],
54 | "label": "Serve docs website"
55 | },
56 | {
57 | "group": {
58 | "kind": "build"
59 | },
60 | "type": "shell",
61 | "command": "npm",
62 | "args": ["i"],
63 | "problemMatcher": [],
64 | "label": "npm: install (Javascript)",
65 | "options": {
66 | "cwd": "${workspaceFolder}/CSF.Screenplay.JsonToHtmlReport.Template/src"
67 | }
68 | }
69 | ]
70 | }
--------------------------------------------------------------------------------
/CSF.Screenplay.Abstractions/Abilities/UseAStopwatch.cs:
--------------------------------------------------------------------------------
1 | using CSF.Screenplay.Resources;
2 |
3 | namespace CSF.Screenplay.Abilities
4 | {
5 | ///
6 | /// An ability that enables an actor to make use of a to accurately
7 | /// measure the passage of time.
8 | ///
9 | ///
10 | ///
11 | /// Use this ability with the actions which exposed by
12 | /// .
13 | /// This ability wraps a instance, allowing the actor
14 | /// to control & read it from the related actions.
15 | ///
16 | ///
17 | public class UseAStopwatch : ICanReport
18 | {
19 | ///
20 | /// Gets the stopwatch granted to the actor by this ability.
21 | ///
22 | public System.Diagnostics.Stopwatch Stopwatch { get; } = new System.Diagnostics.Stopwatch();
23 |
24 | ///
25 | public ReportFragment GetReportFragment(IHasName actor, IFormatsReportFragment formatter)
26 | => formatter.Format(AbilityReportStrings.UseAStopwatchFormat, actor);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/CSF.Screenplay.Abstractions/Actor.abilities.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | namespace CSF.Screenplay
6 | {
7 | public partial class Actor : IHasAbilities
8 | {
9 | readonly HashSet