示例#1
0
        public void ClrTypeMappingPrimitiveTypeOverflowTest()
        {
            var edmModel    = this.GetParserResult(ClrTypeMappingTestModelBuilder.PrimitiveTypeOverflowTest());
            var annotations = edmModel.FindVocabularyAnnotations(edmModel.FindType("NS1.Person"));

            Func <string, IEdmIntegerConstantExpression> GetIntegerExpression = (termName) =>
            {
                var valueAnnotation = annotations.Single(n => n.Term.Name == termName) as IEdmValueAnnotation;
                return((IEdmIntegerConstantExpression)valueAnnotation.Value);
            };
            Func <string, IEdmFloatingConstantExpression> GetFloatExpression = (termName) =>
            {
                var valueAnnotation = annotations.Single(n => n.Term.Name == termName) as IEdmValueAnnotation;
                return((IEdmFloatingConstantExpression)valueAnnotation.Value);
            };
            Func <string, IEdmValue> GetEdmValue = (termName) =>
            {
                var valueAnnotation   = annotations.Single(n => n.Term.Name == termName) as IEdmValueAnnotation;
                var edmToClrEvaluator = new EdmToClrEvaluator(null);
                return(edmToClrEvaluator.Evaluate(valueAnnotation.Value));
            };

            var edmToClrConverter = new EdmToClrConverter();

            Assert.AreEqual(edmToClrConverter.AsClrValue(GetFloatExpression("SingleValue"), typeof(Single)), float.PositiveInfinity, "It should return Infinit for Single when the value is greater than Single.MaxValue.");
            Assert.AreEqual(edmToClrConverter.AsClrValue(GetFloatExpression("NegativeSingleValue"), typeof(Single)), float.NegativeInfinity, "It should return Negative Infinit for Single when the value is less than Single.MinValue.");
            this.VerifyThrowsException(typeof(OverflowException), () => edmToClrConverter.AsClrValue(GetEdmValue("ByteValue"), typeof(byte)));
            this.VerifyThrowsException(typeof(OverflowException), () => edmToClrConverter.AsClrValue <byte>(GetEdmValue("ByteValue")));
            this.VerifyThrowsException(typeof(OverflowException), () => new EdmToClrEvaluator(null).EvaluateToClrValue <byte>(GetIntegerExpression("ByteValue")));
            this.VerifyThrowsException(typeof(OverflowException), () => edmToClrConverter.AsClrValue(GetEdmValue("SByteValue"), typeof(sbyte)));
            this.VerifyThrowsException(typeof(OverflowException), () => edmToClrConverter.AsClrValue <sbyte>(GetEdmValue("SByteValue")));
            this.VerifyThrowsException(typeof(OverflowException), () => new EdmToClrEvaluator(null).EvaluateToClrValue <sbyte>(GetIntegerExpression("SByteValue")));
        }
示例#2
0
        public void ClrTypeMappingValueAnnotationTryPopulateObjectInstance()
        {
            this.InitializeOperationDefinitions();

            EdmToClrEvaluator ev = new EdmToClrEvaluator(this.operationDefinitions);

            var edmModel = this.GetParserResult(ClrTypeMappingTestModelBuilder.ValueAnnotationClassTypeBasicTest(), this.operationDeclarationModel);
            var value    = ev.Evaluate(this.GetValueAnnotations(edmModel, edmModel.FindType("NS1.Person"), "TVDisplay").Single().Value);

            var    isObjectPopulated     = false;
            var    isObjectInitialized   = true;
            object createdObjectInstance = new Display1()
            {
                X = 0, Y = 1
            };
            TryCreateObjectInstance tryCreateObjectInstance = (IEdmStructuredValue edmValue, Type clrType, EdmToClrConverter converter, out object objectInstance, out bool objectInstanceInitialized) =>
            {
                objectInstance            = createdObjectInstance;
                objectInstanceInitialized = isObjectPopulated;
                return(isObjectInitialized);
            };

            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);

            this.VerifyThrowsException(typeof(InvalidCastException), () => ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)));

            isObjectPopulated     = false;
            isObjectInitialized   = false;
            createdObjectInstance = new Display1()
            {
                X = 0, Y = 1
            };
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            isObjectPopulated     = true;
            isObjectInitialized   = true;
            createdObjectInstance = new Display1()
            {
                X = 0, Y = 1
            };
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            this.VerifyThrowsException(typeof(InvalidCastException), () => ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)));
        }
示例#3
0
        private T ConvertToClrObject <T>(IEdmValueAnnotation valueAnnotation)
        {
            var edmClrEvaluator = new EdmToClrEvaluator(this.operationDefinitions);
            var edmClrConverter = new EdmToClrConverter();

            var edmValue = edmClrEvaluator.Evaluate(valueAnnotation.Value);

            var object1 = edmClrEvaluator.EvaluateToClrValue <T>(valueAnnotation.Value);
            var object2 = (T)edmClrConverter.AsClrValue(edmValue, typeof(T));
            var object3 = edmClrEvaluator.EdmToClrConverter.AsClrValue <T>(edmValue);

            Assert.IsTrue(CompareObjects(object1, object2), "The results of EvaluateToClrValue and AsClrValue do not match.");
            Assert.IsTrue(CompareObjects(object2, object3), "The result of the generic version of AsClrValue does not match that of the non-generic version.");

            return(object1);
        }
