ReferenceTracker.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // -----------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. // -----------------------------------------------------------------------
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.UnitTesting;
  8. namespace System
  9. {
  10. public class ReferenceTracker
  11. {
  12. public readonly List<WeakReference> ReferencesExpectedToBeCollected = new List<WeakReference>();
  13. public readonly List<WeakReference> ReferencesNotExpectedToBeCollected = new List<WeakReference>();
  14. public void AddReferencesExpectedToBeCollected(params object[] objects)
  15. {
  16. for (int i = 0; i < objects.Length; i++)
  17. {
  18. ReferencesExpectedToBeCollected.Add(new WeakReference(objects[i]));
  19. objects[i] = null;
  20. }
  21. }
  22. public void AddReferencesNotExpectedToBeCollected(params object[] objects)
  23. {
  24. for (int i = 0; i < objects.Length; i++)
  25. {
  26. ReferencesNotExpectedToBeCollected.Add(new WeakReference(objects[i]));
  27. objects[i] = null;
  28. }
  29. }
  30. public void CollectAndAssert()
  31. {
  32. GC.Collect();
  33. GC.WaitForPendingFinalizers();
  34. EnumerableAssert.IsTrueForAll(ReferencesExpectedToBeCollected, wr => wr.Target == null, "Object should have been collected.");
  35. EnumerableAssert.IsTrueForAll(ReferencesNotExpectedToBeCollected, wr => wr.Target != null, "Object should be have NOT been collected.");
  36. }
  37. }
  38. }