ApplicationModelFencingTests.cs 4.9 KB

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