コード例 #1
0
        public void TestToTooFewFields()
        {
            var          pi           = new ProjectItems((p, i) => new ProjectItems.SelfOptimizingPrefixTrieProjector(p, i, 2, "prefixTrie"));
            var          gc           = new GlobalContext();
            const string THREE_FIELDS = "THREE_FIELDS";

            pi.Configure(gc, $@"{{ -pl
    $ {THREE_FIELDS}(F1:F2:F3) ---% {THREE_FIELDS}

    ! a:b:c ---% ::
    ! a:b   ---% : // this threw an exception before a fix
    ! a    ---%
}}", forceReload: false);

            ItemType     threeFields = ItemType.Find(THREE_FIELDS);
            WorkingGraph graph       = gc.CurrentGraph;
            Item         abc         = graph.CreateItem(threeFields, "a:b:c");
            Item         ab          = graph.CreateItem(threeFields, "a:b:-");
            Item         a           = graph.CreateItem(threeFields, "a:-:-");

            var result = new List <Dependency>();

            pi.Transform(gc, new[] {
                graph.CreateDependency(abc, abc, null, "abc", 1),
                graph.CreateDependency(ab, ab, null, "ab", 1),
                graph.CreateDependency(a, a, null, "a", 1),
            }, "", result, s => null);

            Assert.AreEqual(0, result.Count);
        }
コード例 #2
0
        public void TestMarkLaterCycleWithExplicitAsserts()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a    = graph.CreateItem(ItemType.SIMPLE, "a");
            var b    = graph.CreateItem(ItemType.SIMPLE, "b");
            var c    = graph.CreateItem(ItemType.SIMPLE, "c");
            var d    = graph.CreateItem(ItemType.SIMPLE, "d");
            var e    = graph.CreateItem(ItemType.SIMPLE, "e");
            var deps = new[] {
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(c, d, null, "", 1),
                graph.CreateDependency(d, e, null, "", 1),
                graph.CreateDependency(e, c, null, "", 1),
            };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om,
                                          new MarkCycleDeps.TransformOptions {
                KeepOnlyCycleDependencies = true
            }, deps, result);

            result.Sort((x, y) => string.Compare(x.UsingItemAsString, y.UsingItemAsString, StringComparison.Ordinal));

            Assert.AreEqual(3, result.Count);
            Assert.AreEqual(c, result[0].UsingItem);
            Assert.AreEqual(1, result[0].BadCt);
            Assert.AreEqual(d, result[1].UsingItem);
            Assert.AreEqual(1, result[1].BadCt);
            Assert.AreEqual(e, result[2].UsingItem);
            Assert.AreEqual(1, result[2].BadCt);
        }
コード例 #3
0
        private static List <Dependency> FindLaterCycle(string cycleMarkerPrefix)
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a    = graph.CreateItem(ItemType.SIMPLE, "a");
            var b    = graph.CreateItem(ItemType.SIMPLE, "b");
            var c    = graph.CreateItem(ItemType.SIMPLE, "c");
            var d    = graph.CreateItem(ItemType.SIMPLE, "d");
            var e    = graph.CreateItem(ItemType.SIMPLE, "e");
            var deps = new[] {
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(c, d, null, "", 1),
                graph.CreateDependency(d, e, null, "", 1),
                graph.CreateDependency(e, c, null, "", 1),
            };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om, new MarkCycleDeps.TransformOptions {
                IndexedMarkerPrefix = cycleMarkerPrefix
            }, deps, result);

            result.Sort((x, y) => string.Compare(x.UsingItemAsString, y.UsingItemAsString, StringComparison.Ordinal));
            return(result);
        }
