Exemplo n.º 1
0
        public async Task WhenBaseIntermediateOutputPathNotSet_DoesNotAttemptToAdviseFileChange()
        {
            var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(100);

            var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t());

            using var watcher = new ProjectAssetFileWatcherInstance(
                      IVsServiceFactory.Create <SVsFileChangeEx, IVsAsyncFileChangeEx>(fileChangeService),
                      IProjectTreeProviderFactory.Create(),
                      IUnconfiguredProjectCommonServicesFactory.Create(threadingService: IProjectThreadingServiceFactory.Create()),
                      tasksService,
                      IActiveConfiguredProjectSubscriptionServiceFactory.Create());
            var tree          = ProjectTreeParser.Parse(@"Root (flags: {ProjectRoot}), FilePath: ""C:\Foo\foo.proj""");
            var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{
    ""CurrentState"": {
        ""ConfigurationGeneral"": {
            ""Properties"": {
               ""MSBuildProjectFullPath"": ""C:\\Foo\\foo.proj""
            }
        }
    }
}");

            await watcher.InitializeAsync();

            await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate)));

            var fileChangeServiceMock = Mock.Get(fileChangeService);

            fileChangeServiceMock.Verify(s => s.AdviseFileChangeAsync(It.IsAny <string>(), It.IsAny <_VSFILECHANGEFLAGS>(), watcher, CancellationToken.None),
                                         Times.Never());
        }
        public void ToProjectRestoreInfo_SetsCoreProperties()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""NuGetRestore"": {
            ""Properties"": {
                ""MSBuildProjectExtensionsPath"": ""C:\\Project\\obj"",
                ""TargetFrameworks"": ""net45"",               
                ""TargetFrameworkMoniker"": "".NETFramework, Version=v4.5""
            },
        }
    }
}
");
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal("C:\\Project\\obj", result.BaseIntermediatePath);
            Assert.Equal("net45", result.OriginalTargetFrameworks);
            Assert.Equal(1, result.TargetFrameworks.Count);

            var targetFramework = result.TargetFrameworks.Item(0);

            Assert.Equal(".NETFramework, Version=v4.5", targetFramework.TargetFrameworkMoniker);
        }
        public void VerifyFileWatcherRegistration(string inputTree, string fileToWatch)
        {
            var  spMock            = new IServiceProviderMoq();
            uint adviseCookie      = 100;
            var  fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie);

            spMock.AddService(typeof(IVsFileChangeEx), typeof(SVsFileChangeEx), fileChangeService);

            var watcher = new ProjectAssetFileWatcher(spMock,
                                                      IProjectTreeProviderFactory.Create(),
                                                      IUnconfiguredProjectCommonServicesFactory.Create(),
                                                      IProjectLockServiceFactory.Create(),
                                                      IActiveConfiguredProjectSubscriptionServiceFactory.CreateInstance());

            var tree          = ProjectTreeParser.Parse(inputTree);
            var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson);

            watcher.Load();
            watcher.DataFlow_Changed(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate))));

            // If fileToWatch is null then we expect to not register any filewatcher.
            var times = fileToWatch == null?Times.Never() : Times.Once();

            Mock.Get(fileChangeService).Verify(s => s.AdviseFileChange(fileToWatch ?? It.IsAny <string>(), It.IsAny <uint>(), watcher, out adviseCookie), times);
        }
        public async Task VerifyDesignTimeInputsProcessed(string projectState, string[] designTimeInputs, string[] sharedDesignTimeInputs)
        {
            using DesignTimeInputsDataSource dataSource = CreateDesignTimeInputsDataSource(out ProjectValueDataSource <IProjectSubscriptionUpdate> sourceItemsRuleSource);

            const string defaultProjectConfig = @"""ProjectConfiguration"": {
                                                    ""Name"": ""Debug|AnyCPU"",
                                                    ""Dimensions"": {
                                                        ""Configuration"": ""Debug"",
                                                        ""Platform"": ""AnyCPU""
                                                    }
                                                }";

            // Create a block to receive the results of the block under test
            DesignTimeInputs inputs = null;
            var receiver            = DataflowBlockSlim.CreateActionBlock <IProjectVersionedValue <DesignTimeInputs> >(val =>
            {
                inputs = val.Value;
            });

            dataSource.SourceBlock.LinkTo(receiver, DataflowOption.PropagateCompletion);

            // Construct our input value, including a default project config
            var configUpdate = IProjectSubscriptionUpdateFactory.FromJson("{ " + projectState + "," + defaultProjectConfig + " }");

            // Send our input, and wait for our receiver to complete
            await sourceItemsRuleSource.SendAndCompleteAsync(configUpdate, receiver);

            // Assert
            Assert.NotNull(inputs);
            Assert.Equal(designTimeInputs, inputs.Inputs);
            Assert.Equal(sharedDesignTimeInputs, inputs.SharedInputs);
        }
        public void ToProjectRestoreInfo_WhenEmpty_SetsCorePropertiesToEmpty()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""NuGetRestore"": {
            ""Properties"": {
                ""MSBuildProjectExtensionsPath"": """",
                ""TargetFrameworks"": """",               
                ""TargetFrameworkMoniker"": """"
            },
        }
    }
}
");
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Empty(result.BaseIntermediatePath);
            Assert.Empty(result.OriginalTargetFrameworks);
            Assert.Equal(1, result.TargetFrameworks.Count);

            var targetFramework = result.TargetFrameworks.Item(0);

            Assert.Empty(targetFramework.TargetFrameworkMoniker);
        }
        private void BroadcastChange(
            Dictionary <string, IProjectRuleSnapshotModel> projectSnapshot = null,
            Dictionary <string, IProjectRuleSnapshotModel> sourceSnapshot  = null,
            bool disableFastUpToDateCheck = false)
        {
            projectSnapshot = projectSnapshot ?? new Dictionary <string, IProjectRuleSnapshotModel>();

            if (!projectSnapshot.ContainsKey(ConfigurationGeneral.SchemaName))
            {
                projectSnapshot[ConfigurationGeneral.SchemaName] = new IProjectRuleSnapshotModel
                {
                    Properties = ImmutableStringDictionary <string> .EmptyOrdinal
                                 .Add("MSBuildProjectFullPath", _msBuildProjectFullPath)
                                 .Add("MSBuildProjectDirectory", _msBuildProjectDirectory)
                                 .Add("MSBuildAllProjects", _msBuildAllProjects)
                                 .Add("OutputPath", _outputPath)
                                 .Add("DisableFastUpToDateCheck", disableFastUpToDateCheck.ToString())
                };
            }

            var value = IProjectVersionedValueFactory <
                Tuple <
                    IProjectSubscriptionUpdate,
                    IProjectSubscriptionUpdate,
                    IProjectItemSchema> > .Create(
                Tuple.Create(
                    CreateUpdate(projectSnapshot),
                    CreateUpdate(sourceSnapshot),
                    IProjectItemSchemaFactory.Create(_itemTypes)),
                identity : ProjectDataSources.ConfiguredProjectVersion,
                version : _projectVersion);

            _buildUpToDateCheck.OnChanged(value);

            return;

            IProjectSubscriptionUpdate CreateUpdate(Dictionary <string, IProjectRuleSnapshotModel> snapshotBySchemaName)
            {
                var snapshots = ImmutableDictionary <string, IProjectRuleSnapshot> .Empty;
                var changes   = ImmutableDictionary <string, IProjectChangeDescription> .Empty;

                if (snapshotBySchemaName != null)
                {
                    foreach ((string schemaName, IProjectRuleSnapshotModel model) in snapshotBySchemaName)
                    {
                        var change = new IProjectChangeDescriptionModel
                        {
                            After      = model,
                            Difference = new IProjectChangeDiffModel {
                                AnyChanges = true
                            }
                        };

                        snapshots = snapshots.Add(schemaName, model.ToActualModel());
                        changes   = changes.Add(schemaName, change.ToActualModel());
                    }
                }
                return(IProjectSubscriptionUpdateFactory.Implement(snapshots, changes));
            }
        }
