public void ShouldReturnAllPathsFromSourceToDestinationWhenMultiplePathsExist()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = Any.Instance <NamespaceName>();
            var namespace2 = Any.Instance <NamespaceName>();
            var namespace3 = Any.Instance <NamespaceName>();
            var namespace4 = Any.Instance <NamespaceName>();

            cache.AddMapping(namespace1, namespace2);
            cache.AddMapping(namespace2, namespace3);
            cache.AddMapping(namespace1, namespace4);
            cache.AddMapping(namespace4, namespace3);

            //WHEN
            var paths = cache.RetrievePathsBetween(
                Pattern.WithoutExclusion(namespace1.ToString()),
                Pattern.WithoutExclusion(namespace3.ToString()));

            //THEN
            paths[0].Should().Be(NamespaceDependencyPath.With(

                                     namespace1,
                                     namespace2,
                                     namespace3
                                     ));
            paths[1].Should().Be(
                NamespaceDependencyPath.With(
                    namespace1,
                    namespace4,
                    namespace3
                    ));
            paths.Should().HaveCount(2);
        }
        public void ShouldBeAbleToRetrieveMultipleIndirectCycleTakingOrderIntoAccount()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = new NamespaceName("a");
            var namespace2 = new NamespaceName("b");
            var namespace3 = new NamespaceName("c");
            var namespace4 = new NamespaceName("d");

            cache.AddMapping(namespace1, namespace2);
            cache.AddMapping(namespace2, namespace1);

            cache.AddMapping(namespace1, namespace3);
            cache.AddMapping(namespace3, namespace4);
            cache.AddMapping(namespace4, namespace1);

            //WHEN
            var cycles = cache.RetrieveCycles();

            //THEN
            cycles[0].Should().Be(NamespaceDependencyPath.With(
                                      namespace1,
                                      namespace2,
                                      namespace1
                                      ));
            cycles[1].Should().Be(NamespaceDependencyPath.With(
                                      namespace1,
                                      namespace3,
                                      namespace4,
                                      namespace1
                                      ));
            cycles.Should().HaveCount(2);
        }
        public void ShouldReturnNoCyclesWhenNoMappingsWereAdded()
        {
            //GIVEN
            var cache = new NamespacesDependenciesCache();

            //WHEN
            var cycles = cache.RetrieveCycles();

            //THEN
            cycles.Should().BeEmpty();
        }
        public void ShouldReturnNoCyclesWhenMappingExistsBetweenANamespaceAndItself()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = Any.Instance <NamespaceName>();

            cache.AddMapping(namespace1, namespace1);

            //WHEN
            var cycles = cache.RetrieveCycles();

            //THEN
            cycles.Should().BeEmpty();
        }
        public void ShouldReturnNoCyclesWhenMappingsAddedDoNotMakeTheCycle()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = Any.Instance <NamespaceName>();
            var namespace2 = Any.Instance <NamespaceName>();
            var namespace3 = Any.Instance <NamespaceName>();

            cache.AddMapping(namespace1, namespace2);
            cache.AddMapping(namespace2, namespace3);

            //WHEN
            var cycles = cache.RetrieveCycles();

            //THEN
            cycles.Should().BeEmpty();
        }
        public void ShouldNotReturnAPathConsistingOfASingleEntry()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = Any.Instance <NamespaceName>();
            var namespace2 = Any.Instance <NamespaceName>();

            cache.AddMapping(namespace1, namespace2);

            //WHEN
            var paths = cache.RetrievePathsBetween(
                Pattern.WithoutExclusion(namespace1.ToString()),
                Pattern.WithoutExclusion(namespace1.ToString()));

            //THEN
            paths.Should().BeEmpty();
        }
        public void ShouldReturnADirectPathFromSourceToDestination()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = Any.Instance <NamespaceName>();
            var namespace2 = Any.Instance <NamespaceName>();

            cache.AddMapping(namespace1, namespace2);

            //WHEN
            var paths = cache.RetrievePathsBetween(
                Pattern.WithoutExclusion(namespace1.ToString()),
                Pattern.WithoutExclusion(namespace2.ToString()));

            //THEN
            paths[0].Should().Be(NamespaceDependencyPath.With(
                                     namespace1,
                                     namespace2
                                     ));
            paths.Should().HaveCount(1);
        }
        public void ShouldReturnEmptyListWhenThereAreNoPathsFromSourceToDestination()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = Any.Instance <NamespaceName>();
            var namespace2 = Any.Instance <NamespaceName>();
            var namespace3 = Any.Instance <NamespaceName>();
            var namespace4 = Any.Instance <NamespaceName>();

            cache.AddMapping(namespace1, namespace2);
            cache.AddMapping(namespace2, namespace3);
            cache.AddMapping(namespace4, namespace1);

            //WHEN
            var paths = cache.RetrievePathsBetween(
                Pattern.WithoutExclusion(namespace1.ToString()),
                Pattern.WithoutExclusion(namespace4.ToString()));

            //THEN
            paths.Should().BeEmpty();
        }
        public void ShouldBeAbleToRetrieveSingleDirectCycle()
        {
            //GIVEN
            var cache      = new NamespacesDependenciesCache();
            var namespace1 = new NamespaceName("a");
            var namespace2 = new NamespaceName("b");

            cache.AddMapping(namespace1, namespace2);
            cache.AddMapping(namespace2, namespace1);

            //WHEN
            var cycles = cache.RetrieveCycles();

            //THEN
            cycles.Single().Should().Be(new NamespaceDependencyPath(
                                            new List <NamespaceName>
            {
                namespace1,
                namespace2,
                namespace1
            }.ToImmutableList()));
        }