예제 #1
0
        public void ShouldDeserializeNameFromFormat2()
        {
            const string json     = "{\"type\":\"CSharp.AssemblyName\",\"id\":\"MyAssembly, 1.2.3.4\"}";
            var          expected = Names.Assembly("MyAssembly, 1.2.3.4");

            JsonAssert.DeserializesTo(json, expected);
        }
예제 #2
0
        public void ShouldDeserializeNameFromFormat3()
        {
            const string json     = "\"CSharp.AssemblyName:MyAssembly, 1.2.3.4\"";
            var          expected = Names.Assembly("MyAssembly, 1.2.3.4");

            JsonAssert.DeserializesTo(json, expected);
        }
예제 #3
0
        public void CorrectInitializationAndNonNull()
        {
            AssertInit(Names.General("x"), typeof(GeneralName));

            AssertInit(Names.Alias("x"), typeof(AliasName));
            AssertInit(Names.Event("x"), typeof(EventName));
            AssertInit(Names.Field("x"), typeof(FieldName));
            AssertInit(Names.Lambda("x"), typeof(LambdaName));
            AssertInit(Names.LocalVariable("x"), typeof(LocalVariableName));
            AssertInit(Names.Method("[?] [?].M()"), typeof(MethodName));
            AssertInit(Names.Parameter("[?] p"), typeof(ParameterName));
            AssertInit(Names.Property("get [?] [?].P()"), typeof(PropertyName));

            AssertInit(Names.CommandBarControl("x"), typeof(CommandBarControlName));
            AssertInit(Names.Command("x"), typeof(CommandName));
            AssertInit(Names.Document("x y"), typeof(DocumentName));
            AssertInit(Names.ProjectItem("x y"), typeof(ProjectItemName));
            AssertInit(Names.Project("x y"), typeof(ProjectName));
            AssertInit(Names.Solution("x"), typeof(SolutionName));
            AssertInit(Names.Window("x y"), typeof(WindowName));

            AssertInit(Names.ReSharperLiveTemplate("x:y"), typeof(ReSharperLiveTemplateName));

            AssertInit(Names.Assembly("x"), typeof(AssemblyName));
            AssertInit(Names.AssemblyVersion("1.2.3.4"), typeof(AssemblyVersion));
            AssertInit(Names.Namespace("x"), typeof(NamespaceName));

            AssertInit(Names.Type("T,P"), typeof(TypeName));
            AssertInit(Names.Type("T"), typeof(TypeParameterName));
            AssertInit(Names.Type("T[],P"), typeof(ArrayTypeName));
            AssertInit(Names.Type("d:[?] [?].()"), typeof(DelegateTypeName));
            AssertInit(Names.Type("p:int"), typeof(PredefinedTypeName));
        }
        public void PropRef()
        {
            var b1 = CreateContextWithSSTAndMethodBody(
                RefStmt(
                    new PropertyReference
            {
                PropertyName = Names.Property(
                    "get [T`1[[T -> p:double]],P] [D`1[[T -> p:double]],A,1.2.3.4].P()")
            }));
            var b2 = CreateContextWithSSTAndMethodBody(
                RefStmt(
                    new PropertyReference
            {
                PropertyName = Names.Property("get [T`1[[T -> p:float]],P] [D`1[[T -> p:float]],A,1.2.3.4].P()")
            }
                    ));

            var actual = Extract(b1, b2);

            Assert.AreEqual(0, actual.NumAsmCalls);
            Assert.AreEqual(
                Sets.NewHashSet(Names.Property("get [T`1[[T]],P] [D`1[[T]],A,1.2.3.4].P()")),
                actual.UniqueAsmProperties);
            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), actual.UniqueAssemblies);
        }
예제 #5
0
        public void ShouldAnonymizeAssemblyIfEnclosingProject()
        {
            var original = Names.Assembly("MyProject");
            var expected = Names.Assembly("zRLpydQJBMrk8DCiP3BwEQ==");

            AssertAnonymizedEquals(original, expected);
        }
예제 #6
0
        public void ReturnsEmptyTypeListIfAssemblyDoesNotExist()
        {
            var assemblyName = Names.Assembly("SomeOtherAssembly, 0.0.0.0");
            var typeNames    = _uut.OpenAssembly(assemblyName);
            var expected     = Sets.NewHashSet <ITypeName>();

            Assert.AreEqual(expected, typeNames);
        }
