/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Scripting/CSharpTest.Desktop/ObjectFormatterTests.cs
135 строк
5 KB
Jared Parsons
Fixing the OOM in scripting (#75372)
11 окт 2024, 00:40
Не верифицирован
11 окт 2024, 00:40
ee185b2
Код
Авторство
О чём код?
// 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. #nullable disable using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Reflection; using Microsoft.CodeAnalysis.Scripting.Hosting; using Microsoft.CodeAnalysis.Scripting.Hosting.UnitTests; using Xunit; using VB = Microsoft.CodeAnalysis.VisualBasic; namespace Microsoft.CodeAnalysis.CSharp.Scripting.Hosting.UnitTests { public class ObjectFormatterTests : ObjectFormatterTestBase { private static readonly ObjectFormatter s_formatter = new TestCSharpObjectFormatter(); [Fact] public void DebuggerProxy_FrameworkTypes_ArrayList() { var obj = new ArrayList { 1, 2, true, "goo" }; var str = s_formatter.FormatObject(obj, SingleLineOptions); Assert.Equal("ArrayList(4) { 1, 2, true, \"goo\" }", str); } [Fact] public void DebuggerProxy_FrameworkTypes_Hashtable() { var obj = new Hashtable { { new byte[] { 1, 2 }, new[] { 1,2,3 } }, }; var str = s_formatter.FormatObject(obj, SeparateLinesOptions); AssertMembers(str, "Hashtable(1)", "{ byte[2] { 1, 2 }, int[3] { 1, 2, 3 } }" ); } [Fact] public void DebuggerProxy_FrameworkTypes_Queue() { var obj = new Queue(); obj.Enqueue(1); obj.Enqueue(2); obj.Enqueue(3); var str = s_formatter.FormatObject(obj, SingleLineOptions); Assert.Equal("Queue(3) { 1, 2, 3 }", str); } [Fact] public void DebuggerProxy_FrameworkTypes_Stack() { var obj = new Stack(); obj.Push(1); obj.Push(2); obj.Push(3); var str = s_formatter.FormatObject(obj, SingleLineOptions); Assert.Equal("Stack(3) { 3, 2, 1 }", str); } [Fact] public void DebuggerProxy_FrameworkTypes_SortedList() { SortedList obj = new SortedList(); obj.Add(3, 4); obj.Add(1, 5); obj.Add(2, 6); var str = s_formatter.FormatObject(obj, SingleLineOptions); Assert.Equal("SortedList(3) { { 1, 5 }, { 2, 6 }, { 3, 4 } }", str); obj = new SortedList(); obj.Add(new[] { 3 }, new int[] { 4 }); str = s_formatter.FormatObject(obj, SingleLineOptions); Assert.Equal("SortedList(1) { { int[1] { 3 }, int[1] { 4 } } }", str); } // TODO: move to portable [Fact] public void VBBackingFields_DebuggerBrowsable() { var reference = MetadataReference.CreateFromAssemblyInternal(typeof(object).GetTypeInfo().Assembly); string source = @" Imports System Class C Public WithEvents WE As C Public Event E As Action Public Property A As Integer End Class "; var compilation = VB.VisualBasicCompilation.Create( "goo", new[] { VB.VisualBasicSyntaxTree.ParseText(source) }, new[] { reference }, new VB.VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug)); Assembly a; using (var stream = new MemoryStream()) { var result = compilation.Emit(stream); a = Assembly.Load(stream.ToArray()); } var c = a.GetType("C"); var obj = Activator.CreateInstance(c); var str = s_formatter.FormatObject(obj, SeparateLinesOptions); AssertMembers(str, "C", "A: 0", "WE: null" ); var attrsA = c.GetField("_A", BindingFlags.Instance | BindingFlags.NonPublic).GetCustomAttributes(typeof(DebuggerBrowsableAttribute), true); var attrsWE = c.GetField("_WE", BindingFlags.Instance | BindingFlags.NonPublic).GetCustomAttributes(typeof(DebuggerBrowsableAttribute), true); var attrsE = c.GetField("EEvent", BindingFlags.Instance | BindingFlags.NonPublic).GetCustomAttributes(typeof(DebuggerBrowsableAttribute), true); Assert.Equal(1, attrsA.Length); Assert.Equal(1, attrsWE.Length); Assert.Equal(1, attrsE.Length); reference.GetMetadataNoCopy().Dispose(); } } }