@@ -35,6 +35,19 @@ public void TreatAllWarningsAsErrors()
3535 ObjectModelHelpers . BuildProjectExpectSuccess ( GetTestProject ( treatAllWarningsAsErrors : false ) ) ;
3636 }
3737
38+ [ Fact ]
39+ public void TreatAllWarningsAsErrorsNoPrefix ( )
40+ {
41+ MockLogger logger = ObjectModelHelpers . BuildProjectExpectFailure ( GetTestProject ( customProperties : new Dictionary < string , string >
42+ {
43+ { "TreatWarningsAsErrors" , "true" } ,
44+ } ) ) ;
45+
46+ VerifyBuildErrorEvent ( logger ) ;
47+
48+ ObjectModelHelpers . BuildProjectExpectSuccess ( GetTestProject ( treatAllWarningsAsErrors : false ) ) ;
49+ }
50+
3851 /// <summary>
3952 /// https://github.com/dotnet/msbuild/issues/2667
4053 /// </summary>
@@ -91,22 +104,6 @@ public void TreatWarningsAsErrorsWhenSpecifiedIndirectly()
91104 VerifyBuildErrorEvent ( logger ) ;
92105 }
93106
94- [ Fact ]
95- public void TreatWarningsAsErrorsWhenSpecifiedThroughAdditiveProperty ( )
96- {
97- MockLogger logger = ObjectModelHelpers . BuildProjectExpectFailure (
98- GetTestProject (
99- customProperties : new List < KeyValuePair < string , string > >
100- {
101- new KeyValuePair < string , string > ( "MSBuildWarningsAsErrors" , "123" ) ,
102- new KeyValuePair < string , string > ( "MSBuildWarningsAsErrors" , $@ "$(MSBuildWarningsAsErrors);
103- { ExpectedEventCode . ToLowerInvariant ( ) } " ) ,
104- new KeyValuePair < string , string > ( "MSBuildWarningsAsErrors" , "$(MSBuildWarningsAsErrors);ABC" )
105- } ) ) ;
106-
107- VerifyBuildErrorEvent ( logger ) ;
108- }
109-
110107 [ Fact ]
111108 public void NotTreatWarningsAsErrorsWhenCodeNotSpecified ( )
112109 {
@@ -177,22 +174,99 @@ public void TreatWarningsAsMessagesWhenSpecifiedIndirectly()
177174 VerifyBuildMessageEvent ( logger ) ;
178175 }
179176
177+ [ Theory ]
178+ [ InlineData ( true ) ]
179+ [ InlineData ( false ) ]
180+ public void TreatWarningsAsMessagesWhenSpecifiedThroughAdditiveProperty ( bool usePrefix )
181+ {
182+ string prefix = usePrefix ? "MSBuild" : "" ;
183+ MockLogger logger = ObjectModelHelpers . BuildProjectExpectSuccess (
184+ GetTestProject (
185+ customProperties : new List < KeyValuePair < string , string > >
186+ {
187+ new KeyValuePair < string , string > ( $ "{ prefix } WarningsAsMessages", "123" ) ,
188+ new KeyValuePair < string , string > ( $ "{ prefix } WarningsAsMessages", $@ "$({ prefix } WarningsAsMessages);
189+ { ExpectedEventCode . ToLowerInvariant ( ) } " ) ,
190+ new KeyValuePair < string , string > ( $ "{ prefix } WarningsAsMessages", $ "$({ prefix } WarningsAsMessages);ABC")
191+ } ) ) ;
192+
193+ VerifyBuildMessageEvent ( logger ) ;
194+ }
195+
180196 [ Fact ]
181- public void TreatWarningsAsMessagesWhenSpecifiedThroughAdditiveProperty ( )
197+ ///
198+ /// This is for chaining the properties together via addition.
199+ /// Furthermore it is intended to check if the prefix and no prefix variant interacts properly with each other.
200+ ///
201+ public void TreatWarningsAsMessagesWhenSpecifiedThroughAdditivePropertyCombination ( )
182202 {
183203 MockLogger logger = ObjectModelHelpers . BuildProjectExpectSuccess (
184204 GetTestProject (
185205 customProperties : new List < KeyValuePair < string , string > >
186206 {
187207 new KeyValuePair < string , string > ( "MSBuildWarningsAsMessages" , "123" ) ,
188- new KeyValuePair < string , string > ( "MSBuildWarningsAsMessages " , $@ "$(MSBuildWarningsAsMessages);
208+ new KeyValuePair < string , string > ( "WarningsAsMessages " , $@ "$(MSBuildWarningsAsMessages);
189209 { ExpectedEventCode . ToLowerInvariant ( ) } " ) ,
190- new KeyValuePair < string , string > ( "MSBuildWarningsAsMessages" , "$(MSBuildWarningsAsMessages );ABC" )
210+ new KeyValuePair < string , string > ( "MSBuildWarningsAsMessages" , "$(WarningsAsMessages );ABC" )
191211 } ) ) ;
192212
193213 VerifyBuildMessageEvent ( logger ) ;
194214 }
195215
216+ [ Fact ]
217+ public void TreatWarningsNotAsErrorsWhenSpecifiedThroughAdditivePropertyCombination ( )
218+ {
219+ MockLogger logger = ObjectModelHelpers . BuildProjectExpectSuccess (
220+ GetTestProject (
221+ customProperties : new List < KeyValuePair < string , string > >
222+ {
223+ new KeyValuePair < string , string > ( "MSBuildWarningsNotAsErrors" , "123" ) ,
224+ new KeyValuePair < string , string > ( "WarningsNotAsErrors" , $@ "$(MSBuildWarningsNotAsErrors);
225+ { ExpectedEventCode . ToLowerInvariant ( ) } " ) ,
226+ new KeyValuePair < string , string > ( "MSBuildWarningsNotAsErrors" , "$(WarningsNotAsErrors);ABC" )
227+ } ) ,
228+ _output ) ;
229+
230+ VerifyBuildWarningEvent ( logger ) ;
231+ }
232+
233+ [ Theory ]
234+ [ InlineData ( true ) ]
235+ [ InlineData ( false ) ]
236+ public void TreatWarningsAsErrorsWhenSpecifiedThroughAdditiveProperty ( bool MSBuildPrefix )
237+ {
238+ string prefix = MSBuildPrefix ? "MSBuild" : "" ;
239+ MockLogger logger = ObjectModelHelpers . BuildProjectExpectFailure (
240+ GetTestProject (
241+ customProperties : new List < KeyValuePair < string , string > >
242+ {
243+ new KeyValuePair < string , string > ( $@ "{ prefix } WarningsAsErrors", "123" ) ,
244+ new KeyValuePair < string , string > ( $@ "{ prefix } WarningsAsErrors", $@ "$({ prefix } WarningsAsErrors);
245+ { ExpectedEventCode . ToLowerInvariant ( ) } " ) ,
246+ new KeyValuePair < string , string > ( $@ "{ prefix } WarningsAsErrors", $@ "$({ prefix } WarningsAsErrors);ABC")
247+ } ) ,
248+ _output ) ;
249+
250+ VerifyBuildErrorEvent ( logger ) ;
251+ }
252+
253+ [ Fact ]
254+ public void TreatWarningsAsErrorsWhenSpecifiedThroughAdditivePropertyCombination ( )
255+ {
256+ MockLogger logger = ObjectModelHelpers . BuildProjectExpectFailure (
257+ GetTestProject (
258+ customProperties : new List < KeyValuePair < string , string > >
259+ {
260+ new KeyValuePair < string , string > ( "WarningsAsErrors" , "123" ) ,
261+ new KeyValuePair < string , string > ( "MSBuildWarningsAsErrors" , $@ "$(WarningsAsErrors);
262+ { ExpectedEventCode . ToLowerInvariant ( ) } " ) ,
263+ new KeyValuePair < string , string > ( "WarningsAsErrors" , "$(MSBuildWarningsAsErrors);ABC" )
264+ } ) ,
265+ _output ) ;
266+
267+ VerifyBuildErrorEvent ( logger ) ;
268+ }
269+
196270 [ Fact ]
197271 public void NotTreatWarningsAsMessagesWhenCodeNotSpecified ( )
198272 {
@@ -202,7 +276,8 @@ public void NotTreatWarningsAsMessagesWhenCodeNotSpecified()
202276 {
203277 new KeyValuePair < string , string > ( "MSBuildWarningsAsMessages" , "123" ) ,
204278 new KeyValuePair < string , string > ( "MSBuildWarningsAsMessages" , "$(MSBuildWarningsAsMessages);ABC" )
205- } ) ) ;
279+ } ) ,
280+ _output ) ;
206281
207282 VerifyBuildWarningEvent ( logger ) ;
208283 }
@@ -273,27 +348,33 @@ private string GetTestProject(bool? treatAllWarningsAsErrors = null, string warn
273348 </Project>" ;
274349 }
275350
351+
276352 [ Theory ]
277353
278354 [ InlineData ( "MSB1235" , "MSB1234" , "MSB1234" , "MSB1234" , false ) ] // Log MSB1234, treat as error via MSBuildWarningsAsErrors
279355 [ InlineData ( "MSB1235" , "" , "MSB1234" , "MSB1234" , true ) ] // Log MSB1234, expect MSB1234 as error via MSBuildTreatWarningsAsErrors
280356 [ InlineData ( "MSB1234" , "MSB1234" , "MSB1234" , "MSB4181" , true ) ] // Log MSB1234, MSBuildWarningsAsMessages takes priority
357+ [ InlineData ( "MSB1235" , "MSB1234" , "MSB1234" , "MSB1234" , false , false ) ] // Log MSB1234, treat as error via BuildWarningsAsErrors
358+ [ InlineData ( "MSB1235" , "" , "MSB1234" , "MSB1234" , true , false ) ] // Log MSB1234, expect MSB1234 as error via BuildTreatWarningsAsErrors
359+ [ InlineData ( "MSB1234" , "MSB1234" , "MSB1234" , "MSB4181" , true , false ) ] // Log MSB1234, BuildWarningsAsMessages takes priority
281360 public void WarningsAsErrorsAndMessages_Tests ( string WarningsAsMessages ,
282361 string WarningsAsErrors ,
283362 string WarningToLog ,
284363 string LogShouldContain ,
285- bool allWarningsAreErrors = false )
364+ bool allWarningsAreErrors = false ,
365+ bool useMSPrefix = true )
286366 {
287367 using ( TestEnvironment env = TestEnvironment . Create ( _output ) )
288368 {
369+ var prefix = useMSPrefix ? "MSBuild" : "" ;
289370 TransientTestProjectWithFiles proj = env . CreateTestProjectWithFiles ( $@ "
290371 <Project>
291372 <UsingTask TaskName = ""ReturnFailureWithoutLoggingErrorTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
292373 <UsingTask TaskName = ""CustomLogAndReturnTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
293374 <PropertyGroup>
294- <MSBuildTreatWarningsAsErrors >{ allWarningsAreErrors } </MSBuildTreatWarningsAsErrors >
295- <MSBuildWarningsAsMessages >{ WarningsAsMessages } </MSBuildWarningsAsMessages >
296- <MSBuildWarningsAsErrors >{ WarningsAsErrors } </MSBuildWarningsAsErrors >
375+ <{ prefix } TreatWarningsAsErrors >{ allWarningsAreErrors } </{ prefix } TreatWarningsAsErrors >
376+ <{ prefix } WarningsAsMessages >{ WarningsAsMessages } </{ prefix } WarningsAsMessages >
377+ <{ prefix } WarningsAsErrors >{ WarningsAsErrors } </{ prefix } WarningsAsErrors >
297378 </PropertyGroup>
298379 <Target Name='Build'>
299380 <CustomLogAndReturnTask Return=""true"" ReturnHasLoggedErrors=""true"" WarningCode=""{ WarningToLog } ""/>
@@ -310,6 +391,83 @@ public void WarningsAsErrorsAndMessages_Tests(string WarningsAsMessages,
310391 }
311392 }
312393
394+ [ Theory ]
395+
396+ [ InlineData ( true ) ] // Log MSB1234, BuildWarningsNotAsErrors takes priority
397+ [ InlineData ( false ) ]
398+ public void WarningsNotAsErrorsAndMessages_Tests ( bool useMSPrefix )
399+ {
400+ string Warning = "MSB1235" ;
401+ using ( TestEnvironment env = TestEnvironment . Create ( _output ) )
402+ {
403+ string prefix = useMSPrefix ? "MSBuild" : "" ;
404+ TransientTestProjectWithFiles proj = env . CreateTestProjectWithFiles ( $@ "
405+ <Project>
406+ <PropertyGroup>
407+ <{ prefix } TreatWarningsAsErrors>true</{ prefix } TreatWarningsAsErrors>
408+ <{ prefix } WarningsNotAsErrors>{ Warning } </{ prefix } WarningsNotAsErrors>
409+ </PropertyGroup>
410+ <Target Name='Build'>
411+ <Warning Text=""some random text"" Code='{ Warning } ' />
412+ </Target>
413+ </Project>" ) ;
414+
415+ MockLogger logger = proj . BuildProjectExpectSuccess ( ) ;
416+
417+ logger . WarningCount . ShouldBe ( 1 ) ;
418+ logger . ErrorCount . ShouldBe ( 0 ) ;
419+
420+ logger . AssertLogContains ( Warning ) ;
421+ }
422+ }
423+
424+
425+
426+ [ Theory ]
427+ [ InlineData ( "TreatWarningsAsErrors" , "true" , false ) ] // All warnings are treated as errors
428+ [ InlineData ( "WarningsAsErrors" , "MSB1007" , false ) ]
429+ [ InlineData ( "WarningsAsMessages" , "MSB1007" , false ) ]
430+ [ InlineData ( "WarningsNotAsErrors" , "MSB1007" , true ) ]
431+ [ InlineData ( "WarningsNotAsErrors" , "MSB1007" , false ) ]
432+ public void WarningsChangeWaveTest ( string property , string propertyData , bool treatWarningsAsErrors )
433+ {
434+ using ( TestEnvironment env = TestEnvironment . Create ( _output ) )
435+ {
436+ string warningCode = "MSB1007" ;
437+ string treatWarningsAsErrorsCodeProperty = treatWarningsAsErrors ? "<MSBuildTreatWarningsAsErrors>true</MSBuildTreatWarningsAsErrors>" : "" ;
438+ env . SetEnvironmentVariable ( "MSBUILDDISABLEFEATURESFROMVERSION" , ChangeWaves . Wave17_14 . ToString ( ) ) ;
439+ TransientTestProjectWithFiles proj = env . CreateTestProjectWithFiles ( $@ "
440+ <Project>
441+ <PropertyGroup>
442+ { treatWarningsAsErrorsCodeProperty }
443+ <{ property } >{ propertyData } </{ property } >
444+ </PropertyGroup>
445+ <Target Name='Build'>
446+ <Warning Text=""some random text"" Code='{ warningCode } ' />
447+ </Target>
448+ </Project>" ) ;
449+ if ( treatWarningsAsErrors )
450+ {
451+ // Since the "no prefix" variations can't do anything with the change wave disabled, this should always fail.
452+ MockLogger logger = proj . BuildProjectExpectFailure ( ) ;
453+ logger . ErrorCount . ShouldBe ( 1 ) ;
454+ logger . AssertLogContains ( $ "error { warningCode } ") ;
455+
456+ logger . AssertLogContains ( warningCode ) ;
457+ }
458+ else
459+ {
460+ MockLogger logger = proj . BuildProjectExpectSuccess ( ) ;
461+
462+ logger . WarningCount . ShouldBe ( 1 ) ;
463+ logger . AssertLogContains ( $ "warning { warningCode } ") ;
464+ logger . ErrorCount . ShouldBe ( 0 ) ;
465+
466+ logger . AssertLogContains ( warningCode ) ;
467+ }
468+ }
469+ }
470+
313471 /// <summary>
314472 /// Item1 and Item2 log warnings and continue, item 3 logs a warn-> error and prevents item 4 from running in the batched build.
315473 /// </summary>
@@ -371,17 +529,20 @@ public void TaskLogsWarningAsError_BatchedBuild()
371529 [ Theory ]
372530 [ InlineData ( "MSB1234" , false , 1 , 1 ) ]
373531 [ InlineData ( "MSB0000" , true , 0 , 2 ) ]
374- public void TaskReturnsTrue_Tests ( string warningsAsErrors , bool treatAllWarningsAsErrors , int warningCountShouldBe , int errorCountShouldBe )
532+ [ InlineData ( "MSB1234" , false , 1 , 1 , false ) ]
533+ [ InlineData ( "MSB0000" , true , 0 , 2 , false ) ]
534+ public void TaskReturnsTrue_Tests ( string warningsAsErrors , bool treatAllWarningsAsErrors , int warningCountShouldBe , int errorCountShouldBe , bool useMSPrefix = true )
375535 {
536+ string prefix = useMSPrefix ? "MSBuild" : "" ;
376537 using ( TestEnvironment env = TestEnvironment . Create ( _output ) )
377538 {
378539 TransientTestProjectWithFiles proj = env . CreateTestProjectWithFiles ( $@ "
379540 <Project>
380541 <UsingTask TaskName = ""ReturnFailureWithoutLoggingErrorTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
381542 <UsingTask TaskName = ""CustomLogAndReturnTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
382543 <PropertyGroup>
383- <MSBuildTreatWarningsAsErrors >{ treatAllWarningsAsErrors } </MSBuildTreatWarningsAsErrors >
384- <MSBuildWarningsAsErrors >{ warningsAsErrors } </MSBuildWarningsAsErrors >
544+ <{ prefix } TreatWarningsAsErrors >{ treatAllWarningsAsErrors } </{ prefix } TreatWarningsAsErrors >
545+ <{ prefix } WarningsAsErrors >{ warningsAsErrors } </{ prefix } WarningsAsErrors >
385546 </PropertyGroup>
386547 <Target Name='Build'>
387548 <CustomLogAndReturnTask Return=""true"" WarningCode=""MSB1234""/>
0 commit comments