This looks great to me, thanks for working on this! I have just a couple of 
comments but nothing serious.

Diff comments:

> diff --git a/definitions/basic_installation.xml 
> b/definitions/basic_installation.xml
> new file mode 100644
> index 0000000..413dd32
> --- /dev/null
> +++ b/definitions/basic_installation.xml
> @@ -0,0 +1,129 @@
> +<ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +  <ut:template>
> +    <p><em>Proceed in your native language if you wish. Instructions
> +      will remain in English.</em></p>
> +    <dl>
> +      <ut:tests />
> +    </dl>
> +    <p>If <strong>all</strong> actions produce the expected results listed,
> +      please <a href="results#add_result">submit</a> a 'passed' result.</p>
> +    <p>If <strong>any</strong> action fails, or produces an unexpected 
> result,
> +      please <a href="results#add_result">submit</a> a 'failed' result and <a
> +      href="../../buginstructions">file a bug</a>. Please be sure to include
> +      the bug number when you <a href="results#add_result">submit</a> your
> +      result.</p>
> +  </ut:template>
> +
> +  <ut:test id="start">
> +    <dt>Boot up the image</dt>
> +        <dd>The system boots properly and loads the installer displaying the 
> Welcome dialog with language selection and 'Try FAMILY' and 'Install FAMILY' 
> buttons</dd>
> +    <dt>Click on the release notes hyperlink to confirm that a browser 
> launches and you are taken to the release notes web page.</dt>
> +    <dt>Click on the Install FAMILY button</dt>
> +        <dd>The 'Keyboard Layout' screen appears</dd>
> +        <dd>The proposed keyboard corresponds with your keyboard</dd>
> +    <dt>Select your keyboard layout and click on continue</dt>
> +        <dd>The 'Updates and other software' screen is displayed</dd>
> +    <dt>On the screen 'Updates and other software', note the availability of 
> the following components</dt>
> +        <dd>Available options should represent the state of your system 
> accurately</dd>
> +        <dd>
> +            <ul>
> +                <li>(If network is available) Download updates while 
> installing FAMILY</li>
> +                <li>(If on a 'laptop') Is plugged to a power source</li>
> +                <li>Install third-party software ... option available</li>
> +            </ul>
> +        </dd>
> +    <dt>Click on the continue button</dt>
> +        <dd>The 'Installation type' screen is displayed</dd>
> +  </ut:test>
> +
> +  <ut:test id="entire-disk">
> +    <dt>Select Erase disk and install FAMILY</dt>
> +        <dd>Installation screen expands to include encryption and LVM 
> options</dd>
> +    <dt>Click on the continue button (if there is only one hard disk in the 
> system, the button should read 'Install now')</dt>
> +        <dd>Write changes dialogue appears</dd>
> +    <dt>Click continue</dt>
> +        <dd>If there is only one hard disk, the installer skips to the 
> "Where are you?' screen. Otherwise, the 'Installation type' screen is 
> displayed</dd>
> +    <dt>If there is only one hard disk, skip to step 12 (On the 'Where are 
> you?' screen...). Otherwise, on the 'Installation type' page, select a drive 
> in the 'Select drive' list.</dt>
> +        <dd>Verify that the selected drive corresponds to the drive on the 
> chart</dd>
> +    <dt>Verify that the full drive space is allocated</dt>
> +        <dd>Full drive space is allocated for installation</dd>
> +    <dt>Click on the Install Now button</dt>
> +        <dd>The 'Where are you?' screen is displayed</dd>
> +  </ut:test>
> +
> +  <ut:test id="auto-resize">
> +    <dt>Select Install FAMILY XX.XX alongside SYSTEM YY </dt>
> +        <dd>(SYSTEM YY is the name of the system already installed on disk 
> (FAMILY 12.04, Windows 7, ...)</dd>
> +    <dt>Click on Continue</dt>
> +        <dd>The Screen Install FAMILY XX.XX alongside SYSTEM YY appears</dd>
> +    <dt>Note the drive selected on the Select drive list and the bar 
> state</dt>
> +    <strong>If the target drive has a free partition with sufficient 
> freespace, install will proceed without further partitioning 
> intervention</strong>
> +        <dd> The drive corresponds to the drive on the chart (e.g /dev/sda) 
> and the bar is divided</dd>

There's a leading space in this line.

> +    <dt>Move the greyslider bar that separates the blue sections as 
> appropriate</dt>
> +        <dd>The slider bar can be set as appropriate</dd>
> +    <dt>Click on the Install Now button</dt>
> +    <dt> A dialog will appear  asking if you want to write the changes to 
> disk. Select Continue.</dt>

There's a leading space in this line too.

> +        <dd>The 'Where are you?' screen is displayed</dd>
> +  </ut:test>
> +
> +  <ut:test id="manual-partitions">
> +    <dt>Select Something Else</dt>
> +        <dd>A screen showing the current hard disks and partition layouts is 
> displayed</dd>
> +    <dt>Select the drive you wish to partition and use the Add '+', Change 
> 'Change...', and Delete '-' buttons to create your desired scheme</dt>
> +        <dd>The screen updates showing your desired partitions and mount 
> points</dd>
> +    <dt>Once you have your required partitioning scheme laid out, click on 
> the Install Now button</dt>
> +        <dd>The 'Where are you?' screen is displayed</dd>
> +  </ut:test>
> +
> +  <ut:test id="finish">
> +    <dt>If your system is connected to the network, note the preselected 
> timezone correspond with your timezone and the city indicated in the text box 
> </dt>
> +        <dd>The timezone and city displayed match your timezone and the main 
> city from your area</dd>
> +    <dt>Select your timezone, and click on the continue button</dt>
> +        <dd>The 'Who are you?' screen appears</dd>
> +    <dt>Input your initial user details and password <em>admin can not be 
> used - it is a dedicated Linux User</em></dt>
> +        <dd>Name, username and password are accepted. Automatic login option 
> is shown</dd>
> +        <dd>Continue button becomes available</dd>
> +    <dt>Press continue</dt>
> +        <dd>The 'Welcome to FAMILY ' slide is displayed</dd>
> +        <dd>The slideshow is entirely in your language</dd> 
> +    <dt>Wait for the installer to finish</dt>
> +        <dd>An 'Installation Complete' dialog appears</dd>
> +    <dt>Click the Restart now button</dt>
> +        <dd>GUI is shut down, a prompt to remove media and press Enter 
> appears</dd>
> +    <dt>Remove the disc and press enter</dt>
> +        <dd>The machine is rebooted</dd>
> +  </ut:test>
> +
> +  <ut:test id="reboot-ubuntu">
> +    <dt>Allow the machine to reboot</dt>
> +        <dd>The system boots properly and loads into FAMILY showing username 
> selected</dd>
> +  </ut:test>
> +
> +  <ut:test id="reboot-other">
> +    <dt>Allow the machine to reboot, select the first option at the grub 
> menu</dt>
> +        <dd>Your new installation boots</dd>
> +    <dt>Reboot machine, select the previous installed system</dt>
> +    <dd>Previously installed system boots and operates as expected</dd>
> +  </ut:test>
> +
> +  <ut:case id="1300_Install (entire disk)">
> +    <ut:include ref="start" />
> +    <ut:include ref="entire-disk" />
> +    <ut:include ref="finish" />
> +    <ut:include ref="reboot-ubuntu" />
> +  </ut:case>
> +
> +  <ut:case id="1301_Install (auto-resize)">
> +    <ut:include ref="start" />
> +    <ut:include ref="auto-resize" />
> +    <ut:include ref="finish" />
> +    <ut:include ref="reboot-other" />
> +  </ut:case>
> +
> +  <ut:case id="1302_Install (manual partitioning)">
> +    <ut:include ref="start" />
> +    <ut:include ref="manual-partitions" />
> +    <ut:include ref="finish" />
> +    <ut:include ref="reboot-ubuntu" />
> +  </ut:case>
> +</ut:configuration>
> diff --git a/definitions/non_english_installation.xml 
> b/definitions/non_english_installation.xml
> new file mode 100644
> index 0000000..10bf164
> --- /dev/null
> +++ b/definitions/non_english_installation.xml
> @@ -0,0 +1,142 @@
> +<?xml version="1.0" encoding="utf-8" ?>
> +
> +<!-- See TEMPLATE.xml for an explanation of this file layout -->
> +
> +<ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +  <ut:template>
> +    <p>The goal of this test case is to check that localization support is
> +      functional during the installation, <ut:var name="preamble" /></p>
> +    <dl>
> +      <ut:tests />
> +    </dl>
> +    <p>If <strong>all</strong> actions produce the expected results listed,
> +      please <a href="results#add_result">submit</a> a 'passed' result.</p>
> +    <p>If <strong>any</strong> action fails, or produces an unexpected 
> result,
> +      please <a href="results#add_result">submit</a> a 'failed' result and <a
> +      href="../../buginstructions">file a bug</a>. Please be sure to include
> +      the bug number when you <a href="results#add_result">submit</a> your
> +      result.</p>
> +  </ut:template>
> +
> +  <ut:test id="start">
> +    <dt>Boot up the image. When you see the aubergine screen with an icon at 
> the bottom, press any key to get the menu</dt>
> +        <dd>Language list will appear</dd>
> +    <dt>Use arrow keys to select language and press Enter</dt>
> +        <dd>Language list will close.</dd>
> +        <dd>The installer is localized from this screen onwards</dd>
> +    <dt>Boot up the iso using a CD/DVD or USB Key to a Live Session</dt>

We might as well remove "CD/" since all the ISOs are too big for a CD.

> +        <dd>The system boots properly and loads the installer displaying 
> Welcome dialog with language selection and 'Try FAMILY' and 'Install FAMILY' 
> buttons</dd>
> +    <dt>Click on the Install FAMILY icon</dt>
> +        <dd>The 'Keyboard Layout' screen appears</dd>
> +        <dd>The proposed keyboard corresponds with your keyboard</dd>
> +    <dt>Select your keyboard layout and click on continue</dt>
> +        <dd>The 'Preparing to install FAMILY' screen is displayed</dd>
> +    <dt>On the screen Preparing to install FAMILY, note the availability of 
> the following components</dt>
> +        <dd>Available options should represent the state of your system 
> accurately</dd>
> +        <dd>
> +            <ul>
> +                <li>(If network is available) Download updates while 
> installing FAMILY</li>
> +                <li>(If on a 'laptop') Is plugged to a power source</li>
> +                <li>Install third-party software ... option available</li>
> +            </ul>
> +        </dd>
> +    <dt>Click on the continue button</dt>
> +        <dd>The 'Installation type' screen is displayed</dd>
> +    <dt>Note the state of the 'Erase disk and install FAMILY' radio 
> button</dt>
> +        <dd>The 'Erase disk and install FAMILY' radio button is selected</dd>
> +    <dt>Click on the continue button (if there is only one hard disk in the 
> system, the button should read 'Install now')</dt>
> +        <dd>If there is only one hard disk, the installer skips to the 
> "Where are you?' screen. Otherwise, the 'Installation type' screen is 
> displayed</dd>
> +    <dt>If there is only one hard disk, skip two steps to selecting the 
> timezone (On the 'Where are you?' screen...). Otherwise, on the 'Installation 
> type' screen verify that the drive selected on the Select drive list 
> corresponds to the drive on the chart (e.g /dev/sda)</dt>
> +        <dd>Selected drive is displayed on the chart</dd>
> +    <dt>Verify that the full drive space is allocated</dt>
> +        <dd>Full drive space is allocated for installation</dd>
> +    <dt>Click on Install Now button</dt>
> +        <dd>The 'Where are you?' screen is displayed</dd>
> +  </ut:test>
> +
> +  <ut:test id="auto-timezone">
> +    <dt>If your system is connected to the network, note the preselected 
> timezone correspond with your timezone and the city indicated in the text box 
> </dt>
> +        <dd>The timezone and city displayed match your timezone and a city 
> from your area</dd>
> +  </ut:test>
> +
> +  <ut:test id="user-setup">
> +    <dt>Select your timezone, and click on the continue button</dt>
> +        <dd>The 'Who are you?' screen appears</dd>
> +    <dt>Input your initial user details and password (Note admin can not be 
> used - it is a dedicated Linux User)</dt>
> +        <dd>Name, username and password are accepted. Additionally, the 
> continue button is enabled</dd>
> +    <dt>Click on the continue button</dt>
> +        <dd>The 'Welcome to FAMILY ' slide is displayed</dd>
> +        <dd>The installer's slideshow slides are completely localized</dd>
> +  </ut:test>
> +
> +  <ut:test id="disconnect-net">
> +    <dt>When the installer is installing the language packs, disconnect the 
> Internet</dt>
> +  </ut:test>
> +
> +  <ut:test id="locale-net">
> +    <dt>Verify that your system is localized</dt>
> +        <dd>For any language, the system has to be fully localized. Note: 
> the translation coverage of some languages might not be complete</dd>
> +        <dd>The calendar shows the regional settings correctly</dd>
> +  </ut:test>
> +
> +  <ut:test id="locale-no-net">
> +    <dt>Verify that your system is localized</dt>
> +        <dd>If you aren't using Bengali (bn), German (de), English (en), 
> Spanish (es), French(fr), Portuguese (pt) or Xhosa (xh) a pop up appears 
> showing saying your language support is not complete</dd>
> +        <dd>For any language, the system has to be fully localized. Note: 
> the translation coverage of some languages might not be complete</dd>
> +        <dd>If you are using one of the above languages the calendar shows 
> the regional settings correctly</dd>
> +  </ut:test>
> +
> +  <ut:test id="finish">
> +    <dt>Wait for the installer to finish</dt>
> +        <dd>An 'Installation Complete' dialog appears</dd>
> +    <dt>Click the Restart now button</dt>
> +        <dd>GUI is shut down, a prompt to remove media and press Enter 
> appears</dd>
> +    <dt>Remove the disc and press enter</dt>
> +        <dd>The machine has been rebooted</dd>
> +    <dt>Allow the machine to reboot</dt>
> +        <dd>The system boots properly and loads into FAMILY</dd>
> +  </ut:test>
> +
> +  <ut:case id="1311_Non-English Installation Full Network Support">
> +    <ut:define name="preamble">
> +      and that language packs are downloaded and installed correctly
> +      from the Internet.
> +    </ut:define>
> +
> +    <ut:include ref="start" />
> +    <ut:include ref="auto-timezone" />
> +    <ut:include ref="user-setup" />
> +    <ut:include ref="locale-net" />
> +    <ut:include ref="finish"/>
> +  </ut:case>
> +
> +  <ut:case id="1312_Non-English Installation No Network">
> +    <ut:define name="preamble">
> +      and that language packs are installed correctly for those languages
> +      in the ISO, and that an informational message is shown prompting
> +      users to connect to the Internet to fully install language support
> +      for those languages not included.
> +    </ut:define>
> +
> +    <ut:include ref="start" />
> +    <ut:include ref="user-setup" />
> +    <ut:include ref="locale-no-net" />
> +    <ut:include ref="finish"/>
> +  </ut:case>
> +
> +  <ut:case id="1313_Installation Broken Internet">
> +    <ut:define name="preamble">
> +      and that language packs are installed correctly for those languages
> +      in the ISO. During the lang-packs installation, Internet breaks, and 
> the
> +      installer handles it gracefully. After the installation is complete and
> +      the new system rebooted an informational message is shown prompting 
> users
> +      to connect to the Internet to fully install language support.
> +    </ut:define>
> +
> +    <ut:include ref="start" />
> +    <ut:include ref="disconnect-net" />
> +    <ut:include ref="user-setup" />
> +    <ut:include ref="locale-no-net" />
> +    <ut:include ref="finish"/>
> +  </ut:case>
> +</ut:configuration>
> diff --git a/tools/test_case_gen b/tools/test_case_gen
> index 4309c11..39ead82 100755
> --- a/tools/test_case_gen
> +++ b/tools/test_case_gen
> @@ -269,5 +345,341 @@ class TestConfiguration:
>              raise ValueError(f'<ut:define name={var_name!r}> not found')
>  
>  
> +def _test_main():
> +    import doctest
> +    os.environ.pop('TEST', None) # Don't run the test-suite recursively!
> +    failures, total = doctest.testmod()
> +    return bool(failures)
> +
> +# Some extra doctests to bump coverage
> +
> +__test__ = {
> +    'substitute-prior-append': """
> +    The positioning of the substitution placeholder shouldn't matter; it can
> +    be the first child, or a later child::
> +
> +        >>> from xml.etree import ElementTree as et
> +        >>> xml = et.fromstring('<p>This <em>is</em> a <color /> fruit</p>')
> +        >>> color = et.fromstring('<color>blue</color>')
> +        >>> print(et.tostring(substitute(xml, './color', color)))
> +        b'<p>This <em>is</em> a blue fruit</p>'
> +        >>> xml = et.fromstring('<p>This <em>was</em><color /> fruit</p>')
> +        >>> color = et.fromstring('<color> yellow</color>')

For blue you don't have a space in the color but in yellow you do. Could this 
be consistent one way or the other?

> +        >>> print(et.tostring(substitute(xml, './color', color)))
> +        b'<p>This <em>was</em> yellow fruit</p>'
> +    """,
> +
> +    'substitute-empty-cases': """
> +    The substitution must succeed even if the text/tail properties of the
> +    parent/prior elements are :data:`None`::
> +
> +        >>> from xml.etree import ElementTree as et
> +        >>> xml = et.fromstring('<p><content />?</p>')
> +        >>> content = et.fromstring('<content></content>')
> +        >>> print(et.tostring(substitute(xml, './content', content)))
> +        b'<p>?</p>'
> +        >>> xml = et.fromstring('<p><content />?</p>')
> +        >>> content = et.fromstring('<content>foo bar baz<br /></content>')
> +        >>> print(et.tostring(substitute(xml, './content', content)))
> +        b'<p>foo bar baz<br />?</p>'
> +    """,
> +
> +    'config-bad-root': """
> +    The document passed to TestConfiguration must have <ut:configuration> as
> +    its root element::
> +
> +        >>> from xml.etree import ElementTree as et
> +        >>> doc = et.fromstring("<a />")
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 258, in __init__
> +            raise ValueError(
> +        ValueError: Expected to find <ut:configuration> as the root element
> +
> +    And must have <ut:template> under <ut:configuration>::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <foo />
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 262, in __init__
> +            raise ValueError(
> +        ValueError: Expected to find <ut:template> under the 
> <ut:configuration> element
> +
> +    Which must have <ut:tests> somewhere (indirectly) underneath it::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template>Some content, but no tests!</ut:template>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 266, in __init__
> +            raise ValueError(
> +        ValueError: <ut:template> must include <ut:tests> somewhere within it
> +
> +    There must also be <ut:test> elements::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 277, in __init__
> +            raise ValueError(
> +        ValueError: Expected to find at least one <ut:test> under the 
> <ut:configuration> element
> +
> +    Which must have "id" attributes::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test></ut:test>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 274, in __init__
> +            raise ValueError(
> +        ValueError: Missing "id" attribute in {urn:com:ubuntu:tests}test
> +
> +    Finally, there must also be <ut:case> elements::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo"></ut:test>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 289, in __init__
> +            raise ValueError(
> +        ValueError: Expected to find at least one <ut:case> under the 
> <ut:configuration> element
> +
> +    Which must also have "id" attributes::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo"></ut:test>
> +        ... <ut:case></ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 286, in __init__
> +            raise ValueError(
> +        ValueError: Missing "id" attribute in <ut:case>
> +    """,
> +
> +    'config-bad-defines': """
> +    <ut:define> elements must all have a "name" attribute::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo"></ut:test>
> +        ... <ut:case id="1_foo"></ut:case>
> +        ... <ut:define>Some content</ut:define>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 310, in __init__
> +            raise ValueError(
> +        ValueError: Missing "name" attribute in <ut:define>
> +    """,
> +
> +    'config-bad-include': """
> +    <ut:include> elements must all have a "ref" attribute::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo"></ut:test>
> +        ... <ut:case id="1_foo"><ut:include /></ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        >>> config['1_foo']
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 343, in __init__
> +            raise ValueError(
> +        ValueError: In <ut:case id='1_foo'>: Missing "ref" attribute in 
> <ut:include>
> +
> +    And whatever <ut:test> is referenced must actually exist::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo"></ut:test>
> +        ... <ut:case id="1_foo"><ut:include ref="bar" /></ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        >>> config['1_foo']
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 347, in __init__
> +            raise ValueError(
> +        ValueError: In <ut:case id='1_foo'>: <ut:test id='bar'> not found
> +    """,
> +
> +    'config-bad-var': """
> +    <ut:var> elements must have a "name" attribute::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo">
> +        ...   <dt><ut:var /></dt>
> +        ...   <dd></dd>
> +        ... </ut:test>
> +        ... <ut:case id="1_foo"><ut:include ref="foo" /></ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        >>> config['1_foo']
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 360, in __init__
> +            raise ValueError(
> +        ValueError: In <ut:case id='1_foo'>: Missing "name" attribute in 
> <ut:var>
> +
> +    And whatever <ut:var> is referenced must actually exist::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:tests /></ut:template>
> +        ... <ut:test id="foo">
> +        ...   <dt><ut:var name="my-var" /></dt>
> +        ...   <dd></dd>
> +        ... </ut:test>
> +        ... <ut:case id="1_foo"><ut:include ref="foo" /></ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        >>> config['1_foo']
> +        Traceback (most recent call last):
> +          File "<stdin>", line 3, in <module>
> +            config = TestConfiguration(doc)
> +          File "./tools/test_case_gen", line 364, in __init__
> +            raise ValueError(
> +        ValueError: In <ut:case id='1_foo'>: <ut:define name='my-var'> not 
> found
> +    """,
> +
> +    'config-template-var': """
> +     Templates can contain <ut:var> elements just like <ut:test> can::
> +
> +        >>> doc = et.fromstring('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ... <ut:template><ut:var name="foo" /><ut:tests /></ut:template>
> +        ... <ut:test id="foo"><dt /><dd /></ut:test>
> +        ... <ut:case id="1_foo">
> +        ...   <ut:define name="foo">FOO!</ut:define>
> +        ...   <ut:include ref="foo" />
> +        ... </ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        >>> config = TestConfiguration(doc)
> +        >>> print(et.tostring(config['1_foo'], encoding='unicode'))
> +        <ns0:template xmlns:ns0="urn:com:ubuntu:tests">FOO!
> +          <dt /><dd />
> +        </ns0:template>
> +        <BLANKLINE>
> +    """,
> +
> +    'main --help': """
> +    Running the main function with --help results in help output::
> +
> +        >>> try:
> +        ...     main(['--help']) # doctest: +ELLIPSIS
> +        ... except SystemExit:
> +        ...     pass
> +        usage: test_case_gen [-h] [-o DIR] XML-FILE
> +        ...
> +    """,
> +
> +    'main works': """
> +    Running the main function with a valid configuration results in output
> +    to the specified directory::
> +
> +        >>> import io
> +        >>> import tempfile
> +        >>> from pathlib import Path
> +        >>> tmp = tempfile.TemporaryDirectory()
> +        >>> xml = io.open(Path(tmp.name) / 'config.xml', 'w')
> +        >>> xml.write('''
> +        ... <ut:configuration xmlns:ut="urn:com:ubuntu:tests">
> +        ...   <ut:template>
> +        ...     Before tests
> +        ...     <ut:tests />
> +        ...     After tests
> +        ...   </ut:template>
> +        ...   <ut:test id="button-test">
> +        ...     <dt>Press the big <ut:var name="color" /> button</dt>
> +        ...     <dd>Everything goes <ut:var name="result" /></dd>
> +        ...   </ut:test>
> +        ...   <ut:case id="1_dr_strangelove">
> +        ...     <ut:define name="color">red</ut:define>
> +        ...     <ut:define name="result">boom</ut:define>
> +        ...     <ut:include ref="button-test" />
> +        ...   </ut:case>
> +        ... </ut:configuration>
> +        ... ''')
> +        483
> +        >>> config_file = xml.name
> +        >>> xml.close()
> +        >>> main(['-o', tmp.name, config_file])
> +        >>> output = Path(tmp.name) / '1_dr_strangelove'
> +        >>> output.exists()
> +        True
> +        >>> print(output.read_text()) # doctest: +ELLIPSIS
> +        <!-- Please do not edit this file directly; it was generated with the
> +             tools/test_case_gen script using the following configuration as 
> input:
> +             .../config.xml
> +        -->
> +        <BLANKLINE>
> +            Before tests
> +        <BLANKLINE>
> +        <BLANKLINE>
> +            <dt>Press the big red button</dt>
> +            <dd>Everything goes boom</dd>
> +        <BLANKLINE>
> +        <BLANKLINE>
> +            After tests
> +        <BLANKLINE>
> +        >>> tmp.cleanup()
> +    """,
> +}
> +
> +
>  if __name__ == '__main__':
> -    main()
> +    sys.exit(main())


-- 
https://code.launchpad.net/~waveform/ubuntu-manual-tests/+git/ubuntu-manual-tests/+merge/410534
Your team Ubuntu Testcase Admins is requested to review the proposed merge of 
~waveform/ubuntu-manual-tests:doctest into ubuntu-manual-tests:master.


-- 
Mailing list: https://launchpad.net/~kubuntu-council
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~kubuntu-council
More help   : https://help.launchpad.net/ListHelp

Reply via email to