public void ProjectRepository_NuGetRemoved()
        {
            CleanUpDatabase();

            // Suppose we have project with two nugets
            var project = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    },
                    new Package {
                        Name = "Nuget2", TargetFramework = "4.5", Version = "1.0"
                    }
                }
            };

            // We save it
            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(project);
            }

            Assert.That(GetTableRowCount("Project"), Is.EqualTo(1));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(2));

            // .. and than Nuget2 gets removed from this project and we load this project with just one NuGet:
            var sameProjectOneNugetLess = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    }
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(sameProjectOneNugetLess);
            }

            // Now there should be only one nuget
            Assert.That(GetTableRowCount("Project"), Is.EqualTo(1));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(2));        // There are still two packages
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(1)); // but only one package left in this project
        }
        public void ProjectRepository_MultipleNugetVersions()
        {
            CleanUpDatabase();

            // Suppose we have projects with with the same nuget name, but different versions
            var project1 = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    },
                }
            };

            var project2 = new Project
            {
                Name       = "Console App2",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "2.0"
                    },
                }
            };

            // We save both of them
            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(project1);
                repository.SaveProject(project2);
            }

            Assert.That(GetTableRowCount("Project"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(2)); // That's the whole point
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(2));
        }
        public void ProjectRepository_CanSaveProject()
        {
            CleanUpDatabase();
            var project = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    },
                    new Package {
                        Name = "Nuget2", TargetFramework = "4.5", Version = "1.0"
                    }
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(project);
            }

            Assert.That(GetTableRowCount("Project"), Is.EqualTo(1));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(2));

            var anotherProjectThatUsesTheSameNuget = new Project
            {
                Name       = "Some DLL",
                OutputKind = "Dll",
                Platform   = "x86",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    },
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(anotherProjectThatUsesTheSameNuget);
            }

            Assert.That(GetTableRowCount("Project"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(3));

            // Meaning Nuget1 and Nuget2 are no longer part of this project
            var sameProjectNewNuget = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget3", TargetFramework = "4.6.1", Version = "1.1"
                    },
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(sameProjectNewNuget);
            }

            Assert.That(GetTableRowCount("Project"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(3));
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(2)); // SomeDll has one and Console App has one

            var duplicateProject = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget3", TargetFramework = "4.6.1", Version = "1.1"
                    },
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(duplicateProject);
            }

            Assert.That(GetTableRowCount("Project"), Is.EqualTo(2));
            Assert.That(GetTableRowCount("Package"), Is.EqualTo(3));
            Assert.That(GetTableRowCount("ProjectPackage"), Is.EqualTo(2)); // just like one above
        }
        public void ProjectRepository_DependencyMatrix()
        {
            CleanUpDatabase();
            var project = new Project
            {
                Name       = "Console App",
                OutputKind = "Console",
                Platform   = "Any",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    },
                    new Package {
                        Name = "Nuget2", TargetFramework = "4.5", Version = "1.0"
                    },
                    new Package {
                        Name = "Nuget3", TargetFramework = "4.6.1", Version = "1.1"
                    },
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(project);
            }

            var anotherProjectThatUsesTheSameNuget = new Project
            {
                Name       = "Some DLL",
                OutputKind = "Dll",
                Platform   = "x86",
                Packages   = new List <Package>
                {
                    new Package {
                        Name = "Nuget1", TargetFramework = "4.5", Version = "1.0"
                    },
                }
            };

            using (var repository = new ProjectRepository(_connectionString))
            {
                repository.SaveProject(anotherProjectThatUsesTheSameNuget);
            }


            DependencyMatrix dm;

            using (var repository = new ProjectRepository(_connectionString))
            {
                //           ConsoleApp SomeDll
                // Nuget1        x         x
                // Nuget2        x
                // Nuget3        x
                dm = repository.GetDependencyMatrix();
            }

            CollectionAssert.AreEqual(dm.Rows.Select(s => s.Value), new string[] { "Nuget1 1.0", "Nuget2 1.0", "Nuget3 1.1" });
            CollectionAssert.AreEqual(dm.Columns.Select(s => s.Value), new string[] { "Console App", "Some DLL" });
            Assert.IsTrue(dm.Matrix[dm.Rows[0].Id, dm.Columns[0].Id]);
            Assert.IsTrue(dm.Matrix[dm.Rows[0].Id, dm.Columns[1].Id]);
            Assert.IsTrue(dm.Matrix[dm.Rows[1].Id, dm.Columns[0].Id]);
        }