File: ObjectModel\TestElement.cs
Web Access
Project: src\src\vstest\src\Microsoft.TestPlatform.Extensions.TrxLogger\Microsoft.TestPlatform.Extensions.TrxLogger.csproj (Microsoft.VisualStudio.TestPlatform.Extensions.Trx.TestLogger)
// 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.Globalization;

using Microsoft.TestPlatform.Extensions.TrxLogger.Utility;
using Microsoft.TestPlatform.Extensions.TrxLogger.XML;
using Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger;

using TrxLoggerResources = Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger.Resources.TrxResource;

namespace Microsoft.TestPlatform.Extensions.TrxLogger.ObjectModel;

/// <summary>
/// Test element.
/// </summary>
internal abstract class TestElement : ITestElement, IXmlTestStore
{
    /// <summary>
    /// Default priority for a test method that does not specify a priority
    /// </summary>
    protected const int DefaultPriority = int.MaxValue;

    protected TestId _id;
    protected string _name;
    protected string _owner;
    protected string _storage;
    protected string _adapter;
    protected int _priority;
    protected bool _isRunnable;
    protected TestExecId _executionId;
    protected TestExecId _parentExecutionId;
    protected TestCategoryItemCollection _testCategories;
    protected WorkItemCollection _workItems;
    protected TestListCategoryId _catId;

    public TestElement(Guid id, string name, string adapter)
    {
        TPDebug.Assert(!name.IsNullOrEmpty(), "name is null");
        TPDebug.Assert(!adapter.IsNullOrEmpty(), "adapter is null");

        _owner = string.Empty;
        _priority = DefaultPriority;
        _storage = string.Empty;
        _executionId = TestExecId.Empty;
        _parentExecutionId = TestExecId.Empty;
        _testCategories = new TestCategoryItemCollection();
        _workItems = new WorkItemCollection();
        _isRunnable = true;
        _catId = TestListCategoryId.Uncategorized;

        _id = new TestId(id);
        _name = name;
        _adapter = adapter;
    }

    /// <summary>
    /// Gets the id.
    /// </summary>
    public TestId Id
    {
        get { return _id; }
    }

    /// <summary>
    /// Gets or sets the name.
    /// </summary>
    public string Name
    {
        get { return _name; }

        set
        {
            EqtAssert.ParameterNotNull(value, "Name");
            _name = value;
        }
    }

    /// <summary>
    /// Gets or sets the owner.
    /// </summary>
    public string Owner
    {
        get { return _owner; }

        set
        {
            EqtAssert.ParameterNotNull(value, "Owner");
            _owner = value;
        }
    }

    /// <summary>
    /// Gets or sets the priority.
    /// </summary>
    public int Priority
    {
        get { return _priority; }
        set { _priority = value; }
    }

    /// <summary>
    /// Gets or sets the storage.
    /// </summary>
    public string Storage
    {
        get { return _storage; }

        set
        {
            EqtAssert.StringNotNullOrEmpty(value, "Storage");
            _storage = value.ToLowerInvariant();
        }
    }

    /// <summary>
    /// Gets or sets the execution id.
    /// </summary>
    public TestExecId ExecutionId
    {
        get { return _executionId; }
        set { _executionId = value; }
    }

    /// <summary>
    /// Gets or sets the parent execution id.
    /// </summary>
    public TestExecId ParentExecutionId
    {
        get { return _parentExecutionId; }
        set { _parentExecutionId = value; }
    }

    /// <summary>
    /// Gets the isRunnable value.
    /// </summary>
    public bool IsRunnable
    {
        get { return _isRunnable; }
    }

    /// <summary>
    /// Gets or sets the category id.
    /// </summary>
    /// <remarks>
    /// Instead of setting to null use TestListCategoryId.Uncategorized
    /// </remarks>
    public TestListCategoryId CategoryId
    {
        get { return _catId; }

        set
        {
            EqtAssert.ParameterNotNull(value, "CategoryId");
            _catId = value;
        }
    }

    /// <summary>
    /// Gets or sets the test categories.
    /// </summary>
    public TestCategoryItemCollection TestCategories
    {
        get { return _testCategories; }

        set
        {
            EqtAssert.ParameterNotNull(value, "value");
            _testCategories = value;
        }
    }

    /// <summary>
    /// Gets or sets the work items.
    /// </summary>
    public WorkItemCollection WorkItems
    {
        get { return _workItems; }

        set
        {
            EqtAssert.ParameterNotNull(value, "value");
            _workItems = value;
        }
    }

    /// <summary>
    /// Gets the adapter name.
    /// </summary>
    public string Adapter
    {
        get { return _adapter; }
    }

    /// <summary>
    /// Gets the test type.
    /// </summary>
    public abstract TestType TestType { get; }

    /// <summary>
    /// Override for ToString.
    /// </summary>
    /// <returns>String representation of test element.</returns>
    public override string ToString()
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "'{0}' {1}",
            _name ?? TrxLoggerResources.Common_NullInMessages,
            _id != null ? _id.ToString() : TrxLoggerResources.Common_NullInMessages);
    }

    /// <summary>
    /// Override for Equals.
    /// </summary>
    /// <param name="other">
    /// The object to compare.
    /// </param>
    /// <returns>
    /// The <see cref="bool"/>.
    /// </returns>
    public override bool Equals(object? other)
    {
        return other is TestElement otherTest && _id.Equals(otherTest._id);
    }

    /// <summary>
    /// Override for GetHashCode
    /// </summary>
    /// <returns>
    /// The <see cref="int"/>.
    /// </returns>
    public override int GetHashCode()
    {
        return _id.GetHashCode();
    }

    public virtual void Save(System.Xml.XmlElement element, XmlTestStoreParameters? parameters)
    {
        XmlPersistence h = new();

        h.SaveSimpleField(element, "@name", _name, null);
        h.SaveSimpleField(element, "@storage", _storage, string.Empty);
        h.SaveSimpleField(element, "@priority", _priority, DefaultPriority);
        h.SaveSimpleField(element, "Owners/Owner/@name", _owner, string.Empty);
        h.SaveObject(_testCategories, element, "TestCategory", parameters);

        if (_executionId != null)
            h.SaveGuid(element, "Execution/@id", _executionId.Id);
        if (_parentExecutionId != null)
            h.SaveGuid(element, "Execution/@parentId", _parentExecutionId.Id);

        h.SaveObject(_workItems, element, "Workitems", parameters);

        XmlTestStoreParameters testIdParameters = XmlTestStoreParameters.GetParameters();
        testIdParameters[TestId.IdLocationKey] = "@id";
        XmlPersistence.SaveObject(_id, element, testIdParameters);
    }
}