Ejemplo n.º 1
0
        private void ValidateTemplateMarkup(Template template, IEnumerable <TemplateErrorSuppression> errorSuppressions)
        {
            var references = template.Steps.SelectMany(s => s.Inputs.Select(i =>
            {
                var inputId = s.Id;
                if (!string.IsNullOrEmpty(i.Key))
                {
                    inputId += $".{i.Key}";
                }

                if (i.Type == TemplateStepInputType.Text)
                {
                    return(ReferenceDefinition.String(inputId));
                }
                else if (i.Type == TemplateStepInputType.Checkbox)
                {
                    return(ReferenceDefinition.Boolean(inputId));
                }
                else if (i.Type == TemplateStepInputType.Radio)
                {
                    var values = DynamicUtility.Unwrap(() => (IEnumerable <dynamic>)i.TypeData)
                                 .Select(d => DynamicUtility.Unwrap <string>(() => d.Value));
                    return(ReferenceDefinition.StringFrom(inputId, values));
                }
                else
                {
                    throw new Exception($"Unknown {nameof(TemplateStepInputType)}");
                }
            }));

            _templateMarkupValidator.Validate(template.Markup, template.MarkupVersion, references, errorSuppressions);
        }
Ejemplo n.º 2
0
            private object CreateReference(ReferenceDefinition referenceDefinition)
            {
                TypeDefinition typeDefinition = referenceDefinition.typeDefinition;

                if (typeDefinition.IsArray)
                {
                    Type typeElement = typeDefinition.type.GetElementType();
                    return(Array.CreateInstance(typeElement, referenceDefinition.fields.Length));
                }
                else if (typeDefinition.IsList)
                {
                    Type  elementType = typeDefinition.GetArrayLikeElementType().type;
                    IList list        = MakeInstance <IList>(typeDefinition.type);
                    Debug.Assert(list != null, nameof(list) + " != null");
                    object defaultValue = GetDefaultForType(elementType);
                    for (int i = 0; i < referenceDefinition.fields.Length; i++)
                    {
                        list.Add(defaultValue);
                    }
                    return(list);
                }
                else
                {
                    return(MakeInstance(typeDefinition.type));
                }
            }
Ejemplo n.º 3
0
            private void CreateArrayMembers(Array target, ReferenceDefinition def)
            {
                FieldDefinition[] fields = def.fields;
                for (int i = 0; i < fields.Length; i++)
                {
                    FieldDefinition field = fields[i];
                    switch (field.fieldType)
                    {
                    case FieldType.Array:
                    case FieldType.Reference:
                        target.SetValue(field.refId == -1 ? null : referenceMap[field.refId], i);
                        break;

                    case FieldType.Struct:
                        target.SetValue(CreateStruct(field), i);
                        break;

                    case FieldType.Primitive:
                        target.SetValue(field.value, i);
                        break;

                    case FieldType.Type:
                        target.SetValue(field.value, i);
                        break;

                    case FieldType.Unity:
                        target.SetValue(null, i);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }
Ejemplo n.º 4
0
 public void TestUnknownReference_DataElement()
 {
     RunValidation(
         nameof(TestUnknownReference_DataElement),
         new ReferenceDefinition[]
     {
         ReferenceDefinition.StringFrom("known_reference", new string[] { "person" })
     },
         new TemplateError[]
     {
         new TemplateError()
         {
             Code         = TemplateErrorCode.UnknownReference,
             LineNumber   = 4,
             LinePosition = 13
         }
     });
 }
Ejemplo n.º 5
0
 public void TestUnknownReference_IfAttribute()
 {
     RunValidation(
         nameof(TestUnknownReference_IfAttribute),
         new ReferenceDefinition[]
     {
         ReferenceDefinition.String("known_reference")
     },
         new TemplateError[]
     {
         new TemplateError()
         {
             Code         = TemplateErrorCode.UnknownReference,
             LineNumber   = 3,
             LinePosition = 16
         }
     });
 }
Ejemplo n.º 6
0
        private ReferenceDefinition CreateReferenceDefinition(object target)
        {
            ReferenceDefinition refNode = new ReferenceDefinition();

            refNode.refId          = referenceIdGenerator++;
            refNode.typeDefinition = TypeDefinition.Get(target.GetType());
            referenceMap[target]   = refNode;
            if (refNode.typeDefinition.IsArray)
            {
                Array array = target as Array;
                Debug.Assert(array != null, nameof(array) + " != null");
                int length = array.Length;
                refNode.fields = new FieldDefinition[length];
                TypeDefinition elementType = refNode.typeDefinition.GetArrayLikeElementType();
                for (int i = 0; i < length; i++)
                {
                    refNode.fields[i] = CreateArrayMemberDefinition(elementType, array.GetValue(i), i);
                }
            }
            else if (refNode.typeDefinition.IsArrayLike)
            {
                IList list = target as IList;
                Debug.Assert(list != null, nameof(list) + " != null");

                int length = list.Count;

                refNode.fields = new FieldDefinition[length];
                TypeDefinition elementType = refNode.typeDefinition.GetArrayLikeElementType();
                for (int i = 0; i < length; i++)
                {
                    refNode.fields[i] = CreateArrayMemberDefinition(elementType, list[i], i);
                }
            }
            else
            {
                refNode.fields = new FieldDefinition[refNode.typeDefinition.fields.Length];
                FieldInfo[] fields = refNode.typeDefinition.fields;
                for (int i = 0; i < fields.Length; i++)
                {
                    refNode.fields[i] = CreateFieldDefinition(target, fields[i]);
                }
            }
            return(refNode);
        }