2016-08-22 12:24:10 -07:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Linq ;
using FluentAssertions ;
using Microsoft.DotNet.Tools.Test.Utilities ;
using Xunit ;
using Microsoft.DotNet.ProjectJsonMigration ;
using System ;
using System.IO ;
using Microsoft.Build.Construction ;
2016-08-23 13:50:05 -07:00
using Microsoft.DotNet.ProjectJsonMigration.Rules ;
2016-08-22 12:24:10 -07:00
namespace Microsoft.DotNet.ProjectJsonMigration.Tests
{
public class GivenThatIWantToMigrateScripts : TestBase
{
[Theory]
2016-09-15 15:54:10 -07:00
[InlineData("compile:TargetFramework", "$(TargetFramework)")]
[InlineData("publish:TargetFramework", "$(TargetFramework)")]
2016-08-23 13:50:05 -07:00
[InlineData("compile:FullTargetFramework", "$(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion)")]
2016-08-22 12:24:10 -07:00
[InlineData("compile:Configuration", "$(Configuration)")]
[InlineData("compile:OutputFile", "$(TargetPath)")]
[InlineData("compile:OutputDir", "$(TargetDir)")]
[InlineData("publish:ProjectPath", "$(MSBuildThisFileDirectory)")]
[InlineData("publish:Configuration", "$(Configuration)")]
[InlineData("publish:OutputPath", "$(TargetDir)")]
2016-08-23 13:50:05 -07:00
[InlineData("publish:FullTargetFramework", "$(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion)")]
2016-08-22 12:24:10 -07:00
[InlineData("project:Version", "$(Version)")]
2016-08-23 13:50:05 -07:00
[InlineData("project:Name", "$(AssemblyName)")]
2016-08-22 12:24:10 -07:00
[InlineData("project:Directory", "$(MSBuildProjectDirectory)")]
2016-08-23 13:50:05 -07:00
[InlineData("publish:Runtime", "$(RuntimeIdentifier)")]
2016-08-22 12:24:10 -07:00
public void Formatting_script_commands_replaces_variables_with_the_right_msbuild_properties (
string variable ,
string msbuildReplacement )
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
scriptMigrationRule . ReplaceScriptVariables ( $"%{variable}%" ) . Should ( ) . Be ( msbuildReplacement ) ;
}
[Theory]
[InlineData("compile:ResponseFile")]
[InlineData("compile:CompilerExitCode")]
[InlineData("compile:RuntimeOutputDir")]
[InlineData("compile:RuntimeIdentifier")]
public void Formatting_script_commands_throws_when_variable_is_unsupported ( string unsupportedVariable )
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
Action formatScriptAction = ( ) = > scriptMigrationRule . ReplaceScriptVariables ( $"%{unsupportedVariable}%" ) ;
formatScriptAction . ShouldThrow < Exception > ( )
. Where ( exc = > exc . Message . Contains ( "is currently an unsupported script variable for project migration" ) ) ;
}
[Theory]
[InlineData("precompile", "Build")]
[InlineData("prepublish", "Publish")]
public void Migrating_pre_scripts_populates_BeforeTargets_with_appropriate_target ( string scriptName , string targetName )
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
ProjectRootElement mockProj = ProjectRootElement . Create ( ) ;
var commands = new string [ ] { "fakecommand" } ;
var target = scriptMigrationRule . MigrateScriptSet ( mockProj , mockProj . AddPropertyGroup ( ) , commands , scriptName ) ;
target . BeforeTargets . Should ( ) . Be ( targetName ) ;
}
[Theory]
[InlineData("postcompile", "Build")]
[InlineData("postpublish", "Publish")]
public void Migrating_post_scripts_populates_AfterTargets_with_appropriate_target ( string scriptName , string targetName )
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
ProjectRootElement mockProj = ProjectRootElement . Create ( ) ;
2016-08-30 15:39:27 -07:00
var commands = new [ ] { "fakecommand" } ;
2016-08-22 12:24:10 -07:00
var target = scriptMigrationRule . MigrateScriptSet ( mockProj , mockProj . AddPropertyGroup ( ) , commands , scriptName ) ;
target . AfterTargets . Should ( ) . Be ( targetName ) ;
}
[Theory]
[InlineData("precompile")]
[InlineData("postcompile")]
[InlineData("prepublish")]
[InlineData("postpublish")]
public void Migrating_scripts_with_multiple_commands_creates_Exec_task_for_each ( string scriptName )
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
ProjectRootElement mockProj = ProjectRootElement . Create ( ) ;
2016-08-30 15:39:27 -07:00
var commands = new [ ] { "fakecommand1" , "fakecommand2" , "mockcommand3" } ;
2016-08-22 12:24:10 -07:00
var commandsInTask = commands . ToDictionary ( c = > c , c = > false ) ;
var target = scriptMigrationRule . MigrateScriptSet ( mockProj , mockProj . AddPropertyGroup ( ) , commands , scriptName ) ;
foreach ( var task in target . Tasks )
{
var taskCommand = task . GetParameter ( "Command" ) ;
var originalCommandCandidates = commands . Where ( c = > taskCommand . Contains ( c ) ) ;
originalCommandCandidates . Count ( ) . Should ( ) . Be ( 1 ) ;
var command = originalCommandCandidates . First ( ) ;
commandsInTask [ command ] . Should ( ) . Be ( false , "Expected to find each element from commands Array once" ) ;
commandsInTask [ command ] = true ;
}
commandsInTask . All ( commandInTask = > commandInTask . Value )
. Should ( )
. BeTrue ( "Expected each element from commands array to be found in a task" ) ;
}
[Theory]
[InlineData("precompile")]
[InlineData("postcompile")]
[InlineData("prepublish")]
[InlineData("postpublish")]
public void Migrated_ScriptSet_has_Exec_and_replaces_variables ( string scriptName )
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
ProjectRootElement mockProj = ProjectRootElement . Create ( ) ;
2016-09-15 15:54:10 -07:00
var commands = new [ ] { "%compile:FullTargetFramework%" , "%compile:Configuration%" } ;
2016-08-22 12:24:10 -07:00
var target = scriptMigrationRule . MigrateScriptSet ( mockProj , mockProj . AddPropertyGroup ( ) , commands , scriptName ) ;
target . Tasks . Count ( ) . Should ( ) . Be ( commands . Length ) ;
foreach ( var task in target . Tasks )
{
var taskCommand = task . GetParameter ( "Command" ) ;
var commandIndex = Array . IndexOf ( commands , taskCommand ) ;
commandIndex . Should ( ) . Be ( - 1 , "Expected command array elements to be replaced by appropriate msbuild properties" ) ;
}
}
2016-09-15 15:54:10 -07:00
[Fact]
public void Formatting_script_commands_replaces_unknown_variables_with_MSBuild_Property_for_environment_variable_support ( )
2016-08-22 12:24:10 -07:00
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
2016-09-15 15:54:10 -07:00
scriptMigrationRule . ReplaceScriptVariables ( $"%UnknownVariable%" ) . Should ( ) . Be ( "$(UnknownVariable)" ) ;
2016-08-22 12:24:10 -07:00
}
2016-09-15 15:54:10 -07:00
[Fact]
public void Migrating_scripts_creates_target_with_IsCrossTargettingBuild_not_equal_true_Condition ( )
2016-08-22 12:24:10 -07:00
{
var scriptMigrationRule = new MigrateScriptsRule ( ) ;
2016-09-15 15:54:10 -07:00
ProjectRootElement mockProj = ProjectRootElement . Create ( ) ;
2016-08-22 12:24:10 -07:00
2016-09-15 15:54:10 -07:00
var commands = new [ ] { "compile:FullTargetFramework" , "compile:Configuration" } ;
2016-08-30 15:39:27 -07:00
2016-09-15 15:54:10 -07:00
var target = scriptMigrationRule . MigrateScriptSet ( mockProj , mockProj . AddPropertyGroup ( ) , commands , "prepublish" ) ;
target . Condition . Should ( ) . Be ( " '$(IsCrossTargetingBuild)' != 'true' " ) ;
2016-08-30 15:39:27 -07:00
}
2016-08-22 12:24:10 -07:00
}
}