@@ -78,6 +78,32 @@ public void ItReturnsNullIfTheVersionFoundDoesNotSatisfyTheMinVersion()
7878 + " specified in the project, or increase the version specified in global.json." ) ;
7979 }
8080
81+ [ Fact ]
82+ public void ItReturnsNullWhenTheSDKRequiresAHigherVersionOfMSBuildThanTheOneAvailable ( )
83+ {
84+ var environment = new TestEnvironment ( ) ;
85+ var expected =
86+ environment . CreateSdkDirectory ( ProgramFiles . X64 , "Some.Test.Sdk" , "99.99.99" , new Version ( 2 , 0 ) ) ;
87+ environment . CreateMuxerAndAddToPath ( ProgramFiles . X64 ) ;
88+
89+ var resolver = environment . CreateResolver ( ) ;
90+ var result = ( MockResult ) resolver . Resolve (
91+ new SdkReference ( "Some.Test.Sdk" , null , "99.99.99" ) ,
92+ new MockContext
93+ {
94+ ProjectFilePath = environment . TestDirectory . FullName
95+ } ,
96+ new MockFactory ( ) ) ;
97+
98+ result . Success . Should ( ) . BeFalse ( ) ;
99+ result . Path . Should ( ) . BeNull ( ) ;
100+ result . Version . Should ( ) . BeNull ( ) ;
101+ result . Warnings . Should ( ) . BeNullOrEmpty ( ) ;
102+ result . Errors . Should ( ) . Contain ( "Version 99.99.99 of the SDK requires at least version 2.0 of msbuild."
103+ + " The current available version of msbuild is 1.0. Change the SDK specified in global.json to an older"
104+ + " version that requires the msbuild version currently available." ) ;
105+ }
106+
81107 [ Fact ]
82108 public void ItReturnsTheVersionIfItIsEqualToTheMinVersion ( )
83109 {
@@ -147,27 +173,63 @@ public SdkResolver CreateResolver()
147173 => new DotNetMSBuildSdkResolver ( GetEnvironmentVariable ) ;
148174
149175 public DirectoryInfo GetSdkDirectory ( ProgramFiles programFiles , string sdkName , string sdkVersion )
150- => TestDirectory . GetDirectory ( GetProgramFilesDirectory ( programFiles ) . FullName , "dotnet" , "sdk" , sdkVersion , "Sdks" , sdkName , "Sdk" ) ;
176+ => TestDirectory . GetDirectory (
177+ GetProgramFilesDirectory ( programFiles ) . FullName ,
178+ "dotnet" ,
179+ "sdk" ,
180+ sdkVersion ,
181+ "Sdks" ,
182+ sdkName ,
183+ "Sdk" ) ;
151184
152185 public DirectoryInfo GetProgramFilesDirectory ( ProgramFiles programFiles )
153186 => TestDirectory . GetDirectory ( $ "ProgramFiles{ programFiles } ") ;
154187
155- public DirectoryInfo CreateSdkDirectory ( ProgramFiles programFiles , string sdkVersion , string sdkName )
188+ public DirectoryInfo CreateSdkDirectory (
189+ ProgramFiles programFiles ,
190+ string sdkName ,
191+ string sdkVersion ,
192+ Version minimumMSBuildVersion = null )
156193 {
157- var dir = GetSdkDirectory ( programFiles , sdkVersion , sdkName ) ;
194+ var dir = GetSdkDirectory ( programFiles , sdkName , sdkVersion ) ;
158195 dir . Create ( ) ;
196+
197+ CreateMSBuildRequiredVersionFile ( programFiles , sdkVersion , minimumMSBuildVersion ) ;
198+
159199 return dir ;
160200 }
161201
162202 public void CreateMuxerAndAddToPath ( ProgramFiles programFiles )
163203 {
164- var muxerDirectory = TestDirectory . GetDirectory ( GetProgramFilesDirectory ( programFiles ) . FullName , "dotnet" ) ;
204+ var muxerDirectory =
205+ TestDirectory . GetDirectory ( GetProgramFilesDirectory ( programFiles ) . FullName , "dotnet" ) ;
165206
166207 new FileInfo ( Path . Combine ( muxerDirectory . FullName , Muxer ) ) . Create ( ) ;
167208
168209 PathEnvironmentVariable = $ "{ muxerDirectory } { Path . PathSeparator } { PathEnvironmentVariable } ";
169210 }
170211
212+ private void CreateMSBuildRequiredVersionFile (
213+ ProgramFiles programFiles ,
214+ string sdkVersion ,
215+ Version minimumMSBuildVersion )
216+ {
217+ if ( minimumMSBuildVersion == null )
218+ {
219+ minimumMSBuildVersion = new Version ( 1 , 0 ) ;
220+ }
221+
222+ var cliDirectory = TestDirectory . GetDirectory (
223+ GetProgramFilesDirectory ( programFiles ) . FullName ,
224+ "dotnet" ,
225+ "sdk" ,
226+ sdkVersion ) ;
227+
228+ File . WriteAllText (
229+ Path . Combine ( cliDirectory . FullName , "minimumMSBuildVersion" ) ,
230+ minimumMSBuildVersion . ToString ( ) ) ;
231+ }
232+
171233 public void CreateGlobalJson ( DirectoryInfo directory , string version )
172234 => File . WriteAllText ( directory . GetFile ( "global.json" ) . FullName ,
173235 $@ "{{ ""sdk"": {{ ""version"": ""{ version } "" }} }}") ;
@@ -188,6 +250,12 @@ private sealed class MockContext : SdkResolverContext
188250 {
189251 public new string ProjectFilePath { get => base . ProjectFilePath ; set => base . ProjectFilePath = value ; }
190252 public new string SolutionFilePath { get => base . SolutionFilePath ; set => base . SolutionFilePath = value ; }
253+ public new Version MSBuildVersion { get => base . MSBuildVersion ; set => base . MSBuildVersion = value ; }
254+
255+ public MockContext ( )
256+ {
257+ MSBuildVersion = new Version ( 1 , 0 ) ;
258+ }
191259 }
192260
193261 private sealed class MockFactory : SdkResultFactory
0 commit comments