コード例 #4
0
        public void TestMarkTrivialCut()
        {
            var          gc           = new GlobalContext();
            WorkingGraph graph        = gc.CurrentGraph;
            Item         a            = graph.CreateItem(ItemType.SIMPLE, "a");
            Item         b            = graph.CreateItem(ItemType.SIMPLE, "b");
            Item         c            = graph.CreateItem(ItemType.SIMPLE, "c");
            Item         d            = graph.CreateItem(ItemType.SIMPLE, "d");
            var          dependencies = new[] {
                graph.CreateDependency(a, b, null, "D10", 10, 0, 4, notOkReason: "test data"),
                graph.CreateDependency(b, c, null, "D20", 20, 0, 2, notOkReason: "test data"), // critical edge
                graph.CreateDependency(c, d, null, "D30", 30, 0, 1, notOkReason: "test data"),
                graph.CreateDependency(c, d, null, "D40", 40, 0, 3, notOkReason: "test data"),
            };

            const string             mark   = "CUT";
            IEnumerable <Dependency> result = Run(gc,
                                                  new MarkMinimalCutDeps.TransformOptions {
                SourceMatches = new List <ItemMatch> {
                    new ItemMatch("a", false, anyWhereMatcherOk: true)
                },
                TargetMatches = new List <ItemMatch> {
                    new ItemMatch("d", false, anyWhereMatcherOk: true)
                },
                MarkerToAddToCut = mark
            }, dependencies);

            Assert.IsTrue(result.All(z => z.MarkersContain(mark) == (z.Ct == 20)), string.Join("\r\n", result.Select(z => z.AsLimitableStringWithTypes(withExampleInfo: false, threeLines: false))));
        }
コード例 #5
0
        public void TestLoopIsNotEndless()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;
            Item         a     = graph.CreateItem(ItemType.SIMPLE, "a");
            Item         b     = graph.CreateItem(ItemType.SIMPLE, "b");
            Item         c     = graph.CreateItem(ItemType.SIMPLE, "c");
            Item         d     = graph.CreateItem(ItemType.SIMPLE, "d");

            graph.AddDependencies(new[] {
                graph.CreateDependency(a, b, null, "", 1),
                // Loop on b & c; but we never reach d!
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(c, b, null, "", 1),

                // Loop on d so that it remains in graph
                graph.CreateDependency(d, d, null, "", 1)
            });

            // We want to go from a to d - this will never succeed; but we must make sure that
            // there is no endless loop around b and c.
            var traverser = new TestTraverser(graph.VisibleDependencies, new PathRegex("a.(b.c.)*d"));

            traverser.Traverse(a);

            Assert.AreEqual(0, traverser.RecordedPaths.Count());
        }
コード例 #6
0
        public void TestMarkCutFromMultipleSources()
        {
            var gc = new GlobalContext();

            Dependency[] exampleDependencies = CreateExampleGraph(gc);
            Item         s     = exampleDependencies[0].UsingItem;
            WorkingGraph graph = gc.CurrentGraph;
            Item         r0    = graph.CreateItem(ItemType.SIMPLE, "r0");
            Item         r1    = graph.CreateItem(ItemType.SIMPLE, "r1");
            Item         r2    = graph.CreateItem(ItemType.SIMPLE, "r2");

            Dependency[] dependencies = exampleDependencies.Concat(new[] {
                graph.CreateDependency(r0, s, null, "r0_s", 1000, 0, 1000, notOkReason: "test data"),
                graph.CreateDependency(r1, s, null, "r1_s", 1000, 0, 1000, notOkReason: "test data"),
                graph.CreateDependency(r2, s, null, "r2_s", 1000, 0, 1000, notOkReason: "test data"),
            }).ToArray();

            const string             mark   = "CUT";
            IEnumerable <Dependency> result = Run(gc, new MarkMinimalCutDeps.TransformOptions {
                SourceMatches = new List <ItemMatch> {
                    new ItemMatch("r*", false, anyWhereMatcherOk: true)
                },
                TargetMatches = new List <ItemMatch> {
                    new ItemMatch("t", false, anyWhereMatcherOk: true)
                },
                MarkerToAddToCut = mark
            }, dependencies);

            Assert.IsTrue(result.All(z => z.MarkersContain(mark) == new[] { 12, 36, 78 }.Contains(z.Ct)),
                          string.Join("\r\n", result.Select(z => z.AsLimitableStringWithTypes(withExampleInfo: false, threeLines: false))));
        }
コード例 #7
0
            public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph renderingGraph)
            {
                ItemType simple = ItemType.New("SIMPLE(Name)");
                Item     i1     = renderingGraph.CreateItem(simple, "I1");
                Item     i2     = renderingGraph.CreateItem(simple, "I2");

                return(new[] { renderingGraph.CreateDependency(i1, i1, new TextFileSourceLocation("Test", 1), "Test", ct: 1),
                               renderingGraph.CreateDependency(i1, i2, new TextFileSourceLocation("Test", 2), "Test", ct: 1) });
            }
