def test_iter_collapsed_content_with_repeated_elements(self): schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type"> <xs:sequence> <xs:element name="B1" minOccurs="0" /> <xs:element name="B2" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="B3" maxOccurs="unbounded" /> <xs:element name="B4" /> <xs:element name="B5" maxOccurs="unbounded" /> <xs:element name="B6" minOccurs="0" /> <xs:element name="B7" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> """) model = ModelVisitor(schema.types['A_type'].content_type) content = [('B3', 10), ('B4', None), ('B5', True), ('B5', False), ('B6', 'alpha'), ('B7', 20)] self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B3', 10), ('B3', 11), ('B3', 12), ('B4', None), ('B5', True), ('B5', False), ('B6', 'alpha'), ('B7', 20), ('B7', 30)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B3', 10), ('B3', 11), ('B3', 12), ('B4', None), ('B5', True), ('B5', False)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content)
def test_iter_collapsed_content_with_optional_elements(self): schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type"> <xs:sequence> <xs:element name="B1" minOccurs="0" /> <xs:element name="B2" minOccurs="0" /> <xs:element name="B3" /> <xs:element name="B4" /> <xs:element name="B5" /> <xs:element name="B6" minOccurs="0" /> <xs:element name="B7" /> </xs:sequence> </xs:complexType> """) model = ModelVisitor(schema.types['A_type'].content) content = [('B3', 10), ('B4', None), ('B5', True), ('B6', 'alpha'), ('B7', 20)] model.restart() self.assertListEqual( list(model.iter_collapsed_content(content)), content ) content = [('B3', 10), ('B5', True), ('B6', 'alpha'), ('B7', 20)] # Missing B4 model.restart() self.assertListEqual( list(model.iter_collapsed_content(content)), content )
def test_meta_schema_top_model(self): """ <xs:group name="schemaTop"> <xs:choice> <xs:group ref="xs:redefinable"/> <xs:element ref="xs:element"/> <xs:element ref="xs:attribute"/> <xs:element ref="xs:notation"/> </xs:choice> </xs:group> <xs:group name="redefinable"> <xs:choice> <xs:element ref="xs:simpleType"/> <xs:element ref="xs:complexType"/> <xs:element ref="xs:group"/> <xs:element ref="xs:attributeGroup"/> </xs:choice> </xs:group> """ group = self.schema_class.meta_schema.groups['schemaTop'] model = ModelVisitor(group) self.assertEqual(model.element, group[0][0][0]) self.check_advance_false(model) # <simpleType> doesn't match self.assertEqual(model.element, group[0][0][1]) self.check_advance_true(model) # <complexType> matches self.assertIsNone(model.element) model.restart() self.assertEqual(model.element, group[0][0][0]) self.check_advance_false(model) # <simpleType> doesn't match self.assertEqual(model.element, group[0][0][1]) self.check_advance_false(model) # <complexType> doesn't match self.assertEqual(model.element, group[0][0][2]) self.check_advance_false(model) # <group> doesn't match self.assertEqual(model.element, group[0][0][3]) self.check_advance_false(model) # <attributeGroup> doesn't match self.assertEqual(model.element, group[1]) self.check_advance_false(model) # <element> doesn't match self.assertEqual(model.element, group[2]) self.check_advance_false(model) # <attribute> doesn't match self.assertEqual(model.element, group[3]) self.check_advance_false( model, [(group, 0, group[0][0][:] + group[1:])]) # <notation> doesn't match model.restart() self.assertEqual(model.element, group[0][0][0]) self.check_advance_false(model) # <simpleType> doesn't match self.assertEqual(model.element, group[0][0][1]) self.check_advance_false(model) # <complexType> doesn't match self.assertEqual(model.element, group[0][0][2]) self.check_advance_false(model) # <group> doesn't match self.assertEqual(model.element, group[0][0][3]) self.check_advance_false(model) # <attributeGroup> doesn't match self.assertEqual(model.element, group[1]) self.check_advance_false(model) # <element> doesn't match self.assertEqual(model.element, group[2]) self.check_advance_true(model) # <attribute> doesn't match self.assertIsNone(model.element)
def test_model_group1(self): group = self.models_schema.groups['group1'] model = ModelVisitor(group) self.assertEqual(model.element, group[0]) self.check_stop(model) model.restart() self.assertEqual(model.element, group[0]) for _ in range(3): self.check_advance_false(model) self.assertIsNone(model.element) model.restart() for match in [False, True, False]: self.check_advance(model, match) self.assertIsNone(model.element)
def test_iter_collapsed_content_with_repeated_groups(self): schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type"> <xs:sequence minOccurs="1" maxOccurs="2"> <xs:element name="B1" minOccurs="0" /> <xs:element name="B2" minOccurs="0" /> </xs:sequence> </xs:complexType> """) model = ModelVisitor(schema.types['A_type'].content) content = [('B1', 1), ('B1', 2), ('B2', 3), ('B2', 4)] self.assertListEqual( list(model.iter_collapsed_content(content)), [('B1', 1), ('B2', 3), ('B1', 2), ('B2', 4)] ) # Model broken by unknown element at start content = [('X', None), ('B1', 1), ('B1', 2), ('B2', 3), ('B2', 4)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B1', 1), ('X', None), ('B1', 2), ('B2', 3), ('B2', 4)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B1', 1), ('B1', 2), ('X', None), ('B2', 3), ('B2', 4)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B1', 1), ('B1', 2), ('B2', 3), ('X', None), ('B2', 4)] model.restart() self.assertListEqual( list(model.iter_collapsed_content(content)), [('B1', 1), ('B2', 3), ('B1', 2), ('X', None), ('B2', 4)] ) content = [('B1', 1), ('B1', 2), ('B2', 3), ('B2', 4), ('X', None)] model.restart() self.assertListEqual( list(model.iter_collapsed_content(content)), [('B1', 1), ('B2', 3), ('B1', 2), ('B2', 4), ('X', None)] )
def test_complex_type_model(self): """ <xs:group name="complexTypeModel"> <xs:choice> <xs:element ref="xs:simpleContent"/> <xs:element ref="xs:complexContent"/> <xs:sequence> <xs:group ref="xs:typeDefParticle" minOccurs="0"/> <xs:group ref="xs:attrDecls"/> </xs:sequence> </xs:choice> </xs:group> <xs:group name="typeDefParticle"> <xs:choice> <xs:element name="group" type="xs:groupRef"/> <xs:element ref="xs:all"/> <xs:element ref="xs:choice"/> <xs:element ref="xs:sequence"/> </xs:choice> </xs:group> """ group = self.schema_class.meta_schema.groups['complexTypeModel'] model = ModelVisitor(group) self.assertEqual(model.element, group[0]) self.check_advance_true(model) # <simpleContent> match self.assertIsNone(model.element) model.restart() self.assertEqual(model.element, group[0]) self.check_advance_false(model) self.check_advance_true(model) # <complexContent> match self.assertIsNone(model.element) model.restart() self.assertEqual(model.element, group[0]) for match in [False, False, False, False, True]: self.check_advance(model, match) # <all> match self.check_stop(model) self.assertIsNone(model.element) model.restart() self.assertEqual(model.element, group[0]) for match in [ False, False, False, False, True, False, True, False, False, False ]: self.check_advance(model, match) # <all> match, <attributeGroup> match self.assertIsNone(model.element)
def test_iter_collapsed_content_with_single_elements(self): schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type"> <xs:sequence> <xs:element name="B1" /> <xs:element name="B2" /> <xs:element name="B3" /> </xs:sequence> </xs:complexType> """) model = ModelVisitor(schema.types['A_type'].content_type) content = [('B1', 'abc'), ('B2', 10), ('B3', False)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B3', False), ('B1', 'abc'), ('B2', 10)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B1', 'abc'), ('B3', False), ('B2', 10)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('B1', 'abc'), ('B1', 'def'), ('B2', 10), ('B3', False)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), [('B1', 'abc'), ('B2', 10), ('B3', False), ('B1', 'def')]) content = [('B1', 'abc'), ('B2', 10), ('X', None)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content) content = [('X', None), ('B1', 'abc'), ('B2', 10), ('B3', False)] model.restart() self.assertListEqual(list(model.iter_collapsed_content(content)), content)