예제 #7
0
        public void Equality_DifferentUniqueAssemblies()
        {
            var a = new ContextStatistics
            {
                UniqueAssemblies = { Names.Assembly("A,1.2.3.4") }
            };
            var b = new ContextStatistics();

            Assert.AreNotEqual(a, b);
            Assert.AreNotEqual(a.GetHashCode(), b.GetHashCode());
        }
예제 #8
0
        public void ReturnsAllAssemblies()
        {
            var allAssemblies = _uut.GetAllAssemblies();
            var expected      = Sets.NewHashSet(
                Names.Assembly("Assembly1, 0.0.0.0"),
                Names.Assembly("Assembly2, 0.0.0.0"),
                Names.Assembly("Assembly3, 0.0.0.0")
                );

            Assert.AreEqual(expected, allAssemblies);
        }
예제 #9
0
        public void ReturnsAllTypesInAssembly()
        {
            var assemblyName = Names.Assembly("Assembly1, 0.0.0.0");
            var typeNames    = _uut.OpenAssembly(assemblyName);
            var expected     = Sets.NewHashSet(
                GetTypeName("T1", "Assembly1"),
                GetTypeName("T2", "Assembly1"),
                GetTypeName("T3", "Assembly1")
                );

            Assert.AreEqual(expected, typeNames);
        }
예제 #10
0
        public void ShouldCountFieldRefsAndRegisterAssembly()
        {
            var actual =
                Extract(
                    CreateContextWithSSTAndMethodBody(
                        Stmt(RefExpr(new FieldReference {
                FieldName = Names.Field("[p:int] [T,A,1.2.3.4]._f")
            }))));

            Assert.AreEqual(1, actual.NumAsmFieldRead);
            Assert.AreEqual(Sets.NewHashSet(Names.Field("[p:int] [T,A,1.2.3.4]._f")), actual.UniqueAsmFields);
            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), actual.UniqueAssemblies);
        }
예제 #11
0
        public void ShouldCountMethodRefsAndRegisterAssembly()
        {
            var actual =
                Extract(
                    CreateContextWithSSTAndMethodBody(
                        Stmt(RefExpr(new MethodReference {
                MethodName = Names.Method("[p:void] [T,A,1.2.3.4].M()")
            }))));

            Assert.AreEqual(0, actual.NumUnknownInvocations);
            Assert.AreEqual(0, actual.NumAsmCalls);
            Assert.AreEqual(Sets.NewHashSet(Names.Method("[p:void] [T,A,1.2.3.4].M()")), actual.UniqueAsmMethods);
            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), actual.UniqueAssemblies);
        }
        public void MethodCalls()
        {
            var b1 = CreateContextWithSSTAndMethodBody(
                InvStmt("[T`1[[T -> p:double]],P] [D`1[[T -> p:double]],A,1.2.3.4].M()"));
            var b2 = CreateContextWithSSTAndMethodBody(
                InvStmt("[T`1[[T -> p:float]],P] [D`1[[T -> p:float]],A,1.2.3.4].M()"));

            var actual = Extract(b1, b2);

            Assert.AreEqual(2, actual.NumAsmCalls);
            Assert.AreEqual(
                Sets.NewHashSet(Names.Method("[T`1[[T]],P] [D`1[[T]],A,1.2.3.4].M()")),
                actual.UniqueAsmMethods);
            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), actual.UniqueAssemblies);
        }
예제 #13
0
        private static bool ShouldInclude(IMethodName name)
        {
            if (Names.UnknownMethod.Equals(name))
            {
                return(false);
            }

            var mscorlib  = Names.Assembly("mscorlib, 4.0.0.0");
            var actualLib = name.DeclaringType.Assembly;

            if (!mscorlib.Equals(actualLib))
            {
                return(false);
            }

            return(true);
        }
 public void IncludesAllDependencies()
 {
     CollectionAssert.IsSubsetOf(
         new[]
     {
         Names.Assembly("System, 4.0.0.0"),
         Names.Assembly("System.Core, 4.0.0.0"),
         Names.Assembly("System.Xml.Linq, 4.0.0.0"),
         Names.Assembly("System.Data.DataSetExtensions, 4.0.0.0"),
         Names.Assembly("Microsoft.CSharp, 4.0.0.0"),
         Names.Assembly("System.Data, 4.0.0.0"),
         Names.Assembly("System.Xml, 4.0.0.0"),
         Names.Assembly("mscorlib, 4.0.0.0"),
         Names.Assembly("Newtonsoft.Json, 6.0.0.0")
     },
         AssemblyNames);
 }
