File: TypeInfoTests.cs
Web Access
Project: ..\..\..\src\Framework.UnitTests\Microsoft.Build.Framework.UnitTests.csproj (Microsoft.Build.Framework.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Microsoft.Build.Utilities;
using Shouldly;
using Xunit;
 
namespace Microsoft.Build.Framework.UnitTests;
 
public class TypeInfoTests
{
    [Fact]
    public void IsReferenceOrContainsReferences_ReferenceTypes_ReturnsTrue()
    {
        // Reference types should return true
        TypeInfo<string>.IsReferenceOrContainsReferences().ShouldBeTrue();
        TypeInfo<object>.IsReferenceOrContainsReferences().ShouldBeTrue();
        TypeInfo<TypeInfoTests>.IsReferenceOrContainsReferences().ShouldBeTrue();
    }
 
    [Fact]
    public void IsReferenceOrContainsReferences_ValueTypesWithoutReferences_ReturnsFalse()
    {
        // Value types without references should return false
        TypeInfo<int>.IsReferenceOrContainsReferences().ShouldBeFalse();
        TypeInfo<bool>.IsReferenceOrContainsReferences().ShouldBeFalse();
        TypeInfo<DateTime>.IsReferenceOrContainsReferences().ShouldBeFalse();
        TypeInfo<TestEnum>.IsReferenceOrContainsReferences().ShouldBeFalse();
        TypeInfo<SimpleStruct>.IsReferenceOrContainsReferences().ShouldBeFalse();
    }
 
    [Fact]
    public void IsReferenceOrContainsReferences_ValueTypesWithReferences_ReturnsTrue()
    {
        // Value types containing references should return true
        TypeInfo<StructWithReference>.IsReferenceOrContainsReferences().ShouldBeTrue();
        TypeInfo<StructWithString>.IsReferenceOrContainsReferences().ShouldBeTrue();
    }
 
    [Fact]
    public void IsReferenceOrContainsReferences_ResultIsCached()
    {
        // First call should compute the result
        bool firstResult = TypeInfo<int>.IsReferenceOrContainsReferences();
 
        // Second call should use cached result
        bool secondResult = TypeInfo<int>.IsReferenceOrContainsReferences();
 
        // Both calls should return the same result
        secondResult.ShouldBe(firstResult);
    }
 
#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value
    private enum TestEnum
    {
        Value1,
        Value2
    }
 
    private struct SimpleStruct
    {
        public int X;
        public int Y;
    }
 
    private struct StructWithReference
    {
        public object Reference;
        public int Value;
    }
 
    private struct StructWithString
    {
        public string Text;
        public double Number;
    }
#pragma warning restore CS0649 // Field is never assigned to, and will always have its default value
}