Construction
Validation
Testing

Construction will generate some state
Validation will ensure that everything is kosher
Tests use combinations of the above to check things

##### Example:
parent = gst_object_get_parent(object);

setup:
	create: new object
		action: object = gst_object_new();
		validation: object != NULL, object->parent == NULL, etc
		[cleanup: gst_object_destroy(object);]
	create: new parent
		action: parent = gst_object_new();
		validation: parent != NULL, parent->parent == NULL, etc
		[cleanup: gst_object_destroy(parent);]
	create: set object's parent
		precondition: object->parent == NULL
		action: gst_object_set_parent(object,parent);
		validation: object->parent = parent
preconditions:
	nothing
action:
	curparent = gst_element_get_parent(object);
validation:
	curparent == object->parent
	curparent == parent
cleanup:
	nothing


##### Resulting code:

///// setup
// new object
object = gst_object_new();
ASSERT(object != NULL);
ASSERT(object->parent == NULL);
// new object
parent = gst_object_new();
ASSERT(parent != NULL);
ASSERT(parent->parent == NULL);
// set object parent
ASSERT(object->parent == NULL);
gst_object_set_parent(object,parent);
ASSERT(object->parent != NULL);

///// preconditions

///// action
curparent = gst_element_get_parent(object);

///// validation
ASSERT(object->parent == parent);

///// cleanup
gst_object_destroy(parent);
gst_object_destroy(object);



##### XML descriptions

<construct name="new object">
  <variable>
    GstObject *object;
  </variabls>
  <action>
    object = gst_object_new();
  </action>
  <validation>
    <assert>
      object != NULL
    </assert>
    <assert>
      GST_IS_OBJECT(object)
    <assert>
      object->parent == NULL
    </assert>
  </validation>
  <cleanup>
    <validation>
      <assert>
        object != NULL
      </assert>
      <assert>
        GST_IS_OBJECT(object)
      </assert>
    </validation>
    <action>
      gst_object_destroy(object);
    </action>
  </cleanup>
</construct>

<construct name="set object parent">
  <variable>
    GstObject *object;
  </variable>
  <variable>
    GstObject *object;
  </variable>
  <precondition>
    <assert>
      object->parent == NULL
    </assert>
  </precondition>
  <action>
    gst_object_set_parent(object,parent);
  </action>
  <validation>
    <assert>
      object->parent == parent
    </assert>
  </validation>
</construct>

<test name="set object parent">
  <variable>
    GstObject *object;
  <variable>
  </variable>
    GstObject *parent;
  <variable>
  </variable>
    GstObject *curparent;
  </variable>
  <setup>
    object = gst_object_new();
    parent = gst_object_new();
    gst_object_set_parent(object,parent);
  </setup>
  <action>
    curparent = gst_element_get_parent(object);
  </action>
  <validation>
    curparent == object->parent
    curparent == parent
  </validation>
</test>