コード例 #8
0
        private static List <Dependency> CreateDependenciesAndFindCycles(GlobalContext gc, Item a, Item b, Item c, Item d, Item e, bool keepOnlyCyclesOption, string markerPrefix)
        {
            WorkingGraph graph = gc.CurrentGraph;

            var deps = new[] {
                // "Confusing" edges to sink b
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, b, null, "", 1),
                graph.CreateDependency(c, b, null, "", 1),
                graph.CreateDependency(d, b, null, "", 1),

                // a->c->d->e
                graph.CreateDependency(a, c, null, "", 1),
                graph.CreateDependency(c, d, null, "", 1),
                graph.CreateDependency(d, e, null, "", 1),

                // Cycle edges c<-d and a<-e
                graph.CreateDependency(d, c, null, "", 1),
                graph.CreateDependency(e, a, null, "", 1),
            };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om,
                                          new MarkCycleDeps.TransformOptions {
                KeepOnlyCycleDependencies = keepOnlyCyclesOption,
                IndexedMarkerPrefix       = markerPrefix
            },
                                          deps, result);

            result.Sort((x, y) => string.Compare(x.UsingItemAsString, y.UsingItemAsString, StringComparison.Ordinal));
            return(result);
        }
コード例 #9
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            Item a = transformingGraph.CreateItem(ItemType.SIMPLE, "A");
            Item b = transformingGraph.CreateItem(ItemType.SIMPLE, "B");

            return(new[] {
                transformingGraph.CreateDependency(a, a, source: null, markers: "", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test"),
                transformingGraph.CreateDependency(a, b, source: null, markers: "use+define", ct: 1, questionableCt: 0, badCt: 0),
                transformingGraph.CreateDependency(b, a, source: null, markers: "define", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test"),
            });
        }
コード例 #10
0
ファイル: MarkDeps.cs プロジェクト: hmmueller/Archichect
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            Item am = transformingGraph.CreateItem(ItemType.SIMPLE, new[] { "A" }, new[] { "M" });
            Item bm = transformingGraph.CreateItem(ItemType.SIMPLE, new[] { "B" }, new[] { "M" });
            Item cn = transformingGraph.CreateItem(ItemType.SIMPLE, new[] { "C" }, new[] { "N" });

            return(new[] {
                transformingGraph.CreateDependency(am, am, source: null, markers: "", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test"),
                transformingGraph.CreateDependency(am, bm, source: null, markers: "use+define", ct: 1, questionableCt: 0, badCt: 0),
                transformingGraph.CreateDependency(am, cn, source: null, markers: "define", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test"),
                transformingGraph.CreateDependency(bm, am, source: null, markers: "define", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test"),
            });
        }
コード例 #11
0
        private static void SmallTestForPrefixOptimizedProjector(Func <Projection[], bool, ProjectItems.IProjector> createProjector)
        {
            var          pi    = new ProjectItems(createProjector);
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            pi.Configure(gc, @"{ -pl
    $ (Ignore:Name) ---% SIMPLE

    ! :a* ---% A
    > :ab ---% AB
    ! :b* ---% B
    ! :c* ---% C
    ! :** ---% 
}", forceReload: false);

            ItemType generic2 = ItemType.Generic(2, ignoreCase: false);
            Item     a        = graph.CreateItem(generic2, "x:a");
            Item     ab       = graph.CreateItem(generic2, "x:ab");
            Item     ac       = graph.CreateItem(generic2, "x:ac");
            Item     ca       = graph.CreateItem(generic2, "x:ca");
            Item     cb       = graph.CreateItem(generic2, "x:cb");
            Item     s        = graph.CreateItem(generic2, "m:s");
            Item     t        = graph.CreateItem(generic2, "m:t");

            var result = new List <Dependency>();

            pi.Transform(gc, new ProjectItems.ConfigureOptions(), new ProjectItems.TransformOptions(), new[] {
                graph.CreateDependency(a, a, null, "a_a", 1),     // the first surviving dependency
                graph.CreateDependency(a, s, null, "a_s", 1),     // vanishes, because s is not mapped
                graph.CreateDependency(ab, s, null, "ab_s", 1),   // same
                graph.CreateDependency(ca, s, null, "ca_s", 1),   // etc.
                graph.CreateDependency(cb, cb, null, "cb_cb", 1), // the second surviving dependency
                graph.CreateDependency(cb, t, null, "cb_t", 1),   // vanishes, because t is not mapped
                graph.CreateDependency(a, t, null, "a_t", 1),
                graph.CreateDependency(ac, t, null, "ac_t", 1),
                graph.CreateDependency(a, s, null, "a_s", 1),

                // Counts:
                // !a  5
                // >ab 0
                // !ac 1
                // !b  0
                // !ca 1
                // !cb 3
                // !s  4
                // !t  3
            }, result);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual("A", result[0].UsingItem.Values[0]);
            Assert.AreEqual("A", result[0].UsedItem.Values[0]);
            Assert.AreEqual("C", result[1].UsingItem.Values[0]);
            Assert.AreEqual("C", result[1].UsedItem.Values[0]);
        }
コード例 #12
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph renderingGraph)
        {
            ItemType simple       = ItemType.New("SIMPLE(Name)");
            Item     root         = renderingGraph.CreateItem(simple, "root");
            Item     ok           = renderingGraph.CreateItem(simple, "ok");
            Item     questionable = renderingGraph.CreateItem(simple, "questionable");
            Item     bad          = renderingGraph.CreateItem(simple, "bad");

            return(new[] {
                renderingGraph.CreateDependency(root, ok, new TextFileSourceLocation("Test", 1), "Use", 4, 0, 0, "to root"),
                renderingGraph.CreateDependency(root, questionable, new TextFileSourceLocation("Test", 1), "Use", 4, 1, 0, "to questionable"),
                renderingGraph.CreateDependency(root, bad, new TextFileSourceLocation("Test", 1), "Use", 4, 2, 1, "to bad")
            });
        }
コード例 #13
0
ファイル: MainTests.cs プロジェクト: hmmueller/NDepCheck
 private Dependency NewDependency(WorkingGraph workingGraph, string usingA, string usingN, string usingC, string usedA, string usedN,
                                  string usedC)
 {
     return(workingGraph.CreateDependency(workingGraph.CreateItem(ITEMTYPE, usingA, usingN, usingC),
                                          workingGraph.CreateItem(ITEMTYPE, usedA, usedN, usedC),
                                          null, "Test", ct: 1));
 }
コード例 #14
0
        public void TestMarkSmallCycle()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a      = graph.CreateItem(ItemType.SIMPLE, "a");
            var b      = graph.CreateItem(ItemType.SIMPLE, "b");
            var deps   = new[] { graph.CreateDependency(a, b, null, "", 1), graph.CreateDependency(b, a, null, "", 1), };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om, new MarkCycleDeps.TransformOptions(), deps, result);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(1, result[0].BadCt);
            Assert.AreEqual(1, result[1].BadCt);
        }
