L3 Core: Followup on TypeInfo.isDerivedFrom tests

Over the past few days, I've also added 48 tests for 
TypeInfo.isDerivedFrom.  I had commented that I thought that the spec 
was underdocumented, especially when dealing with derivation trees that 
involve multiple method of derivations.  Basically, the tests reflect 
the following algebra:

If

<simpleType name="b">
      <restriction base="a"/>
</simpleType>   (or equivalent complexType>

then:

b.isDerivedFrom(otherType, method) =
     ((method & METHOD_RESTRICTION != 0) && otherType == a) || 
a.isDerivedFrom(otherType, method)

If

<simpleType name="c">
      <union memberTypes="a b"/>
</simpleType>

Then:

c.isDerivedFrom(otherType, METHOD_RESTRICTION) =
      a.isDerivedFrom(otherType, METHOD_RESTRICTION) && 
b.isDerivedFrom(otherType, METHOD_RESTRICTION)

c.isDerivedFrom(otherType, METHOD_UNION) =
      otherType == a ||
      otherType == b ||
      a.isDerivedFrom(otherType, METHOD_RESTRICTION) ||
      b.isDerivedFrom(otherType, METHOD_RESTRICTION)

c.isDerivedFrom(otherType, METHOD_EXTENSION) =
      false

c.isDerivedFrom(otherType, METHOD_LIST)
      a.isDerivedFrom(otherType, METHOD_LIST) && 
b.isDerivedFrom(otherType, METHOD_LIST)



If

<simpleType name="b">
      <list base="a"/>
</simpleType>

b.isDerivedFrom(otherType, METHOD_RESTRICTION) =
     otherType == xsd:anySimpleType || otherType == xsd:anyType

b.isDerivedFrom(otherType, METHOD_UNION) =
      false

b.isDerivedFrom(otherType, METHOD_EXTENSION) =
      false

b.isDerivedFrom(otherType, METHOD_LIST)
      otherType == a ||
      a.isDerivedFrom(otherType, METHOD_RESTRICTION)



If

<complexType name="b">
      <extension base="a"/>
</complexType>

b.isDerivedFrom(otherType, METHOD_RESTRICTION) =
     otherType == xsd:anySimpleType || otherType == xsd:anyType

b.isDerivedFrom(otherType, METHOD_UNION) =
      false

b.isDerivedFrom(otherType, METHOD_EXTENSION) =
      otherType == a || a.isDerivedFrom(otherType, METHOD_EXTENSION)

b.isDerivedFrom(otherType, METHOD_LIST)
      false


For two non-zero integers, i and j

a.isDerivedFrom(otherType, i | j)
     a.isDerivedFrom(otherType, i) || a.isDerivedFrom(otherType, j)

This algebra should result in the following desirable features:

if a.isDerivedFrom(otherType, METHOD_RESTRICTION) then every member of 
the value set for a is also a member of the value set of otherType.

if a.isDerivedFrom(otherType, METHOD_LIST) then every member of the 
value set for a is a list of members of the value set of otherType.

if a.isDerivedFrom(otherType, METHOD_EXTENSION) then every element that 
is valid for type a is not missing any required content or attributes 
for otherType.

Received on Friday, 16 January 2004 02:48:31 UTC