ApplicationModelFencingTests.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. namespace UnitTests.ApplicationTests;
  2. /// <summary>
  3. /// Tests to ensure that mixing legacy static Application and modern instance-based models
  4. /// throws appropriate exceptions.
  5. /// </summary>
  6. [Collection ("Global Test Setup")]
  7. public class ApplicationModelFencingTests
  8. {
  9. public ApplicationModelFencingTests ()
  10. {
  11. // Reset the model usage tracking before each test
  12. ApplicationImpl.ResetModelUsageTracking ();
  13. }
  14. [Fact]
  15. public void Create_ThenInstanceAccess_ThrowsInvalidOperationException ()
  16. {
  17. // Create a modern instance-based application
  18. IApplication app = Application.Create ();
  19. // Attempting to access the legacy static instance should throw
  20. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  21. {
  22. IApplication _ = ApplicationImpl.Instance;
  23. });
  24. Assert.Contains ("Cannot use legacy static Application model", ex.Message);
  25. Assert.Contains ("after using modern instance-based model", ex.Message);
  26. // Clean up
  27. app.Shutdown ();
  28. }
  29. [Fact]
  30. public void InstanceAccess_ThenCreate_ThrowsInvalidOperationException ()
  31. {
  32. // Access the legacy static instance
  33. IApplication staticInstance = ApplicationImpl.Instance;
  34. // Attempting to create a modern instance-based application should throw
  35. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  36. {
  37. IApplication _ = Application.Create ();
  38. });
  39. Assert.Contains ("Cannot use modern instance-based model", ex.Message);
  40. Assert.Contains ("after using legacy static Application model", ex.Message);
  41. // Clean up
  42. staticInstance.Shutdown ();
  43. }
  44. [Fact]
  45. public void Init_ThenCreate_ThrowsInvalidOperationException ()
  46. {
  47. // Initialize using legacy static API
  48. IApplication staticInstance = ApplicationImpl.Instance;
  49. staticInstance.Init ("fake");
  50. // Attempting to create a modern instance-based application should throw
  51. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  52. {
  53. IApplication _ = Application.Create ();
  54. });
  55. Assert.Contains ("Cannot use modern instance-based model", ex.Message);
  56. Assert.Contains ("after using legacy static Application model", ex.Message);
  57. // Clean up
  58. staticInstance.Shutdown ();
  59. }
  60. [Fact]
  61. public void Create_ThenInit_ThrowsInvalidOperationException ()
  62. {
  63. // Create a modern instance-based application
  64. IApplication app = Application.Create ();
  65. app.Init ("fake");
  66. // Attempting to access the legacy static instance should throw
  67. // (Init calls ApplicationImpl.Instance internally)
  68. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  69. {
  70. IApplication _ = ApplicationImpl.Instance;
  71. });
  72. Assert.Contains ("Cannot use legacy static Application model", ex.Message);
  73. Assert.Contains ("after using modern instance-based model", ex.Message);
  74. // Clean up
  75. app.Shutdown ();
  76. }
  77. [Fact]
  78. public void MultipleCreate_Calls_DoNotThrow ()
  79. {
  80. // Multiple calls to Create should not throw
  81. IApplication app1 = Application.Create ();
  82. IApplication app2 = Application.Create ();
  83. IApplication app3 = Application.Create ();
  84. Assert.NotNull (app1);
  85. Assert.NotNull (app2);
  86. Assert.NotNull (app3);
  87. // Clean up
  88. app1.Shutdown ();
  89. app2.Shutdown ();
  90. app3.Shutdown ();
  91. }
  92. [Fact]
  93. public void MultipleInstanceAccess_DoesNotThrow ()
  94. {
  95. // Multiple accesses to Instance should not throw (it's a singleton)
  96. IApplication instance1 = ApplicationImpl.Instance;
  97. IApplication instance2 = ApplicationImpl.Instance;
  98. IApplication instance3 = ApplicationImpl.Instance;
  99. Assert.NotNull (instance1);
  100. Assert.Same (instance1, instance2);
  101. Assert.Same (instance2, instance3);
  102. // Clean up
  103. instance1.Shutdown ();
  104. }
  105. [Fact]
  106. public void ResetModelUsageTracking_AllowsSwitchingModels ()
  107. {
  108. // Use modern model
  109. IApplication app1 = Application.Create ();
  110. app1.Shutdown ();
  111. // Reset the tracking
  112. ApplicationImpl.ResetModelUsageTracking ();
  113. // Should now be able to use legacy model
  114. IApplication staticInstance = ApplicationImpl.Instance;
  115. Assert.NotNull (staticInstance);
  116. staticInstance.Shutdown ();
  117. // Reset again
  118. ApplicationImpl.ResetModelUsageTracking ();
  119. // Should be able to use modern model again
  120. IApplication app2 = Application.Create ();
  121. Assert.NotNull (app2);
  122. app2.Shutdown ();
  123. }
  124. }