예제 #15
0
        public ISet <IAssemblyName> GetAllAssemblies()
        {
            var files    = Directory.EnumerateFiles(_path);
            var zipFiles = files.Where(s => s.EndsWith(".zip"));
            var result   = Sets.NewHashSet <IAssemblyName>();

            foreach (var zipFile in zipFiles)
            {
                var assemblyFileName = Path.GetFileNameWithoutExtension(zipFile);
                if (assemblyFileName != null)
                {
                    var assemblyNameStrings = assemblyFileName.Split('-');
                    var assembly            = Names.Assembly(assemblyNameStrings[0] + ", " + assemblyNameStrings[1]);
                    result.Add(assembly);
                }
            }
            return(result);
        }
예제 #16
0
        public void ShouldCountPropertyRefsAndRegisterAssembly()
        {
            var actual =
                Extract(
                    CreateContextWithSSTAndMethodBody(
                        Stmt(
                            RefExpr(
                                new PropertyReference
            {
                PropertyName = Names.Property("get set [p:int] [T,A,1.2.3.4].P()")
            }))));

            Assert.AreEqual(1, actual.NumAsmPropertyRead);
            Assert.AreEqual(
                Sets.NewHashSet(Names.Property("get set [p:int] [T,A,1.2.3.4].P()")),
                actual.UniqueAsmProperties);
            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), actual.UniqueAssemblies);
        }
        public void FieldRef()
        {
            var b1 = CreateContextWithSSTAndMethodBody(
                RefStmt(
                    new FieldReference
            {
                FieldName = Names.Field("[T`1[[T -> p:double]],P] [D`1[[T -> p:double]],A,1.2.3.4]._f")
            }));
            var b2 = CreateContextWithSSTAndMethodBody(
                RefStmt(
                    new FieldReference
            {
                FieldName = Names.Field("[T`1[[T -> p:float]],P] [D`1[[T -> p:float]],A,1.2.3.4]._f")
            }
                    ));

            var actual = Extract(b1, b2);

            Assert.AreEqual(0, actual.NumAsmCalls);
            Assert.AreEqual(
                Sets.NewHashSet(Names.Field("[T`1[[T]],P] [D`1[[T]],A,1.2.3.4]._f")),
                actual.UniqueAsmFields);
            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), actual.UniqueAssemblies);
        }
