// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #if NET7_0_OR_GREATER using System; using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace CommunityToolkit.HighPerformance.UnitTests; [TestClass] public class Test_NullableRefOfT { [TestMethod] public void Test_NullableRefOfT_CreateNullableRefOfT_Ok() { int value = 1; NullableRef reference = new(ref value); Assert.IsTrue(reference.HasValue); Assert.IsTrue(Unsafe.AreSame(ref value, ref reference.Value)); reference.Value++; Assert.AreEqual(value, 2); } [TestMethod] public void Test_NullableRefOfT_CreateNullableRefOfT_Null() { Assert.IsFalse(default(NullableRef).HasValue); Assert.IsFalse(NullableRef.Null.HasValue); Assert.IsFalse(default(NullableRef).HasValue); Assert.IsFalse(NullableRef.Null.HasValue); } [TestMethod] [ExpectedException(typeof(InvalidOperationException))] public void Test_NullableRefOfT_CreateNullableRefOfT_Null_Exception() { NullableRef reference = default; _ = reference.Value; } [TestMethod] public void Test_NullableRefOfT_CreateNullableRefOfT_ImplicitRefCast() { int value = 42; Ref reference = new(ref value); NullableRef nullableRef = reference; Assert.IsTrue(nullableRef.HasValue); Assert.IsTrue(Unsafe.AreSame(ref reference.Value, ref nullableRef.Value)); } [TestMethod] public void Test_NullableRefOfT_CreateNullableRefOfT_ExplicitCastOfT() { int value = 42; NullableRef reference = new(ref value); Assert.AreEqual(value, (int)reference); } [TestMethod] [ExpectedException(typeof(InvalidOperationException))] public void Test_NullableRefOfT_CreateNullableRefOfT_ExplicitCastOfT_Exception() { NullableRef invalid = default; _ = (int)invalid; } } #endif