<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
	<xs:annotation>
		<xs:documentation>
			Cobertura XML code coverage report: a translation of Cobertura's DTD 'coverage-04.dtd' to XML Schema.

			Elements, attributes, their order and which are required follow the DTD; no other attribute is allowed. Where the
			DTD's CDATA holds a number, the attribute has a numeric type: a rate in range 0..1, a count, a complexity.
			Cobertura publishes no XML Schema, only DTDs; 'Any-Cobertura.xsd' reads the format leniently, as tools write it.
		</xs:documentation>
	</xs:annotation>

	<xs:simpleType name="Rate">
		<xs:restriction base="xs:decimal">
			<xs:minInclusive value="0"/>
			<xs:maxInclusive value="1"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="ConditionCoverage">
		<xs:annotation>
			<xs:documentation>Percentage and count of taken branches, e.g. '50% (1/2)'.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="\d+(\.\d+)?%( \(\d+/\d+\))?"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:element name="coverage">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="sources" minOccurs="0">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="source" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="packages">
					<xs:complexType>
						<xs:sequence>
							<xs:element ref="package" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="line-rate"        type="Rate"                  use="required"/>
			<xs:attribute name="branch-rate"      type="Rate"                  use="required"/>
			<xs:attribute name="lines-covered"    type="xs:nonNegativeInteger" use="required"/>
			<xs:attribute name="lines-valid"      type="xs:nonNegativeInteger" use="required"/>
			<xs:attribute name="branches-covered" type="xs:nonNegativeInteger" use="required"/>
			<xs:attribute name="branches-valid"   type="xs:nonNegativeInteger" use="required"/>
			<xs:attribute name="complexity"       type="xs:decimal"            use="required"/>
			<xs:attribute name="version"          type="xs:string"             use="required"/>
			<xs:attribute name="timestamp"        type="xs:string"             use="required"/>
		</xs:complexType>
	</xs:element>

	<xs:element name="package">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="classes">
					<xs:complexType>
						<xs:sequence>
							<xs:element ref="class" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="name"        type="xs:string"  use="required"/>
			<xs:attribute name="line-rate"   type="Rate"       use="required"/>
			<xs:attribute name="branch-rate" type="Rate"       use="required"/>
			<xs:attribute name="complexity"  type="xs:decimal" use="required"/>
		</xs:complexType>
	</xs:element>

	<xs:element name="class">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="methods">
					<xs:complexType>
						<xs:sequence>
							<xs:element ref="method" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element ref="lines"/>
			</xs:sequence>
			<xs:attribute name="name"        type="xs:string"  use="required"/>
			<xs:attribute name="filename"    type="xs:string"  use="required"/>
			<xs:attribute name="line-rate"   type="Rate"       use="required"/>
			<xs:attribute name="branch-rate" type="Rate"       use="required"/>
			<xs:attribute name="complexity"  type="xs:decimal" use="required"/>
		</xs:complexType>
	</xs:element>

	<xs:element name="method">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="lines"/>
			</xs:sequence>
			<xs:attribute name="name"        type="xs:string" use="required"/>
			<xs:attribute name="signature"   type="xs:string" use="required"/>
			<xs:attribute name="line-rate"   type="Rate"      use="required"/>
			<xs:attribute name="branch-rate" type="Rate"      use="required"/>
		</xs:complexType>
	</xs:element>

	<xs:element name="lines">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="line" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<xs:element name="line">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="conditions" minOccurs="0" maxOccurs="unbounded">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="condition" minOccurs="0" maxOccurs="unbounded">
								<xs:complexType>
									<xs:attribute name="number"   type="xs:nonNegativeInteger" use="required"/>
									<xs:attribute name="type"     type="xs:string"             use="required"/>
									<xs:attribute name="coverage" type="xs:string"             use="required"/>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="number"             type="xs:positiveInteger"    use="required"/>
			<xs:attribute name="hits"               type="xs:nonNegativeInteger" use="required"/>
			<xs:attribute name="branch"             type="xs:boolean"            default="false"/>
			<xs:attribute name="condition-coverage" type="ConditionCoverage"     default="100%"/>
		</xs:complexType>
	</xs:element>
</xs:schema>
