ApplicationModelFencingTests.cs 6.0 KB

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