public async Task WhenEmptySnapshot_ShouldJustUpdateDependencyRootNode()
        {
            // Arrange
            var treeServices         = new MockIDependenciesTreeServices();
            var treeViewModelFactory = IMockDependenciesViewModelFactory.Implement(getDependenciesRootIcon: KnownMonikers.AboutBox);
            var project        = UnconfiguredProjectFactory.Create();
            var commonServices = IUnconfiguredProjectCommonServicesFactory.Create(project: project);

            var dependenciesRoot = new TestProjectTree
            {
                Caption  = "MyDependencies",
                FilePath = ""
            };
            var targets  = new Dictionary <ITargetFramework, ITargetedDependenciesSnapshot>();
            var snapshot = IDependenciesSnapshotFactory.Implement(targets: targets, hasUnresolvedDependency: false);

            // Act
            var provider   = new GroupedByTargetTreeViewProvider(treeServices, treeViewModelFactory, commonServices);
            var resultTree = await provider.BuildTreeAsync(dependenciesRoot, snapshot);

            // Assert
            var expectedFlatHierarchy =
                @"Caption=MyDependencies, FilePath=, IconHash=325248080, ExpandedIconHash=325248080, Rule=, IsProjectItem=False, CustomTag=
";

            Assert.Equal(expectedFlatHierarchy, ((TestProjectTree)resultTree).FlatHierarchy);
            Assert.Equal(KnownMonikers.AboutBox.ToProjectSystemType(), resultTree.Icon);
            Assert.Equal(KnownMonikers.AboutBox.ToProjectSystemType(), resultTree.ExpandedIcon);
        }
        public async Task WhenMultipleTargetSnapshotsWithExistingDependencies_ShouldApplyChanges()
        {
            var tfm1   = ITargetFrameworkFactory.Implement(moniker: "tfm1");
            var tfm2   = ITargetFrameworkFactory.Implement(moniker: "tfm2");
            var tfmAny = ITargetFrameworkFactory.Implement(moniker: "any");

            var dependencyModelRootXxx = IDependencyModelFactory.FromJson(@"
                {
                    ""ProviderType"": ""Xxx"",
                    ""Id"": ""XxxDependencyRoot"",
                    ""Name"":""XxxDependencyRoot"",
                    ""Caption"":""XxxDependencyRoot"",
                    ""Resolved"":""true""
                }");

            var dependencyXxx1 = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Xxx"",
                    ""Id"": ""xxx\\dependency1"",
                    ""Path"": ""dependencyxxxpath"",
                    ""Name"":""dependency1"",
                    ""Caption"":""Dependency1"",
                    ""SchemaItemType"":""Xxx"",
                    ""Resolved"":""true""
                }",
                                                             icon: KnownMonikers.Uninstall,
                                                             expandedIcon: KnownMonikers.Uninstall,
                                                             targetFramework: tfm1);

            var dependencyModelRootYyy = IDependencyModelFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""YyyDependencyRoot"",
                    ""Name"":""YyyDependencyRoot"",
                    ""Caption"":""YyyDependencyRoot""
                }");

            var dependencyYyy1 = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""yyy\\dependency1"",
                    ""Path"": ""dependencyyyypath"",
                    ""Name"":""dependency1"",
                    ""Caption"":""Dependency1"",
                    ""SchemaItemType"":""Yyy"",
                    ""Resolved"":""true""
                }",
                                                             icon: KnownMonikers.Uninstall,
                                                             expandedIcon: KnownMonikers.Uninstall,
                                                             targetFramework: tfm1);

            var dependencyYyyExisting = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""yyy\\dependencyExisting"",
                    ""Path"": ""dependencyyyyExistingpath"",
                    ""Name"":""dependencyExisting"",
                    ""Caption"":""DependencyExisting"",
                    ""SchemaItemType"":""Yyy"",
                    ""Resolved"":""true""
                }",
                                                                    icon: KnownMonikers.Uninstall,
                                                                    expandedIcon: KnownMonikers.Uninstall,
                                                                    targetFramework: tfm1);

            var dependencyModelRootZzz = IDependencyModelFactory.FromJson(@"
                {
                    ""ProviderType"": ""Zzz"",
                    ""Id"": ""ZzzDependencyRoot"",
                    ""Name"":""ZzzDependencyRoot"",
                    ""Caption"":""ZzzDependencyRoot"",
                    ""Resolved"":""true""
                }",
                                                                          flags: ProjectTreeFlags.Create(ProjectTreeFlags.Common.BubbleUp));
            var dependencyAny1 = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Zzz"",
                    ""Id"": ""ZzzDependencyAny1"",
                    ""Path"": ""ZzzDependencyAny1path"",
                    ""Name"":""ZzzDependencyAny1"",
                    ""Caption"":""ZzzDependencyAny1""
                }",
                                                             targetFramework: tfmAny);

            var dependencies = new List <IDependency>
            {
                dependencyXxx1,
                dependencyYyy1,
                dependencyYyyExisting
            };

            var dependenciesAny = new List <IDependency>
            {
                dependencyAny1
            };

            var oldRootChildToBeRemoved = new TestProjectTree
            {
                Caption  = "OldRootChildToBeRemoved",
                FilePath = ""
            };

            var dependencyYyyExistingTree = new TestProjectTree
            {
                Caption  = "DependencyExisting",
                FilePath = "yyy\\dependencyExisting"
            };

            var dependencyRootYyyTree = new TestProjectTree
            {
                Caption  = "YyyDependencyRoot",
                FilePath = "YyyDependencyRoot"
            };

            dependencyRootYyyTree.Add(dependencyYyyExistingTree);

            var dependenciesRoot = new TestProjectTree
            {
                Caption  = "MyDependencies",
                FilePath = ""
            };

            dependenciesRoot.Add(oldRootChildToBeRemoved);
            dependenciesRoot.Add(dependencyRootYyyTree);

            var targetModel1 = IDependencyModelFactory.FromJson(@"
                {
                    ""Id"": ""tfm1"",
                    ""Name"":""tfm1"",
                    ""Caption"":""tfm1""
                }");
            var targetModel2 = IDependencyModelFactory.FromJson(@"
                {
                    ""Id"": ""tfm2"",
                    ""Name"":""tfm2"",
                    ""Caption"":""tfm2""
                }");

            var treeViewModelFactory = IMockDependenciesViewModelFactory.Implement(
                getDependenciesRootIcon: KnownMonikers.AboutBox,
                createRootViewModel: new[] { dependencyModelRootXxx, dependencyModelRootYyy, dependencyModelRootZzz },
                createTargetViewModel: new[] { targetModel1, targetModel2 });

            var testData = new Dictionary <ITargetFramework, List <IDependency> >
            {
                { tfm1, dependencies },
                { tfm2, dependencies },
                { tfmAny, dependenciesAny }
            };

            var project        = UnconfiguredProjectFactory.Create(filePath: @"c:\somefolder\someproject.csproj");
            var commonServices = IUnconfiguredProjectCommonServicesFactory.Create(project: project);

            var provider = new GroupedByTargetTreeViewProvider(
                new MockIDependenciesTreeServices(),
                treeViewModelFactory,
                commonServices);

            // Act
            var resultTree = await provider.BuildTreeAsync(dependenciesRoot, GetSnapshot(testData));

            // Assert
            var expectedFlatHierarchy =
                @"Caption=MyDependencies, FilePath=, IconHash=325248080, ExpandedIconHash=325248080, Rule=, IsProjectItem=False, CustomTag=
Caption=ZzzDependencyRoot, FilePath=ZzzDependencyRoot, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=ZzzDependencyAny1, FilePath=ZzzDependencyAny1, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=tfm2, FilePath=tfm2, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=, BubbleUpFlag=True
Caption=YyyDependencyRoot, FilePath=YyyDependencyRoot, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=DependencyExisting, FilePath=tfm1\Yyy\dependencyyyyExistingpath, IconHash=325249260, ExpandedIconHash=325249260, Rule=, IsProjectItem=False, CustomTag=
Caption=Dependency1, FilePath=tfm1\Yyy\dependencyyyypath, IconHash=325249260, ExpandedIconHash=325249260, Rule=, IsProjectItem=False, CustomTag=
Caption=XxxDependencyRoot, FilePath=XxxDependencyRoot, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=Dependency1, FilePath=tfm1\Xxx\dependencyxxxpath, IconHash=325249260, ExpandedIconHash=325249260, Rule=, IsProjectItem=False, CustomTag=
Caption=tfm1, FilePath=tfm1, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=, BubbleUpFlag=True
Caption=YyyDependencyRoot, FilePath=YyyDependencyRoot, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=DependencyExisting, FilePath=tfm1\Yyy\dependencyyyyExistingpath, IconHash=325249260, ExpandedIconHash=325249260, Rule=, IsProjectItem=True, CustomTag=
Caption=Dependency1, FilePath=tfm1\Yyy\dependencyyyypath, IconHash=325249260, ExpandedIconHash=325249260, Rule=, IsProjectItem=True, CustomTag=
Caption=XxxDependencyRoot, FilePath=XxxDependencyRoot, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=Dependency1, FilePath=tfm1\Xxx\dependencyxxxpath, IconHash=325249260, ExpandedIconHash=325249260, Rule=, IsProjectItem=True, CustomTag=
";

            Assert.Equal(expectedFlatHierarchy, ((TestProjectTree)resultTree).FlatHierarchy);
        }
        public async Task WheEmptySnapshotAndVisibilityMarkerNotProvided_ShouldHideSubTreeRoot()
        {
            var dependencyModelRootYyy     = IDependencyModelFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""YyyDependencyRoot"",
                    ""Name"":""YyyDependencyRoot"",
                    ""Caption"":""YyyDependencyRoot"",
                    ""Resolved"":""true""
                }");
            var dependencyVisibilityMarker = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""someid"",
                    ""Name"":""someid"",
                    ""Caption"":""someid"",
                    ""Resolved"":""false"",
                    ""Visible"":""false""
                }");

            var dependencies = new List <IDependency>
            {
                dependencyVisibilityMarker
            };

            var dependencyRootYyyTree = new TestProjectTree
            {
                Caption  = "YyyDependencyRoot",
                FilePath = "YyyDependencyRoot"
            };

            var dependenciesRoot = new TestProjectTree
            {
                Caption  = "MyDependencies",
                FilePath = ""
            };

            dependenciesRoot.Add(dependencyRootYyyTree);

            var treeViewModelFactory = IMockDependenciesViewModelFactory.Implement(
                getDependenciesRootIcon: KnownMonikers.AboutBox,
                createRootViewModel: new[] { dependencyModelRootYyy });

            var testData = new Dictionary <ITargetFramework, List <IDependency> >
            {
                { ITargetFrameworkFactory.Implement(moniker: "tfm1"), dependencies }
            };

            var project        = UnconfiguredProjectFactory.Create(filePath: @"c:\somefolder\someproject.csproj");
            var commonServices = IUnconfiguredProjectCommonServicesFactory.Create(project: project);

            var provider = new GroupedByTargetTreeViewProvider(
                new MockIDependenciesTreeServices(),
                treeViewModelFactory,
                commonServices);

            // Act
            var resultTree = await provider.BuildTreeAsync(dependenciesRoot, GetSnapshot(testData));

            // Assert
            var expectedFlatHierarchy =
                @"Caption=MyDependencies, FilePath=, IconHash=325248080, ExpandedIconHash=325248080, Rule=, IsProjectItem=False, CustomTag=