Exemplo n.º 7
0
        public async Task WhenBaseIntermediateOutputPathNotSet_DoesNotAttemptToAdviseFileChange()
        {
            var spMock            = new IAsyncServiceProviderMoq();
            var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(100);

            spMock.AddService(typeof(SVsFileChangeEx), fileChangeService);
            var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t());

            var watcher = new ProjectAssetFileWatcher(spMock,
                                                      IProjectTreeProviderFactory.Create(),
                                                      IUnconfiguredProjectCommonServicesFactory.Create(threadingService: new IProjectThreadingServiceMock()),
                                                      tasksService,
                                                      IActiveConfiguredProjectSubscriptionServiceFactory.Create());

            var tree          = ProjectTreeParser.Parse(@"Root (flags: {ProjectRoot}), FilePath: ""C:\Foo\foo.proj""");
            var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{
    ""CurrentState"": {
        ""ConfigurationGeneral"": {
            ""Properties"": {
               ""MSBuildProjectFullPath"": ""C:\\Foo\\foo.proj""
            }
        }
    }
}");

            watcher.Load();
            await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate))));

            var  fileChangeServiceMock = Mock.Get(fileChangeService);
            uint cookie;

            fileChangeServiceMock.Verify(s => s.AdviseFileChange(It.IsAny <string>(), It.IsAny <uint>(), watcher, out cookie),
                                         Times.Never());
        }
        public static IProjectVersionedValue <IProjectSubscriptionUpdate> FromJson(IComparable version, string jsonString)
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(jsonString);

            // Every IProjectSubscriptionUpdate contains the version of the configured project
            return(Create(update, identity: ProjectDataSources.ConfiguredProjectVersion, version));
        }
        public void ToProjectRestoreInfo_SetsToolReferences()
        {
            var update     = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""DotNetCliToolReference"": {
            ""Items"" : {
                ""ToolReference1"" : {
                    ""Version"" : ""1.0.0.0"",
                },
                ""ToolReference2"" : {
                    ""Version"" : ""2.0.0.0"",
                },
                ""ToolReference3"" : {
                    ""Name"" : ""Value""
                }
            }
        }
    }
}
");
            var result     = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);
            var references = result.ToolReferences;

            Assert.Equal(3, references.Count);

            Assert.Equal("ToolReference1", references.Item("ToolReference1").Name);
            AssertContainsProperty("Version", "1.0.0.0", references.Item("ToolReference1").Properties);

            Assert.Equal("ToolReference2", references.Item("ToolReference2").Name);
            AssertContainsProperty("Version", "2.0.0.0", references.Item("ToolReference2").Properties);

            Assert.Equal("ToolReference3", references.Item("ToolReference3").Name);
            AssertContainsProperty("Name", "Value", references.Item("ToolReference3").Properties);
        }