コード例 #15
0
 private Dependency ToDependency(WorkingGraph readingGraph, Item usedItem, string containerUri)
 {
     return(readingGraph.CreateDependency(UsingItem.ToItem(), usedItem, _sequencePoint == null
                 ? (ISourceLocation) new LocalSourceLocation(containerUri, UsingItem.NamespaceName + "." + UsingItem.ClassName + (string.IsNullOrWhiteSpace(UsingItem.MemberName) ? "" : "." + UsingItem.MemberName))
                 : new ProgramFileSourceLocation(containerUri, _sequencePoint.Document.Url, _sequencePoint.StartLine, _sequencePoint.StartColumn, _sequencePoint.EndLine, _sequencePoint.EndColumn),
                                          Usage.ToString(), 1));
 }
コード例 #16
0
 private Dependency ResolveItemProxies(WorkingGraph readingGraph, Dependency d, Dictionary <Item, Item> itemsDictionary)
 {
     return(d.UsingItem is ItemProxy || d.UsedItem is ItemProxy
         ? readingGraph.CreateDependency(itemsDictionary[d.UsingItem], itemsDictionary[d.UsedItem],
                                         d.Source, d.MarkerSet, d.Ct, d.QuestionableCt, d.BadCt, d.NotOkReason, d.ExampleInfo)
         : d);
 }
コード例 #17
0
            public static IEnumerable <Dependency> CreateSomeTestItems(int n, string prefix, WorkingGraph renderingGraph)
            {
                ItemType simple     = ItemType.New("SIMPLE(Name)");
                var      localItems = Enumerable.Range(0, n).Select(i => renderingGraph.CreateItem(simple, prefix + i)).ToArray();

                return(localItems.SelectMany(
                           (from, i) => localItems.Skip(i).Select(to => renderingGraph.CreateDependency(from, to, new TextFileSourceLocation(prefix, i), "Use", 10 * i))).ToArray());
            }