예제 #18
0
        public void Equality_SetValues()
        {
            var a = new ContextStatistics
            {
                NumRepositories                         = 1,
                NumUsers                                = 2,
                NumSolutions                            = 3,
                EstimatedLinesOfCode                    = 31,
                NumTypeDeclTopLevel                     = 4,
                NumTypeDeclNested                       = 5,
                UniqueTypeDecl                          = { Names.Type("T,P") },
                NumPartial                              = 20,
                NumClasses                              = 6,
                NumInterfaces                           = 7,
                NumDelegates                            = 8,
                NumStructs                              = 9,
                NumEnums                                = 10,
                NumUnusualType                          = 111,
                NumTypeDeclExtendsOrImplements          = 11,
                NumMethodDeclsTotal                     = 12,
                NumMethodDeclsOverrideOrImplement       = 13,
                NumMethodDeclsOverrideOrImplementAsm    = 21,
                UniqueMethodDeclsOverrideOrImplementAsm = { Names.Method("[p:bool] [T,P].O1()") },
                NumValidInvocations                     = 1311,
                NumUnknownInvocations                   = 131,
                UniqueAssemblies                        = { Names.Assembly("A,1.2.3.4") },
                NumAsmCalls                             = 14,
                UniqueAsmMethods                        = { Names.Method("[p:bool] [T,P].M()") },
                NumAsmFieldRead                         = 15,
                UniqueAsmFields                         = { Names.Field("[p:int] [T,P]._f") },
                NumAsmPropertyRead                      = 16,
                UniqueAsmProperties                     = { Names.Property("get set [p:double] [T,P].P()") }
            };
            var b = new ContextStatistics
            {
                NumRepositories                         = 1,
                NumUsers                                = 2,
                NumSolutions                            = 3,
                EstimatedLinesOfCode                    = 31,
                NumTypeDeclTopLevel                     = 4,
                NumTypeDeclNested                       = 5,
                UniqueTypeDecl                          = { Names.Type("T,P") },
                NumPartial                              = 20,
                NumClasses                              = 6,
                NumInterfaces                           = 7,
                NumDelegates                            = 8,
                NumStructs                              = 9,
                NumEnums                                = 10,
                NumUnusualType                          = 111,
                NumTypeDeclExtendsOrImplements          = 11,
                NumMethodDeclsTotal                     = 12,
                NumMethodDeclsOverrideOrImplement       = 13,
                NumMethodDeclsOverrideOrImplementAsm    = 21,
                UniqueMethodDeclsOverrideOrImplementAsm = { Names.Method("[p:bool] [T,P].O1()") },
                NumValidInvocations                     = 1311,
                NumUnknownInvocations                   = 131,
                UniqueAssemblies                        = { Names.Assembly("A,1.2.3.4") },
                NumAsmCalls                             = 14,
                UniqueAsmMethods                        = { Names.Method("[p:bool] [T,P].M()") },
                NumAsmFieldRead                         = 15,
                UniqueAsmFields                         = { Names.Field("[p:int] [T,P]._f") },
                NumAsmPropertyRead                      = 16,
                UniqueAsmProperties                     = { Names.Property("get set [p:double] [T,P].P()") }
            };

            Assert.AreEqual(a, b);
            Assert.AreEqual(a.GetHashCode(), b.GetHashCode());
        }
예제 #19
0
 private IAssemblyName A(int i)
 {
     return(Names.Assembly("A{0}, 1.2.3.4", i));
 }
예제 #20
0
        public void ShouldKeepAssemblyIfFullQualified()
        {
            var original = Names.Assembly("SomeAssembly, 1.5.6.3");

            AssertAnonymizedEquals(original, original);
        }
예제 #21
0
 private static IAssemblyName ToAnonymousName(IAssemblyName assembly)
 {
     return(assembly.IsLocalProject ? Names.Assembly(assembly.Identifier.ToHash()) : assembly);
 }
예제 #22
0
        public void ShouldSerializeAssemblyName()
        {
            var name = Names.Assembly("AssemblyName, 0.8.15.0");

            JsonAssert.SerializationPreservesReferenceIdentity(name);
        }
