public void CanAddFileReferenceWhenNoReferencesExist()
        {
            var project = CreateDefaultProject();

            Solution.Projects.Add(project);

            var request = new AddReferenceRequest
            {
                Reference = @"c:\test\packages\SomeTest\lib\net40\Some.Test.dll",
                FileName = @"c:\test\one\test.cs"
            };

            var expectedXml = XDocument.Parse(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""Some.Test"">
                            <HintPath>..\packages\SomeTest\lib\net40\Some.Test.dll</HintPath>
                        </Reference>
                    </ItemGroup>
                </Project>");

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddFileReferenceProcessor() }, new FakeFileSystem()));
            handler.AddReference(request);

            project.AsXml().ToString().ShouldEqual(expectedXml.ToString());
			((FakeAssembly)project.References.First(r => r.GetType() == typeof(FakeAssembly))).AssemblyPath.ForceWindowsPathSeparator().ShouldEqual(@"c:\test\packages\SomeTest\lib\net40\Some.Test.dll");
        }
        public AddReferenceResponse AddReference(AddReferenceRequest request)
        {
            var project   = _solution.ProjectContainingFile(request.FileName);
            var processor = _addReferenceProcessorFactory.CreateProcessorFor(request);

            return(processor.AddReference(project, request.Reference));
        }
        public void WillNotAddDuplicateGacAssemblyReference()
        {
            var project = CreateDefaultProjectWithGacReference();
            Solution.Projects.Add(project);

            var expectedXml = XDocument.Parse(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""System.Web.Mvc"" />
                    </ItemGroup>
                </Project>");

            var request = new AddReferenceRequest
            {
                Reference = @"System.Web.Mvc",
                FileName = @"c:\test\one\test.cs"
            };

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddGacReferenceProcessor() }, new FileSystem()));
            handler.AddReference(request);

            project.AsXml().ToString().ShouldEqual(expectedXml.ToString());
        }
         public void CanAddGacAssemblyReference()
         {
            var project = GetProject(
                @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                </Project>");
             Solution.Projects.Add(project);

            var path = 
                _fs.Path.Combine(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5", "System.Web.Mvc.dll");
            _fs.File.WriteAllText(path, "");
             const string expectedXml = @"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""System.Web.Mvc"" />
                    </ItemGroup>
                </Project>";

             var request = new AddReferenceRequest
             {
                 Reference = @"System.Web.Mvc",
                 FileName = @"c:\test\one\test.cs"
             };

             var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[]{new AddGacReferenceProcessor() }, new NativeFileSystem()));
             var response = handler.AddReference(request);
            response.Message.ShouldEqual("Reference to System.Web.Mvc added successfully");
            _fs.File.ReadAllText(project.FileName).ShouldEqualXml(expectedXml);
         }
        public AddReferenceResponse AddReference(AddReferenceRequest request)
        {
            var project = _solution.ProjectContainingFile(request.FileName);
           
            var processor = _addReferenceProcessorFactory.CreateProcessorFor(request);

            return processor.AddReference(project, request.Reference);
           
        }
        public void ShouldReturnAddGacReferenceProcessorWhenReferencingGac()
        {
            var request = new AddReferenceRequest
            {
                Reference = "System.Web.Mvc"
            };

            var processor = _factory.CreateProcessorFor(request);

            processor.ShouldBeType<AddGacReferenceProcessor>();
        }
        public void ShouldReturnAddProjectReferenceProcessorWhenReferencingProject()
        {
            var request = new AddReferenceRequest
                              {
                                  Reference = "fake"
                              };

            var processor = _factory.CreateProcessorFor(request);

            processor.ShouldBeType<AddProjectReferenceProcessor>();
        }
        public void ShouldReturnAddFileReferenceProcessorWhenReferencingFile()
        {
            var request = new AddReferenceRequest
                              {
                                  Reference = "Nancy.dll"
                              };

            var processor = _factory.CreateProcessorFor(request);

            processor.ShouldBeType<AddFileReferenceProcessor>();
        }
        public void ShouldReturnAddGacReferenceProcessorWhenFileReferenceNotFound()
        {
            var fs = new FakeFileSystem();
            fs.FileExists(false);
            _factory = new AddReferenceProcessorFactory(_solution, _processors, fs);
            var request = new AddReferenceRequest
            {
                Reference = "Nancy.dll"
            };

            var processor = _factory.CreateProcessorFor(request);
            processor.ShouldBeType<AddGacReferenceProcessor>();
        }