Exemplo n.º 10
0
        public void ToProjectRestoreInfo_SetsProjectReferences()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(ProjectWithItems);

            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal(1, result.TargetFrameworks.Count);

            var references = result.TargetFrameworks.Item(0).ProjectReferences;

            Assert.Equal(3, references.Count);

            Assert.Equal("..\\Project\\Project1.csproj", references.Item("..\\Project\\Project1.csproj").Name);
            Assert.Equal("ProjectFileFullPath", references.Item("..\\Project\\Project1.csproj").Properties.Item("ProjectFileFullPath").Name);
            Assert.Equal("C:\\Solution\\Project\\Project1.csproj", references.Item("..\\Project\\Project1.csproj").Properties.Item("ProjectFileFullPath").Value);

            Assert.Equal("..\\Project\\Project2.csproj", references.Item("..\\Project\\Project2.csproj").Name);
            Assert.Equal("ProjectFileFullPath", references.Item("..\\Project\\Project2.csproj").Properties.Item("ProjectFileFullPath").Name);
            Assert.Equal("C:\\Solution\\Project\\Project2.csproj", references.Item("..\\Project\\Project2.csproj").Properties.Item("ProjectFileFullPath").Value);

            Assert.Equal("..\\Project\\Project3.csproj", references.Item("..\\Project\\Project3.csproj").Name);
            Assert.Equal("ProjectFileFullPath", references.Item("..\\Project\\Project3.csproj").Properties.Item("ProjectFileFullPath").Name);
            Assert.Equal("C:\\Solution\\Project\\Project3.csproj", references.Item("..\\Project\\Project3.csproj").Properties.Item("ProjectFileFullPath").Value);
            Assert.Equal("Property", references.Item("..\\Project\\Project3.csproj").Properties.Item("Property").Name);
            Assert.Equal("Value", references.Item("..\\Project\\Project3.csproj").Properties.Item("Property").Value);
        }
        public void ToProjectRestoreInfo_WhenNoItems_ReturnsEmptyItemCollections()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""ProjectReference"": {
            ""Items"" : {}
        },
        ""PackageReference"": {
            ""Items"" : {}
        },
        ""DotNetCliToolReference"": {
            ""Items"" : {}
        },
        ""CollectedFrameworkReference"": {
            ""Items"" : {}
        },
        ""CollectedPackageDownload"": {
            ""Items"" : {}
        }
    }
}
");
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            AssertNoItems(result);
        }
