public static FixtureEngine LoadConfiguration(this FixtureEngine @this, CarnaWinUIRunnerHost host)
    {
        using var stream = new FileStream(Path.Combine(Path.GetDirectoryName(Environment.ProcessPath) ?? string.Empty, "carna-runner-settings.json"), FileMode.Open, FileAccess.Read);

        stream.Position = stream.ReadByte() == 0xef ? 3 : 0;

        var serializer = new DataContractJsonSerializer(
            typeof(CarnaWinUIRunnerConfiguration),
            new DataContractJsonSerializerSettings {
            UseSimpleDictionaryFormat = true
        }
            );

        if (serializer.ReadObject(stream) is not CarnaWinUIRunnerConfiguration configuration)
        {
            return(@this);
        }

        configuration.Ensure(new AssemblyLoader());
        @this.Configure(configuration);

        host.AutoExit = configuration.AutoExit;
        if (configuration.Formatter is not null)
        {
            host.Formatter = configuration.Formatter.Create <IFixtureFormatter>(@this.Assemblies);
        }

        return(@this);
    }
    private async Task <List <IFixture> > BuildFixtures(CarnaWinUIRunnerHost host, FixtureEngine engine, DispatcherQueue dispatcher)
    {
        var fixtures = await Task.Run(() => engine.BuildFixtures().ToList());

        var fixtureContents = host.Fixtures;
        await Task.Run(() => Configure(host, fixtures, fixtureContents, engine.Filter, dispatcher));

        SetChildOpenCondition(host.Summary, host.Fixtures);
        return(fixtures);
    }
    private void ConfigureSummary(CarnaWinUIRunnerHost host, IFixture fixture, DispatcherQueue dispatcher)
    {
        dispatcher.TryEnqueue(DispatcherQueuePriority.Normal, () => ++ host.Summary.TotalCount);

        fixture.FixtureRun += (_, e) => dispatcher.TryEnqueue(DispatcherQueuePriority.Normal, () =>
        {
            switch (e.Result.Status)
            {
            case FixtureStatus.Passed: ++host.Summary.PassedCount; break;

            case FixtureStatus.Failed: ++host.Summary.FailedCount; break;

            case FixtureStatus.Pending: ++host.Summary.PendingCount; break;
            }
        });
    }
    private FixtureContent CreateFixtureContent(CarnaWinUIRunnerHost host, IFixture fixture, DispatcherQueue dispatcher)
    {
        var fixtureContent = new FixtureContent
        {
            Description = host.Formatter.FormatFixture(fixture.FixtureDescriptor).ToString()
        };

        fixture.FixtureRunning += (_, _) => dispatcher.TryEnqueue(DispatcherQueuePriority.Normal, () => fixtureContent.Status = FixtureStatus.Running);
        fixture.FixtureRun     += (_, e) => dispatcher.TryEnqueue(DispatcherQueuePriority.Normal, () =>
        {
            fixtureContent.OnFixtureRunningCompleted(e.Result, host.Formatter);
            foreach (var stepContent in e.Result.StepResults.Select(stepResult => new FixtureStepContent(stepResult, host.Formatter)))
            {
                fixtureContent.Steps.Add(stepContent);
            }
        });

        return(fixtureContent);
    }
    private void Configure(CarnaWinUIRunnerHost host, IEnumerable <IFixture> fixtures, IList <FixtureContent> fixtureContents, IFixtureFilter?filter, DispatcherQueue dispatcher)
    {
        foreach (var fixture in fixtures)
        {
            if (!fixture.CanRun(filter))
            {
                continue;
            }

            var fixtureContent = CreateFixtureContent(host, fixture, dispatcher);
            dispatcher.TryEnqueue(DispatcherQueuePriority.Normal, () => fixtureContents.Add(fixtureContent));

            var childFixtures = RetrieveChildFixtures(fixture).ToList();
            if (childFixtures.Any())
            {
                Configure(host, childFixtures, fixtureContent.Fixtures, EnsureFilter(filter, fixture), dispatcher);
            }
            else
            {
                ConfigureSummary(host, fixture, dispatcher);
            }
        }
    }