Esempio n. 1
0
        private static SpecificationResult PopulateSpecificationResult(ISpecification specification, ConditionResult filterResult, ConditionResult checkResult)
        {
            SpecificationResult specRes = new SpecificationResult();

            // Populate the result.
            specRes.PassedObjects.AddRange(checkResult.PassedObjects);
            specRes.FailedObjects.AddRange(checkResult.FailedObjects);
            specRes.NotAssessedObjects.AddRange(filterResult.FailedObjects);

            specRes.Specifications = new List <ISpecification>()
            {
                specification
            };
            specRes.ObjectFailures = new List <ObjectFailures>();

            for (int i = 0; i < specRes.FailedObjects.Count(); i++)
            {
                object         failedObj = specRes.FailedObjects.ElementAtOrDefault(i);
                ObjectFailures f         = new ObjectFailures();
                f.Object = failedObj;
                f.FailedSpecifications = new HashSet <ISpecification>()
                {
                    specification
                };

                var fi = string.Join("\n\t", checkResult.FailInfo);
                f.CheckFailures.Add(new CheckFailure()
                {
                    Object = failedObj, ParentSpecification = specification, FailedCheckCondition = checkResult.Condition, FailInfo = checkResult.FailInfo[i]
                });
                specRes.ObjectFailures.Add(f);
            }

            return(specRes);
        }
Esempio n. 2
0
        /***************************************************/
        /**** Public Methods                            ****/
        /***************************************************/

        // Engineer to Order workflow. Verify against specs.
        public static SpecificationResult VerifySpecifications(List <object> objects, List <ISpecification> specifications, PassRequirement passRequirement = PassRequirement.AllMustPass)
        {
            SpecificationResult combinedResult = new SpecificationResult();

            // Find unique objects.
            HashSet <object> allObjs = new HashSet <object>(objects); // TODO: evaluate whether to use our HashComparer.

            objects = allObjs.ToList();

            HashSet <object> passedObjs  = new HashSet <object>();
            HashSet <object> failedObjs  = new HashSet <object>();
            HashSet <object> NotAssessed = new HashSet <object>(objects);

            Dictionary <object, ObjectFailures> objFailDict = new Dictionary <object, ObjectFailures>();  // one "Failures" per failed object, stating what specification(s) that object failed.

            foreach (var spec in specifications)
            {
                SpecificationResult specRes             = IVerifySpecification(objects, spec);
                CheckFailure        failuresForThisSpec = new CheckFailure();

                foreach (var obj in specRes.PassedObjects)
                {
                    NotAssessed.Remove(obj);

                    if (passRequirement == PassRequirement.AtLeastOnePasses || (passRequirement == PassRequirement.AllMustPass && !failedObjs.Contains(obj)))
                    {
                        passedObjs.Add(obj);

                        if (failedObjs.Contains(obj))
                        {
                            failedObjs.Remove(obj);
                            objFailDict.Remove(obj);
                        }
                    }
                }

                foreach (var obj in specRes.FailedObjects)
                {
                    NotAssessed.Remove(obj);

                    if (passRequirement == PassRequirement.AtLeastOnePasses && passedObjs.Contains(obj))
                    {
                        continue; // continue considering the object as Passed.
                    }
                    passedObjs.Remove(obj);
                    failedObjs.Add(obj);

                    ObjectFailures f;
                    if (!objFailDict.TryGetValue(obj, out f))
                    {
                        f        = new ObjectFailures();
                        f.Object = obj;
                    }

                    f.FailedSpecifications.Add(spec);
                    var singleSpecFailure = specRes.ObjectFailures.First();

                    var existingCheckFailure  = f.CheckFailures.FirstOrDefault(cf => cf.ParentSpecification == spec && (cf.FailedCheckCondition == singleSpecFailure.CheckFailures.First() || cf.FailInfo == singleSpecFailure.CheckFailures.First().FailInfo));
                    var checkFailure_thisSpec = f.CheckFailures.FirstOrDefault(cf => cf.ParentSpecification == spec);

                    bool areNotEqual = checkFailure_thisSpec != null;

                    string text1 = checkFailure_thisSpec?.FailInfo.ToString();
                    string text2 = singleSpecFailure?.CheckFailures.First().FailInfo.ToString();

                    if (!string.IsNullOrWhiteSpace(text1) && !string.IsNullOrWhiteSpace(text2))
                    {
                        string asdasd = string.Join("", text1.Except(text2));
                        areNotEqual &= !string.IsNullOrWhiteSpace(asdasd);
                    }

                    if (!f.CheckFailures.Any() || checkFailure_thisSpec == null || areNotEqual)
                    {
                        f.CheckFailures.Add(new CheckFailure()
                        {
                            Object = obj, ParentSpecification = spec, FailedCheckCondition = singleSpecFailure.CheckFailures.First().FailedCheckCondition, FailInfo = singleSpecFailure.CheckFailures.FirstOrDefault()?.FailInfo
                        });
                    }

                    objFailDict[obj] = f;
                }
            }

            combinedResult = new SpecificationResult()
            {
                PassedObjects      = passedObjs.ToList(),
                FailedObjects      = failedObjs.ToList(),
                NotAssessedObjects = NotAssessed.ToList(),
                Specifications     = specifications.Distinct().ToList(),
                ObjectFailures     = objFailDict.Values.ToList()
            };

            return(combinedResult);
        }