Exemplo n.º 12
0
        public async Task VerifyFileWatcherRegistrationOnTreeChange(string inputTree, string changedTree, int numRegisterCalls, int numUnregisterCalls)
        {
            var  spMock            = new IAsyncServiceProviderMoq();
            uint adviseCookie      = 100;
            var  fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie);

            spMock.AddService(typeof(SVsFileChangeEx), fileChangeService);
            var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t());

            var watcher = new ProjectAssetFileWatcher(spMock,
                                                      IProjectTreeProviderFactory.Create(),
                                                      IUnconfiguredProjectCommonServicesFactory.Create(threadingService: new IProjectThreadingServiceMock()),
                                                      tasksService,
                                                      IActiveConfiguredProjectSubscriptionServiceFactory.Create());

            watcher.Load();
            var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson);

            var firstTree = ProjectTreeParser.Parse(inputTree);
            await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(firstTree), projectUpdate))));

            var secondTree = ProjectTreeParser.Parse(changedTree);
            await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(secondTree), projectUpdate))));

            // If fileToWatch is null then we expect to not register any filewatcher.
            var fileChangeServiceMock = Mock.Get(fileChangeService);

            fileChangeServiceMock.Verify(s => s.AdviseFileChange(It.IsAny <string>(), It.IsAny <uint>(), watcher, out adviseCookie),
                                         Times.Exactly(numRegisterCalls));
            fileChangeServiceMock.Verify(s => s.UnadviseFileChange(adviseCookie), Times.Exactly(numUnregisterCalls));
        }
        public void ToProjectRestoreInfo_SetsFrameworkReferences()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""CollectedFrameworkReference"": {
            ""Items"" : {
                ""WindowsForms"" : {
                },
                ""WPF"" : {
                    ""PrivateAssets"" : ""all"",
                }
            }
        }
    }
}");
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal(1, result.TargetFrameworks.Count);

            var references = result.TargetFrameworks.Item(0).FrameworkReferences;

            Assert.Equal(2, references.Count);

            var reference1 = references.Item("WindowsForms");

            Assert.Equal("WindowsForms", reference1.Name);
            Assert.Empty(reference1.Properties);

            var reference2 = references.Item("WPF");

            Assert.Equal("WPF", reference2.Name);

            AssertContainsProperty("PrivateAssets", "all", reference2.Properties);
        }
Exemplo n.º 14
0
        public void NuGetDependenciesSubTreeProvider_ProcessDependenciesChanges_EmptyTreeAndBothResolvedAndUnresolvedAreProvided(
            string projectSubscriptionUpdateJson,
            string existingTopLevelNodesJson,
            string existingDependenciesChanges)
        {
            // Arrange
            var projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(projectSubscriptionUpdateJson);
            var mockRootNode = IDependencyNodeFactory.Implement(existingTopLevelNodesJson);

            var provider = new TestableNuGetDependenciesSubTreeProvider();

            provider.SetRootNode(mockRootNode);

            // Act
            var resultDependenciesChange = provider.TestDependenciesChanged(projectSubscriptionUpdate, catalogs: null);

            // Assert
            // check that DependenciesChange returned is as expected
            var expectedResult = DependenciesChangeFactory.FromJson(existingDependenciesChanges);

            Assert.True(DependenciesChangeFactory.AreEqual(expectedResult, resultDependenciesChange));

            // Check if all added items were added to Snapshot
            var currentSnapshot = provider.GetCurrentSnapshotDependenciesWorld();

            foreach (var addedNode in expectedResult.AddedNodes)
            {
                if (addedNode.Id.ItemSpec.Contains("/"))
                {
                    // if it is a resolved package
                    Assert.True(currentSnapshot.Any(x => x.Equals(addedNode.Id.ItemSpec, StringComparison.OrdinalIgnoreCase)));
                }
            }
        }
