2016-11-16 15:49:25 -08: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.
2016-11-22 14:41:56 -08:00
using FluentAssertions ;
using Microsoft.Build.Construction ;
2017-06-20 16:16:38 -07:00
using Microsoft.DotNet.Tools ;
2016-11-22 14:41:56 -08:00
using Microsoft.DotNet.Tools.Test.Utilities ;
2016-11-29 15:42:16 -08:00
using Msbuild.Tests.Utilities ;
2016-11-16 15:49:25 -08:00
using System ;
using System.IO ;
2016-12-08 14:56:31 -08:00
using System.Linq ;
2016-11-16 15:49:25 -08:00
using Xunit ;
2017-01-06 14:08:50 -08:00
namespace Microsoft.DotNet.Cli.Add.Reference.Tests
2016-11-16 15:49:25 -08:00
{
2017-01-06 14:08:50 -08:00
public class GivenDotnetAddReference : TestBase
2016-11-16 15:49:25 -08:00
{
2018-04-09 14:18:24 -07:00
private const string HelpText = @ "Usage: dotnet add <PROJECT> reference [options] <PROJECT_PATH>
2016-12-16 01:04:09 -08:00
Arguments :
2018-04-09 14:18:24 -07:00
< PROJECT > The project file to operate on . If a file is not specified , the command will search the current directory for one .
< PROJECT_PATH > Project to project references to add
2016-12-16 01:04:09 -08:00
Options :
2017-05-09 21:05:09 -07:00
- h , - - help Show help information .
2017-03-22 15:26:58 -07:00
- f , - - framework < FRAMEWORK > Add reference only when targeting a specific framework
2016-12-16 01:04:09 -08:00
";
2017-06-26 17:17:51 -07:00
private const string AddCommandHelpText = @ "Usage: dotnet add [options] <PROJECT> [command]
2017-05-04 01:01:35 +02:00
Arguments :
< PROJECT > The project file to operate on . If a file is not specified , the command will search the current directory for one .
Options :
2017-05-09 21:05:09 -07:00
- h , - - help Show help information .
2017-05-04 01:01:35 +02:00
Commands :
2018-04-09 14:18:24 -07:00
package < PACKAGE_NAME > Add a NuGet package reference to the project .
reference < PROJECT_PATH > Add a project - to - project reference to the project .
2017-05-04 01:01:35 +02:00
";
2016-11-16 15:49:25 -08:00
const string FrameworkNet451Arg = "-f net451" ;
const string ConditionFrameworkNet451 = "== 'net451'" ;
const string FrameworkNetCoreApp10Arg = "-f netcoreapp1.0" ;
const string ConditionFrameworkNetCoreApp10 = "== 'netcoreapp1.0'" ;
2017-06-20 16:16:38 -07:00
static readonly string ProjectNotCompatibleErrorMessageRegEx = string . Format ( CommonLocalizableStrings . ProjectNotCompatibleWithFrameworks , "[^`]*" ) ;
static readonly string ProjectDoesNotTargetFrameworkErrorMessageRegEx = string . Format ( CommonLocalizableStrings . ProjectDoesNotTargetFramework , "[^`]*" , "[^`]*" ) ;
2016-12-08 14:56:31 -08:00
static readonly string [ ] DefaultFrameworks = new string [ ] { "netcoreapp1.0" , "net451" } ;
2016-12-27 13:18:54 -08:00
2016-11-22 10:45:45 -08:00
private TestSetup Setup ( [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( Setup ) , string identifier = "" )
2016-11-16 15:49:25 -08:00
{
2016-11-22 10:45:45 -08:00
return new TestSetup (
2016-11-22 14:41:56 -08:00
TestAssets . Get ( TestSetup . TestGroup , TestSetup . ProjectName )
2016-11-23 13:46:44 -08:00
. CreateInstance ( callingMethod : callingMethod , identifier : identifier )
2016-11-22 14:41:56 -08:00
. WithSourceFiles ( )
. Root
. FullName ) ;
2016-11-16 15:49:25 -08:00
}
private ProjDir NewDir ( [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( NewDir ) , string identifier = "" )
{
2017-02-15 15:35:03 -08:00
return new ProjDir ( TestAssets . CreateTestDirectory ( callingMethod : callingMethod , identifier : identifier ) . FullName ) ;
2016-11-16 15:49:25 -08:00
}
2017-02-15 15:35:03 -08:00
private ProjDir NewLib ( string dir = null , [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( NewDir ) , string identifier = "" )
2016-11-16 15:49:25 -08:00
{
2017-02-15 15:35:03 -08:00
var projDir = dir = = null ? NewDir ( callingMethod : callingMethod , identifier : identifier ) : new ProjDir ( dir ) ;
2016-11-16 15:49:25 -08:00
try
{
2017-07-10 15:57:30 -07:00
string args = $"classlib -o \" { projDir . Path } \ " --debug:ephemeral-hive --no-restore" ;
2017-01-31 17:31:37 -08:00
new NewCommandShim ( )
2017-02-15 15:35:03 -08:00
. WithWorkingDirectory ( projDir . Path )
2017-01-31 17:31:37 -08:00
. ExecuteWithCapturedOutput ( args )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
}
catch ( System . ComponentModel . Win32Exception e )
{
2017-02-15 15:35:03 -08:00
throw new Exception ( $"Intermittent error in `dotnet new` occurred when running it in dir `{projDir.Path}`\nException:\n{e}" ) ;
2016-11-16 15:49:25 -08:00
}
2017-02-15 15:35:03 -08:00
return projDir ;
2016-11-16 15:49:25 -08:00
}
2016-12-08 14:56:31 -08:00
private static void SetTargetFrameworks ( ProjDir proj , string [ ] frameworks )
{
var csproj = proj . CsProj ( ) ;
csproj . AddProperty ( "TargetFrameworks" , string . Join ( ";" , frameworks ) ) ;
csproj . Save ( ) ;
}
2017-02-15 15:35:03 -08:00
private ProjDir NewLibWithFrameworks ( string dir = null , [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( NewDir ) , string identifier = "" )
2016-12-08 14:56:31 -08:00
{
2017-02-15 15:35:03 -08:00
var ret = NewLib ( dir , callingMethod : callingMethod , identifier : identifier ) ;
2016-12-08 14:56:31 -08:00
SetTargetFrameworks ( ret , DefaultFrameworks ) ;
return ret ;
}
2016-11-16 15:49:25 -08:00
[Theory]
[InlineData("--help")]
[InlineData("-h")]
public void WhenHelpOptionIsPassedItPrintsUsage ( string helpArg )
{
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( ) . Execute ( helpArg ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
2016-11-16 15:49:25 -08:00
}
2016-12-16 10:23:26 -08:00
[Theory]
[InlineData("")]
[InlineData("unknownCommandName")]
public void WhenNoCommandIsPassedItPrintsError ( string commandName )
{
var cmd = new DotnetCommand ( )
. ExecuteWithCapturedOutput ( $"add {commandName}" ) ;
cmd . Should ( ) . Fail ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdErr . Should ( ) . Be ( CommonLocalizableStrings . RequiredCommandNotPassed ) ;
cmd . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( AddCommandHelpText ) ;
2016-12-16 10:23:26 -08:00
}
2016-12-13 14:31:35 -10:00
[Fact]
public void WhenTooManyArgumentsArePassedItPrintsError ( )
{
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-12-13 14:31:35 -10:00
. WithProject ( "one two three" )
. Execute ( "proj.csproj" ) ;
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
2017-06-27 13:26:14 -07:00
cmd . StdErr . Should ( ) . BeVisuallyEquivalentTo ( $@"{string.Format(CommandLine.LocalizableStrings.UnrecognizedCommandOrArgument, " two ")}
{ string . Format ( CommandLine . LocalizableStrings . UnrecognizedCommandOrArgument , "three" ) } ");
2016-12-13 14:31:35 -10:00
}
2016-11-16 15:49:25 -08:00
[Theory]
[InlineData("idontexist.csproj")]
[InlineData("ihave?inv@lid/char\\acters")]
public void WhenNonExistingProjectIsPassedItPrintsErrorAndUsage ( string projName )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 15:49:25 -08:00
. WithProject ( projName )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
2017-06-20 16:16:38 -07:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . CouldNotFindProjectOrDirectory , projName ) ) ;
cmd . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenBrokenProjectIsPassedItPrintsErrorAndUsage ( )
{
string projName = "Broken/Broken.csproj" ;
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 15:49:25 -08:00
. WithProject ( projName )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
2017-06-20 16:16:38 -07:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectIsInvalid , "Broken/Broken.csproj" ) ) ;
cmd . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenMoreThanOneProjectExistsInTheDirectoryItPrintsErrorAndUsage ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2016-12-16 01:04:09 -08:00
var workingDir = Path . Combine ( setup . TestRoot , "MoreThanOne" ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-12-16 01:04:09 -08:00
. WithWorkingDirectory ( workingDir )
2016-11-22 13:58:16 -08:00
. Execute ( $"\" { setup . ValidRefCsprojRelToOtherProjPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
2017-06-20 16:16:38 -07:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . MoreThanOneProjectInDirectory , workingDir + Path . DirectorySeparatorChar ) ) ;
cmd . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenNoProjectsExistsInTheDirectoryItPrintsErrorAndUsage ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
2017-06-20 16:16:38 -07:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . CouldNotFindAnyProjectInDirectory , setup . TestRoot + Path . DirectorySeparatorChar ) ) ;
cmd . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void ItAddsRefWithoutCondAndPrintsStatus ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-12-16 01:04:09 -08:00
2016-11-16 15:49:25 -08:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void ItAddsRefWithCondAndPrintsStatus ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithoutCondIsPresentItAddsDifferentRefWithoutCond ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
2017-01-06 14:08:50 -08:00
new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . LibCsprojPath } \ "" )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-16 15:49:25 -08:00
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithCondIsPresentItAddsDifferentRefWithCond ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
2017-01-06 14:08:50 -08:00
new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojPath } \ "" )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ; ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithCondIsPresentItAddsRefWithDifferentCond ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
2017-01-06 14:08:50 -08:00
new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNetCoreApp10Arg} \" { setup . ValidRefCsprojPath } \ "" )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithConditionIsPresentItAddsDifferentRefWithoutCond ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
2017-01-06 14:08:50 -08:00
new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojPath } \ "" )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithNoCondAlreadyExistsItDoesntDuplicate ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
2017-01-06 14:08:50 -08:00
new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-16 15:49:25 -08:00
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectAlreadyHasAreference , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithCondOnItemAlreadyExistsItDoesntDuplicate ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithExistingRefCondOnItem" ) ) ;
2016-11-16 15:49:25 -08:00
2016-11-22 10:45:45 -08:00
string contentBefore = proj . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectAlreadyHasAreference , @"..\Lib\Lib.csproj" ) ) ;
2016-11-22 10:45:45 -08:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithCondOnItemGroupAlreadyExistsItDoesntDuplicate ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
2017-01-06 14:08:50 -08:00
new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" )
2016-11-16 15:49:25 -08:00
. Should ( ) . Pass ( ) ;
var csprojContentBefore = lib . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectAlreadyHasAreference , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( csprojContentBefore ) ;
}
[Fact]
public void WhenRefWithCondWithWhitespaceOnItemGroupExistsItDoesntDuplicate ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithExistingRefCondWhitespaces" ) ) ;
2016-11-16 15:49:25 -08:00
2016-11-22 10:45:45 -08:00
string contentBefore = proj . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjName )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectAlreadyHasAreference , @"..\Lib\Lib.csproj" ) ) ;
2016-11-22 10:45:45 -08:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithoutCondAlreadyExistsInNonUniformItemGroupItDoesntDuplicate ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefNoCondNonUniform" ) ) ;
2016-11-16 15:49:25 -08:00
2016-11-22 10:45:45 -08:00
string contentBefore = proj . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjName )
. Execute ( $"\" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectAlreadyHasAreference , @"..\Lib\Lib.csproj" ) ) ;
2016-11-22 10:45:45 -08:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithoutCondAlreadyExistsInNonUniformItemGroupItAddsDifferentRefInDifferentGroup ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefNoCondNonUniform" ) ) ;
2016-11-16 15:49:25 -08:00
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 15:49:25 -08:00
. WithProject ( proj . CsProjPath )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"..\ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithCondAlreadyExistsInNonUniformItemGroupItDoesntDuplicate ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefCondNonUniform" ) ) ;
2016-11-16 15:49:25 -08:00
2016-11-22 10:45:45 -08:00
string contentBefore = proj . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjName )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectAlreadyHasAreference , @"..\Lib\Lib.csproj" ) ) ;
2016-11-22 10:45:45 -08:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenRefWithCondAlreadyExistsInNonUniformItemGroupItAddsDifferentRefInDifferentGroup ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefCondNonUniform" ) ) ;
2016-11-16 15:49:25 -08:00
int condBefore = proj . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 15:49:25 -08:00
. WithProject ( proj . CsProjPath )
2016-11-22 10:45:45 -08:00
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , "..\\ValidRef\\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void WhenEmptyItemGroupPresentItAddsRefInIt ( )
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "EmptyItemGroup" ) ) ;
2016-11-16 15:49:25 -08:00
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 15:49:25 -08:00
. WithProject ( proj . CsProjPath )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"..\ValidRef\ValidRef.csproj" ) ) ;
2016-11-16 15:49:25 -08:00
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void ItAddsMultipleRefsNoCondToTheSameItemGroup ( )
{
2017-06-20 16:16:38 -07:00
string OutputText = $@"{string.Format(CommonLocalizableStrings.ReferenceAddedToTheProject, @" Lib \ Lib . csproj ")}
{ string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) } ";
2016-12-16 01:04:09 -08:00
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . LibCsprojPath } \ " \"{setup.ValidRefCsprojPath}\"" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2016-12-27 13:18:54 -08:00
cmd . StdOut . Should ( ) . BeVisuallyEquivalentTo ( OutputText ) ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . LibCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
[Fact]
public void ItAddsMultipleRefsWithCondToTheSameItemGroup ( )
{
2017-06-20 16:16:38 -07:00
string OutputText = $@"{string.Format(CommonLocalizableStrings.ReferenceAddedToTheProject, @" Lib \ Lib . csproj ")}
{ string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) } ";
2016-12-16 01:04:09 -08:00
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-16 15:49:25 -08:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojPath } \ " \"{setup.ValidRefCsprojPath}\"" ) ;
2016-11-16 15:49:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2016-12-27 13:18:54 -08:00
cmd . StdOut . Should ( ) . BeVisuallyEquivalentTo ( OutputText ) ;
2016-11-16 15:49:25 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . LibCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
2016-11-21 11:38:25 -08:00
[Fact]
2016-11-16 15:49:25 -08:00
public void WhenProjectNameIsNotPassedItFindsItAndAddsReference ( )
2016-11-21 11:38:25 -08:00
{
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-21 11:38:25 -08:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-21 11:38:25 -08:00
. WithWorkingDirectory ( lib . Path )
2016-11-22 10:45:45 -08:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-21 11:38:25 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-21 11:38:25 -08:00
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 10:45:45 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-21 11:38:25 -08:00
}
2016-11-22 10:45:45 -08:00
[Fact]
2016-11-21 11:38:25 -08:00
public void WhenPassedReferenceDoesNotExistItShowsAnError ( )
{
2016-12-08 14:56:31 -08:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 10:45:45 -08:00
var contentBefore = lib . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
. Execute ( "\"IDoNotExist.csproj\"" ) ;
cmd . Should ( ) . Fail ( ) ;
2017-12-07 17:19:51 -08:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . CouldNotFindProjectOrDirectory , "IDoNotExist.csproj" ) ) ;
2016-11-22 10:45:45 -08:00
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-21 11:38:25 -08:00
}
2016-11-22 10:45:45 -08:00
[Fact]
2016-11-21 11:38:25 -08:00
public void WhenPassedMultipleRefsAndOneOfthemDoesNotExistItCancelsWholeOperation ( )
{
2016-12-08 14:56:31 -08:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 10:45:45 -08:00
var setup = Setup ( ) ;
var contentBefore = lib . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 10:45:45 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ " \"IDoNotExist.csproj\"" ) ;
cmd . Should ( ) . Fail ( ) ;
2017-12-07 17:19:51 -08:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . CouldNotFindProjectOrDirectory , "IDoNotExist.csproj" ) ) ;
2016-11-22 10:45:45 -08:00
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-21 11:38:25 -08:00
}
2016-11-22 13:58:16 -08:00
[Fact]
2016-11-21 11:38:25 -08:00
public void WhenPassedReferenceIsUsingSlashesItNormalizesItToBackslashes ( )
{
2016-11-22 13:58:16 -08:00
var setup = Setup ( ) ;
2017-02-15 15:35:03 -08:00
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
2016-11-22 13:58:16 -08:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 13:58:16 -08:00
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
2016-12-13 14:31:35 -10:00
. Execute ( $"\" { setup . ValidRefCsprojPath . Replace ( '\\' , '/' ) } \ "" ) ;
2016-11-22 13:58:16 -08:00
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
2016-11-22 13:58:16 -08:00
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-12-13 14:31:35 -10:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojRelPath . Replace ( '/' , '\\' ) ) . Should ( ) . Be ( 1 ) ;
2016-11-21 11:38:25 -08:00
}
2016-11-22 13:58:16 -08:00
[Fact]
public void WhenReferenceIsRelativeAndProjectIsNotInCurrentDirectoryReferencePathIsFixed ( )
2016-11-16 15:49:25 -08:00
{
2016-11-22 13:58:16 -08:00
var setup = Setup ( ) ;
var proj = new ProjDir ( setup . LibDir ) ;
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-11-22 13:58:16 -08:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( setup . LibCsprojPath )
. Execute ( $"\" { setup . ValidRefCsprojRelPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"..\ValidRef\ValidRef.csproj" ) ) ;
2016-11-22 13:58:16 -08:00
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-23 14:02:19 -08:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojRelToOtherProjPath . Replace ( '/' , '\\' ) ) . Should ( ) . Be ( 1 ) ;
2016-11-16 15:49:25 -08:00
}
2016-12-08 16:23:21 -08:00
[Fact]
2016-12-09 12:11:11 -08:00
public void ItCanAddReferenceWithConditionOnCompatibleFramework ( )
2016-12-08 16:23:21 -08:00
{
var setup = Setup ( ) ;
var lib = new ProjDir ( setup . LibDir ) ;
var net45lib = new ProjDir ( Path . Combine ( setup . TestRoot , "Net45Lib" ) ) ;
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-12-08 16:23:21 -08:00
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { net45lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"..\Net45Lib\Net45Lib.csproj" ) ) ;
2016-12-08 16:23:21 -08:00
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( net45lib . CsProjName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
}
[Fact]
public void ItCanAddRefWithoutCondAndTargetingSupersetOfFrameworksAndOneOfReferencesCompatible ( )
{
var setup = Setup ( ) ;
var lib = new ProjDir ( setup . LibDir ) ;
var net452netcoreapp10lib = new ProjDir ( Path . Combine ( setup . TestRoot , "Net452AndNetCoreApp10Lib" ) ) ;
int noCondBefore = net452netcoreapp10lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-12-08 16:23:21 -08:00
. WithProject ( net452netcoreapp10lib . CsProjPath )
. Execute ( $"\" { lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
2017-06-20 16:16:38 -07:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"..\Lib\Lib.csproj" ) ) ;
2016-12-08 16:23:21 -08:00
var csproj = net452netcoreapp10lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeContaining ( lib . CsProjName ) . Should ( ) . Be ( 1 ) ;
}
[Theory]
[InlineData("net45")]
[InlineData("net40")]
[InlineData("netcoreapp1.1")]
[InlineData("nonexistingframeworkname")]
public void WhenFrameworkSwitchIsNotMatchingAnyOfTargetedFrameworksItPrintsError ( string framework )
{
2017-08-09 23:46:57 -07:00
var setup = Setup ( framework ) ;
2016-12-08 16:23:21 -08:00
var lib = new ProjDir ( setup . LibDir ) ;
var net45lib = new ProjDir ( Path . Combine ( setup . TestRoot , "Net45Lib" ) ) ;
var csProjContent = lib . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-12-08 16:23:21 -08:00
. WithProject ( lib . CsProjPath )
. Execute ( $"-f {framework} \" { net45lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Fail ( ) ;
2017-06-20 16:16:38 -07:00
cmd . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ProjectDoesNotTargetFramework , setup . LibCsprojPath , framework ) ) ;
2016-12-16 01:04:09 -08:00
2016-12-08 16:23:21 -08:00
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( csProjContent ) ;
}
[Theory]
[InlineData("")]
[InlineData("-f net45")]
public void WhenIncompatibleFrameworkDetectedItPrintsError ( string frameworkArg )
{
var setup = Setup ( ) ;
var lib = new ProjDir ( setup . LibDir ) ;
var net45lib = new ProjDir ( Path . Combine ( setup . TestRoot , "Net45Lib" ) ) ;
var csProjContent = net45lib . CsProjContent ( ) ;
2017-01-06 14:08:50 -08:00
var cmd = new AddReferenceCommand ( )
2016-12-08 16:23:21 -08:00
. WithProject ( net45lib . CsProjPath )
. Execute ( $"{frameworkArg} \" { lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Fail ( ) ;
2016-12-09 12:11:11 -08:00
cmd . StdErr . Should ( ) . MatchRegex ( ProjectNotCompatibleErrorMessageRegEx ) ;
2016-12-13 14:15:35 -08:00
cmd . StdErr . Should ( ) . MatchRegex ( " - net45" ) ;
2016-12-08 16:23:21 -08:00
net45lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( csProjContent ) ;
}
2017-12-07 17:19:51 -08:00
[Fact]
public void WhenDirectoryContainingProjectIsGivenReferenceIsAdded ( )
{
var setup = Setup ( ) ;
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
var result = new AddReferenceCommand ( )
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { Path . GetDirectoryName ( setup . ValidRefCsprojPath ) } \ "" ) ;
result . Should ( ) . Pass ( ) ;
result . StdOut . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . ReferenceAddedToTheProject , @"ValidRef\ValidRef.csproj" ) ) ;
result . StdErr . Should ( ) . BeEmpty ( ) ;
}
[Fact]
public void WhenDirectoryContainsNoProjectsItCancelsWholeOperation ( )
{
var setup = Setup ( ) ;
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
var reference = "Empty" ;
var result = new AddReferenceCommand ( )
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( reference ) ;
result . Should ( ) . Fail ( ) ;
result . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
result . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . CouldNotFindAnyProjectInDirectory , reference ) ) ;
}
[Fact]
public void WhenDirectoryContainsMultipleProjectsItCancelsWholeOperation ( )
{
var setup = Setup ( ) ;
var lib = NewLibWithFrameworks ( dir : setup . TestRoot ) ;
var reference = "MoreThanOne" ;
var result = new AddReferenceCommand ( )
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( reference ) ;
result . Should ( ) . Fail ( ) ;
result . StdOut . Should ( ) . BeVisuallyEquivalentToIfNotLocalized ( HelpText ) ;
result . StdErr . Should ( ) . Be ( string . Format ( CommonLocalizableStrings . MoreThanOneProjectInDirectory , reference ) ) ;
}
2016-11-16 15:49:25 -08:00
}
2016-11-23 14:02:19 -08:00
}