< Summary

Information
Class: MyNet.UI.ViewModels.Shell.Startup.SplashScreenViewModel
Assembly: MyNet.UI
File(s): https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/ViewModels/Shell/Startup/SplashScreenViewModel.cs
Tag: 323_28699572109
Line coverage
59%
Covered lines: 29
Uncovered lines: 20
Coverable lines: 49
Total lines: 179
Line coverage: 59.1%
Branch coverage
40%
Covered branches: 9
Total branches: 22
Branch coverage: 40.9%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
set_Message(...)100%11100%
set_IsBusy(...)100%11100%
AddTask(...)100%22100%
AddTask(...)100%210%
AddTask(...)100%210%
AddTask(...)100%11100%
AddTasks(...)0%620%
AddTasks(...)0%620%
AddTasks(...)0%620%
AddTasks(...)0%620%
AddTasks(...)0%620%
AddTasks(...)0%620%
ExecuteAsync()87.5%88100%
UpdateMessage(...)100%11100%

File(s)

https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/ViewModels/Shell/Startup/SplashScreenViewModel.cs

#LineLine coverage
 1// -----------------------------------------------------------------------
 2// <copyright file="SplashScreenViewModel.cs" company="Stéphane ANDRE">
 3// Copyright (c) Stéphane ANDRE. All rights reserved.
 4// </copyright>
 5// -----------------------------------------------------------------------
 6
 7using System;
 8using System.Collections.Generic;
 9using System.Threading.Tasks;
 10using MyNet.UI.Resources;
 11using MyNet.UI.Services;
 12using MyNet.UI.ViewModels.Dialog;
 13
 14namespace MyNet.UI.ViewModels.Shell.Startup;
 15
 16/// <summary>
 17/// Dialog view model for application startup splash screens with queued startup tasks.
 18/// </summary>
 19public class SplashScreenViewModel : DialogViewModel
 20{
 1221    private readonly Dictionary<Func<string>, (Func<Task> Action, Func<bool> CanExecute)> _tasks = [];
 22
 23    /// <summary>
 24    /// Initializes a new instance of the <see cref="SplashScreenViewModel"/> class.
 25    /// </summary>
 1226    public SplashScreenViewModel(IApplicationInfo applicationInfo)
 27    {
 1228        ArgumentNullException.ThrowIfNull(applicationInfo);
 29
 1230        Version = applicationInfo.Version;
 1231        Copyright = applicationInfo.Copyright;
 1232        ProductName = applicationInfo.ProductName;
 1233        Company = applicationInfo.Company;
 1234        Message = UiResources.Ready;
 1235    }
 36
 37    /// <summary>
 38    /// Gets the application version.
 39    /// </summary>
 40    public string? Version { get; }
 41
 42    /// <summary>
 43    /// Gets the current status message (suffix <c>"..."</c> is applied while a task runs).
 44    /// </summary>
 2445    public string? Message { get; private set => SetProperty(ref field, value); }
 46
 47    /// <summary>
 48    /// Gets the copyright notice.
 49    /// </summary>
 50    public string? Copyright { get; }
 51
 52    /// <summary>
 53    /// Gets the product name.
 54    /// </summary>
 55    public string? ProductName { get; }
 56
 57    /// <summary>
 58    /// Gets the company name.
 59    /// </summary>
 60    public string? Company { get; }
 61
 62    /// <summary>
 63    /// Gets a value indicating whether startup tasks are currently executing.
 64    /// </summary>
 2465    public bool IsBusy { get; private set => SetProperty(ref field, value); }
 66
 67    /// <summary>
 68    /// Enqueues an asynchronous startup task.
 69    /// </summary>
 70    public void AddTask(Func<string> message, Func<Task> task, Func<bool>? canExecute = null)
 1571        => _tasks.Add(message, (task, canExecute ?? (() => true)));
 72
 73    /// <summary>
 74    /// Enqueues a synchronous startup task executed on the thread pool.
 75    /// </summary>
 76    public void AddTask(Func<string> message, Action action, Func<bool>? canExecute = null)
 077        => AddTask(message, () => Task.Run(action), canExecute);
 78
 79    /// <summary>
 80    /// Enqueues a synchronous startup task with a fixed message.
 81    /// </summary>
 82    public void AddTask(string message, Action action, Func<bool>? canExecute = null)
 083        => AddTask(() => message, action, canExecute);
 84
 85    /// <summary>
 86    /// Enqueues an asynchronous startup task with a fixed message.
 87    /// </summary>
 88    public void AddTask(string message, Func<Task> task, Func<bool>? canExecute = null)
 1589        => AddTask(() => message, task, canExecute);
 90
 91    /// <summary>
 92    /// Enqueues multiple startup tasks.
 93    /// </summary>
 94    public void AddTasks(IEnumerable<(string Message, Func<Task> Task)> tasks)
 95    {
 096        foreach (var task in tasks)
 097            AddTask(task.Message, task.Task);
 098    }
 99
 100    /// <summary>
 101    /// Enqueues multiple synchronous startup tasks.
 102    /// </summary>
 103    public void AddTasks(IEnumerable<(string Message, Action Action)> tasks)
 104    {
 0105        foreach (var task in tasks)
 0106            AddTask(task.Message, task.Action);
 0107    }
 108
 109    /// <summary>
 110    /// Enqueues multiple startup tasks with dynamic messages.
 111    /// </summary>
 112    public void AddTasks(IEnumerable<(Func<string> Message, Func<Task> Task)> tasks)
 113    {
 0114        foreach (var task in tasks)
 0115            AddTask(task.Message, task.Task);
 0116    }
 117
 118    /// <summary>
 119    /// Enqueues multiple synchronous startup tasks with dynamic messages.
 120    /// </summary>
 121    public void AddTasks(IEnumerable<(Func<string> Message, Action Action)> tasks)
 122    {
 0123        foreach (var task in tasks)
 0124            AddTask(task.Message, task.Action);
 0125    }
 126
 127    /// <summary>
 128    /// Enqueues multiple startup tasks with optional execution guards.
 129    /// </summary>
 130    public void AddTasks(IEnumerable<(Func<string> Message, Func<Task> Task, Func<bool> CanExecute)> tasks)
 131    {
 0132        foreach (var task in tasks)
 0133            AddTask(task.Message, task.Task, task.CanExecute);
 0134    }
 135
 136    /// <summary>
 137    /// Enqueues multiple synchronous startup tasks with optional execution guards.
 138    /// </summary>
 139    public void AddTasks(IEnumerable<(Func<string> Message, Action Action, Func<bool> CanExecute)> tasks)
 140    {
 0141        foreach (var task in tasks)
 0142            AddTask(task.Message, task.Action, task.CanExecute);
 0143    }
 144
 145    /// <summary>
 146    /// Runs queued startup tasks in registration order.
 147    /// </summary>
 148    public async Task ExecuteAsync(Action? completedCallBack = null, Action<Exception>? failedCallback = null)
 149    {
 150        try
 151        {
 12152            IsBusy = true;
 51153            foreach (var task in _tasks)
 154            {
 15155                if (!task.Value.CanExecute.Invoke())
 156                    continue;
 157
 12158                var message = task.Key.Invoke();
 12159                UpdateMessage(message);
 160
 12161                await Task.Delay(200).ConfigureAwait(false);
 12162                await task.Value.Action.Invoke().ConfigureAwait(false);
 9163            }
 164
 9165            completedCallBack?.Invoke();
 9166        }
 3167        catch (Exception e)
 168        {
 3169            failedCallback?.Invoke(e);
 3170        }
 171        finally
 172        {
 12173            IsBusy = false;
 174        }
 12175    }
 176
 12177    private void UpdateMessage(string message) => Message = message + "...";
 178}
 179