コード例 #18
0
        private static WorkingGraph CreateSmallTestgraph()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;
            Item         a     = graph.CreateItem(ItemType.SIMPLE, "a");
            Item         b     = graph.CreateItem(ItemType.SIMPLE, "b");
            Item         c     = graph.CreateItem(ItemType.SIMPLE, "c");
            Item         d     = graph.CreateItem(ItemType.SIMPLE, "d");

            graph.AddDependencies(new[] {
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(b, d, null, "", 1)
            });

            return(graph);
        }
コード例 #19
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph renderingGraph)
        {
            ItemType simple = ItemType.New("SIMPLE(Name)");

            Item[] localItems = Enumerable.Range(0, 5).Select(i => renderingGraph.CreateItem(simple, "Item " + i)).ToArray();
            return(localItems.SelectMany(
                       (from, i) => localItems.Skip(i).Select(to => renderingGraph.CreateDependency(from, to, new TextFileSourceLocation("Test", i), "Test", ct: 10 * i))).ToArray());
        }
コード例 #20
0
        public void TestMarkAnotherCut()
        {
            // Graph from http://www.cs.princeton.edu/courses/archive/spring06/cos226/lectures/maxflow.pdf p.30 (and Wikipedia)
            var          gc           = new GlobalContext();
            WorkingGraph graph        = gc.CurrentGraph;
            Item         s            = graph.CreateItem(ItemType.SIMPLE, "s");
            Item         n2           = graph.CreateItem(ItemType.SIMPLE, "2");
            Item         n4           = graph.CreateItem(ItemType.SIMPLE, "4");
            Item         t            = graph.CreateItem(ItemType.SIMPLE, "t");
            var          dependencies = new[] {
                graph.CreateDependency(s, n2, null, "s_2", 102, 0, 100, notOkReason: "test data"),
                graph.CreateDependency(s, n4, null, "s_4", 104, 0, 100, notOkReason: "test data"),

                graph.CreateDependency(n2, t, null, "2_t", 203, 0, 100, notOkReason: "test data"),

                graph.CreateDependency(n4, n2, null, "4_7", 402, 0, 1, notOkReason: "test data"),
                graph.CreateDependency(n4, t, null, "4_7", 403, 0, 100, notOkReason: "test data"),
            };

            const string mark   = "CUT";
            const string source = "SOURCE";

            IEnumerable <Dependency> result = Run(gc, new MarkMinimalCutDeps.TransformOptions {
                SourceMatches = new List <ItemMatch> {
                    new ItemMatch("s", false, anyWhereMatcherOk: true)
                },
                TargetMatches = new List <ItemMatch> {
                    new ItemMatch("t", false, anyWhereMatcherOk: true)
                },
                MarkerToAddToCut        = mark,
                MarkerToAddToSourceSide = source
            }, dependencies);

            Assert.IsTrue(result.All(z => z.MarkersContain(mark) == new[] { 102, 104 }.Contains(z.Ct)),
                          string.Join("\r\n", result.Select(z => z.AsLimitableStringWithTypes(withExampleInfo: false, threeLines: false))));
            Assert.IsTrue(s.MarkersContain(source));
            Assert.IsFalse(n2.MarkersContain(source));
            Assert.IsFalse(n4.MarkersContain(source));
            Assert.IsFalse(t.MarkersContain(source));
        }
コード例 #21
0
        public void TestOneTopologicalSortStep()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            Item a            = graph.CreateItem(ItemType.SIMPLE, "a");
            Item b            = graph.CreateItem(ItemType.SIMPLE, "b");
            Item c            = graph.CreateItem(ItemType.SIMPLE, "c");
            var  dependencies = new[] {
                graph.CreateDependency(a, b, source: null, markers: "", ct: 1),
                graph.CreateDependency(c, a, source: null, markers: "", ct: 100),
                graph.CreateDependency(c, b, source: null, markers: "", ct: 100)
            };

            var aggregated = new Dictionary <FromTo, Dependency>();

            foreach (var d in dependencies.Where(d => !Equals(d.UsingItem, d.UsedItem)))
            {
                new FromTo(d.UsingItem, d.UsedItem).AggregateDependency(graph, d, aggregated);
            }

            var aggregatedCounts = new MatrixDictionary <Item, int>((s, i) => s + i, (s, i) => s - i);

            foreach (var kvp in aggregated)
            {
                aggregatedCounts.Add(kvp.Key.From, kvp.Key.To, kvp.Value.Ct);
            }

            var itemsToRatios =
                aggregatedCounts.ColumnKeys.Select(
                    k => new {
                Item  = k,
                Ratio = aggregatedCounts.GetRowSum(k) / (aggregatedCounts.GetColumnSum(k) + aggregatedCounts.GetRowSum(k) + 0.001m)
            });
            decimal minToRatio = itemsToRatios.Min(ir => ir.Ratio);
            Item    minItem    = itemsToRatios.First(ir => ir.Ratio == minToRatio).Item;

            Assert.AreEqual(b, minItem);
        }
