Beispiel #1
0
        public static IReadOnlyList <string> Validate(DeviceProfile profile, ICommand cmd, bool failOnFirst = false)
        {
            var res = new List <string>();

            if (!(cmd is AutoSerializeBase asbCmd))
            {
                return(res);
            }

            var           props            = AutoSerializeBase.GetPropertySpecForType(asbCmd.GetType());
            List <string> propNamesToCheck = null;

            // If there is a mask, only validate the ones specified by the mask
            AutoSerializeBase.PropertySpec maskProp = props.Properties.Where(p => p.PropInfo.Name == "Mask").FirstOrDefault();
            if (maskProp != null)
            {
                // Only check fields which are indicated by the mask
                propNamesToCheck = maskProp.Getter.DynamicInvoke(cmd).ToString()
                                   .Split(',').Select(s => s.Trim()).Concat(new[] { "Mask" }).ToList();
            }

            foreach (AutoSerializeBase.PropertySpec prop in props.Properties)
            {
                if (prop.Getter == null)
                {
                    continue;
                }

                // If prop is not to check and not commandId then skip
                if (!prop.IsCommandId && propNamesToCheck != null && !propNamesToCheck.Contains(prop.PropInfo.Name))
                {
                    continue;
                }

                object val = prop.Getter.DynamicInvoke(cmd);
                if (!prop.SerAttr.IsValid(prop.PropInfo, val) || !AvailabilityChecker.IsAvailable(profile, val))
                {
                    res.Add("Invalid value: " + asbCmd.GetType().FullName + "." + prop.PropInfo.Name + ": " + val);

                    if (failOnFirst)
                    {
                        return(res);
                    }
                }
            }

            return(res);
        }
Beispiel #2
0
        public static bool ValidateCommandMatches <T>(ICommand cmd, T expectedCmd, bool followMask, params string[] ignoreProps) where T : AutoSerializeBase
        {
            if (cmd is T cmd2)
            {
                AutoSerializeBase.CommandPropertySpec spec = AutoSerializeBase.GetPropertySpecForType(typeof(T));

                AutoSerializeBase.PropertySpec maskProp = spec.Properties.FirstOrDefault(p => p.PropInfo.Name == "Mask");
                var maskedNames = new HashSet <string> {
                    "Mask"
                };
                if (maskProp != null)
                {
                    Enum maskVal = maskProp.Getter.DynamicInvoke(cmd) as Enum;
                    IEnumerable <string> components = Enum.GetValues(maskProp.PropInfo.PropertyType).OfType <Enum>()
                                                      .Where(v => maskVal.HasFlag(v)).Select(c => c.ToString());
                    maskedNames.AddRange(components);
                }

                foreach (var prop in spec.Properties)
                {
                    if (followMask && !maskedNames.Contains(prop.PropInfo.Name))
                    {
                        continue;
                    }
                    if (ignoreProps.Contains(prop.PropInfo.Name))
                    {
                        continue;
                    }

                    object expectedValue = prop.Getter.DynamicInvoke(expectedCmd);
                    object actualValue   = prop.Getter.DynamicInvoke(cmd2);
                    Assert.Equal(expectedValue, actualValue);
                }

                // Accept it
                return(true);
            }

            return(false);
        }