Bläddra i källkod

Add Disposal Test and fix an issue where the CopyClipboard test was failing (#2936)

* add Disposal Test and fix an ssue where the CopyClipboard test was failing

* Update ViewDisposalTest.cs

* Update ViewDisposalTest.cs: Some Formatting, and adding code comments.

---------

Co-authored-by: John Züchler <[email protected]>
usr 1 år sedan
förälder
incheckning
34c6b6ebcc
2 ändrade filer med 102 tillägg och 1 borttagningar
  1. 1 1
      UnitTests/Drivers/ClipboardTests.cs
  2. 101 0
      UnitTests/Views/ViewDisposalTest.cs

+ 1 - 1
UnitTests/Drivers/ClipboardTests.cs

@@ -159,7 +159,7 @@ namespace Terminal.Gui.DriverTests {
 				output.WriteLine ($"Pasting to OS clipboard: {clipText}...");
 
 				if (RuntimeInformation.IsOSPlatform (OSPlatform.Windows)) {
-					(exitCode, result) = ClipboardProcessRunner.Process ("pwsh", $"-command \"Set-Clipboard -Value \\\"{clipText}\\\"\"");
+					(exitCode, result) = ClipboardProcessRunner.Process ("pwsh", $"-command \"Set-Clipboard -Value '{clipText}'\"");
 					output.WriteLine ($"  Windows: pwsh Set-Clipboard: exitCode = {exitCode}, result = {result}");
 					getClipText = Clipboard.Contents.ToString ();
 

+ 101 - 0
UnitTests/Views/ViewDisposalTest.cs

@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using Terminal.Gui;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace UnitTests.ViewsTests {
+
+	public class ViewDisposalTest {
+
+#nullable enable
+		Dictionary<Type, object? []?> special_params = new Dictionary<Type, object? []?> ();
+#nullable restore
+
+		readonly ITestOutputHelper output;
+
+		public ViewDisposalTest (ITestOutputHelper output)
+		{
+			{
+				this.output = output;
+			}
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void TestViewsDisposeCorrectly ()
+		{
+			var reference = DoTest ();
+			for (var i = 0; i < 10 && reference.IsAlive; i++) {
+				GC.Collect ();
+				GC.WaitForPendingFinalizers ();
+			}
+
+			if (reference.IsAlive) {
+				Assert.True (((View)reference.Target).WasDisposed);
+				Assert.Fail ($"Some Views didnt get Garbage Collected: {((View)reference.Target).Subviews}");
+			}
+		}
+
+		void getSpecialParams ()
+		{
+			special_params.Clear ();
+			//special_params.Add (typeof (LineView), new object [] { Orientation.Horizontal });
+		}
+
+		WeakReference DoTest ()
+		{
+			getSpecialParams ();
+			View Container = new View ();
+			Toplevel top = Application.Top;
+			var views = GetViews ();
+			foreach (var view in views) {
+				View instance;
+				//Create instance of view and add to container
+				if (special_params.ContainsKey (view)) {
+					instance = (View)Activator.CreateInstance (view, special_params [view]);
+				} else {
+					instance = (View)Activator.CreateInstance (view);
+				}
+
+				Assert.NotNull (instance);
+				Container.Add (instance);
+				output.WriteLine ($"Added instance of {view}!");
+			}
+			top.Add (Container);
+			// make sure the application is doing to the views whatever its supposed to do to the views
+			for (var i = 0; i < 100; i++) {
+				Application.Refresh ();
+			}
+
+			top.Remove (Container);
+			WeakReference reference = new (Container, true);
+			Container.Dispose ();
+			return reference;
+		}
+
+		/// <summary>
+		/// Get all types derived from <see cref="View"/> using reflection
+		/// </summary>
+		/// <returns></returns>
+		List<Type> GetViews ()
+		{
+			List<Type> valid = new ();
+			// Filter all types that can be instantiated, are public, arent generic,  aren't the view type itself, but derive from view
+			foreach (var type in Assembly.GetAssembly (typeof (View)).GetTypes ().Where (T => { //body of anonymous check function
+				return ((!T.IsAbstract) && T.IsPublic && T.IsClass && T.IsAssignableTo (typeof (View)) && !T.IsGenericType && !(T == typeof (View)));
+			})) //end of body of anonymous check function
+			{ //body of the foreach loop
+				output.WriteLine ($"Found Type {type.Name}");
+				Assert.DoesNotContain (type, valid);
+				Assert.True (type.IsAssignableTo (typeof (IDisposable)));// Just to be safe
+				valid.Add (type);
+				output.WriteLine ("	-Added!");
+			} //end body of foreach loop
+
+			return valid;
+		}
+	}
+}