/// <summary> /// Assumes first performanceTestRun should be used to compare all other performanceTestRuns against. /// </summary> /// <param name="performanceTestRun"></param> /// <param name="xmlFileNamePath"></param> public void ProcessMetadata(PerformanceTestRun performanceTestRun, string xmlFileNamePath) { SetIsBuiltInVr(new[] { performanceTestRun }); SetIsAndroid(new[] { performanceTestRun }); foreach (var metadataType in metadataTypes) { var typeMetadata = TypeMetadata.Any(tm => tm.Type == metadataType) ? TypeMetadata.First(m => m.Type == metadataType) : null; // If metadataType doesn't exist in our TypeMetadata list, add it if (typeMetadata == null) { typeMetadata = new TypeMetadata(metadataType); TypeMetadata.Add(typeMetadata); } var fieldInfos = performanceTestRun.GetType().GetFields(); // If this metadataType is completely missing from the perf test run, mark it as such and move on if (fieldInfos.Any(f => f.FieldType == metadataType)) { var fieldInfo = fieldInfos.First(f => f.FieldType == metadataType); object obj = null; GetFieldInfoValue(performanceTestRun, metadataType, ref obj, fieldInfo); // If null, we're missing metadata for this performanceTestRun if (obj == null) { typeMetadata.NullResultCount++; // But we already have results for this metadataType, // add an empty "missing value" entry for it each FieldGroup if (typeMetadata.ValidResultCount > 0) { foreach (var fieldGroup in typeMetadata.FieldGroups) { BackfillFieldGroupValuesForMissingMetadata(xmlFileNamePath, fieldGroup, typeMetadata); } } continue; } var fieldsToProcess = GetFieldsToProcess(metadataType, obj.GetType().GetFields()); // if we have valid field metadata to process if (fieldsToProcess.Length > 0) { ProcessMetaData(xmlFileNamePath, fieldsToProcess, typeMetadata, metadataType, obj); } } } }
/// <summary> /// Assumes first performanceTestRun should be used to compare all other performanceTestRuns against. /// </summary> /// <param name="performanceTestRun"></param> /// <param name="xmlFileNamePath"></param> public void ProcessMetadata(PerformanceTestRun performanceTestRun, string xmlFileNamePath) { SetIsVrSupported(new[] { performanceTestRun }); SetIsAndroid(new[] { performanceTestRun }); foreach (var metadataType in metadataTypes) { var typeMetadata = TypeMetadata.Any(tm => tm.Type == metadataType) ? TypeMetadata.First(m => m.Type == metadataType) : null; // If metadataType doesn't exist in our TypeMetadata list, add it if (typeMetadata == null) { typeMetadata = new TypeMetadata(metadataType); TypeMetadata.Add(typeMetadata); } var fieldInfos = performanceTestRun.GetType().GetFields(); // If this metadataType is completely missing from the perf test run, mark it as such and move on if (fieldInfos.Any(f => f.FieldType == metadataType)) { var fieldInfo = fieldInfos.First(f => f.FieldType == metadataType); object obj = null; GetFieldInfoValue(performanceTestRun, metadataType, ref obj, fieldInfo); // If null, we're missing metadata for this performanceTestRun if (obj == null) { typeMetadata.NullResultCount++; // But we already have results for this metadataType, // add an empty "missing value" entry for it each FieldGroup if (typeMetadata.ValidResultCount > 0) { foreach (var fieldGroup in typeMetadata.FieldGroups) { BackfillFieldGroupValuesForMissingMetadata(xmlFileNamePath, fieldGroup, typeMetadata); } } continue; } var fields = obj.GetType().GetFields(); var fieldsToProcess = GetFieldsToProcess(metadataType, fields); // if we have valid field metadata to process if (fieldsToProcess.Length > 0) { foreach (var field in fieldsToProcess) { if (!typeMetadata.FieldGroups.Any(fg => fg.FieldName.Equals(field.Name))) { typeMetadata.FieldGroups.Add(new FieldGroup(field.Name)); } var thisFieldGroup = typeMetadata.FieldGroups.First(fg => fg.FieldName.Equals(field.Name)); // We want to keep the values array length consistent with the number of results, even for results // that are missing metadata. We do that here. BackfillFieldGroupValuesForMissingMetadata(xmlFileNamePath, thisFieldGroup, typeMetadata); // Add this field value var value = GetValueBasedOnType(metadataType, field, obj); Array.Resize(ref thisFieldGroup.Values, thisFieldGroup.Values.Length + 1); thisFieldGroup.Values[thisFieldGroup.Values.Length - 1] = new FieldValue(xmlFileNamePath, value); // fieldGroup.Values is sorted by result name; the first element in this array // is considered to be the reference point, regardless if it's a "baseline" or not. if (thisFieldGroup.Values[thisFieldGroup.Values.Length - 1].Value != thisFieldGroup.Values[0].Value) { thisFieldGroup.Values[thisFieldGroup.Values.Length - 1].IsMismatched = true; } } typeMetadata.ValidResultCount++; } } } }