DisposableDictionaryTests.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.Collections.Generic;
  3. using Masuit.Tools.Systems;
  4. using Xunit;
  5. namespace Masuit.Tools.Abstractions.Test.Systems;
  6. public class DisposableDictionaryTests
  7. {
  8. private class DisposableValue : IDisposable
  9. {
  10. public bool IsDisposed { get; private set; }
  11. public void Dispose()
  12. {
  13. IsDisposed = true;
  14. }
  15. }
  16. [Fact]
  17. public void AddAndRetrieveValue()
  18. {
  19. var dictionary = new DisposableDictionary<string, DisposableValue>();
  20. var value = new DisposableValue();
  21. dictionary.Add("key", value);
  22. Assert.True(dictionary.TryGetValue("key", out var retrievedValue));
  23. Assert.Equal(value, retrievedValue);
  24. }
  25. [Fact]
  26. public void Dispose_DisposesAllValues()
  27. {
  28. var dictionary = new DisposableDictionary<string, DisposableValue>
  29. {
  30. { "key1", new DisposableValue() },
  31. { "key2", new DisposableValue() }
  32. };
  33. dictionary.Dispose();
  34. foreach (var value in dictionary.Values)
  35. {
  36. Assert.True(value.IsDisposed);
  37. }
  38. }
  39. [Fact]
  40. public void Dispose_CanBeCalledMultipleTimes()
  41. {
  42. var dictionary = new DisposableDictionary<string, DisposableValue>
  43. {
  44. { "key1", new DisposableValue() },
  45. { "key2", new DisposableValue() }
  46. };
  47. dictionary.Dispose();
  48. dictionary.Dispose();
  49. foreach (var value in dictionary.Values)
  50. {
  51. Assert.True(value.IsDisposed);
  52. }
  53. }
  54. [Fact]
  55. public void Finalizer_DisposesValues()
  56. {
  57. var dictionary = new DisposableDictionary<string, DisposableValue>
  58. {
  59. { "key1", new DisposableValue() },
  60. { "key2", new DisposableValue() }
  61. };
  62. dictionary = null;
  63. GC.Collect();
  64. GC.WaitForPendingFinalizers();
  65. // 无法直接测试终结器的效果,但可以通过其他测试确保 Dispose 方法的正确性
  66. }
  67. [Fact]
  68. public void Constructor_WithFallbackValue()
  69. {
  70. var fallbackValue = new DisposableValue();
  71. var dictionary = new DisposableDictionary<string, DisposableValue>(fallbackValue);
  72. Assert.Equal(dictionary["aa"], fallbackValue);
  73. }
  74. [Fact]
  75. public void Constructor_WithCapacity()
  76. {
  77. var dictionary = new DisposableDictionary<string, DisposableValue>(10);
  78. Assert.Equal(0, dictionary.Count);
  79. }
  80. [Fact]
  81. public void Constructor_WithDictionary()
  82. {
  83. var initialDictionary = new Dictionary<NullObject<string>, DisposableValue>
  84. {
  85. { new NullObject<string>("key1"), new DisposableValue() },
  86. { new NullObject<string>("key2"), new DisposableValue() }
  87. };
  88. var dictionary = new DisposableDictionary<string, DisposableValue>(initialDictionary);
  89. Assert.Equal(2, dictionary.Count);
  90. }
  91. }