示例#4
0
        public void ClrTypeMappingValueAnnotationEnumTest()
        {
            var edmModel    = this.GetParserResult(ClrTypeMappingTestModelBuilder.ValueAnnotationEnumTest());
            var annotations = edmModel.FindVocabularyAnnotations(edmModel.FindType("NS1.Person"));

            Func <string, IEdmIntegerConstantExpression> GetIntegerExpression = (termName) =>
            {
                var valueAnnotation = annotations.Single(n => n.Term.Name == termName) as IEdmValueAnnotation;
                return((IEdmIntegerConstantExpression)valueAnnotation.Value);
            };

            Func <string, IEdmValue> GetEdmValue = (termName) =>
            {
                var valueAnnotation   = annotations.Single(n => n.Term.Name == termName) as IEdmValueAnnotation;
                var edmToClrEvaluator = new EdmToClrEvaluator(null);
                return(edmToClrEvaluator.Evaluate(valueAnnotation.Value));
            };

            var edmToClrConverter = new EdmToClrConverter();

            Assert.AreEqual(edmToClrConverter.AsClrValue(GetIntegerExpression("PersonValueAnnotation3"), typeof(EnumInt)), EnumInt.Member1, "It should return Infinit for Single when the value is greater than Single.MaxValue.");
            Assert.AreEqual(new EdmToClrEvaluator(null).EvaluateToClrValue <EnumInt>(GetIntegerExpression("PersonValueAnnotation3")), EnumInt.Member1, "It should return Infinit for Single when the value is greater than Single.MaxValue.");
            Assert.AreEqual(new EdmToClrEvaluator(null).EvaluateToClrValue <EnumInt>(GetIntegerExpression("PersonValueAnnotation4")), (EnumInt)(-2), "It should return Infinit for Single when the value is greater than Single.MaxValue.");
#if !SILVERLIGHT
            this.ValidateClrObjectConverter(this.GetValueAnnotations(edmModel, edmModel.FindType("NS1.Person"), "PersonValueAnnotation1").Single(),
                                            new ClassWithEnum()
            {
                EnumInt   = EnumInt.Member1,
                EnumByte  = (EnumByte)10,
                EnumULong = EnumULong.Member2
            });
#endif
            this.VerifyThrowsException(typeof(InvalidCastException), () => new EdmToClrEvaluator(null).EvaluateToClrValue <EnumInt>(GetIntegerExpression("PersonValueAnnotation2")));
#if !SILVERLIGHT
            this.ValidateClrObjectConverter(this.GetValueAnnotations(edmModel, edmModel.FindType("NS1.Person"), "PersonValueAnnotation8").Single(),
                                            new ClassWithEnum()
            {
                EnumInt = (EnumInt)10,
            });
#endif
        }
示例#5
0
        public void ClrTypeMappingValueAnnotationTryCreateObjectInstance()
        {
            this.InitializeOperationDefinitions();

            EdmToClrEvaluator ev = new EdmToClrEvaluator(this.operationDefinitions);

            var edmModel = this.GetParserResult(ClrTypeMappingTestModelBuilder.ValueAnnotationClassTypeBasicTest(), this.operationDeclarationModel);
            var value    = ev.Evaluate(this.GetValueAnnotations(edmModel, edmModel.FindType("NS1.Person"), "TVDisplay").Single().Value);

            var    isObjectPopulated     = true;
            var    isObjectInitialized   = true;
            object createdObjectInstance = null;
            TryCreateObjectInstance tryCreateObjectInstance = (IEdmStructuredValue edmValue, Type clrType, EdmToClrConverter converter, out object objectInstance, out bool objectInstanceInitialized) =>
            {
                objectInstance            = createdObjectInstance;
                objectInstanceInitialized = isObjectPopulated;
                return(isObjectInitialized);
            };

            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsNull((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), "The returned object should be null.");

            isObjectPopulated    = false;
            isObjectInitialized  = true;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsNull((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), "The returned object should be null.");

            isObjectPopulated    = true;
            isObjectInitialized  = false;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            isObjectPopulated    = false;
            isObjectInitialized  = false;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            createdObjectInstance = new Display2()
            {
                X = 0, Y = 1, Origin = new Display1 {
                    X = 3, Y = 4
                }
            };
            isObjectPopulated    = true;
            isObjectInitialized  = true;
            ev.EdmToClrConverter = new EdmToClrConverter(tryCreateObjectInstance);
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), createdObjectInstance), "The returned object has incorrect values.");

            ev.EdmToClrConverter = new EdmToClrConverter((IEdmStructuredValue edmValue, Type clrType, EdmToClrConverter converter, out object objectInstance, out bool objectInstanceInitialized) =>
            {
                if (clrType == typeof(Display2))
                {
                    objectInstance = new Display2()
                    {
                        X = 0, Y = 1, Origin = new Display1 {
                            X = 3, Y = 4
                        }
                    };
                    objectInstanceInitialized = false;
                    return(true);
                }
                else if (clrType == typeof(Display1))
                {
                    objectInstance = new Display1 {
                        X = 3, Y = 4
                    };
                    objectInstanceInitialized = false;
                    return(true);
                }
                else
                {
                    objectInstance            = null;
                    objectInstanceInitialized = false;
                    return(false);
                }
            });
            Assert.IsTrue(CompareObjects((Display2)ev.EdmToClrConverter.AsClrValue(value, typeof(Display2)), new Display2()
            {
                X = 10, Y = 20, Origin = new Display1()
                {
                    X = 10, Y = 20
                }
            }), "The returned object has incorrect values.");

            isObjectPopulated     = false;
            isObjectInitialized   = true;
            createdObjectInstance = new DisplayCoordination();
            ev.EdmToClrConverter  = new EdmToClrConverter(tryCreateObjectInstance);
            Coordination actual   = (Coordination)ev.EdmToClrConverter.AsClrValue(value, typeof(Coordination));
            Coordination expected = new Coordination()
            {
                X = 10, Y = 20
            };

            Assert.AreEqual(expected.X, actual.X, "The returned object has incorrect values. X");
            Assert.AreEqual(expected.Y, actual.Y, "The returned object has incorrect values. X");
        }