File: Client\Events\TestRunCompleteEventArgs.cs
Web Access
Project: src\src\vstest\src\Microsoft.TestPlatform.ObjectModel\Microsoft.TestPlatform.ObjectModel.csproj (Microsoft.VisualStudio.TestPlatform.ObjectModel)
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;

namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;

/// <summary>
/// Event arguments used when a test run has completed.
/// </summary>
[DataContract]
public class TestRunCompleteEventArgs : EventArgs
{
    // We have more than one ctor for backward-compatibility reason but we don't want to add dependency on Newtosoft([JsonConstructor])
    // We want to fallback to the non-public default constructor https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ConstructorHandling.htm during deserialization
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
    private TestRunCompleteEventArgs()
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
    {
        AttachmentSets = new Collection<AttachmentSet>();
        InvokedDataCollectors = new Collection<InvokedDataCollector>();
    }

    /// <summary>
    /// Default constructor.
    /// </summary>
    /// <param name="stats">The final stats for the test run. This parameter is only set for communications between the test host and the clients (like VS)</param>
    /// <param name="isCanceled">Specifies whether the test run is canceled.</param>
    /// <param name="isAborted">Specifies whether the test run is aborted.</param>
    /// <param name="error">Specifies the error encountered during the execution of the test run.</param>
    /// <param name="attachmentSets">Attachment sets associated with the run.</param>
    /// <param name="elapsedTime">Time elapsed in just running tests</param>
    public TestRunCompleteEventArgs(
        ITestRunStatistics? stats,
        bool isCanceled,
        bool isAborted,
        Exception? error,
        Collection<AttachmentSet>? attachmentSets,
        TimeSpan elapsedTime)
        : this(
              stats,
              isCanceled,
              isAborted,
              error,
              attachmentSets,
              null,
              elapsedTime)
    { }

    /// <summary>
    /// Default constructor.
    /// </summary>
    /// <param name="stats">The final stats for the test run. This parameter is only set for communications between the test host and the clients (like VS)</param>
    /// <param name="isCanceled">Specifies whether the test run is canceled.</param>
    /// <param name="isAborted">Specifies whether the test run is aborted.</param>
    /// <param name="error">Specifies the error encountered during the execution of the test run.</param>
    /// <param name="attachmentSets">Attachment sets associated with the run.</param>
    /// <param name="invokedDataCollectors">Invoked data collectors</param>
    /// <param name="elapsedTime">Time elapsed in just running tests</param>
    public TestRunCompleteEventArgs(
        ITestRunStatistics? stats,
        bool isCanceled,
        bool isAborted,
        Exception? error,
        Collection<AttachmentSet>? attachmentSets,
        Collection<InvokedDataCollector>? invokedDataCollectors,
        TimeSpan elapsedTime)
    {
        TestRunStatistics = stats;
        IsCanceled = isCanceled;
        IsAborted = isAborted;
        Error = error;
        AttachmentSets = attachmentSets ?? new Collection<AttachmentSet>(); // Ensuring attachmentSets are not null, so that new attachmentSets can be combined whenever required.
        InvokedDataCollectors = invokedDataCollectors ?? new Collection<InvokedDataCollector>(); // Ensuring that invoked data collectors are not null.
        ElapsedTimeInRunningTests = elapsedTime;

        DiscoveredExtensions = new Dictionary<string, HashSet<string>>();
    }

    /// <summary>
    /// Gets the statistics on the state of the test run.
    /// </summary>
    [DataMember]
    public ITestRunStatistics? TestRunStatistics { get; private set; }

    /// <summary>
    /// Gets a value indicating whether the test run is canceled or not.
    /// </summary>
    [DataMember]
    public bool IsCanceled { get; private set; }

    /// <summary>
    /// Gets a value indicating whether the test run is aborted.
    /// </summary>
    [DataMember]
    public bool IsAborted { get; private set; }

    /// <summary>
    /// Gets the error encountered during the execution of the test run. Null if there is no error.
    /// </summary>
    [DataMember]
    public Exception? Error { get; private set; }

    /// <summary>
    /// Gets the attachment sets associated with the test run.
    /// </summary>
    [DataMember]
    public Collection<AttachmentSet> AttachmentSets { get; private set; }

    /// <summary>
    /// Gets the invoked data collectors for the test session.
    /// </summary>
    [DataMember]
    public Collection<InvokedDataCollector> InvokedDataCollectors { get; private set; }

    /// <summary>
    /// Gets the time elapsed in just running the tests.
    /// Value is set to TimeSpan.Zero in case of any error.
    /// </summary>
    [DataMember]
    public TimeSpan ElapsedTimeInRunningTests { get; private set; }

    /// <summary>
    /// Get or Sets the Metrics
    /// </summary>
    [DataMember]
    public IDictionary<string, object>? Metrics { get; set; }

    /// <summary>
    /// Gets or sets the collection of discovered extensions.
    /// </summary>
    [DataMember]
    public Dictionary<string, HashSet<string>>? DiscoveredExtensions { get; set; }
}