예제 #23
0
        public void Integration()
        {
            var sut = new ContextStatisticsLogger();

            sut.StartUp(new ContextFilter(GeneratedCode.Include, Duplication.Exclude));

            sut.SearchingZips("C:\\a\\b\\");
            sut.FoundZips(123);

            sut.StartingStatCreation(1);
            sut.StartingStatCreation(2);
            sut.CreatingStats(1, "a/b.zip");
            sut.CreatingStats(1, "c.zip");
            sut.CreatingStats(1, "d.zip");
            sut.FinishedStatCreation(1);
            sut.FinishedStatCreation(2);


            var counts = new Dictionary <IAssemblyName, int>();

            counts[Names.Assembly("A,1.2.3.4")] = 1;
            counts[Names.Assembly("B,1.2.3.4")] = 4;
            counts[Names.Assembly("D,1.2.3.4")] = 3;
            counts[Names.Assembly("C,1.2.3.4")] = 2;

            sut.Results(
                new ContextStatistics
            {
                NumRepositories      = 1,
                NumUsers             = 2,
                NumSolutions         = 3,
                EstimatedLinesOfCode = 31,
                NumTypeDeclTopLevel  = 4,
                NumTypeDeclNested    = 5,
                UniqueTypeDecl       =
                {
                    Names.Type("T1,P"),
                    Names.Type("T2,P"),
                    Names.Type("T3,P"),
                    Names.Type("T4,P"),
                    Names.Type("T5,P")
                },
                NumPartial     = 20,
                NumClasses     = 6,
                NumInterfaces  = 7,
                NumDelegates   = 8,
                NumStructs     = 9,
                NumEnums       = 10,
                NumUnusualType = 111,
                NumTypeDeclExtendsOrImplements          = 11,
                NumMethodDeclsTotal                     = 12,
                NumMethodDeclsOverrideOrImplement       = 13,
                NumMethodDeclsOverrideOrImplementAsm    = 121,
                UniqueMethodDeclsOverrideOrImplementAsm =
                {
                    Names.Method("[p:bool] [T,P].M1()"),
                    Names.Method("[p:bool] [T,P].M2()"),
                    Names.Method("[p:bool] [T,P].M3()"),
                    Names.Method("[p:bool] [T,P].M4()"),
                    Names.Method("[p:bool] [T,P].M5()"),
                    Names.Method("[p:bool] [T,P].M6()")
                },
                UniqueAssemblies =
                {
                    Names.Assembly("A,1.2.3.4")
                },
                NumAsmCalls      = 14,
                UniqueAsmMethods =
                {
                    Names.Method("[p:bool] [T,P].M1()"),
                    Names.Method("[p:bool] [T,P].M2()")
                },
                NumAsmFieldRead = 15,
                UniqueAsmFields =
                {
                    Names.Field("[p:int] [T,P]._f1"),
                    Names.Field("[p:int] [T,P]._f2"),
                    Names.Field("[p:int] [T,P]._f3")
                },
                NumAsmPropertyRead  = 16,
                UniqueAsmProperties =
                {
                    Names.Property("get set [p:double] [T,P].P1()"),
                    Names.Property("get set [p:double] [T,P].P2()"),
                    Names.Property("get set [p:double] [T,P].P3()"),
                    Names.Property("get set [p:double] [T,P].P4()")
                }
            },
                counts);
        }
