/// <summary>
        /// Function to find if the operations collection has a foreign key
        /// </summary>
        /// <param name="operations"></param>
        /// <returns></returns>
        private static bool HasForeignKeyOperations(CdmOperationCollection operations)
        {
            List <CdmOperationBase> list = operations
                                           .Where <CdmOperationBase>(op => op.ObjectType == CdmObjectType.OperationReplaceAsForeignKeyDef).ToList();

            return(list.Count > 0);
        }
        /// <summary>
        /// When no explicit condition is provided, a projection will apply the default condition expression based on the operations
        /// This function defined the defaults for each operation and builds the projection's condition expression
        /// </summary>
        /// <param name="operations"></param>
        /// <param name="owner"></param>
        /// <returns></returns>
        internal static string GetDefaultConditionExpression(CdmOperationCollection operations, CdmObject owner = null)
        {
            StringBuilder bldr = new StringBuilder();

            // if the owner of the projection is an entity attribute
            if (owner?.ObjectType == CdmObjectType.EntityAttributeDef)
            {
                bldr.Append($" ( (!normalized) || (cardinality.maximum <= 1) ) ");
            }

            if (operations.Count > 0)
            {
                if (HasForeignKeyOperations(operations))
                {
                    bldr = AppendString(bldr, $" (referenceOnly || noMaxDepth || (depth > maxDepth)) ");
                }
                else if (HasNotStructuredOperations(operations))
                {
                    bldr = AppendString(bldr, $" (!structured) ");
                }
                else
                {
                    bldr = AppendString(bldr, $" (true) "); // do these always
                }
            }

            return((bldr.Length > 0) ? bldr.ToString() : null);
        }
        /// <summary>
        /// Function to find if the operations collection has an operation that is not resolved for structured directive
        /// </summary>
        /// <param name="operations"></param>
        /// <returns></returns>
        private static bool HasNotStructuredOperations(CdmOperationCollection operations)
        {
            List <CdmOperationBase> list = operations
                                           .Where <CdmOperationBase>(op => (
                                                                         op.ObjectType == CdmObjectType.OperationAddCountAttributeDef ||
                                                                         op.ObjectType == CdmObjectType.OperationAddTypeAttributeDef ||
                                                                         op.ObjectType == CdmObjectType.OperationRenameAttributesDef ||
                                                                         op.ObjectType == CdmObjectType.OperationArrayExpansionDef
                                                                         )).ToList();

            return(list.Count > 0);
        }