";

            Assert.Equal(expectedFlatHierarchy, ((TestProjectTree)resultTree).FlatHierarchy);
        }
        public async Task WhenOneTargetSnapshotAndDependencySupportsRule_ShouldCreateRule()
        {
            var dependencyRootYyy     = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""YyyDependencyRoot"",
                    ""Name"":""YyyDependencyRoot"",
                    ""Caption"":""YyyDependencyRoot"",
                    ""Resolved"":""true""
                }");
            var dependencyYyyExisting = IDependencyFactory.FromJson(@"
                {
                    ""ProviderType"": ""Yyy"",
                    ""Id"": ""tfm1\\yyy\\dependencyExisting"",
                    ""Name"":""dependencyExisting"",
                    ""Caption"":""DependencyExisting"",
                    ""SchemaItemType"":""Yyy"",
                    ""Resolved"":""true""
                }",
                                                                    icon: KnownMonikers.Uninstall,
                                                                    expandedIcon: KnownMonikers.Uninstall,
                                                                    flags: DependencyTreeFlags.SupportsRuleProperties);

            var dependencies = new List <IDependency>
            {
                dependencyYyyExisting
            };

            var dependencyYyyExistingTree = new TestProjectTree
            {
                Caption  = "DependencyExisting",
                FilePath = "tfm1\\yyy\\dependencyExisting",
                Flags    = DependencyTreeFlags.ResolvedFlags
            };

            var dependencyRootYyyTree = new TestProjectTree
            {
                Caption  = "YyyDependencyRoot",
                FilePath = "YyyDependencyRoot"
            };

            dependencyRootYyyTree.Add(dependencyYyyExistingTree);

            var dependenciesRoot = new TestProjectTree
            {
                Caption  = "MyDependencies",
                FilePath = ""
            };

            dependenciesRoot.Add(dependencyRootYyyTree);

            var treeViewModelFactory = IMockDependenciesViewModelFactory.Implement(
                getDependenciesRootIcon: KnownMonikers.AboutBox,
                createRootViewModel: new[] { dependencyRootYyy });

            var testData = new Dictionary <ITargetFramework, List <IDependency> >
            {
                { ITargetFrameworkFactory.Implement(moniker: "tfm1"), dependencies }
            };

            var project        = UnconfiguredProjectFactory.Create(filePath: @"c:\somefolder\someproject.csproj");
            var commonServices = IUnconfiguredProjectCommonServicesFactory.Create(project: project);

            var provider = new GroupedByTargetTreeViewProvider(
                new MockIDependenciesTreeServices(),
                treeViewModelFactory,
                commonServices);

            // Act
            var resultTree = await provider.BuildTreeAsync(dependenciesRoot, GetSnapshot(testData));

            // Assert
            var expectedFlatHierarchy =
                @"Caption=MyDependencies, FilePath=, IconHash=325248080, ExpandedIconHash=325248080, Rule=, IsProjectItem=False, CustomTag=
Caption=YyyDependencyRoot, FilePath=YyyDependencyRoot, IconHash=0, ExpandedIconHash=0, Rule=, IsProjectItem=False, CustomTag=
Caption=DependencyExisting, FilePath=tfm1\yyy\dependencyExisting, IconHash=325249260, ExpandedIconHash=325249260, Rule=Yyy, IsProjectItem=False, CustomTag=
";

            Assert.Equal(expectedFlatHierarchy, ((TestProjectTree)resultTree).FlatHierarchy);
        }