public HashSet<string> MergeCaseCoverageData(CoverageDataDescriptor cdata,string caseId) { HashSet<string> differentStamps = new HashSet<string>(); foreach (string key in cdata.CoverageMap.Keys) { if (!m_coverageMap.ContainsKey(key)) { m_coverageMap.Add(key, new CaseCoverageDataHolder(cdata.CoverageMap[key].Coverage, cdata.CoverageMap[key].Stamp, caseId)); } else { //标识不一致表示同个类前后两次内容不一致,可能是错误操作引起得,记录类名以供分析 if (m_coverageMap[key].Stamp != cdata.CoverageMap[key].Stamp) { differentStamps.Add(key); continue; } for (int i = 0; i < m_coverageMap[key].CaseCoverage.Length; i++) { for (int j = 0; j < m_coverageMap[key].CaseCoverage[i].Length; j++) { if (cdata.CoverageMap[key].Coverage[i][j]) { m_coverageMap[key].CaseCoverage[i][j].Add(caseId); } } } } } return differentStamps; }
public RootItem CreateView(MetaDataDescriptor mdata, CoverageDataDescriptor cdata, bool srcView) { if (mdata == null) throw new ArgumentNullException("null input: mdata"); if (cdata == null) throw new ArgumentNullException("null input: cdata"); m_mdata = mdata; if (srcView && !mdata.HasSrcFileData) throw new ArgumentException("source file data view requested for metadata with incomplete SourceFile debug info"); m_view = new RootItem(); m_packageMap = new Dictionary<string, PackageItem>(); m_srcFileMap = new Dictionary<string, SrcFileItem>(); m_classMap = new Dictionary<string, ClassItem>(); PackageItem packageItem = null; foreach (string key in mdata.ClassMap.Keys) { ClassDescriptor cls = mdata.ClassMap[key]; string packageVMName = cls.PackageVMName; if (!m_packageMap.ContainsKey(packageVMName)) { string packageName = packageVMName.Length == 0 ? "default package" : VMNameConvert.VMNameToJavaName(packageVMName); packageItem = new PackageItem(m_view, packageName, packageVMName); m_packageMap.Add(packageVMName, packageItem); m_view.AddChild(packageItem); } else packageItem = m_packageMap[packageVMName]; SrcFileItem srcfileItem = null; if (srcView) { string srcFileName = cls.SrcFileName; if (srcFileName == null) throw new ArgumentNullException("src file name = null"); string fullSrcFileName = VMNameConvert.CombineVMName(packageVMName, srcFileName); if (!m_srcFileMap.ContainsKey(fullSrcFileName)) { srcfileItem = new SrcFileItem(packageItem, srcFileName, fullSrcFileName); m_srcFileMap.Add(fullSrcFileName, srcfileItem); packageItem.AddChild(srcfileItem); } else srcfileItem = m_srcFileMap[fullSrcFileName]; } DataHolder data = cdata.GetCoverage(cls); if (data != null) { if (data.Stamp != cls.Stamp) throw new Exception("class stamp mismatch:" + VMNameConvert.VMNameToJavaName(cls.ClassVMName)); } bool[][] coverage = (data != null ? data.Coverage : null); ClassItem classItem = srcView ? new ClassItem(srcfileItem, cls, coverage) : new ClassItem(packageItem, cls, coverage); MethodDescriptor[] methods = cls.Methods; for (int m = 0; m < methods.Length; ++m) { MethodDescriptor method = methods[m]; if ((method.Status & DataConstants.METHOD_NO_BLOCK_DATA) != 0) continue; MethodItem methodItem = new MethodItem(classItem, m, method.Name, method.Descriptor, method.FirstLine); classItem.AddChild(methodItem); } if (srcView) { srcfileItem.AddChild(classItem); m_classMap.Add(classItem.Name, classItem); } else packageItem.AddChild(classItem); } return m_view; }