1+ // Licensed to the .NET Foundation under one or more agreements.
2+ // The .NET Foundation licenses this file to you under the MIT license.
3+
4+ #nullable disable
5+
6+ using Microsoft . DotNet . Cli . Commands . Restore ;
7+ using Microsoft . DotNet . Cli . Utils ;
8+ using Microsoft . DotNet . Cli . Commands . Build ;
9+
10+ namespace Microsoft . NET . Restore . Tests
11+ {
12+ public class GivenThatWeWantRestoreOptimizations : SdkTest
13+ {
14+ public GivenThatWeWantRestoreOptimizations ( ITestOutputHelper log ) : base ( log )
15+ {
16+ }
17+
18+ [ Fact ]
19+ public void It_adds_EnableDefaultItems_false_by_default ( )
20+ {
21+ // Arrange
22+ var originalArgs = new [ ] { "-target:Restore" , "MyProject.csproj" } ;
23+
24+ // Act
25+ var optimizedArgs = Constants . AddRestoreOptimizations ( originalArgs ) ;
26+
27+ // Assert
28+ optimizedArgs . Should ( ) . Contain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
29+ }
30+
31+ [ Fact ]
32+ public void It_does_not_add_EnableDefaultItems_false_when_user_specified_EnableDefaultItems_true ( )
33+ {
34+ // Arrange
35+ var originalArgs = new [ ] { "-target:Restore" , "-property:EnableDefaultItems=true" , "MyProject.csproj" } ;
36+
37+ // Act
38+ var optimizedArgs = Constants . AddRestoreOptimizations ( originalArgs ) ;
39+
40+ // Assert
41+ optimizedArgs . Should ( ) . NotContain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
42+ optimizedArgs . Should ( ) . Contain ( "-property:EnableDefaultItems=true" ) ;
43+ }
44+
45+ [ Fact ]
46+ public void It_does_not_add_EnableDefaultItems_false_when_user_specified_EnableDefaultItems_false ( )
47+ {
48+ // Arrange
49+ var originalArgs = new [ ] { "-target:Restore" , "-property:EnableDefaultItems=false" , "MyProject.csproj" } ;
50+
51+ // Act
52+ var optimizedArgs = Constants . AddRestoreOptimizations ( originalArgs ) ;
53+
54+ // Assert
55+ var enableDefaultItemsArgs = optimizedArgs . Where ( arg => arg . Contains ( "EnableDefaultItems" ) ) . ToList ( ) ;
56+ enableDefaultItemsArgs . Should ( ) . ContainSingle ( ) ;
57+ enableDefaultItemsArgs . Single ( ) . Should ( ) . Be ( "-property:EnableDefaultItems=false" ) ;
58+ }
59+
60+ [ Fact ]
61+ public void It_respects_user_EnableDefaultItems_with_short_property_syntax ( )
62+ {
63+ // Arrange
64+ var originalArgs = new [ ] { "-target:Restore" , "-p:EnableDefaultItems=true" , "MyProject.csproj" } ;
65+
66+ // Act
67+ var optimizedArgs = Constants . AddRestoreOptimizations ( originalArgs ) ;
68+
69+ // Assert
70+ optimizedArgs . Should ( ) . NotContain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
71+ optimizedArgs . Should ( ) . Contain ( "-p:EnableDefaultItems=true" ) ;
72+ }
73+
74+ [ Fact ]
75+ public void It_respects_user_EnableDefaultItems_with_double_dash_syntax ( )
76+ {
77+ // Arrange
78+ var originalArgs = new [ ] { "-target:Restore" , "--property:EnableDefaultItems=true" , "MyProject.csproj" } ;
79+
80+ // Act
81+ var optimizedArgs = Constants . AddRestoreOptimizations ( originalArgs ) ;
82+
83+ // Assert
84+ optimizedArgs . Should ( ) . NotContain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
85+ optimizedArgs . Should ( ) . Contain ( "--property:EnableDefaultItems=true" ) ;
86+ }
87+
88+ [ Fact ]
89+ public void It_handles_case_insensitive_property_names ( )
90+ {
91+ // Arrange
92+ var originalArgs = new [ ] { "-target:Restore" , "-property:enabledefaultitems=true" , "MyProject.csproj" } ;
93+
94+ // Act
95+ var optimizedArgs = Constants . AddRestoreOptimizations ( originalArgs ) ;
96+
97+ // Assert
98+ optimizedArgs . Should ( ) . NotContain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
99+ optimizedArgs . Should ( ) . Contain ( "-property:enabledefaultitems=true" ) ;
100+ }
101+
102+ [ Fact ]
103+ public void RestoreCommand_CreateForwarding_includes_optimization ( )
104+ {
105+ // Arrange
106+ var originalArgs = new [ ] { "-target:Restore" , "MyProject.csproj" } ;
107+
108+ // Act
109+ var restoreCommand = RestoreCommand . CreateForwarding ( originalArgs ) ;
110+
111+ // Assert
112+ var msbuildArgs = restoreCommand . MSBuildArguments ;
113+ msbuildArgs . Should ( ) . Contain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
114+ }
115+
116+ [ Fact ]
117+ public void RestoreCommand_CreateForwarding_respects_user_EnableDefaultItems ( )
118+ {
119+ // Arrange
120+ var originalArgs = new [ ] { "-target:Restore" , "-property:EnableDefaultItems=true" , "MyProject.csproj" } ;
121+
122+ // Act
123+ var restoreCommand = RestoreCommand . CreateForwarding ( originalArgs ) ;
124+
125+ // Assert
126+ var msbuildArgs = restoreCommand . MSBuildArguments ;
127+ msbuildArgs . Should ( ) . NotContain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
128+ msbuildArgs . Should ( ) . Contain ( "-property:EnableDefaultItems=true" ) ;
129+ }
130+
131+ [ Fact ]
132+ public void SeparateRestoreCommand_includes_optimization_when_needed ( )
133+ {
134+ // This tests the optimization in the separate restore command path
135+ // which is used when certain properties are excluded from the main restore
136+
137+ // Arrange - use args that trigger separate restore (like specifying TargetFramework)
138+ var args = new [ ] { "-f" , "net6.0" , "MyProject.csproj" } ;
139+
140+ // Act
141+ var buildCommand = ( RestoringCommand ) BuildCommand . FromArgs ( args , "msbuildpath" ) ;
142+
143+ // Assert
144+ buildCommand . SeparateRestoreCommand . Should ( ) . NotBeNull ( ) ;
145+ var restoreArgs = buildCommand . SeparateRestoreCommand . MSBuildArguments ;
146+ restoreArgs . Should ( ) . Contain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
147+ }
148+
149+ [ Fact ]
150+ public void SeparateRestoreCommand_respects_user_EnableDefaultItems ( )
151+ {
152+ // Arrange - use args that trigger separate restore and specify EnableDefaultItems
153+ var args = new [ ] { "-f" , "net6.0" , "-property:EnableDefaultItems=true" , "MyProject.csproj" } ;
154+
155+ // Act
156+ var buildCommand = ( RestoringCommand ) BuildCommand . FromArgs ( args , "msbuildpath" ) ;
157+
158+ // Assert
159+ buildCommand . SeparateRestoreCommand . Should ( ) . NotBeNull ( ) ;
160+ var restoreArgs = buildCommand . SeparateRestoreCommand . MSBuildArguments ;
161+ restoreArgs . Should ( ) . NotContain ( $ "-property:{ Constants . EnableDefaultItems } =false") ;
162+ restoreArgs . Should ( ) . Contain ( "-property:EnableDefaultItems=true" ) ;
163+ }
164+ }
165+ }
0 commit comments