Skip to content

Commit 216f56e

Browse files
committed
Fix logic and tests
1 parent 58c28af commit 216f56e

File tree

6 files changed

+285
-222
lines changed

6 files changed

+285
-222
lines changed

src/Adapter/MSTest.TestAdapter/Execution/TestClassInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ public void RunClassInitialize(TestContext testContext)
357357
throw testFailedException;
358358
}
359359

360-
internal UnitTestResult GetResultOrRunClassInitialize(ITestContext testContext, string? initializationLogs, string? initializationErrorLogs, string? initializationTrace, string? initializationTestContextMessages)
360+
internal UnitTestResult GetResultOrRunClassInitialize(ITestContext testContext, string initializationLogs, string initializationErrorLogs, string initializationTrace, string initializationTestContextMessages)
361361
{
362362
bool isSTATestClass = AttributeComparer.IsDerived<STATestClassAttribute>(ClassAttribute);
363363
bool isWindowsOS = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
@@ -373,7 +373,7 @@ internal UnitTestResult GetResultOrRunClassInitialize(ITestContext testContext,
373373
return DoRun();
374374
}
375375

376-
UnitTestResult result = new();
376+
UnitTestResult result = new(ObjectModelUnitTestOutcome.Error, "MSTest STATestClass ClassInitialize didn't complete");
377377
Thread entryPointThread = new(() => result = DoRun())
378378
{
379379
Name = "MSTest STATestClass ClassInitialize",
@@ -408,7 +408,7 @@ internal UnitTestResult GetResultOrRunClassInitialize(ITestContext testContext,
408408
// Local functions
409409
UnitTestResult DoRun()
410410
{
411-
UnitTestResult result = new();
411+
UnitTestResult result = new(ObjectModelUnitTestOutcome.Passed, null);
412412

413413
try
414414
{

src/Adapter/MSTest.TestAdapter/Execution/UnitTestRunner.cs

+2-6
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ internal UnitTestResult[] RunSingleTest(TestMethod testMethod, IDictionary<strin
165165
}
166166
else
167167
{
168-
UnitTestResult classInitializeResult = testMethodInfo.Parent.GetResultOrRunClassInitialize(testContext, assemblyInitializeResult.StandardOut, assemblyInitializeResult.StandardError, assemblyInitializeResult.DebugTrace, assemblyInitializeResult.TestContextMessages);
168+
UnitTestResult classInitializeResult = testMethodInfo.Parent.GetResultOrRunClassInitialize(testContext, assemblyInitializeResult.StandardOut!, assemblyInitializeResult.StandardError!, assemblyInitializeResult.DebugTrace!, assemblyInitializeResult.TestContextMessages!);
169169
if (classInitializeResult.Outcome != UnitTestOutcome.Passed)
170170
{
171171
result = [classInitializeResult];
@@ -174,11 +174,7 @@ internal UnitTestResult[] RunSingleTest(TestMethod testMethod, IDictionary<strin
174174
{
175175
// Run the test method
176176
var testMethodRunner = new TestMethodRunner(testMethodInfo, testMethod, testContext);
177-
result = testMethodRunner.Execute(
178-
assemblyInitializeResult.StandardOut + classInitializeResult.StandardOut,
179-
assemblyInitializeResult.StandardError + classInitializeResult.StandardError,
180-
assemblyInitializeResult.DebugTrace + classInitializeResult.DebugTrace,
181-
assemblyInitializeResult.TestContextMessages + classInitializeResult.TestContextMessages);
177+
result = testMethodRunner.Execute(classInitializeResult.StandardOut!, classInitializeResult.StandardError!, classInitializeResult.DebugTrace!, classInitializeResult.TestContextMessages!);
182178
}
183179
}
184180
}

test/IntegrationTests/MSTest.Acceptance.IntegrationTests/STATestClassTests.cs

+143-23
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public STATestClassTests(ITestExecutionContext testExecutionContext, TestAssetFi
2323
}
2424

2525
[ArgumentsProvider(nameof(TargetFrameworks.All), typeof(TargetFrameworks))]
26-
public async Task STATestClass_OnWindows_LifeCycle(string currentTfm)
26+
public async Task STATestClass_OnWindows_OnLifeCycleTestClass_FixturesAndMethodsAreOnExpectedApartmentState(string currentTfm)
2727
{
2828
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
2929
{
@@ -35,11 +35,45 @@ public async Task STATestClass_OnWindows_LifeCycle(string currentTfm)
3535
TestHostResult testHostResult = await testHost.ExecuteAsync($"--settings {runSettingsFilePath} --filter className=LifeCycleTestClass");
3636

3737
testHostResult.AssertExitCodeIs(0);
38-
testHostResult.AssertOutputContains("Passed!");
38+
testHostResult.AssertOutputContains("Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1");
39+
testHostResult.AssertOutputContains("LifeCycleTestClass.AssemblyInitialize");
40+
testHostResult.AssertOutputContains("LifeCycleTestClass.ClassInitialize");
41+
testHostResult.AssertOutputContains("LifeCycleTestClass.Constructor");
42+
testHostResult.AssertOutputContains("LifeCycleTestClass.TestInitialize");
43+
testHostResult.AssertOutputContains("LifeCycleTestClass.TestMethod1");
44+
testHostResult.AssertOutputContains("LifeCycleTestClass.TestCleanup");
45+
testHostResult.AssertOutputContains("LifeCycleTestClass.Dispose");
46+
testHostResult.AssertOutputContains("LifeCycleTestClass.ClassCleanup");
47+
testHostResult.AssertOutputContains("LifeCycleTestClass.AssemblyCleanup");
3948
}
4049

4150
[ArgumentsProvider(nameof(TargetFrameworks.All), typeof(TargetFrameworks))]
42-
public async Task DerivedSTATestClass_OnWindows_ClassCleanupWithEndOfAssemblyBehavior_IsNotInsideTheSTAThread(string currentTfm)
51+
public async Task STATestClass_OnWindows_OnLifeCycleTestClassWithLastTestSkipped_FixturesAndMethodsAreOnExpectedApartmentState(string currentTfm)
52+
{
53+
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
54+
{
55+
return;
56+
}
57+
58+
var testHost = TestHost.LocateFrom(_testAssetFixture.TargetAssetPath, AssetName, currentTfm);
59+
string runSettingsFilePath = Path.Combine(testHost.DirectoryName, "mta.runsettings");
60+
TestHostResult testHostResult = await testHost.ExecuteAsync($"--settings {runSettingsFilePath} --filter className=LifeCycleTestClassWithLastTestSkipped");
61+
62+
testHostResult.AssertExitCodeIs(0);
63+
testHostResult.AssertOutputContains("Passed! - Failed: 0, Passed: 1, Skipped: 1, Total: 2");
64+
testHostResult.AssertOutputContains("LifeCycleTestClass.AssemblyInitialize");
65+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.ClassInitialize");
66+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.Constructor");
67+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.TestInitialize");
68+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.TestMethod1");
69+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.TestCleanup");
70+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.Dispose");
71+
testHostResult.AssertOutputContains("LifeCycleTestClassWithLastTestSkipped.ClassCleanup");
72+
testHostResult.AssertOutputContains("LifeCycleTestClass.AssemblyCleanup");
73+
}
74+
75+
[ArgumentsProvider(nameof(TargetFrameworks.All), typeof(TargetFrameworks))]
76+
public async Task DerivedSTATestClass_OnWindows_OnTestClassWithClassCleanupEndOfAssembly_ClassCleanupIsMTA(string currentTfm)
4377
{
4478
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
4579
{
@@ -51,7 +85,16 @@ public async Task DerivedSTATestClass_OnWindows_ClassCleanupWithEndOfAssemblyBeh
5185
TestHostResult testHostResult = await testHost.ExecuteAsync($"--settings {runSettingsFilePath} --filter className=TestClassWithClassCleanupEndOfAssembly");
5286

5387
testHostResult.AssertExitCodeIs(0);
54-
testHostResult.AssertOutputContains("Passed!");
88+
testHostResult.AssertOutputContains("Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1");
89+
testHostResult.AssertOutputContains("LifeCycleTestClass.AssemblyInitialize");
90+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.ClassInitialize");
91+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.Constructor");
92+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.TestInitialize");
93+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.TestMethod1");
94+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.TestCleanup");
95+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.Dispose");
96+
testHostResult.AssertOutputContains("TestClassWithClassCleanupEndOfAssembly.ClassCleanup");
97+
testHostResult.AssertOutputContains("LifeCycleTestClass.AssemblyCleanup");
5598
}
5699

57100
[TestFixture(TestFixtureSharingStrategy.PerTestGroup)]
@@ -75,6 +118,9 @@ public sealed class TestAssetFixture(AcceptanceFixture acceptanceFixture) : Test
75118
<RunConfiguration>
76119
<ExecutionThreadApartmentState>MTA</ExecutionThreadApartmentState>
77120
</RunConfiguration>
121+
<MSTest>
122+
<CaptureTraceOutput>false</CaptureTraceOutput>
123+
</MSTest>
78124
</RunSettings>
79125
80126
#file STATestClass.csproj
@@ -112,53 +158,120 @@ public class LifeCycleTestClass : IDisposable
112158
[AssemblyInitialize]
113159
public static void AssemblyInitialize(TestContext context)
114160
{
115-
Helper.AssertCorrectThreadApartmentMTAState();
161+
Console.WriteLine("LifeCycleTestClass.AssemblyInitialize");
162+
ThreadAssert.AssertApartmentStateIsMTA();
116163
}
117164
118165
[AssemblyCleanup]
119166
public static void AssemblyCleanup()
120167
{
121-
Helper.AssertCorrectThreadApartmentMTAState();
168+
Console.WriteLine("LifeCycleTestClass.AssemblyCleanup");
169+
ThreadAssert.AssertApartmentStateIsMTA();
122170
}
123171
124172
public LifeCycleTestClass()
125173
{
126-
Helper.AssertCorrectThreadApartmentSTAState();
174+
Console.WriteLine("LifeCycleTestClass.Constructor");
175+
ThreadAssert.AssertApartmentStateIsSTA();
176+
}
177+
178+
[ClassInitialize]
179+
public static void ClassInitialize(TestContext context)
180+
{
181+
Console.WriteLine("LifeCycleTestClass.ClassInitialize");
182+
ThreadAssert.AssertApartmentStateIsSTA();
183+
}
184+
185+
[ClassCleanup(ClassCleanupBehavior.EndOfClass)]
186+
public static void ClassCleanup()
187+
{
188+
Console.WriteLine("LifeCycleTestClass.ClassCleanup");
189+
ThreadAssert.AssertApartmentStateIsSTA();
190+
}
191+
192+
[TestInitialize]
193+
public void TestInitialize()
194+
{
195+
Console.WriteLine("LifeCycleTestClass.TestInitialize");
196+
ThreadAssert.AssertApartmentStateIsSTA();
197+
}
198+
199+
[TestCleanup]
200+
public void TestCleanup()
201+
{
202+
Console.WriteLine("LifeCycleTestClass.TestCleanup");
203+
ThreadAssert.AssertApartmentStateIsSTA();
204+
}
205+
206+
[TestMethod]
207+
public void TestMethod1()
208+
{
209+
Console.WriteLine("LifeCycleTestClass.TestMethod1");
210+
ThreadAssert.AssertApartmentStateIsSTA();
211+
}
212+
213+
public void Dispose()
214+
{
215+
Console.WriteLine("LifeCycleTestClass.Dispose");
216+
ThreadAssert.AssertApartmentStateIsSTA();
217+
}
218+
}
219+
220+
[STATestClass]
221+
public class LifeCycleTestClassWithLastTestSkipped : IDisposable
222+
{
223+
public LifeCycleTestClassWithLastTestSkipped()
224+
{
225+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.Constructor");
226+
ThreadAssert.AssertApartmentStateIsSTA();
127227
}
128228
129229
[ClassInitialize]
130230
public static void ClassInitialize(TestContext context)
131231
{
132-
Helper.AssertCorrectThreadApartmentSTAState();
232+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.ClassInitialize");
233+
ThreadAssert.AssertApartmentStateIsSTA();
133234
}
134235
135236
[ClassCleanup(ClassCleanupBehavior.EndOfClass)]
136237
public static void ClassCleanup()
137238
{
138-
Helper.AssertCorrectThreadApartmentSTAState();
239+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.ClassCleanup");
240+
ThreadAssert.AssertApartmentStateIsSTA();
139241
}
140242
141243
[TestInitialize]
142244
public void TestInitialize()
143245
{
144-
Helper.AssertCorrectThreadApartmentSTAState();
246+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.TestInitialize");
247+
ThreadAssert.AssertApartmentStateIsSTA();
145248
}
146249
147250
[TestCleanup]
148251
public void TestCleanup()
149252
{
150-
Helper.AssertCorrectThreadApartmentSTAState();
253+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.TestCleanup");
254+
ThreadAssert.AssertApartmentStateIsSTA();
151255
}
152256
153257
[TestMethod]
154258
public void TestMethod1()
155259
{
156-
Helper.AssertCorrectThreadApartmentSTAState();
260+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.TestMethod1");
261+
ThreadAssert.AssertApartmentStateIsSTA();
262+
}
263+
264+
[TestMethod]
265+
[Ignore]
266+
public void TestMethod2()
267+
{
268+
Assert.Fail("TestMethod2 should not be executed");
157269
}
158270
159271
public void Dispose()
160272
{
161-
Helper.AssertCorrectThreadApartmentSTAState();
273+
Console.WriteLine("LifeCycleTestClassWithLastTestSkipped.Dispose");
274+
ThreadAssert.AssertApartmentStateIsSTA();
162275
}
163276
}
164277
@@ -171,54 +284,61 @@ public class TestClassWithClassCleanupEndOfAssembly : IDisposable
171284
{
172285
public TestClassWithClassCleanupEndOfAssembly()
173286
{
174-
Helper.AssertCorrectThreadApartmentSTAState();
287+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.Constructor");
288+
ThreadAssert.AssertApartmentStateIsSTA();
175289
}
176290
177291
[ClassInitialize]
178292
public static void ClassInitialize(TestContext context)
179293
{
180-
Helper.AssertCorrectThreadApartmentSTAState();
294+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.ClassInitialize");
295+
ThreadAssert.AssertApartmentStateIsSTA();
181296
}
182297
183298
[ClassCleanup(ClassCleanupBehavior.EndOfAssembly)]
184299
public static void ClassCleanup()
185300
{
186-
Helper.AssertCorrectThreadApartmentMTAState();
301+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.ClassCleanup");
302+
ThreadAssert.AssertApartmentStateIsMTA();
187303
}
188304
189305
[TestInitialize]
190306
public void TestInitialize()
191307
{
192-
Helper.AssertCorrectThreadApartmentSTAState();
308+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.TestInitialize");
309+
ThreadAssert.AssertApartmentStateIsSTA();
193310
}
194311
195312
[TestCleanup]
196313
public void TestCleanup()
197314
{
198-
Helper.AssertCorrectThreadApartmentSTAState();
315+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.TestCleanup");
316+
ThreadAssert.AssertApartmentStateIsSTA();
199317
}
200318
201319
[TestMethod]
202320
public void TestMethod1()
203321
{
204-
Helper.AssertCorrectThreadApartmentSTAState();
322+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.TestMethod1");
323+
ThreadAssert.AssertApartmentStateIsSTA();
205324
}
206325
207326
public void Dispose()
208327
{
209-
Helper.AssertCorrectThreadApartmentSTAState();
328+
Console.WriteLine("TestClassWithClassCleanupEndOfAssembly.Dispose");
329+
ThreadAssert.AssertApartmentStateIsSTA();
210330
}
211331
}
212332
213-
public static class Helper
333+
public static class ThreadAssert
214334
{
215-
public static void AssertCorrectThreadApartmentMTAState()
335+
public static void AssertApartmentStateIsMTA()
216336
{
217337
var apartmentState = Thread.CurrentThread.GetApartmentState();
218338
Assert.AreEqual(ApartmentState.MTA, apartmentState);
219339
}
220340
221-
public static void AssertCorrectThreadApartmentSTAState()
341+
public static void AssertApartmentStateIsSTA()
222342
{
223343
var apartmentState = Thread.CurrentThread.GetApartmentState();
224344
Assert.AreEqual(ApartmentState.STA, apartmentState);

0 commit comments

Comments
 (0)