예제 #24
0
        public void Add()
        {
            var a = new ContextStatistics
            {
                NumRepositories                         = 1,
                NumUsers                                = 2,
                NumSolutions                            = 3,
                EstimatedLinesOfCode                    = 31,
                NumTypeDeclTopLevel                     = 4,
                NumTypeDeclNested                       = 5,
                UniqueTypeDecl                          = { Names.Type("T,P") },
                NumPartial                              = 20,
                NumClasses                              = 6,
                NumInterfaces                           = 7,
                NumDelegates                            = 8,
                NumStructs                              = 9,
                NumEnums                                = 10,
                NumUnusualType                          = 111,
                NumTypeDeclExtendsOrImplements          = 11,
                NumMethodDeclsTotal                     = 12,
                NumMethodDeclsOverrideOrImplement       = 13,
                NumMethodDeclsOverrideOrImplementAsm    = 121,
                UniqueMethodDeclsOverrideOrImplementAsm = { Names.Method("[p:bool] [T,P].O1()") },
                NumValidInvocations                     = 1311,
                NumUnknownInvocations                   = 131,
                UniqueAssemblies                        = { Names.Assembly("A,1.2.3.4") },
                NumAsmDelegateCalls                     = 141,
                NumAsmCalls                             = 14,
                UniqueAsmMethods                        = { Names.Method("[p:bool] [T,P].MA()") },
                NumAsmFieldRead                         = 15,
                UniqueAsmFields                         = { Names.Field("[p:int] [T,P]._fA") },
                NumAsmPropertyRead                      = 16,
                UniqueAsmProperties                     = { Names.Property("get set [p:double] [T,P].PA()") }
            };

            a.Add(
                new ContextStatistics
            {
                NumRepositories                         = 1 + 1,
                NumUsers                                = 2 + 1,
                NumSolutions                            = 3 + 1,
                EstimatedLinesOfCode                    = 31 + 1,
                NumTypeDeclTopLevel                     = 4 + 1,
                NumTypeDeclNested                       = 5 + 1,
                UniqueTypeDecl                          = { Names.Type("T2,P") },
                NumPartial                              = 20 + 1,
                NumClasses                              = 6 + 1,
                NumInterfaces                           = 7 + 1,
                NumDelegates                            = 8 + 1,
                NumStructs                              = 9 + 1,
                NumEnums                                = 10 + 1,
                NumUnusualType                          = 111 + 1,
                NumTypeDeclExtendsOrImplements          = 11 + 1,
                NumMethodDeclsTotal                     = 12 + 1,
                NumMethodDeclsOverrideOrImplement       = 13 + 1,
                NumMethodDeclsOverrideOrImplementAsm    = 122,
                UniqueMethodDeclsOverrideOrImplementAsm = { Names.Method("[p:bool] [T,P].O2()") },
                NumValidInvocations                     = 1311 + 1,
                NumUnknownInvocations                   = 131 + 1,
                UniqueAssemblies                        = { Names.Assembly("B,1.2.3.4") },
                NumAsmDelegateCalls                     = 141 + 1,
                NumAsmCalls                             = 14 + 1,
                UniqueAsmMethods                        = { Names.Method("[p:bool] [T,P].MB()") },
                NumAsmFieldRead                         = 15 + 1,
                UniqueAsmFields                         = { Names.Field("[p:int] [T,P]._fB") },
                NumAsmPropertyRead                      = 16 + 1,
                UniqueAsmProperties                     = { Names.Property("get set [p:double] [T,P].PB()") }
            });

            var c = new ContextStatistics
            {
                NumRepositories                         = 1 * 2 + 1,
                NumUsers                                = 2 * 2 + 1,
                NumSolutions                            = 3 * 2 + 1,
                EstimatedLinesOfCode                    = 31 * 2 + 1,
                NumTypeDeclTopLevel                     = 4 * 2 + 1,
                NumTypeDeclNested                       = 5 * 2 + 1,
                UniqueTypeDecl                          = { Names.Type("T,P"), Names.Type("T2,P") },
                NumPartial                              = 2 * 20 + 1,
                NumClasses                              = 6 * 2 + 1,
                NumInterfaces                           = 7 * 2 + 1,
                NumDelegates                            = 8 * 2 + 1,
                NumStructs                              = 9 * 2 + 1,
                NumEnums                                = 10 * 2 + 1,
                NumUnusualType                          = 111 * 2 + 1,
                NumTypeDeclExtendsOrImplements          = 11 * 2 + 1,
                NumMethodDeclsTotal                     = 12 * 2 + 1,
                NumMethodDeclsOverrideOrImplement       = 13 * 2 + 1,
                NumMethodDeclsOverrideOrImplementAsm    = 121 * 2 + 1,
                UniqueMethodDeclsOverrideOrImplementAsm =
                {
                    Names.Method("[p:bool] [T,P].O1()"),
                    Names.Method("[p:bool] [T,P].O2()")
                },
                NumValidInvocations   = 2 * 1311 + 1,
                NumUnknownInvocations = 2 * 131 + 1,
                UniqueAssemblies      = { Names.Assembly("A,1.2.3.4"), Names.Assembly("B,1.2.3.4") },
                NumAsmDelegateCalls   = 2 * 141 + 1,
                NumAsmCalls           = 14 * 2 + 1,
                UniqueAsmMethods      = { Names.Method("[p:bool] [T,P].MA()"), Names.Method("[p:bool] [T,P].MB()") },
                NumAsmFieldRead       = 15 * 2 + 1,
                UniqueAsmFields       = { Names.Field("[p:int] [T,P]._fA"), Names.Field("[p:int] [T,P]._fB") },
                NumAsmPropertyRead    = 16 * 2 + 1,
                UniqueAsmProperties   =
                {
                    Names.Property("get set [p:double] [T,P].PA()"),
                    Names.Property("get set [p:double] [T,P].PB()")
                }
            };

            Assert.AreEqual(a, c);
        }
 public void DoesNotIncludeLocalProjects()
 {
     CollectionAssert.DoesNotContain(AssemblyNames, Names.Assembly("Project1"));
 }