Beispiel #4
0
        public async Task TestProjectionUsingObjectModel()
        {
            CdmCorpusDefinition corpus = TestHelper.GetLocalCorpus(testsSubpath, "TestProjectionUsingObjectModel");

            corpus.Storage.Mount("local", new LocalAdapter(TestHelper.GetActualOutputFolderPath(testsSubpath, "TestProjectionUsingObjectModel")));
            CdmFolderDefinition   localRoot       = corpus.Storage.FetchRootFolder("local");
            CdmManifestDefinition manifestDefault = CreateDefaultManifest(corpus, localRoot);

            CdmEntityDefinition entityTestSource                    = CreateEntityTestSource(corpus, manifestDefault, localRoot);
            CdmEntityDefinition entityTestEntityProjection          = CreateEntityTestEntityProjection(corpus, manifestDefault, localRoot);
            CdmEntityDefinition entityTestEntityNestedProjection    = CreateEntityTestEntityNestedProjection(corpus, manifestDefault, localRoot);
            CdmEntityDefinition entityTestEntityAttributeProjection = CreateEntityTestEntityAttributeProjection(corpus, manifestDefault, localRoot);
            CdmEntityDefinition entityTestOperationCollection       = CreateEntityTestOperationCollection(corpus, manifestDefault, localRoot);

            // Save manifest and entities
            await manifestDefault.SaveAsAsync($"{manifestDefault.ManifestName}.manifest.cdm.json", saveReferenced : true);

            string        expected     = "TestSource";
            CdmObjectType expectedType = CdmObjectType.ProjectionDef;
            string        actual       = null;
            CdmObjectType actualType   = CdmObjectType.Error;

            // Try to read back the newly persisted manifest and projection based entities
            CdmManifestDefinition manifestReadBack = await corpus.FetchObjectAsync <CdmManifestDefinition>($"local:/{manifestDefault.ManifestName}.manifest.cdm.json");

            Assert.AreEqual(5, manifestReadBack.Entities.Count);
            Assert.AreEqual(entityTestSource.EntityName, manifestReadBack.Entities[0].EntityName);
            Assert.AreEqual(entityTestEntityProjection.EntityName, manifestReadBack.Entities[1].EntityName);
            Assert.AreEqual(entityTestEntityNestedProjection.EntityName, manifestReadBack.Entities[2].EntityName);
            Assert.AreEqual(entityTestEntityAttributeProjection.EntityName, manifestReadBack.Entities[3].EntityName);

            // Read back the newly persisted manifest and projection based entity TestEntityProjection and validate
            CdmEntityDefinition entityTestEntityProjectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestEntityProjection.EntityName}.cdm.json/{entityTestEntityProjection.EntityName}", manifestReadBack);

            Assert.IsNotNull(entityTestEntityProjectionReadBack);
            actual     = ((CdmEntityReference)((CdmProjection)entityTestEntityProjectionReadBack.ExtendsEntity.ExplicitReference).Source).NamedReference;
            actualType = ((CdmProjection)entityTestEntityProjectionReadBack.ExtendsEntity.ExplicitReference).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(expectedType, actualType);

            // Read back the newly persisted manifest and projection based entity TestEntityNestedProjection and validate
            CdmEntityDefinition entityTestEntityNestedProjectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestEntityNestedProjection.EntityName}.cdm.json/{entityTestEntityNestedProjection.EntityName}", manifestReadBack);

            Assert.IsNotNull(entityTestEntityNestedProjectionReadBack);
            actual     = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entityTestEntityNestedProjectionReadBack.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).Source.NamedReference;
            actualType = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entityTestEntityNestedProjectionReadBack.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(expectedType, actualType);

            // Read back the newly persisted manifest and projection based entity TestEntityAttributeProjection and validate
            CdmEntityDefinition entityTestEntityAttributeProjectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestEntityAttributeProjection.EntityName}.cdm.json/{entityTestEntityAttributeProjection.EntityName}", manifestReadBack);

            Assert.IsNotNull(entityTestEntityAttributeProjectionReadBack);
            actual     = ((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entityTestEntityAttributeProjectionReadBack.Attributes[0]).Entity).ExplicitReference).Source).NamedReference;
            actualType = ((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entityTestEntityAttributeProjectionReadBack.Attributes[0]).Entity).ExplicitReference).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(expectedType, actualType);

            // Read back operations collections and validate
            CdmEntityDefinition entityTestOperationCollectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestOperationCollection.EntityName}.cdm.json/{entityTestOperationCollection.EntityName}", manifestReadBack);

            Assert.IsNotNull(entityTestOperationCollectionReadBack);
            int actualOperationCount = ((CdmProjection)entityTestOperationCollectionReadBack.ExtendsEntity.ExplicitReference).Operations.Count;

            Assert.AreEqual(9, actualOperationCount);
            CdmOperationCollection operations = ((CdmProjection)entityTestOperationCollectionReadBack.ExtendsEntity.ExplicitReference).Operations;

            Assert.AreEqual(CdmOperationType.AddCountAttribute, operations[0].Type);
            Assert.AreEqual(CdmOperationType.AddSupportingAttribute, operations[1].Type);
            Assert.AreEqual(CdmOperationType.AddTypeAttribute, operations[2].Type);
            Assert.AreEqual(CdmOperationType.ExcludeAttributes, operations[3].Type);
            Assert.AreEqual(CdmOperationType.ArrayExpansion, operations[4].Type);
            Assert.AreEqual(CdmOperationType.CombineAttributes, operations[5].Type);
            Assert.AreEqual(CdmOperationType.RenameAttributes, operations[6].Type);
            Assert.AreEqual(CdmOperationType.ReplaceAsForeignKey, operations[7].Type);
            Assert.AreEqual(CdmOperationType.IncludeAttributes, operations[8].Type);
        }
        public async Task TestLoadProjection()
        {
            CdmCorpusDefinition corpus = TestHelper.GetLocalCorpus(testsSubpath, "TestLoadProjection");

            CdmManifestDefinition manifest = await corpus.FetchObjectAsync <CdmManifestDefinition>($"local:/default.manifest.cdm.json");

            string        expected   = "TestSource";
            string        actual     = null;
            CdmObjectType actualType = CdmObjectType.Error;

            #region TestEntityStringReference.cdm.json
            CdmEntityDefinition entTestEntityStringReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityStringReference.cdm.json/TestEntityStringReference", manifest);

            Assert.IsNotNull(entTestEntityStringReference);
            actual     = ((CdmEntityReference)entTestEntityStringReference.ExtendsEntity).NamedReference;
            actualType = ((CdmEntityReference)entTestEntityStringReference.ExtendsEntity).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.EntityRef, actualType);
            #endregion // TestEntityStringReference.cdm.json

            #region TestEntityEntityReference.cdm.json
            CdmEntityDefinition entTestEntityEntityReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityEntityReference.cdm.json/TestEntityEntityReference", manifest);

            Assert.IsNotNull(entTestEntityEntityReference);
            actual     = ((CdmEntityReference)entTestEntityEntityReference.ExtendsEntity).NamedReference;
            actualType = ((CdmEntityReference)entTestEntityEntityReference.ExtendsEntity).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.EntityRef, actualType);
            #endregion // TestEntityEntityReference.cdm.json

            #region TestEntityProjection.cdm.json
            CdmEntityDefinition entTestEntityProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityProjection.cdm.json/TestEntityProjection", manifest);

            Assert.IsNotNull(entTestEntityProjection);
            actual     = ((CdmEntityReference)((CdmProjection)entTestEntityProjection.ExtendsEntity.ExplicitReference).Source).NamedReference;
            actualType = ((CdmProjection)entTestEntityProjection.ExtendsEntity.ExplicitReference).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.ProjectionDef, actualType);
            #endregion // TestEntityProjection.cdm.json

            #region TestEntityNestedProjection.cdm.json
            CdmEntityDefinition entTestEntityNestedProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityNestedProjection.cdm.json/TestEntityNestedProjection", manifest);

            Assert.IsNotNull(entTestEntityNestedProjection);
            actual     = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entTestEntityNestedProjection.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).Source.NamedReference;
            actualType = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entTestEntityNestedProjection.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.ProjectionDef, actualType);
            #endregion // TestEntityNestedProjection.cdm.json

            #region TestEntityAttributeStringReference.cdm.json
            CdmEntityDefinition entTestEntityAttributeStringReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeStringReference.cdm.json/TestEntityAttributeStringReference", manifest);

            Assert.IsNotNull(entTestEntityAttributeStringReference);
            actual     = ((CdmEntityAttributeDefinition)entTestEntityAttributeStringReference.Attributes[0]).Entity.NamedReference;
            actualType = ((CdmEntityAttributeDefinition)entTestEntityAttributeStringReference.Attributes[0]).Entity.ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.EntityRef, actualType);
            #endregion // TestEntityAttributeStringReference.cdm.json

            #region TestEntityAttributeEntityReference.cdm.json
            CdmEntityDefinition entTestEntityAttributeEntityReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeEntityReference.cdm.json/TestEntityAttributeEntityReference", manifest);

            Assert.IsNotNull(entTestEntityAttributeEntityReference);
            actual     = ((CdmEntityAttributeDefinition)entTestEntityAttributeEntityReference.Attributes[0]).Entity.NamedReference;
            actualType = ((CdmEntityAttributeDefinition)entTestEntityAttributeEntityReference.Attributes[0]).Entity.ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.EntityRef, actualType);
            #endregion // TestEntityAttributeEntityReference.cdm.json

            #region TestEntityAttributeProjection.cdm.json
            CdmEntityDefinition entTestEntityAttributeProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeProjection.cdm.json/TestEntityAttributeProjection", manifest);

            Assert.IsNotNull(entTestEntityAttributeProjection);
            actual     = ((CdmProjection)((CdmEntityAttributeDefinition)entTestEntityAttributeProjection.Attributes[0]).Entity.ExplicitReference).Source.NamedReference;
            actualType = ((CdmEntityAttributeDefinition)entTestEntityAttributeProjection.Attributes[0]).Entity.ExplicitReference.ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.ProjectionDef, actualType);
            #endregion // TestEntityAttributeProjection.cdm.json

            #region TestEntityAttributeNestedProjection.cdm.json
            CdmEntityDefinition entTestEntityAttributeNestedProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeNestedProjection.cdm.json/TestEntityAttributeNestedProjection", manifest);

            Assert.IsNotNull(entTestEntityAttributeNestedProjection);
            actual     = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entTestEntityAttributeNestedProjection.Attributes[0]).Entity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).Source.NamedReference;
            actualType = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entTestEntityAttributeNestedProjection.Attributes[0]).Entity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).ObjectType;
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(CdmObjectType.ProjectionDef, actualType);
            #endregion // TestEntityAttributeNestedProjection.cdm.json

            #region TestOperationCollection.cdm.json
            CdmEntityDefinition entTestOperationCollection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestOperationCollection.cdm.json/TestOperationCollection", manifest);

            Assert.IsNotNull(entTestOperationCollection);
            int actualOperationCount = ((CdmProjection)entTestOperationCollection.ExtendsEntity.ExplicitReference).Operations.Count;
            Assert.AreEqual(9, actualOperationCount);
            CdmOperationCollection operations = ((CdmProjection)entTestOperationCollection.ExtendsEntity.ExplicitReference).Operations;
            Assert.AreEqual(CdmOperationType.AddCountAttribute, operations[0].Type);
            Assert.AreEqual(CdmOperationType.AddSupportingAttribute, operations[1].Type);
            Assert.AreEqual(CdmOperationType.AddTypeAttribute, operations[2].Type);
            Assert.AreEqual(CdmOperationType.ExcludeAttributes, operations[3].Type);
            Assert.AreEqual(CdmOperationType.ArrayExpansion, operations[4].Type);
            Assert.AreEqual(CdmOperationType.CombineAttributes, operations[5].Type);
            Assert.AreEqual(CdmOperationType.RenameAttributes, operations[6].Type);
            Assert.AreEqual(CdmOperationType.ReplaceAsForeignKey, operations[7].Type);
            Assert.AreEqual(CdmOperationType.IncludeAttributes, operations[8].Type);
            #endregion // TestOperationCollection.cdm.json

            #region TestEntityTrait.cdm.json
            CdmEntityDefinition entTestEntityTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityTrait.cdm.json/TestEntityTrait", manifest);

            Assert.IsNotNull(entTestEntityTrait);
            Assert.AreEqual("TestAttribute", ((CdmTypeAttributeDefinition)entTestEntityTrait.Attributes[0]).Name);
            Assert.AreEqual("testDataType", ((CdmTypeAttributeDefinition)entTestEntityTrait.Attributes[0]).DataType.NamedReference);
            #endregion // TestEntityTrait.cdm.json

            #region TestEntityExtendsTrait.cdm.json
            CdmEntityDefinition entTestEntityExtendsTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityExtendsTrait.cdm.json/TestEntityExtendsTrait", manifest);

            Assert.IsNotNull(entTestEntityExtendsTrait);
            Assert.AreEqual("TestExtendsTraitAttribute", ((CdmTypeAttributeDefinition)entTestEntityExtendsTrait.Attributes[0]).Name);
            Assert.AreEqual("testDerivedDataType", ((CdmTypeAttributeDefinition)entTestEntityExtendsTrait.Attributes[0]).DataType.NamedReference);
            #endregion // TestEntityExtendsTrait.cdm.json

            #region TestProjectionTrait.cdm.json
            CdmEntityDefinition entTestProjectionTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestProjectionTrait.cdm.json/TestProjectionTrait", manifest);

            Assert.IsNotNull(entTestProjectionTrait);
            Assert.AreEqual("TestProjectionAttribute", ((CdmTypeAttributeDefinition)entTestProjectionTrait.Attributes[0]).Name);
            Assert.AreEqual("testDataType", ((CdmTypeAttributeDefinition)entTestProjectionTrait.Attributes[0]).DataType.NamedReference);
            #endregion // TestProjectionTrait.cdm.json

            #region TestProjectionExtendsTrait.cdm.json
            CdmEntityDefinition entTestProjectionExtendsTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestProjectionExtendsTrait.cdm.json/TestProjectionExtendsTrait", manifest);

            Assert.IsNotNull(entTestProjectionExtendsTrait);
            Assert.AreEqual("TestProjectionAttributeB", ((CdmTypeAttributeDefinition)entTestProjectionExtendsTrait.Attributes[0]).Name);
            Assert.AreEqual("testExtendsDataTypeB", ((CdmTypeAttributeDefinition)entTestProjectionExtendsTrait.Attributes[0]).DataType.NamedReference);
            #endregion // TestProjectionExtendsTrait.cdm.json
        }