コード例 #22
0
        public void TestSimpleNamedCall()
        {
            ItemType     itemType = DotNetAssemblyDependencyReaderFactory.DOTNETITEM;
            var          gc       = new GlobalContext();
            WorkingGraph graph    = gc.CurrentGraph;
            Item         @using   = graph.CreateItem(itemType, "", "NamespacelessTestClassForNDepCheck", "NDepCheck.TestAssembly", "1.0.0.0", "", "");
            Item         used     = graph.CreateItem(itemType, "System", "Object", "mscorlib", "", "", "");
            var          d        = graph.CreateDependency(@using, used, null, "Test", ct: 1);

            DependencyRule r = CreateDependencyRule(itemType, "**", "Assembly.Name=mscorlib");

            Assert.IsTrue(r.IsMatch(d));
        }
コード例 #23
0
        public void TestSmallSelfOptimizingPrefixTrieProjector2()
        {
            // This test found a problem in TrieNode.SetProjectors.
            var pi = new ProjectItems((p, i) => new ProjectItems.SelfOptimizingPrefixTrieProjector(p, i, 2, "prefixTrie"));
            var gc = new GlobalContext();

            pi.Configure(gc, @"{ -pl
    $ (:Name) ---% SIMPLE

    ! :abc ---% ADetail
    ! :a*  ---% A
    ! :t   ---% T
    ! :**  ---% 
}", forceReload: false);

            ItemType     generic2 = ItemType.Generic(2, ignoreCase: false);
            WorkingGraph graph    = gc.CurrentGraph;
            Item         a        = graph.CreateItem(generic2, "x:a");
            Item         ab       = graph.CreateItem(generic2, "x:ab");
            Item         abc      = graph.CreateItem(generic2, "x:abc");
            Item         abcd     = graph.CreateItem(generic2, "x:abcd");
            Item         t        = graph.CreateItem(generic2, "m:t");

            var result = new List <Dependency>();

            pi.Transform(gc, new[] {
                graph.CreateDependency(a, t, null, "a_t", 1),       // A_T
                graph.CreateDependency(ab, t, null, "ab_t", 1),     // A_ T
                graph.CreateDependency(abc, t, null, "abc_t", 1),   // ADetail _T
                graph.CreateDependency(abcd, t, null, "abcd_t", 1), // A _ T
            }, "", result, s => null);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual("A", result[0].UsingItem.Values[0]);
            Assert.AreEqual(3, result[0].Ct);
            Assert.AreEqual("ADetail", result[1].UsingItem.Values[0]);
            Assert.AreEqual(1, result[1].Ct);
        }
コード例 #24
0
        private void CreateAndRender(int n, string prefix, int boxHeight = 15)
        {
            var          gc     = new GlobalContext();
            WorkingGraph graph  = gc.CurrentGraph;
            ItemType     simple = ItemType.New("SIMPLE(Name)");

            Item[]       items        = Enumerable.Range(0, n).Select(i => graph.CreateItem(simple, prefix + i)).ToArray();
            Dependency[] dependencies =
                items.SelectMany(
                    (from, i) => items.Skip(i).Select(to => graph.CreateDependency(from, to, new TextFileSourceLocation(prefix, i), "Use", 10 * i))).ToArray();

            new SomewhatComplexTestRenderer(boxHeight).Render(gc, dependencies,
                                                              options: "", target: new WriteTarget(Path.GetTempFileName(), append: false, limitLinesForConsole: 100), ignoreCase: false);
        }