Exemple #10
0
        public IReferenceProcessor CreateProcessorFor(AddReferenceRequest request)
        {
            if (IsProjectReference(request.Reference))
            {
                return(_processors[typeof(AddProjectReferenceProcessor)]);
            }

            if (IsFileReference(request.Reference))
            {
                return(_processors[typeof(AddFileReferenceProcessor)]);
            }

            return(_processors[typeof(AddGacReferenceProcessor)]);
        }
        public IReferenceProcessor CreateProcessorFor(AddReferenceRequest request)
        {
            if (IsProjectReference(request.Reference))
            {
                return _processors[typeof (AddProjectReferenceProcessor)];
            }

            if (IsFileReference(request.Reference))
            {
                return _processors[typeof (AddFileReferenceProcessor)];
            }

            return _processors[typeof (AddGacReferenceProcessor)];
        }
        public void CanAddFileReference()
        {
            var project = GetProject(
                @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""Hello.World"">
                            <HintPath>..\packages\HelloWorld\lib\net40\Does.Not.Exist.dll</HintPath>
                        </Reference>
                    </ItemGroup>
                </Project>");

            Solution.Projects.Add(project);

            var request = new AddReferenceRequest
            {
                Reference = @"c:\test\packages\SomeTest\lib\net40\Some.Test.dll",
                FileName = @"c:\test\one\test.cs"
            };

            const string expectedXml = @"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""Hello.World"">
                            <HintPath>..\packages\HelloWorld\lib\net40\Does.Not.Exist.dll</HintPath>
                        </Reference>
                        <Reference Include=""Some.Test"">
                            <HintPath>..\packages\SomeTest\lib\net40\Some.Test.dll</HintPath>
                        </Reference>
                    </ItemGroup>
                </Project>";

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddFileReferenceProcessor() }, new FakeWindowsFileSystem()));
            handler.AddReference(request);

            _fs.File.ReadAllText(project.FileName).ShouldEqualXml(expectedXml);

            project.References.Select(r => ((DefaultUnresolvedAssembly)r).AssemblyName)
                .ShouldContain(@"c:\test\packages\SomeTest\lib\net40\Some.Test.dll");
        }
        public void CanAddProjectReferenceWhenNoProjectReferencesExist()
        {
            var projectOne = GetProject(
                                 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                </Project>");
            projectOne.Title = "Project One";
            projectOne.ProjectId = Guid.NewGuid();
                
            var projectTwo = GetProject(
                                 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                </Project>", @"c:\test\two\fake2.csproj");

            _solution.Projects.Add(projectOne);
            _solution.Projects.Add(projectTwo);

            projectTwo.Files.Add(new CSharpFile(projectTwo, @"c:\test\two\test.cs", "some c# code"));
            var request = new AddReferenceRequest
            {
                Reference = @"fake1",
                FileName = @"c:\test\two\test.cs"
            };

            var handler = new AddReferenceHandler(_solution, new AddReferenceProcessorFactory(_solution, new IReferenceProcessor[] { new AddProjectReferenceProcessor(_solution) }, new NativeFileSystem()));
            handler.AddReference(request);

            var expectedXml = string.Format(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <ProjectReference Include=""..\one\fake1.csproj"">
                            <Project>{{{0}}}</Project>
                            <Name>Project One</Name>
                        </ProjectReference>
                    </ItemGroup>
                </Project>", projectOne.ProjectId.ToString().ToUpperInvariant());
            _fs.File.ReadAllText(projectTwo.FileName).ShouldEqualXml(expectedXml);
        }
        public void CanAddProjectReferenceWhenNoProjectReferencesExist()
        {
            var projectOne = CreateDefaultProject();

            var projectTwoId = Guid.NewGuid();
            var projectTwo = new FakeProject("faketwo", @"c:\test\two\fake2.csproj", projectTwoId);
            projectTwo.Title = "Project Two";
            projectTwo.AddFile("some content", @"c:\test\two\test.cs");
            projectTwo.XmlRepresentation = XDocument.Parse(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                </Project>");

            var expectedXml = XDocument.Parse(string.Format(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <ProjectReference Include=""..\one\fake1.csproj"">
                            <Project>{0}</Project>
                            <Name>Project One</Name>
                        </ProjectReference>
                    </ItemGroup>
                </Project>", string.Concat("{", projectOne.ProjectId.ToString().ToUpperInvariant(), "}")));

            Solution.Projects.Add(projectOne);
            Solution.Projects.Add(projectTwo);

            var request = new AddReferenceRequest
                {
                    Reference = @"fake1",
                    FileName = @"c:\test\two\test.cs"
                };

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddProjectReferenceProcessor(Solution) }, new NativeFileSystem()));
            handler.AddReference(request);

            projectTwo.AsXml().ToString().ShouldEqual(expectedXml.ToString());
        }
        public void ShouldNotAddGacReferenceThatDoesNotExist()
        {
            const string xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                </Project>";

            var project = GetProject(xml);
            Solution.Projects.Add(project);

            var request = new AddReferenceRequest
            {
                Reference = @"System.Web.Mvc",
                FileName = @"c:\test\one\test.cs"
             };

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[]{new AddGacReferenceProcessor() }, new NativeFileSystem()));
            var response = handler.AddReference(request);
            response.Message.ShouldEqual("Did not find System.Web.Mvc");
            _fs.File.ReadAllText(project.FileName).ShouldEqualXml(xml);
        }
        public void ShouldNotAddDuplicateFileReference()
        {
            var project = GetProject(
                @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""Hello.World"">
                            <HintPath>..\packages\HelloWorld\lib\net40\Hello.World.dll</HintPath>
                        </Reference>
                    </ItemGroup>
                </Project>");

            Solution.Projects.Add(project);

            var request = new AddReferenceRequest
            {
                Reference = @"c:\test\packages\HelloWorld\lib\net40\Hello.World.dll",
                FileName = @"c:\test\one\test.cs"
            };

            const string expectedXml = @"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""Hello.World"">
                            <HintPath>..\packages\HelloWorld\lib\net40\Hello.World.dll</HintPath>
                        </Reference>
                    </ItemGroup>
                </Project>";

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddFileReferenceProcessor() }, new FakeFileSystem()));
            handler.AddReference(request);
            _fs.File.ReadAllText(project.FileName).ShouldEqualXml(expectedXml);
        }
        public void ShouldNotAddCircularReference()
        {
            var projectOne = GetProject(
                                 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                                     <ItemGroup>
                                         <Compile Include=""Test.cs""/>
                                     </ItemGroup>
                                 </Project>");
            var xml = string.Format(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <ProjectReference Include=""..\one\fake1.csproj"">
                            <Project>{0}</Project>
                            <Name>Project One</Name>
                        </ProjectReference>
                    </ItemGroup>
                </Project>", string.Concat("{", projectOne.ProjectId.ToString().ToUpperInvariant(), "}"));
            var projectTwo = GetProject(xml, @"c:\test\two\fake2.csproj");
            projectTwo.Title = "Project Two";
            projectTwo.Files.Add(new CSharpFile(projectTwo, @"c:\test\two\test.cs", "some c# code"));
            projectTwo.AddReference(new ProjectReference(_solution, "Project One", projectOne.ProjectId));


            var expectedXml = XDocument.Parse(xml);
            
            _solution.Projects.Add(projectOne);
            _solution.Projects.Add(projectTwo);

            var request = new AddReferenceRequest
            {
                Reference = @"fake2",
                FileName = @"c:\test\one\test.cs"
            };

            var handler = new AddReferenceHandler(_solution, new AddReferenceProcessorFactory(_solution, new IReferenceProcessor[] { new AddProjectReferenceProcessor(_solution) }, new NativeFileSystem()));
            var response = handler.AddReference(request);

            projectTwo.AsXml().ToString().ShouldEqual(expectedXml.ToString());
            response.Message.ShouldEqual("Reference will create circular dependency");
        }
        public void WillNotAddDuplicateGacAssemblyReference()
        {
            var project = GetProject(
                @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""System.Web.Mvc"" />
                    </ItemGroup>
                </Project>");

            Solution.Projects.Add(project);

            const string expectedXml = @"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""System.Web.Mvc"" />
                    </ItemGroup>
                </Project>";

            var request = new AddReferenceRequest
            {
                Reference = @"System.Web.Mvc",
                FileName = @"c:\test\one\test.cs"
            };

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddGacReferenceProcessor() }, new NativeFileSystem()));
            handler.AddReference(request);
            _fs.File.ReadAllText(project.FileName).ShouldEqualXml(expectedXml);
        }
        public void ShouldNotAddDuplicateFileReference()
        {
            var project = CreateDefaultProjectWithFileReference();

            Solution.Projects.Add(project);

            var request = new AddReferenceRequest
            {
                Reference = @"c:\test\packages\HelloWorld\lib\net40\Hello.World.dll",
                FileName = @"c:\test\one\test.cs"
            };

            var expectedXml = XDocument.Parse(@"
                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                    <ItemGroup>
                        <Compile Include=""Test.cs""/>
                    </ItemGroup>
                    <ItemGroup>
                        <Reference Include=""Hello.World"">
                            <HintPath>..\packages\HelloWorld\lib\net40\Hello.World.dll</HintPath>
                        </Reference>
                    </ItemGroup>
                </Project>");

            var handler = new AddReferenceHandler(Solution, new AddReferenceProcessorFactory(Solution, new IReferenceProcessor[] { new AddFileReferenceProcessor() }, new FakeFileSystem()));
            handler.AddReference(request);

            project.AsXml().ToString().ShouldEqual(expectedXml.ToString());
            project.References.FirstOrDefault(r => r.GetType() == typeof(FakeAssembly)).ShouldBeNull();
        }