public void ReadOnlyPropertiesWorkIfTheReferenceMatches() { var document = new OclDocument { new OclBlock("ReadOnlyPassengers") { new OclAttribute("Name", "Bob") } }; var expected = new Car(); expected.ReadOnlyPassengers.Add(new Person { Name = "Bob" }); var context = new OclConversionContext(new OclSerializerOptions() ?? new OclSerializerOptions()); var result = context.FromElement(typeof(Car), document, null); if (result == null) { throw new OclException("Document conversion resulted in null, which is not valid"); } ((Car)result) .Should() .BeEquivalentTo(expected); }
public object?FromElement(OclConversionContext context, Type type, IOclElement element, object?currentValue) { var collectionType = GetElementType(type); var collection = currentValue ?? CreateNewCollection(type, collectionType); var elements = element is OclDocument root ? root.ToArray() : new[] { element }; foreach (var item in elements.Select(e => context.FromElement(collectionType, e, null))) { if (collection is IList list) { list.Add(item); } else { var addMethod = collection.GetType().GetMethod("Add", new[] { collectionType }); if (addMethod == null) { throw new Exception("Only collections that implement an Add method are supported"); } addMethod.Invoke(collection, new[] { item }); } } return(collection); }
public void CollectionSingleItem() { var document = new OclDocument { new OclBlock("Passengers") { new OclAttribute("Name", "Bob") } }; var context = new OclConversionContext(new OclSerializerOptions() ?? new OclSerializerOptions()); var result = context.FromElement(typeof(Car), document, null); if (result == null) { throw new OclException("Document conversion resulted in null, which is not valid"); } ((Car)result) .Should() .BeEquivalentTo(new Car { Passengers = new List <Person> { new Person { Name = "Bob" } } }); }
public void Empty() { var document = new OclDocument(); var context = new OclConversionContext(new OclSerializerOptions()); var result = context.FromElement(typeof(Car), document, null); if (result == null) { throw new OclException("Document conversion resulted in null, which is not valid"); } ((Car)result) .Should() .BeEquivalentTo(new Car()); }
public void StringAttribute() { var document = new OclDocument { new OclAttribute("Name", "Mystery Machine") }; var context = new OclConversionContext(new OclSerializerOptions() ?? new OclSerializerOptions()); var result = context.FromElement(typeof(Car), document, null); if (result == null) { throw new OclException("Document conversion resulted in null, which is not valid"); } ((Car)result) .Should() .BeEquivalentTo(new Car { Name = "Mystery Machine" }); }
protected virtual IReadOnlyList <IOclElement> SetProperties( OclConversionContext context, IEnumerable <IOclElement> elements, object target, IReadOnlyList <PropertyInfo> properties) { var notFound = new List <IOclElement>(); foreach (var element in elements) { var name = element.Name?.Trim(); if (string.IsNullOrWhiteSpace(name)) { throw new OclException("Encountered invalid child: " + element.GetType()); } var propertyToSet = context.Namer.GetProperty(name, properties); if (propertyToSet == null) { notFound.Add(element); } else { var currentValue = propertyToSet.GetValue(target); var valueToSet = context.FromElement(propertyToSet.PropertyType, element, currentValue); if (currentValue != valueToSet) { if (!propertyToSet.CanWrite) { throw new OclException($"The property '{propertyToSet.Name}' on '{target.GetType().Name}' does not have a setter"); } propertyToSet.SetValue(target, CoerceValue(valueToSet, propertyToSet.PropertyType)); } } } return(notFound); }
public void ExceptionIsThrownIfPropertyCantBeSet() { var document = new OclDocument { new OclAttribute("ReadOnly", 1) }; Action action = () => { var context = new OclConversionContext(new OclSerializerOptions() ?? new OclSerializerOptions()); var result = context.FromElement(typeof(Car), document, null); if (result == null) { throw new OclException("Document conversion resulted in null, which is not valid"); } var temp = (Car)result; }; action.Should() .Throw <OclException>() .WithMessage("*The property 'ReadOnly' on 'Car' does not have a setter*"); }
public void ExceptionIsThrownIfPropertyDoesNotExist() { var document = new OclDocument { new OclAttribute("Wings", 1) }; Action action = () => { var context = new OclConversionContext(new OclSerializerOptions() ?? new OclSerializerOptions()); var result = context.FromElement(typeof(Car), document, null); if (result == null) { throw new OclException("Document conversion resulted in null, which is not valid"); } var temp = (Car)result; }; action.Should() .Throw <OclException>() .WithMessage("*The property 'Wings' was not found on 'Car'*"); }