コード例 #25
0
        public void TestBackReferenceDependencyRuleMatchesWithOuterParentheses()
        {
            ItemType itemtype = ItemType.New("SO", new[] { "Schema", "Object" }, new[] { "", "" }, ignoreCase: false);
            var      rn3      = CreateDependencyRule(itemtype, "(s**):(t**)", @"\1*:\2*");
            var      rn5      = CreateDependencyRule(itemtype, "(**s**):(**t**)", @"\1:\2");

            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            Dependency dep = graph.CreateDependency(graph.CreateItem(itemtype, "sx", "tx"), graph.CreateItem(itemtype, "sx", "tx"), null, "Test", ct: 1);

            Assert.IsTrue(rn3.IsMatch(dep));
            Assert.IsTrue(rn5.IsMatch(dep));
        }
コード例 #26
0
ファイル: MarkMinimalCut.cs プロジェクト: hmmueller/NDepCheck
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            // Graph from http://web.stanford.edu/class/cs97si/08-network-flow-problems.pdf p.7
            Item s = transformingGraph.CreateItem(ItemType.SIMPLE, "s");
            Item a = transformingGraph.CreateItem(ItemType.SIMPLE, "a");
            Item b = transformingGraph.CreateItem(ItemType.SIMPLE, "b");
            Item c = transformingGraph.CreateItem(ItemType.SIMPLE, "c");
            Item d = transformingGraph.CreateItem(ItemType.SIMPLE, "d");
            Item t = transformingGraph.CreateItem(ItemType.SIMPLE, "t");

            return(new[] {
                transformingGraph.CreateDependency(s, a, null, "s_a", 101, 16, 0, "test data"),
                transformingGraph.CreateDependency(s, c, null, "s_c", 103, 13, 0, "test data"),
                transformingGraph.CreateDependency(a, b, null, "a_b", 112, 12, 0, "test data"),
                transformingGraph.CreateDependency(a, c, null, "a_c", 113, 10, 0, "test data"),
                transformingGraph.CreateDependency(b, c, null, "b_c", 123, 9, 0, "test data"),
                transformingGraph.CreateDependency(b, t, null, "b_t", 125, 20, 0, "test data"),
                transformingGraph.CreateDependency(c, a, null, "c_a", 131, 4, 0, "test data"),
                transformingGraph.CreateDependency(c, d, null, "c_d", 134, 14, 0, "test data"),
                transformingGraph.CreateDependency(d, b, null, "d_b", 142, 7, 0, "test data"),
                transformingGraph.CreateDependency(d, t, null, "d_t", 145, 4, 0, "test data"),
            });
        }
コード例 #27
0
        public void TestProblemWithEmptyNamespace()
        {
            ItemType itemType = DotNetAssemblyDependencyReaderFactory.DOTNETITEM;

            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var @using = graph.CreateItem(itemType, "", "NamespacelessTestClassForArchichect", "Archichect.TestAssembly", "1.0.0.0", "", "");
            var used   = graph.CreateItem(itemType, "System", "Object", "mscorlib", "", "", "");
            var d      = graph.CreateDependency(@using, used, null, "Test", ct: 1);

            var r = CreateDependencyRule(itemType, "**", "System.**");

            Assert.IsTrue(r.IsMatch(d));
        }
コード例 #28
0
        public void TestEmptyNamespaceInRule()
        {
            ItemType itemType = DotNetAssemblyDependencyReaderFactory.DOTNETITEM;

            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            Item @using = graph.CreateItem(itemType, "NDepCheck.TestAssembly.dir1.dir2", "SomeClass", "NDepCheck.TestAssembly", "1.0.0.0", "", "AnotherMethod");
            Item used   = graph.CreateItem(itemType, "", "NamespacelessTestClassForNDepCheck", "NDepCheck.TestAssembly", "1.0.0.0", "", "I");
            var  d      = graph.CreateDependency(@using, used, null, "Test", ct: 1);

            var r = CreateDependencyRule(itemType, "NDepCheck.TestAssembly.dir1.dir2:SomeClass:**", "-:NamespacelessTestClassForNDepCheck::I");

            Assert.IsTrue(r.IsMatch(d));
        }
