2016-11-16 23:49:25 +00: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 22:41:56 +00:00
using FluentAssertions ;
using Microsoft.Build.Construction ;
using Microsoft.DotNet.Tools.Test.Utilities ;
2016-11-29 23:42:16 +00:00
using Msbuild.Tests.Utilities ;
2016-11-16 23:49:25 +00:00
using System ;
using System.IO ;
2016-12-08 22:56:31 +00:00
using System.Linq ;
2016-11-16 23:49:25 +00:00
using Xunit ;
namespace Microsoft.DotNet.Cli.Add.P2P.Tests
{
public class GivenDotnetAddP2P : TestBase
{
const string FrameworkNet451Arg = "-f net451" ;
const string ConditionFrameworkNet451 = "== 'net451'" ;
const string FrameworkNetCoreApp10Arg = "-f netcoreapp1.0" ;
const string ConditionFrameworkNetCoreApp10 = "== 'netcoreapp1.0'" ;
2016-12-09 20:11:11 +00:00
const string ProjectNotCompatibleErrorMessageRegEx = "Project `[^`]*` cannot be added due to incompatible targeted frameworks between the two projects\\. Please review the project you are trying to add and verify that is compatible with the following targets\\:" ;
const string ProjectDoesNotTargetFrameworkErrorMessageRegEx = "Project `[^`]*` does not target framework `[^`]*`." ;
2016-12-08 22:56:31 +00:00
static readonly string [ ] DefaultFrameworks = new string [ ] { "netcoreapp1.0" , "net451" } ;
2016-12-09 20:11:11 +00:00
2016-11-22 18:45:45 +00:00
private TestSetup Setup ( [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( Setup ) , string identifier = "" )
2016-11-16 23:49:25 +00:00
{
2016-11-22 18:45:45 +00:00
return new TestSetup (
2016-11-22 22:41:56 +00:00
TestAssets . Get ( TestSetup . TestGroup , TestSetup . ProjectName )
2016-11-23 21:46:44 +00:00
. CreateInstance ( callingMethod : callingMethod , identifier : identifier )
2016-11-22 22:41:56 +00:00
. WithSourceFiles ( )
. Root
. FullName ) ;
2016-11-16 23:49:25 +00:00
}
private ProjDir NewDir ( [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( NewDir ) , string identifier = "" )
{
2016-11-22 22:41:56 +00:00
return new ProjDir ( TestAssetsManager . CreateTestDirectory ( callingMethod : callingMethod , identifier : identifier ) . Path ) ;
2016-11-16 23:49:25 +00:00
}
private ProjDir NewLib ( [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( NewDir ) , string identifier = "" )
{
2016-11-22 22:41:56 +00:00
var dir = NewDir ( callingMethod : callingMethod , identifier : identifier ) ;
2016-11-16 23:49:25 +00:00
try
{
new NewCommand ( )
. WithWorkingDirectory ( dir . Path )
. ExecuteWithCapturedOutput ( "-t Lib" )
. Should ( ) . Pass ( ) ;
}
catch ( System . ComponentModel . Win32Exception e )
{
2016-11-22 18:45:45 +00:00
throw new Exception ( $"Intermittent error in `dotnet new` occurred when running it in dir `{dir.Path}`\nException:\n{e}" ) ;
2016-11-16 23:49:25 +00:00
}
return dir ;
}
2016-12-08 22:56:31 +00:00
private static void SetTargetFrameworks ( ProjDir proj , string [ ] frameworks )
{
var csproj = proj . CsProj ( ) ;
csproj . AddProperty ( "TargetFrameworks" , string . Join ( ";" , frameworks ) ) ;
csproj . Save ( ) ;
}
private ProjDir NewLibWithFrameworks ( [ System . Runtime . CompilerServices . CallerMemberName ] string callingMethod = nameof ( NewDir ) , string identifier = "" )
{
var ret = NewLib ( callingMethod : callingMethod , identifier : identifier ) ;
SetTargetFrameworks ( ret , DefaultFrameworks ) ;
return ret ;
}
2016-11-16 23:49:25 +00:00
[Theory]
[InlineData("--help")]
[InlineData("-h")]
public void WhenHelpOptionIsPassedItPrintsUsage ( string helpArg )
{
var cmd = new AddP2PCommand ( ) . Execute ( helpArg ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "Usage" ) ;
}
[Theory]
[InlineData("idontexist.csproj")]
[InlineData("ihave?inv@lid/char\\acters")]
public void WhenNonExistingProjectIsPassedItPrintsErrorAndUsage ( string projName )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 23:49:25 +00:00
. WithProject ( projName )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
cmd . StdErr . Should ( ) . Contain ( "Could not find" ) ;
cmd . StdOut . Should ( ) . Contain ( "Usage" ) ;
}
[Fact]
public void WhenBrokenProjectIsPassedItPrintsErrorAndUsage ( )
{
string projName = "Broken/Broken.csproj" ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 23:49:25 +00:00
. WithProject ( projName )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
2016-12-02 00:01:29 +00:00
cmd . StdErr . Should ( ) . Contain ( " is invalid." ) ;
2016-11-16 23:49:25 +00:00
cmd . StdOut . Should ( ) . Contain ( "Usage" ) ;
}
[Fact]
public void WhenMoreThanOneProjectExistsInTheDirectoryItPrintsErrorAndUsage ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( Path . Combine ( setup . TestRoot , "MoreThanOne" ) )
2016-11-22 21:58:16 +00:00
. Execute ( $"\" { setup . ValidRefCsprojRelToOtherProjPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
cmd . StdErr . Should ( ) . Contain ( "more than one" ) ;
cmd . StdOut . Should ( ) . Contain ( "Usage" ) ;
}
[Fact]
public void WhenNoProjectsExistsInTheDirectoryItPrintsErrorAndUsage ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . ExitCode . Should ( ) . NotBe ( 0 ) ;
cmd . StdErr . Should ( ) . Contain ( "not find any" ) ;
cmd . StdOut . Should ( ) . Contain ( "Usage" ) ;
}
[Fact]
public void ItAddsRefWithoutCondAndPrintsStatus ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void ItAddsRefWithCondAndPrintsStatus ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithoutCondIsPresentItAddsDifferentRefWithoutCond ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . LibCsprojPath } \ "" )
2016-11-16 23:49:25 +00:00
. Should ( ) . Pass ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithCondIsPresentItAddsDifferentRefWithCond ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojPath } \ "" )
2016-11-16 23:49:25 +00:00
. Should ( ) . Pass ( ) ;
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithCondIsPresentItAddsRefWithDifferentCond ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNetCoreApp10Arg} \" { setup . ValidRefCsprojPath } \ "" )
2016-11-16 23:49:25 +00:00
. Should ( ) . Pass ( ) ;
int condBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithConditionIsPresentItAddsDifferentRefWithoutCond ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojPath } \ "" )
2016-11-16 23:49:25 +00:00
. Should ( ) . Pass ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithNoCondAlreadyExistsItDoesntDuplicate ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" )
2016-11-16 23:49:25 +00:00
. Should ( ) . Pass ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "already has a reference" ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithCondOnItemAlreadyExistsItDoesntDuplicate ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithExistingRefCondOnItem" ) ) ;
2016-11-16 23:49:25 +00:00
2016-11-22 18:45:45 +00:00
string contentBefore = proj . CsProjContent ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "already has a reference" ) ;
2016-11-22 18:45:45 +00:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithCondOnItemGroupAlreadyExistsItDoesntDuplicate ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" )
2016-11-16 23:49:25 +00:00
. Should ( ) . Pass ( ) ;
var csprojContentBefore = lib . CsProjContent ( ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "already has a reference" ) ;
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( csprojContentBefore ) ;
}
[Fact]
public void WhenRefWithCondWithWhitespaceOnItemGroupExistsItDoesntDuplicate ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithExistingRefCondWhitespaces" ) ) ;
2016-11-16 23:49:25 +00:00
2016-11-22 18:45:45 +00:00
string contentBefore = proj . CsProjContent ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjName )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "already has a reference" ) ;
2016-11-22 18:45:45 +00:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithoutCondAlreadyExistsInNonUniformItemGroupItDoesntDuplicate ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefNoCondNonUniform" ) ) ;
2016-11-16 23:49:25 +00:00
2016-11-22 18:45:45 +00:00
string contentBefore = proj . CsProjContent ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjName )
. Execute ( $"\" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "already has a reference" ) ;
2016-11-22 18:45:45 +00:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithoutCondAlreadyExistsInNonUniformItemGroupItAddsDifferentRefInDifferentGroup ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefNoCondNonUniform" ) ) ;
2016-11-16 23:49:25 +00:00
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 23:49:25 +00:00
. WithProject ( proj . CsProjPath )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithCondAlreadyExistsInNonUniformItemGroupItDoesntDuplicate ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefCondNonUniform" ) ) ;
2016-11-16 23:49:25 +00:00
2016-11-22 18:45:45 +00:00
string contentBefore = proj . CsProjContent ( ) ;
2016-11-16 23:49:25 +00:00
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( proj . Path )
. WithProject ( proj . CsProjName )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojRelPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "already has a reference" ) ;
2016-11-22 18:45:45 +00:00
proj . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenRefWithCondAlreadyExistsInNonUniformItemGroupItAddsDifferentRefInDifferentGroup ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "WithRefCondNonUniform" ) ) ;
2016-11-16 23:49:25 +00:00
int condBefore = proj . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 23:49:25 +00:00
. WithProject ( proj . CsProjPath )
2016-11-22 18:45:45 +00:00
. Execute ( $"{FrameworkNet451Arg} \" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( condBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void WhenEmptyItemGroupPresentItAddsRefInIt ( )
{
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( Path . Combine ( setup . TestRoot , "EmptyItemGroup" ) ) ;
2016-11-16 23:49:25 +00:00
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
2016-11-16 23:49:25 +00:00
. WithProject ( proj . CsProjPath )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void ItAddsMultipleRefsNoCondToTheSameItemGroup ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . LibCsprojPath } \ " \"{setup.ValidRefCsprojPath}\"" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) . And . NotContain ( "already has a reference" ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . LibCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
[Fact]
public void ItAddsMultipleRefsWithCondToTheSameItemGroup ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-16 23:49:25 +00:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) ;
var cmd = new AddP2PCommand ( )
2016-11-22 18:45:45 +00:00
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { setup . LibCsprojPath } \ " \"{setup.ValidRefCsprojPath}\"" ) ;
2016-11-16 23:49:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) . And . NotContain ( "already has a reference" ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithConditionContaining ( ConditionFrameworkNet451 ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . ValidRefCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeAndConditionContaining ( setup . LibCsprojName , ConditionFrameworkNet451 ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
2016-11-21 19:38:25 +00:00
[Fact]
2016-11-16 23:49:25 +00:00
public void WhenProjectNameIsNotPassedItFindsItAndAddsReference ( )
2016-11-21 19:38:25 +00:00
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-21 19:38:25 +00:00
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-21 19:38:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-22 18:45:45 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojName ) . Should ( ) . Be ( 1 ) ;
2016-11-21 19:38:25 +00:00
}
[Fact]
public void ItAddsRefBetweenImports ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
2016-11-21 19:38:25 +00:00
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
2016-11-22 18:45:45 +00:00
. Execute ( $"\" { setup . ValidRefCsprojPath } \ "" ) ;
2016-11-21 19:38:25 +00:00
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
int state = 0 ;
foreach ( var el in lib . CsProj ( ) . AllChildren )
{
var import = el as ProjectImportElement ;
var projRef = el as ProjectItemElement ;
switch ( state )
{
case 0 :
if ( import ! = null & & import . Project . EndsWith ( ".props" ) )
{
state + + ;
}
break ;
case 1 :
2016-11-22 18:45:45 +00:00
if ( projRef ! = null & & projRef . ItemType = = "ProjectReference" & & projRef . Include . Contains ( setup . ValidRefCsprojName ) )
2016-11-21 19:38:25 +00:00
{
state + + ;
}
break ;
case 2 :
if ( import ! = null & & import . Project . EndsWith ( ".targets" ) )
{
state + + ;
}
break ;
}
}
state . Should ( ) . Be ( 3 ) ;
}
2016-11-22 18:45:45 +00:00
[Fact]
2016-11-21 19:38:25 +00:00
public void WhenPassedReferenceDoesNotExistItShowsAnError ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var contentBefore = lib . CsProjContent ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
. Execute ( "\"IDoNotExist.csproj\"" ) ;
cmd . Should ( ) . Fail ( ) ;
cmd . StdErr . Should ( ) . Contain ( "does not exist" ) ;
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-21 19:38:25 +00:00
}
2016-11-22 18:45:45 +00:00
[Fact]
2016-11-21 19:38:25 +00:00
public void WhenPassedMultipleRefsAndOneOfthemDoesNotExistItCancelsWholeOperation ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 18:45:45 +00:00
var setup = Setup ( ) ;
var contentBefore = lib . CsProjContent ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( lib . CsProjPath )
. Execute ( $"\" { setup . ValidRefCsprojPath } \ " \"IDoNotExist.csproj\"" ) ;
cmd . Should ( ) . Fail ( ) ;
cmd . StdErr . Should ( ) . Contain ( "does not exist" ) ;
cmd . StdErr . Should ( ) . NotMatchRegex ( "(.*does not exist.*){2,}" ) ;
lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( contentBefore ) ;
2016-11-21 19:38:25 +00:00
}
2016-11-22 21:58:16 +00:00
[Fact]
2016-11-21 19:38:25 +00:00
public void WhenPassedReferenceDoesNotExistAndForceSwitchIsPassedItAddsIt ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 21:58:16 +00:00
const string nonExisting = "IDoNotExist.csproj" ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
. Execute ( $"--force \" { nonExisting } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeContaining ( nonExisting ) . Should ( ) . Be ( 1 ) ;
2016-11-21 19:38:25 +00:00
}
2016-11-22 21:58:16 +00:00
[Fact]
2016-11-21 19:38:25 +00:00
public void WhenPassedReferenceIsUsingSlashesItNormalizesItToBackslashes ( )
{
2016-12-08 22:56:31 +00:00
var lib = NewLibWithFrameworks ( ) ;
2016-11-22 21:58:16 +00:00
var setup = Setup ( ) ;
int noCondBefore = lib . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( lib . Path )
. WithProject ( lib . CsProjName )
. Execute ( $"--force \" { setup . ValidRefCsprojPath . Replace ( '\\' , '/' ) } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = lib . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojPath . Replace ( '/' , '\\' ) ) . Should ( ) . Be ( 1 ) ;
2016-11-21 19:38:25 +00:00
}
2016-11-22 21:58:16 +00:00
[Fact]
public void WhenReferenceIsRelativeAndProjectIsNotInCurrentDirectoryReferencePathIsFixed ( )
2016-11-16 23:49:25 +00:00
{
2016-11-22 21:58:16 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( setup . LibDir ) ;
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( setup . LibCsprojPath )
. Execute ( $"\" { setup . ValidRefCsprojRelPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-23 22:02:19 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojRelToOtherProjPath . Replace ( '/' , '\\' ) ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
2016-11-22 21:58:16 +00:00
[Fact]
public void WhenReferenceIsRelativeAndProjectIsNotInCurrentDirectoryAndForceSwitchIsPassedItDoesNotChangeIt ( )
2016-11-16 23:49:25 +00:00
{
2016-11-22 21:58:16 +00:00
var setup = Setup ( ) ;
var proj = new ProjDir ( setup . LibDir ) ;
int noCondBefore = proj . CsProj ( ) . NumberOfItemGroupsWithoutCondition ( ) ;
var cmd = new AddP2PCommand ( )
. WithWorkingDirectory ( setup . TestRoot )
. WithProject ( setup . LibCsprojPath )
. Execute ( $"--force \" { setup . ValidRefCsprojRelPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
cmd . StdErr . Should ( ) . BeEmpty ( ) ;
var csproj = proj . CsProj ( ) ;
csproj . NumberOfItemGroupsWithoutCondition ( ) . Should ( ) . Be ( noCondBefore + 1 ) ;
2016-11-23 22:02:19 +00:00
csproj . NumberOfProjectReferencesWithIncludeContaining ( setup . ValidRefCsprojRelPath . Replace ( '/' , '\\' ) ) . Should ( ) . Be ( 1 ) ;
2016-11-16 23:49:25 +00:00
}
2016-12-09 00:23:21 +00:00
[Fact]
2016-12-09 20:11:11 +00:00
public void ItCanAddReferenceWithConditionOnCompatibleFramework ( )
2016-12-09 00:23:21 +00: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 ) ;
var cmd = new AddP2PCommand ( )
. WithProject ( lib . CsProjPath )
. Execute ( $"{FrameworkNet451Arg} \" { net45lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
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 ( ) ;
var cmd = new AddP2PCommand ( )
. WithProject ( net452netcoreapp10lib . CsProjPath )
. Execute ( $"\" { lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Pass ( ) ;
cmd . StdOut . Should ( ) . Contain ( "added to the project" ) ;
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 )
{
var setup = Setup ( ) ;
var lib = new ProjDir ( setup . LibDir ) ;
var net45lib = new ProjDir ( Path . Combine ( setup . TestRoot , "Net45Lib" ) ) ;
var csProjContent = lib . CsProjContent ( ) ;
var cmd = new AddP2PCommand ( )
. WithProject ( lib . CsProjPath )
. Execute ( $"-f {framework} \" { net45lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Fail ( ) ;
2016-12-09 20:11:11 +00:00
cmd . StdErr . Should ( ) . MatchRegex ( ProjectDoesNotTargetFrameworkErrorMessageRegEx ) ;
cmd . StdErr . Should ( ) . Contain ( $"`{framework}`" ) ;
2016-12-09 00:23:21 +00: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 ( ) ;
var cmd = new AddP2PCommand ( )
. WithProject ( net45lib . CsProjPath )
. Execute ( $"{frameworkArg} \" { lib . CsProjPath } \ "" ) ;
cmd . Should ( ) . Fail ( ) ;
2016-12-09 20:11:11 +00:00
cmd . StdErr . Should ( ) . MatchRegex ( ProjectNotCompatibleErrorMessageRegEx ) ;
cmd . StdErr . Should ( ) . MatchRegex ( " - net45(\n|\r)" ) ;
2016-12-09 00:23:21 +00:00
net45lib . CsProjContent ( ) . Should ( ) . BeEquivalentTo ( csProjContent ) ;
}
2016-11-16 23:49:25 +00:00
}
2016-11-23 22:02:19 +00:00
}