/// <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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <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++;
                    }
                }
            }
        }