コード例 #29
0
        private void RecursivelyFlood(Item root, Item from, HashSet <Item> visited, Dictionary <FromTo, Dependency> checkPresence,
                                      DependencyPattern idempotentPattern, Dictionary <Item, Dependency[]> outgoing, IEnumerable <ItemMatch> toItemMatches,
                                      List <DependencyMatch> matches, List <DependencyMatch> excludes, Dictionary <string, int> markersToAddOrNull,
                                      List <Dependency> result, Dependency collectedEdge, [NotNull] Action checkAbort, WorkingGraph workingGraph, bool ignoreCase)
        {
            if (outgoing.ContainsKey(from))
            {
                checkAbort();
                foreach (var d in outgoing[from].Where(d => d.IsMarkerMatch(matches, excludes)))
                {
                    Item target = d.UsedItem;
                    if (visited.Add(target))
                    {
                        Dependency rootToTarget = collectedEdge == null
                            ? d
                            : workingGraph.CreateDependency(root, target, d.Source,
                                                            new MutableMarkerSet(ignoreCase,
                                                                                 markersToAddOrNull
                                                                                 ?? MutableMarkerSet.ConcatOrUnionWithMarkers(collectedEdge.AbstractMarkerSet,
                                                                                                                              d.AbstractMarkerSet, ignoreCase)),
                                                            collectedEdge.Ct + d.Ct, collectedEdge.QuestionableCt + d.QuestionableCt,
                                                            collectedEdge.BadCt + d.BadCt, collectedEdge.NotOkReason ?? d.NotOkReason, d.ExampleInfo);

                        if (IsMatch(toItemMatches, target))
                        {
                            Dependency alreadyThere;
                            var        rootTargetKey = new FromTo(root, target);
                            if (checkPresence.TryGetValue(rootTargetKey, out alreadyThere) && idempotentPattern.IsMatch(alreadyThere))
                            {
                                // we do not add a dependency
                            }
                            else
                            {
                                checkPresence[rootTargetKey] = rootToTarget;
                                result.Add(rootToTarget);
                            }
                        }

                        // Continue search
                        RecursivelyFlood(root, target, visited, checkPresence, idempotentPattern, outgoing,
                                         toItemMatches, matches, excludes, markersToAddOrNull, result, rootToTarget,
                                         checkAbort, workingGraph, ignoreCase);
                    }
                }
            }
        }
コード例 #30
0
        public void TestSimpleDependencyRuleMatches()
        {
            ItemType itemType = ItemType.New("NC", new[] { "Namespace", "Class" }, new[] { "", "" }, ignoreCase: false);

            var r1 = CreateDependencyRule(itemType, ":", ":");

            var rn1  = CreateDependencyRule(itemType, "n*", ":");
            var rn2  = CreateDependencyRule(itemType, "n*:", ":");
            var rn3  = CreateDependencyRule(itemType, "n**", ":");
            var rn4  = CreateDependencyRule(itemType, "n**:", ":");
            var rn5  = CreateDependencyRule(itemType, "n1", ":");
            var rn6  = CreateDependencyRule(itemType, "n1:", ":");
            var rn7  = CreateDependencyRule(itemType, "*n1:", ":");
            var rn8  = CreateDependencyRule(itemType, "**n1:", ":");
            var rc1  = CreateDependencyRule(itemType, ":c*", ":");
            var rc2  = CreateDependencyRule(itemType, ":c**", ":");
            var rc3  = CreateDependencyRule(itemType, ":*c1", ":");
            var rc4  = CreateDependencyRule(itemType, ":**c1", ":");
            var rnc1 = CreateDependencyRule(itemType, "n*:c*", ":");
            var rnc2 = CreateDependencyRule(itemType, "n**:c**", ":");

            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            Dependency dep = graph.CreateDependency(graph.CreateItem(itemType, "n1", "c1"), graph.CreateItem(itemType, "n2", "c2"), null, "Test", ct: 1);

            Assert.IsTrue(r1.IsMatch(dep));

            Assert.IsTrue(rn1.IsMatch(dep));
            Assert.IsTrue(rn2.IsMatch(dep));
            Assert.IsTrue(rn3.IsMatch(dep));
            Assert.IsTrue(rn4.IsMatch(dep));
            Assert.IsTrue(rn5.IsMatch(dep));
            Assert.IsTrue(rn6.IsMatch(dep));
            Assert.IsTrue(rn7.IsMatch(dep));
            Assert.IsTrue(rn8.IsMatch(dep));

            Assert.IsTrue(rc1.IsMatch(dep));
            Assert.IsTrue(rc2.IsMatch(dep));
            Assert.IsTrue(rc3.IsMatch(dep));
            Assert.IsTrue(rc4.IsMatch(dep));

            Assert.IsTrue(rnc1.IsMatch(dep));
            Assert.IsTrue(rnc2.IsMatch(dep));
        }