Exemplo n.º 15
0
        public async Task VerifyFileWatcherRegistrationOnTreeChange(string inputTree, string changedTree, int numRegisterCalls, int numUnregisterCalls)
        {
            uint adviseCookie      = 100;
            var  fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie);

            var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t());

            using var watcher = new ProjectAssetFileWatcherInstance(
                      IVsServiceFactory.Create <SVsFileChangeEx, IVsAsyncFileChangeEx>(fileChangeService),
                      IProjectTreeProviderFactory.Create(),
                      IUnconfiguredProjectCommonServicesFactory.Create(threadingService: IProjectThreadingServiceFactory.Create()),
                      tasksService,
                      IActiveConfiguredProjectSubscriptionServiceFactory.Create());
            await watcher.InitializeAsync();

            var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson);

            var firstTree = ProjectTreeParser.Parse(inputTree);
            await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(firstTree), projectUpdate)));

            var secondTree = ProjectTreeParser.Parse(changedTree);
            await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(secondTree), projectUpdate)));

            // If fileToWatch is null then we expect to not register any filewatcher.
            var fileChangeServiceMock = Mock.Get(fileChangeService);

            fileChangeServiceMock.Verify(s => s.AdviseFileChangeAsync(It.IsAny <string>(), It.IsAny <_VSFILECHANGEFLAGS>(), watcher, CancellationToken.None),
                                         Times.Exactly(numRegisterCalls));
            fileChangeServiceMock.Verify(s => s.UnadviseFileChangeAsync(adviseCookie, CancellationToken.None), Times.Exactly(numUnregisterCalls));
        }
        public async Tasks.Task VerifyProjectNotAdded()
        {
            var projectGuid = Guid.NewGuid();

            var mockIVsStartupProjectsListService = IVsStartupProjectsListServiceFactory.CreateMockInstance(projectGuid);
            var iVsStartupProjectsListService     = mockIVsStartupProjectsListService.Object;

            var serviceProvider = SVsServiceProviderFactory.Create(iVsStartupProjectsListService);

            var debuggerLaunchProvider = CreateDebuggerLaunchProviderInstance();

            debuggerLaunchProvider.Debuggers.Add(GetLazyDebugLaunchProvider(debugs: false));
            var activeConfiguredProjectWithLaunchProviders = ActiveConfiguredProjectFactory.ImplementValue(() => debuggerLaunchProvider);

            var startupProjectRegistrar = CreateInstance(
                serviceProvider,
                activeConfiguredProjectWithLaunchProviders);

            var testWrapperMethod = new DataFlowExtensionMethodCaller(new DataFlowExtensionMethodWrapperMock());

            startupProjectRegistrar.WrapperMethodCaller = testWrapperMethod;

            await startupProjectRegistrar.Load();

            var projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{
    ""ProjectChanges"": {
        ""ConfigurationGeneral"": {
            ""Difference"": {
                ""ChangedProperties"": [ ""Something"" ]
            }
        }
    }
}");
            await startupProjectRegistrar.ConfigurationGeneralRuleBlock_ChangedAsync(
                IProjectVersionedValueFactory <IProjectSubscriptionUpdate> .Create(projectSubscriptionUpdate));

            mockIVsStartupProjectsListService.Verify(s => s.RemoveProject(ref projectGuid), Times.Never);
            mockIVsStartupProjectsListService.Verify(s => s.AddProject(ref projectGuid), Times.Never);

            projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{
    ""ProjectChanges"": {
        ""ConfigurationGeneral"": {
            ""Difference"": {
                ""ChangedProperties"": [ ""ProjectGuid"" ]
            },
            ""After"": {
                ""Properties"": {
                   ""ProjectGuid"": ""GuidNotParsable""
                }
            }
        }
    }
}");
            await startupProjectRegistrar.ConfigurationGeneralRuleBlock_ChangedAsync(
                IProjectVersionedValueFactory <IProjectSubscriptionUpdate> .Create(projectSubscriptionUpdate));

            mockIVsStartupProjectsListService.Verify(s => s.RemoveProject(ref projectGuid), Times.Never);
            mockIVsStartupProjectsListService.Verify(s => s.AddProject(ref projectGuid), Times.Never);
        }
        public void ToProjectRestoreInfo_WhenItemsAreMissing_ReturnsEmptyItemCollections()
        {
            var update = IProjectSubscriptionUpdateFactory.CreateEmpty();

            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            AssertNoItems(result);
        }
Exemplo n.º 18
0
        public async Tasks.Task VerifyProjectAdded_RemovedWithChange()
        {
            var projectGuid = Guid.NewGuid();

            var mockIVsStartupProjectsListService = IVsStartupProjectsListServiceFactory.CreateMockInstance(projectGuid);
            var iVsStartupProjectsListService     = IVsServiceFactory.Create <SVsStartupProjectsListService, IVsStartupProjectsListService>(mockIVsStartupProjectsListService.Object);

            var serviceProvider = SVsServiceProviderFactory.Create(iVsStartupProjectsListService);

            var debuggerLaunchProvider = CreateDebuggerLaunchProviderInstance();

            debuggerLaunchProvider.Debuggers.Add(GetLazyDebugLaunchProvider(debugs: true));
            var activeConfiguredProjectWithLaunchProviders = ActiveConfiguredProjectFactory.ImplementValue(() => debuggerLaunchProvider);

            var startupProjectRegistrar = CreateInstance(
                iVsStartupProjectsListService,
                activeConfiguredProjectWithLaunchProviders);

            var projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{
    ""ProjectChanges"": {
        ""ConfigurationGeneral"": {
            ""Difference"": {
                ""ChangedProperties"": [ ""ProjectGuid"" ]
            },
            ""After"": {
                ""Properties"": {
                   ""ProjectGuid"": """ + projectGuid + @"""
                }
            }
        }
    }
}");
            await startupProjectRegistrar.ConfigurationGeneralRuleBlock_ChangedAsync(
                IProjectVersionedValueFactory <IProjectSubscriptionUpdate> .Create(projectSubscriptionUpdate));

            mockIVsStartupProjectsListService.Verify(s => s.AddProject(ref projectGuid), Times.Once);
            mockIVsStartupProjectsListService.Verify(s => s.RemoveProject(ref projectGuid), Times.Never);

            debuggerLaunchProvider.Debuggers.Clear();
            debuggerLaunchProvider.Debuggers.Add(GetLazyDebugLaunchProvider(debugs: false));

            projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{
    ""ProjectChanges"": {
        ""ConfigurationGeneral"": {
            ""Difference"": {
                ""ChangedProperties"": [ ""OutputType"" ]
            }
        }
    }
}");

            await startupProjectRegistrar.ConfigurationGeneralRuleBlock_ChangedAsync(
                IProjectVersionedValueFactory <IProjectSubscriptionUpdate> .Create(projectSubscriptionUpdate));

            mockIVsStartupProjectsListService.Verify(s => s.RemoveProject(ref projectGuid), Times.Once);
        }
