ApplicationModelFencingTests.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. app.Init ("fake");
  20. // Attempting to initialize using the legacy static model should throw
  21. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  22. {
  23. ApplicationImpl.Instance.Init ("fake");
  24. });
  25. Assert.Contains ("Cannot use legacy static Application model", ex.Message);
  26. Assert.Contains ("after using modern instance-based model", ex.Message);
  27. // Clean up
  28. app.Shutdown ();
  29. ApplicationImpl.ResetModelUsageTracking ();
  30. }
  31. [Fact]
  32. public void InstanceAccess_ThenCreate_ThrowsInvalidOperationException ()
  33. {
  34. // Initialize using the legacy static model
  35. IApplication staticInstance = ApplicationImpl.Instance;
  36. staticInstance.Init ("fake");
  37. // Attempting to create and initialize with modern instance-based model should throw
  38. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  39. {
  40. IApplication app = Application.Create ();
  41. app.Init ("fake");
  42. });
  43. Assert.Contains ("Cannot use modern instance-based model", ex.Message);
  44. Assert.Contains ("after using legacy static Application model", ex.Message);
  45. // Clean up
  46. staticInstance.Shutdown ();
  47. ApplicationImpl.ResetModelUsageTracking ();
  48. }
  49. [Fact]
  50. public void Init_ThenCreate_ThrowsInvalidOperationException ()
  51. {
  52. // Initialize using legacy static API
  53. IApplication staticInstance = ApplicationImpl.Instance;
  54. staticInstance.Init ("fake");
  55. // Attempting to create a modern instance-based application should throw
  56. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  57. {
  58. IApplication _ = Application.Create ();
  59. });
  60. Assert.Contains ("Cannot use modern instance-based model", ex.Message);
  61. Assert.Contains ("after using legacy static Application model", ex.Message);
  62. // Clean up
  63. staticInstance.Shutdown ();
  64. ApplicationImpl.ResetModelUsageTracking ();
  65. }
  66. [Fact]
  67. public void Create_ThenInit_ThrowsInvalidOperationException ()
  68. {
  69. // Create a modern instance-based application
  70. IApplication app = Application.Create ();
  71. app.Init ("fake");
  72. // Attempting to initialize using the legacy static model should throw
  73. InvalidOperationException ex = Assert.Throws<InvalidOperationException> (() =>
  74. {
  75. ApplicationImpl.Instance.Init ("fake");
  76. });
  77. Assert.Contains ("Cannot use legacy static Application model", ex.Message);
  78. Assert.Contains ("after using modern instance-based model", ex.Message);
  79. // Clean up
  80. app.Shutdown ();
  81. ApplicationImpl.ResetModelUsageTracking ();
  82. }
  83. [Fact]
  84. public void MultipleCreate_Calls_DoNotThrow ()
  85. {
  86. // Multiple calls to Create should not throw
  87. IApplication app1 = Application.Create ();
  88. IApplication app2 = Application.Create ();
  89. IApplication app3 = Application.Create ();
  90. Assert.NotNull (app1);
  91. Assert.NotNull (app2);
  92. Assert.NotNull (app3);
  93. // Clean up
  94. app1.Shutdown ();
  95. app2.Shutdown ();
  96. app3.Shutdown ();
  97. ApplicationImpl.ResetModelUsageTracking ();
  98. }
  99. [Fact]
  100. public void MultipleInstanceAccess_DoesNotThrow ()
  101. {
  102. // Multiple accesses to Instance should not throw (it's a singleton)
  103. IApplication instance1 = ApplicationImpl.Instance;
  104. IApplication instance2 = ApplicationImpl.Instance;
  105. IApplication instance3 = ApplicationImpl.Instance;
  106. Assert.NotNull (instance1);
  107. Assert.Same (instance1, instance2);
  108. Assert.Same (instance2, instance3);
  109. // Clean up
  110. instance1.Shutdown ();
  111. ApplicationImpl.ResetModelUsageTracking ();
  112. }
  113. [Fact]
  114. public void ResetModelUsageTracking_AllowsSwitchingModels ()
  115. {
  116. // Use modern model
  117. IApplication app1 = Application.Create ();
  118. app1.Shutdown ();
  119. // Reset the tracking
  120. ApplicationImpl.ResetModelUsageTracking ();
  121. // Should now be able to use legacy model
  122. IApplication staticInstance = ApplicationImpl.Instance;
  123. Assert.NotNull (staticInstance);
  124. staticInstance.Shutdown ();
  125. // Reset again
  126. ApplicationImpl.ResetModelUsageTracking ();
  127. // Should be able to use modern model again
  128. IApplication app2 = Application.Create ();
  129. Assert.NotNull (app2);
  130. app2.Shutdown ();
  131. ApplicationImpl.ResetModelUsageTracking ();
  132. }
  133. }