예제 #26
0
        public void SetValues()
        {
            var sut = new ContextStatistics
            {
                NumRepositories                         = 1,
                NumUsers                                = 2,
                NumSolutions                            = 3,
                EstimatedLinesOfCode                    = 31,
                NumTypeDeclTopLevel                     = 4,
                NumTypeDeclNested                       = 5,
                UniqueTypeDecl                          = { Names.Type("T,P") },
                NumPartial                              = 20,
                NumClasses                              = 6,
                NumInterfaces                           = 7,
                NumDelegates                            = 8,
                NumStructs                              = 9,
                NumEnums                                = 10,
                NumUnusualType                          = 111,
                NumTypeDeclExtendsOrImplements          = 11,
                NumMethodDeclsTotal                     = 12,
                NumMethodDeclsOverrideOrImplement       = 13,
                NumMethodDeclsOverrideOrImplementAsm    = 21,
                UniqueMethodDeclsOverrideOrImplementAsm = { Names.Method("[p:bool] [T,P].O1()") },
                NumValidInvocations                     = 1311,
                NumUnknownInvocations                   = 131,
                UniqueAssemblies                        = { Names.Assembly("A,1.2.3.4") },
                NumAsmDelegateCalls                     = 141,
                NumAsmCalls                             = 14,
                UniqueAsmMethods                        = { Names.Method("[p:bool] [T,P].M()") },
                NumAsmFieldRead                         = 15,
                UniqueAsmFields                         = { Names.Field("[p:int] [T,P]._f") },
                NumAsmPropertyRead                      = 16,
                UniqueAsmProperties                     = { Names.Property("get set [p:double] [T,P].P()") }
            };

            Assert.AreEqual(1, sut.NumRepositories);
            Assert.AreEqual(2, sut.NumUsers);
            Assert.AreEqual(3, sut.NumSolutions);
            Assert.AreEqual(31, sut.EstimatedLinesOfCode);

            Assert.AreEqual(9, sut.NumTypeDeclTotal);
            Assert.AreEqual(4, sut.NumTypeDeclTopLevel);
            Assert.AreEqual(5, sut.NumTypeDeclNested);
            Assert.AreEqual(20, sut.NumPartial);
            Assert.AreEqual(Sets.NewHashSet(Names.Type("T,P")), sut.UniqueTypeDecl);

            Assert.AreEqual(6, sut.NumClasses);
            Assert.AreEqual(7, sut.NumInterfaces);
            Assert.AreEqual(8, sut.NumDelegates);
            Assert.AreEqual(9, sut.NumStructs);
            Assert.AreEqual(10, sut.NumEnums);
            Assert.AreEqual(111, sut.NumUnusualType);

            Assert.AreEqual(11, sut.NumTypeDeclExtendsOrImplements);
            Assert.AreEqual(12, sut.NumMethodDeclsTotal);
            Assert.AreEqual(13, sut.NumMethodDeclsOverrideOrImplement);
            Assert.AreEqual(21, sut.NumMethodDeclsOverrideOrImplementAsm);
            Assert.AreEqual(
                Sets.NewHashSet(Names.Method("[p:bool] [T,P].O1()")),
                sut.UniqueMethodDeclsOverrideOrImplementAsm);

            Assert.AreEqual(1311, sut.NumValidInvocations);
            Assert.AreEqual(131, sut.NumUnknownInvocations);

            Assert.AreEqual(Sets.NewHashSet(Names.Assembly("A,1.2.3.4")), sut.UniqueAssemblies);

            Assert.AreEqual(141, sut.NumAsmDelegateCalls);
            Assert.AreEqual(14, sut.NumAsmCalls);
            Assert.AreEqual(Sets.NewHashSet(Names.Method("[p:bool] [T,P].M()")), sut.UniqueAsmMethods);

            Assert.AreEqual(15, sut.NumAsmFieldRead);
            Assert.AreEqual(Sets.NewHashSet(Names.Field("[p:int] [T,P]._f")), sut.UniqueAsmFields);

            Assert.AreEqual(16, sut.NumAsmPropertyRead);
            Assert.AreEqual(Sets.NewHashSet(Names.Property("get set [p:double] [T,P].P()")), sut.UniqueAsmProperties);

            Assert.AreNotEqual(0, sut.GetHashCode());
            Assert.AreNotEqual(1, sut.GetHashCode());
        }
 protected static void AssertUniqueAssemblies(IContextStatistics actual, params string[] ids)
 {
     Assert.AreEqual(Sets.NewHashSetFrom(ids.Select(id => Names.Assembly(id))), actual.UniqueAssemblies);
 }