Exemplo n.º 19
0
        public void ToProjectRestoreInfo_SetsCoreProperties()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(ProjectWithEmptyItems);

            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal("C:\\Project\\obj", result.BaseIntermediatePath);
            Assert.Equal("net45", result.OriginalTargetFrameworks);
            Assert.Equal(1, result.TargetFrameworks.Count);
            Assert.Equal(".NETFramework, Version=v4.5", result.TargetFrameworks.Item(0).TargetFrameworkMoniker);
        }
        public void ToProjectRestoreInfo_WhenNuGetRestoreRuleMissing_ReturnsEmpty()
        {
            var update = IProjectSubscriptionUpdateFactory.CreateEmpty();
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Empty(result.BaseIntermediatePath);
            Assert.Empty(result.OriginalTargetFrameworks);
            Assert.Equal(1, result.TargetFrameworks.Count);

            var targetFramework = result.TargetFrameworks.Item(0);

            Assert.Empty(targetFramework.TargetFrameworkMoniker);
            Assert.Empty(targetFramework.Properties);
        }
Exemplo n.º 21
0
        public void ToProjectRestoreInfo_WhenNoItems_ReturnsEmptyItemCollections()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(ProjectWithEmptyItems);

            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Empty(result.ToolReferences);
            Assert.Equal(1, result.TargetFrameworks.Count);

            var targetFramework = result.TargetFrameworks.Item(0);

            Assert.Empty(targetFramework.PackageReferences);
            Assert.Empty(targetFramework.ProjectReferences);
        }
        [InlineData(new [] { "A", "B", "D", "E" }, new [] { "B", "C", "E", "F" }, new [] { "C", "F" }, new [] { "A", "D" })]                        // Addition and deletion in jumbled order with the same no of elements as before

        public void UpdateNamespaceImportListTest(string[] initialState, string[] updateToApply, string[] expectedAdded, string[] expectedRemoved)
        {
            var list = VisualBasicNamespaceImportsListFactory.CreateInstance(initialState);

            var json = ConstructNamespaceImportChangeJson(updateToApply);
            var projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(json);

            list.TestApply(projectSubscriptionUpdate);

            // Updates represent the final state, so they are the expected list too
            Assert.Equal(updateToApply.OrderBy(s => s), list.OrderBy(s => s));
            Assert.Equal(expectedAdded.OrderBy(s => s), list.ImportsAdded.OrderBy(s => s));
            Assert.Equal(expectedRemoved.OrderBy(s => s), list.ImportsRemoved.OrderBy(s => s));

            return;
Exemplo n.º 23
0
        public void NuGetDependenciesSubTreeProvider_ProcessDependenciesChanges(
            string projectSubscriptionUpdateJson,
            string existingTopLevelNodesJson,
            string packageToTestVersionUpdate,
            string existingDependenciesChanges)
        {
            // Arrange
            var projectSubscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(projectSubscriptionUpdateJson);
            var mockRootNode = IDependencyNodeFactory.Implement(existingTopLevelNodesJson);

            var provider = new TestableNuGetDependenciesSubTreeProvider();

            provider.SetRootNode(mockRootNode);

            // Act
            var resultDependenciesChange = provider.TestDependenciesChanged(projectSubscriptionUpdate, catalogs: null);

            // Assert
            // Check that for updated/changed nodes, properties were updated
            var propertyToCheck = "Version";
            var itemsProperties = projectSubscriptionUpdate.ProjectChanges.Values
                                  .Where(y => y.Difference.AnyChanges &&
                                         y.Difference.ChangedItems.Any(x => x.Equals(packageToTestVersionUpdate)))
                                  .Select(x => x.After.Items)
                                  .FirstOrDefault();
            var expectedPropertyValue = itemsProperties[packageToTestVersionUpdate][propertyToCheck];

            var properties = provider.GetDependencyProperties(packageToTestVersionUpdate);

            Assert.Equal(expectedPropertyValue, properties[propertyToCheck]);

            // check that DependenciesChange returned is as expected
            var expectedResult = DependenciesChangeFactory.FromJson(existingDependenciesChanges);

            Assert.True(DependenciesChangeFactory.AreEqual(expectedResult, resultDependenciesChange));

            // Check if all added items were added to Snapshot
            var currentSnapshot = provider.GetCurrentSnapshotDependenciesWorld();

            foreach (var addedNode in expectedResult.AddedNodes)
            {
                if (addedNode.Id.ItemSpec.Contains("/"))
                {
                    // if it is a resolved package
                    Assert.True(currentSnapshot.Any(x => x.Equals(addedNode.Id.ItemSpec, StringComparison.OrdinalIgnoreCase)));
                }
            }
        }
        public void ToProjectRestoreInfo_SetsProjectReferences()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""ProjectReference"": {
            ""Items"" : {
                ""..\\Project\\Project1.csproj"" : {
                    ""ProjectFileFullPath"" : ""C:\\Solution\\Project\\Project1.csproj"",
                },
                ""..\\Project\\Project2.csproj"" : {
                    ""ProjectFileFullPath"" : ""C:\\Solution\\Project\\Project2.csproj"",
                },
                ""..\\Project\\Project3.csproj"" : {
                    ""ProjectFileFullPath"" : ""C:\\Solution\\Project\\Project3.csproj"",
                    ""MetadataName"": ""MetadataValue""
                }
            }
        }
    }
}");
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal(1, result.TargetFrameworks.Count);

            var references = result.TargetFrameworks.Item(0).ProjectReferences;

            Assert.Equal(3, references.Count);

            var reference1 = references.Item("..\\Project\\Project1.csproj");

            Assert.Equal("..\\Project\\Project1.csproj", reference1.Name);

            AssertContainsProperty("ProjectFileFullPath", "C:\\Solution\\Project\\Project1.csproj", reference1.Properties);

            var reference2 = references.Item("..\\Project\\Project2.csproj");

            Assert.Equal("..\\Project\\Project2.csproj", reference2.Name);

            AssertContainsProperty("ProjectFileFullPath", "C:\\Solution\\Project\\Project2.csproj", reference2.Properties);

            var reference3 = references.Item("..\\Project\\Project3.csproj");

            Assert.Equal("..\\Project\\Project3.csproj", reference3.Name);

            AssertContainsProperty("ProjectFileFullPath", "C:\\Solution\\Project\\Project3.csproj", reference3.Properties);
            AssertContainsProperty("MetadataName", "MetadataValue", reference3.Properties);
        }