Beispiel #6
0
        public void TestGetDefaultConditionExpression()
        {
            CdmCorpusDefinition corpus = TestHelper.GetLocalCorpus(testsSubpath, "TestGetDefaultConditionExpression");

            corpus.Storage.Mount("local", new LocalAdapter(TestHelper.GetActualOutputFolderPath(testsSubpath, "TestGetDefaultConditionExpression")));
            CdmFolderDefinition   localRoot       = corpus.Storage.FetchRootFolder("local");
            CdmManifestDefinition manifestDefault = CreateDefaultManifest(corpus, localRoot);

            CdmEntityDefinition entityTestSource = CreateEntityTestSource(corpus, manifestDefault, localRoot);

            // projection for a non entity attribute
            CdmOperationCollection opColl = new CdmOperationCollection(corpus.Ctx, entityTestSource);
            {
                // add 1st FK
                opColl.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx));
                Assert.AreEqual($" (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource));

                // add 2nd FK
                opColl.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx));
                Assert.AreEqual($" (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource));

                opColl.Clear();

                // add AddCount
                opColl.Add(new CdmOperationAddCountAttribute(corpus.Ctx));
                Assert.AreEqual($" (!structured) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource));

                // add ArrayExpansion
                opColl.Add(new CdmOperationArrayExpansion(corpus.Ctx));
                Assert.AreEqual($" (!structured) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource));

                opColl.Clear();

                // add AddSupporting
                opColl.Add(new CdmOperationAddSupportingAttribute(corpus.Ctx));
                Assert.AreEqual($" (true) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource));
            }

            CdmEntityAttributeDefinition entityTestEntityAttribute = corpus.MakeObject <CdmEntityAttributeDefinition>(CdmObjectType.EntityAttributeDef, nameOrRef: "TestEntityAttribute", simpleNameRef: false);

            // projection for a non entity attribute
            CdmOperationCollection opCollEA = new CdmOperationCollection(corpus.Ctx, entityTestEntityAttribute);
            {
                // add 1st FK
                opCollEA.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx));
                Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) )  &&  (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute));

                // add 2nd FK
                opCollEA.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx));
                Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) )  &&  (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute));

                opCollEA.Clear();

                // add AddCount
                opCollEA.Add(new CdmOperationAddCountAttribute(corpus.Ctx));
                Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) )  &&  (!structured) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute));

                // add ArrayExpansion
                opCollEA.Add(new CdmOperationArrayExpansion(corpus.Ctx));
                Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) )  &&  (!structured) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute));

                opCollEA.Clear();

                // add AddSupporting
                opCollEA.Add(new CdmOperationAddSupportingAttribute(corpus.Ctx));
                Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) )  &&  (true) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute));
            }
        }