private static void EnumMemberExpressionDemo() { Console.WriteLine("EnumMemberExpressionDemo"); var model = new EdmModel(); var personType = new EdmEntityType("TestNS", "Person"); model.AddElement(personType); var pid = personType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32, false); personType.AddKeys(pid); personType.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String); var colorType = new EdmEnumType("TestNS2", "Color", true); model.AddElement(colorType); colorType.AddMember("Cyan", new EdmIntegerConstant(1)); colorType.AddMember("Blue", new EdmIntegerConstant(2)); var outColorTerm = new EdmTerm("TestNS", "OutColor", new EdmEnumTypeReference(colorType, true)); model.AddElement(outColorTerm); var exp = new EdmEnumMemberExpression( new EdmEnumMember(colorType, "Blue", new EdmIntegerConstant(2)) ); var annotation = new EdmAnnotation(personType, outColorTerm, exp); annotation.SetSerializationLocation(model, EdmVocabularyAnnotationSerializationLocation.Inline); model.SetVocabularyAnnotation(annotation); ShowModel(model); var ann = model.FindVocabularyAnnotations<IEdmValueAnnotation>(personType, "TestNS.OutColor").First(); var memberExp = (IEdmEnumMemberExpression)ann.Value; foreach (var member in memberExp.EnumMembers) { Console.WriteLine(member.Name); } }
public void EvaluateEnumExpressionOfMultiValuesWithStringUnderlyingTypeShouldThrow() { var color = new EdmEnumType("Ns", "Color", EdmPrimitiveTypeKind.String, true); var blue = color.AddMember("Blue", new EdmStringConstant("1")); var white = color.AddMember("White", new EdmStringConstant("2")); var enumExpression = new EdmEnumMemberExpression(blue, white); EdmExpressionEvaluator evaluator = new EdmExpressionEvaluator(null); Action action = () => evaluator.Evaluate(enumExpression); action.ShouldThrow<InvalidOperationException>().WithMessage("Type Ns.Color cannot be assigned with multi-values."); }
public void EvaluateEnumExpressionOfMultiValuesWithoutFlagsShouldThrow() { var color = new EdmEnumType("Ns", "Color"); var blue = color.AddMember("Blue", new EdmIntegerConstant(1)); var white = color.AddMember("White", new EdmIntegerConstant(2)); var enumExpression = new EdmEnumMemberExpression(blue, white); EdmExpressionEvaluator evaluator = new EdmExpressionEvaluator(null); Action action = () => evaluator.Evaluate(enumExpression); action.ShouldThrow<InvalidOperationException>().WithMessage("Type Ns.Color cannot be assigned with multi-values."); }
public void EvaluateEnumExpressionOfMultiValues() { var color = new EdmEnumType("Ns", "Color", true); var blue = color.AddMember("Blue", new EdmIntegerConstant(1)); var white = color.AddMember("White", new EdmIntegerConstant(2)); var enumExpression = new EdmEnumMemberExpression(blue, white); EdmExpressionEvaluator evaluator = new EdmExpressionEvaluator(null); var value = evaluator.Evaluate(enumExpression) as IEdmEnumValue; value.Type.Definition.Should().Be(color); (value.Value as EdmIntegerConstant).Value.Should().Be(3); }
public void TestEnumMemberReferencingExtraEnumType() { const string csdl = @"<?xml version=""1.0"" encoding=""utf-8""?> <edmx:Edmx Version=""4.0"" xmlns:edmx=""http://docs.oasis-open.org/odata/ns/edmx""> <edmx:DataServices> <Schema Namespace=""TestNS"" xmlns=""http://docs.oasis-open.org/odata/ns/edm""> <EntityType Name=""Person""> <Key> <PropertyRef Name=""Id"" /> </Key> <Property Name=""Id"" Type=""Edm.Int32"" Nullable=""false"" /> <Property Name=""Name"" Type=""Edm.String"" /> <Annotation Term=""TestNS.OutColor""> <EnumMember>TestNS2.Color/Blue TestNS2.Color/Cyan</EnumMember> </Annotation> </EntityType> <Term Name=""OutColor"" Type=""TestNS2.Color"" /> </Schema> <Schema Namespace=""TestNS2"" xmlns=""http://docs.oasis-open.org/odata/ns/edm""> <EnumType Name=""Color"" IsFlags=""true""> <Member Name=""Cyan"" Value=""1"" /> <Member Name=""Blue"" Value=""2"" /> </EnumType> </Schema> </edmx:DataServices> </edmx:Edmx>"; IEdmModel model; IEnumerable<EdmError> errors; IEnumerable<EdmError> validationErrors; #region try build model var edmModel = new EdmModel(); var personType = new EdmEntityType("TestNS", "Person"); edmModel.AddElement(personType); var pid = personType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32, false); personType.AddKeys(pid); personType.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String); var colorType = new EdmEnumType("TestNS2", "Color", true); edmModel.AddElement(colorType); colorType.AddMember("Cyan", new EdmIntegerConstant(1)); colorType.AddMember("Blue", new EdmIntegerConstant(2)); var outColorTerm = new EdmTerm("TestNS", "OutColor", new EdmEnumTypeReference(colorType, true)); edmModel.AddElement(outColorTerm); var exp = new EdmEnumMemberExpression( new EdmEnumMember(colorType, "Blue", new EdmIntegerConstant(2)), new EdmEnumMember(colorType, "Cyan", new EdmIntegerConstant(1)) ); var annotation = new EdmAnnotation(personType, outColorTerm, exp); annotation.SetSerializationLocation(edmModel, EdmVocabularyAnnotationSerializationLocation.Inline); edmModel.SetVocabularyAnnotation(annotation); var stream = new MemoryStream(); Assert.IsFalse(edmModel.Validate(out errors)); using (var xw = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true })) { Assert.IsTrue(EdmxWriter.TryWriteEdmx(edmModel, xw, EdmxTarget.OData, out errors)); } stream.Seek(0, SeekOrigin.Begin); using (var sr = new StreamReader(stream)) { Assert.AreEqual(csdl, sr.ReadToEnd()); } #endregion Assert.IsTrue(EdmxReader.TryParse(XmlReader.Create(new StringReader(csdl)), out model, out errors), "parsed"); Assert.IsFalse(model.Validate(out validationErrors)); TestEnumMember(model); }