File: Framework.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 Microsoft.VisualStudio.TestPlatform.CoreUtilities;

using System.Globalization;

using NuGetClone.Frameworks;
using System;

namespace Microsoft.VisualStudio.TestPlatform.ObjectModel;

/// <summary>
/// Class for target Framework for the test container
/// </summary>
public class Framework
{
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. | Suppressed as we know values are set
    private Framework()
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
    {
    }

    /// <summary>
    /// Default .Net target framework.
    /// </summary>
#if NETFRAMEWORK
    public static Framework DefaultFramework { get; } = Framework.FromString(".NETFramework,Version=v4.0")!;
#else
    public static Framework DefaultFramework { get; } = Framework.FromString(".NETCoreApp,Version=v1.0")!;
#endif

    /// <summary>
    /// Gets the FullName of framework.
    /// </summary>
    public string Name { get; private set; }

    /// <summary>
    /// Gets the framework name such as .NETCoreApp.
    /// </summary>
    public string FrameworkName { get; private set; }

    /// <summary>
    /// Common short name, as well as directory name, such as net5.0. Is null when the framework is not correct.
    /// </summary>
    public string? ShortName { get; private set; }

    /// <summary>
    /// Gets the framework version.
    /// </summary>
    public string Version { get; private set; }

    /// <summary>
    /// Returns a valid framework or null when it cannot parse it, or when given null.
    /// </summary>
    /// <param name="frameworkString">Framework name</param>
    /// <returns>A framework object</returns>
    public static Framework? FromString(string? frameworkString)
    {
        if (frameworkString.IsNullOrWhiteSpace())
        {
            return null;
        }

        string name, frameworkName, version;
        string? shortName = null;
        try
        {
            // IDE always sends framework in form of ENUM, which always throws exception
            // This throws up in first chance exception, refer Bug https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_workitems/edit/591142
            var formattedFrameworkString = frameworkString.Trim().ToLower(CultureInfo.InvariantCulture);
            string? mappedShortName = null;
            switch (formattedFrameworkString)
            {
                case "framework35":
                    mappedShortName = "net3.5";
                    break;

                case "framework40":
                    mappedShortName = "net4.0";
                    break;

                case "framework45":
                    mappedShortName = "net4.5";
                    break;

                case "frameworkcore10":
                    mappedShortName = "netcoreapp1.0";
                    break;

                case "frameworkuap10":
                    mappedShortName = "uap10.0";
                    break;
            }

            if (mappedShortName != null)
            {
                frameworkString = mappedShortName;
            }

            var nugetFramework = NuGetFramework.Parse(frameworkString);
            if (nugetFramework.IsUnsupported)
                return null;

            // e.g. .NETFramework,Version=v3.5
            name = nugetFramework.DotNetFrameworkName;
            // e.g. net35
            try
            {
                // .NETPortable4.5 for example, is not a valid framework
                // and this will throw.
                shortName = nugetFramework.GetShortFolderName();
            }
            catch (Exception ex)
            {
                EqtTrace.Error(ex);
            }
            // e.g. .NETFramework
            frameworkName = nugetFramework.Framework;
            // e.g. 3.5.0.0
            version = nugetFramework.Version.ToString();

        }
        catch
        {
            return null;
        }

        return new Framework() { Name = name, ShortName = shortName, FrameworkName = frameworkName, Version = version };
    }

    /// <summary>
    /// Returns full name of the framework.
    /// </summary>
    /// <returns>String presentation of the object.</returns>
    public override string ToString()
    {
        return Name;
    }
}