Exemplo n.º 25
0
        public void ToProjectRestoreInfo_SetsCentralPackageVersions()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""CollectedPackageVersion"": {
            ""Items"" : {
                ""Newtonsoft.Json"" : {
                    ""Version"" : ""1.0"",
                },
                ""System.IO"" : {
                    ""Version"" : ""2.0"",
                },
                ""Microsoft.Extensions"" : {
                    ""Version"" : ""3.0""
                }
            }
        }
    }
}");
            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal(1, result.TargetFrameworks.Count);

            var versions = ((IVsTargetFrameworkInfo3)result.TargetFrameworks.Item(0)).CentralPackageVersions;

            Assert.Equal(3, versions.Count);

            var reference1 = versions.Item("Newtonsoft.Json");

            Assert.Equal("Newtonsoft.Json", reference1.Name);

            AssertContainsProperty("Version", "1.0", reference1.Properties);

            var reference2 = versions.Item("System.IO");

            Assert.Equal("System.IO", reference2.Name);

            AssertContainsProperty("Version", "2.0", reference2.Properties);

            var reference3 = versions.Item("Microsoft.Extensions");

            Assert.Equal("Microsoft.Extensions", reference3.Name);

            AssertContainsProperty("Version", "3.0", reference3.Properties);
        }
        private void SendDesignTimeInputs(DesignTimeInputs inputs, string?intermediateOutputPath = null)
        {
            _intermediateOutputPath = intermediateOutputPath ?? _intermediateOutputPath;

            var ruleUpdate = @"{
                                      ""ProjectChanges"": {
                                          ""ConfigurationGeneral"": {
                                              ""Difference"": {
                                                  ""ChangedProperties"": [ ";

            if (_lastIntermediateOutputPath != _intermediateOutputPath)
            {
                ruleUpdate += @"                        ""IntermediateOutputPath"",";
            }
            // root namespace and project folder have changed if its the first time we've sent inputs
            if (_lastIntermediateOutputPath == null)
            {
                ruleUpdate += @"                        ""ProjectDir"",
                                                        ""RootNamespace""";
            }
            ruleUpdate  = ruleUpdate.TrimEnd(',');
            ruleUpdate += @"                      ]
                                              },
                                              ""After"": {
                                                  ""Properties"": {
                                                      ""ProjectDir"": """ + _projectFolder.Replace("\\", "\\\\") + @""",
                                                      ""IntermediateOutputPath"": """ + _intermediateOutputPath.Replace("\\", "\\\\") + @""",
                                                      ""RootNamespace"": ""MyNamespace""
                                                  }
                                              }
                                          }
                                      }
                                  }";
            IProjectSubscriptionUpdate subscriptionUpdate = IProjectSubscriptionUpdateFactory.FromJson(ruleUpdate);

            _lastIntermediateOutputPath = _intermediateOutputPath;

            // Ensure our input files are in the mock file system
            foreach (string file in inputs.Inputs.Concat(inputs.SharedInputs))
            {
                var fullFilePath = Path.Combine(_projectFolder, file);
            }

            _changeTracker.ProcessDataflowChanges(new ProjectVersionedValue <Tuple <DesignTimeInputs, IProjectSubscriptionUpdate> >(new Tuple <DesignTimeInputs, IProjectSubscriptionUpdate>(inputs, subscriptionUpdate), ImmutableDictionary <NamedIdentity, IComparable> .Empty));
        }
        public void ToProjectRestoreInfo_RespectsNuGetTargetMonikerIfPresent()
        {
            var update          = IProjectSubscriptionUpdateFactory.FromJson(@"
{
    ""CurrentState"": {
        ""NuGetRestore"": {
            ""Properties"": {
                ""NuGetTargetMoniker"": ""UWP, Version=v10"",
                ""TargetFrameworkMoniker"": "".NETFramework, Version=v4.5""
            },
        }
    }
}
");
            var result          = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);
            var targetFramework = result.TargetFrameworks.Item(0);

            Assert.Equal("UWP, Version=v10", targetFramework.TargetFrameworkMoniker);
        }
Exemplo n.º 28
0
        public async Task VerifyFileWatcherRegistration(string inputTree, string fileToWatch)
        {
            uint adviseCookie      = 100;
            var  fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie);

            var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t());

            using (var watcher = new ProjectAssetFileWatcher(IVsServiceFactory.Create <SVsFileChangeEx, Shell.IVsAsyncFileChangeEx>(fileChangeService), IProjectTreeProviderFactory.Create(), IUnconfiguredProjectCommonServicesFactory.Create(threadingService: IProjectThreadingServiceFactory.Create()), tasksService, IActiveConfiguredProjectSubscriptionServiceFactory.Create()))
            {
                var tree          = ProjectTreeParser.Parse(inputTree);
                var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson);
                watcher.Load();
                await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate)));

                // If fileToWatch is null then we expect to not register any filewatcher.
                var times = fileToWatch == null?Times.Never() : Times.Once();

                Mock.Get(fileChangeService).Verify(s => s.AdviseFileChangeAsync(fileToWatch ?? It.IsAny <string>(), It.IsAny <_VSFILECHANGEFLAGS>(), watcher, CancellationToken.None), times);
            }
        }
Exemplo n.º 29
0
        public void ToProjectRestoreInfo_SetsToolReferences()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(ProjectWithItems);

            var result     = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);
            var references = result.ToolReferences;

            Assert.Equal(3, references.Count);

            Assert.Equal("ToolReference1", references.Item("ToolReference1").Name);
            Assert.Equal("Version", references.Item("ToolReference1").Properties.Item("Version").Name);
            Assert.Equal("1.0.0.0", references.Item("ToolReference1").Properties.Item("Version").Value);

            Assert.Equal("ToolReference2", references.Item("ToolReference2").Name);
            Assert.Equal("Version", references.Item("ToolReference2").Properties.Item("Version").Name);
            Assert.Equal("2.0.0.0", references.Item("ToolReference2").Properties.Item("Version").Value);

            Assert.Equal("ToolReference3", references.Item("ToolReference3").Name);
            Assert.Equal("Name", references.Item("ToolReference3").Properties.Item("Name").Name);
            Assert.Equal("Value", references.Item("ToolReference3").Properties.Item("Name").Value);
        }
Exemplo n.º 30
0
        public void ToProjectRestoreInfo_SetsTargetFrameworkPropertiesToAllProperties()
        {
            var update = IProjectSubscriptionUpdateFactory.FromJson(ProjectWithEmptyItems);

            var result = RestoreBuilder.ToProjectRestoreInfo(update.CurrentState);

            Assert.Equal(1, result.TargetFrameworks.Count);

            var properties = result.TargetFrameworks.Item(0).Properties;

            Assert.Equal("MSBuildProjectExtensionsPath", properties.Item("MSBuildProjectExtensionsPath").Name);
            Assert.Equal("C:\\Project\\obj", properties.Item("MSBuildProjectExtensionsPath").Value);

            Assert.Equal("TargetFrameworks", properties.Item("TargetFrameworks").Name);
            Assert.Equal("net45", properties.Item("TargetFrameworks").Value);

            Assert.Equal("TargetFrameworkMoniker", properties.Item("TargetFrameworkMoniker").Name);
            Assert.Equal(".NETFramework, Version=v4.5", properties.Item("TargetFrameworkMoniker").Value);

            Assert.Equal("Property", properties.Item("Property").Name);
            Assert.Equal("Value", properties.Item("Property").Value);
        }