diff options
Diffstat (limited to 'test/test_transforms/test_hyperlinks.py')
-rwxr-xr-x | test/test_transforms/test_hyperlinks.py | 845 |
1 files changed, 845 insertions, 0 deletions
diff --git a/test/test_transforms/test_hyperlinks.py b/test/test_transforms/test_hyperlinks.py new file mode 100755 index 000000000..cef12a4f1 --- /dev/null +++ b/test/test_transforms/test_hyperlinks.py @@ -0,0 +1,845 @@ +#! /usr/bin/env python + +# Author: David Goodger +# Contact: goodger@users.sourceforge.net +# Revision: $Revision$ +# Date: $Date$ +# Copyright: This module has been placed in the public domain. + +""" +Tests for docutils.transforms.references.Hyperlinks. +""" + +from __init__ import DocutilsTestSupport +from docutils.transforms.references import PropagateTargets, \ + AnonymousHyperlinks, IndirectHyperlinks, ExternalTargets, \ + InternalTargets, DanglingReferences + +from docutils.parsers.rst import Parser + + +def suite(): + parser = Parser() + s = DocutilsTestSupport.TransformTestSuite(parser) + s.generateTests(totest) + return s + +totest = {} + +# Exhaustive listing of hyperlink variations: every combination of +# target/reference, direct/indirect, internal/external, and named/anonymous, +# plus embedded URIs. +totest['exhaustive_hyperlinks'] = ((PropagateTargets, AnonymousHyperlinks, + IndirectHyperlinks, + ExternalTargets, InternalTargets, + DanglingReferences), [ +["""\ +direct_ external + +.. _direct: http://direct +""", +"""\ +<document source="test data"> + <paragraph> + <reference name="direct" refuri="http://direct"> + direct + external + <target ids="direct" names="direct" refuri="http://direct"> +"""], +["""\ +indirect_ external + +.. _indirect: xtarget_ +.. _xtarget: http://indirect +""", +"""\ +<document source="test data"> + <paragraph> + <reference name="indirect" refuri="http://indirect"> + indirect + external + <target ids="indirect" names="indirect" refuri="http://indirect"> + <target ids="xtarget" names="xtarget" refuri="http://indirect"> +"""], +["""\ +.. _direct: + +direct_ internal +""", +"""\ +<document source="test data"> + <target refid="direct"> + <paragraph ids="direct" names="direct"> + <reference name="direct" refid="direct"> + direct + internal +"""], +["""\ +.. _ztarget: + +indirect_ internal + +.. _indirect2: ztarget_ +.. _indirect: indirect2_ +""", +"""\ +<document source="test data"> + <target refid="ztarget"> + <paragraph ids="ztarget" names="ztarget"> + <reference name="indirect" refid="ztarget"> + indirect + internal + <target ids="indirect2" names="indirect2" refid="ztarget"> + <target ids="indirect" names="indirect" refid="ztarget"> +"""], +["""\ +Implicit +-------- + +indirect_ internal + +.. _indirect: implicit_ +""", +"""\ +<document source="test data"> + <section ids="implicit" names="implicit"> + <title> + Implicit + <paragraph> + <reference name="indirect" refid="implicit"> + indirect + internal + <target ids="indirect" names="indirect" refid="implicit"> +"""], +["""\ +Implicit +-------- + +`multiply-indirect`_ internal + +.. _multiply-indirect: indirect_ +.. _indirect: implicit_ +""", +"""\ +<document source="test data"> + <section ids="implicit" names="implicit"> + <title> + Implicit + <paragraph> + <reference name="multiply-indirect" refid="implicit"> + multiply-indirect + internal + <target ids="multiply-indirect" names="multiply-indirect" refid="implicit"> + <target ids="indirect" names="indirect" refid="implicit"> +"""], +["""\ +circular_ indirect reference + +.. _circular: indirect_ +.. _indirect: circular_ +""", +"""\ +<document source="test data"> + <paragraph> + <problematic ids="id2" refid="id1"> + circular_ + indirect reference + <target ids="circular" names="circular" refid="circular"> + <problematic ids="id3 indirect" names="indirect" refid="id1"> + .. _indirect: circular_ + <system_message backrefs="id2 id3" ids="id1" level="3" line="3" source="test data" type="ERROR"> + <paragraph> + Indirect hyperlink target "circular" (id="circular") refers to target "indirect", forming a circular reference. +"""], +["""\ +Implicit +-------- + +Duplicate implicit targets. + +Implicit +-------- + +indirect_ internal + +.. _indirect: implicit_ + +Direct internal reference: Implicit_ +""", +"""\ +<document source="test data"> + <section dupnames="implicit" ids="implicit"> + <title> + Implicit + <paragraph> + Duplicate implicit targets. + <section dupnames="implicit" ids="id1"> + <title> + Implicit + <system_message backrefs="id1" level="1" line="7" source="test data" type="INFO"> + <paragraph> + Duplicate implicit target name: "implicit". + <paragraph> + <problematic ids="id3" refid="id2"> + indirect_ + internal + <target ids="indirect" names="indirect" refname="implicit"> + <paragraph> + Direct internal reference: + <problematic ids="id5" refid="id4"> + Implicit_ + <system_message backrefs="id3" ids="id2" level="3" line="11" source="test data" type="ERROR"> + <paragraph> + Indirect hyperlink target "indirect" (id="indirect") refers to target "implicit", which is a duplicate, and cannot be used as a unique reference. + <system_message backrefs="id5" ids="id4" level="3" line="13" source="test data" type="ERROR"> + <paragraph> + Duplicate target name, cannot be used as a unique reference: "implicit". +"""], +["""\ +`direct external`__ + +__ http://direct +""", +"""\ +<document source="test data"> + <paragraph> + <reference anonymous="1" name="direct external" refuri="http://direct"> + direct external + <target anonymous="1" ids="id1" refuri="http://direct"> +"""], +["""\ +`indirect external`__ + +__ xtarget_ +.. _xtarget: http://indirect +""", +"""\ +<document source="test data"> + <paragraph> + <reference anonymous="1" name="indirect external" refuri="http://indirect"> + indirect external + <target anonymous="1" ids="id1" refuri="http://indirect"> + <target ids="xtarget" names="xtarget" refuri="http://indirect"> +"""], +["""\ +__ + +`direct internal`__ +""", +"""\ +<document source="test data"> + <target anonymous="1" refid="id1"> + <paragraph ids="id1"> + <reference anonymous="1" name="direct internal" refid="id1"> + direct internal +"""], +["""\ +.. _ztarget: + +`indirect internal`__ + +__ ztarget_ +""", +"""\ +<document source="test data"> + <target refid="ztarget"> + <paragraph ids="ztarget" names="ztarget"> + <reference anonymous="1" name="indirect internal" refid="ztarget"> + indirect internal + <target anonymous="1" ids="id1" refid="ztarget"> +"""], +["""\ +.. _ztarget: + +First + +.. _ztarget: + +Second + +`indirect internal`__ + +__ ztarget_ +""", +"""\ +<document source="test data"> + <target dupnames="ztarget" refid="ztarget"> + <paragraph ids="ztarget"> + First + <system_message backrefs="id1" level="2" line="5" source="test data" type="WARNING"> + <paragraph> + Duplicate explicit target name: "ztarget". + <target dupnames="ztarget" refid="id1"> + <paragraph ids="id1"> + Second + <paragraph> + <problematic ids="id4" refid="id3"> + `indirect internal`__ + <target anonymous="1" ids="id2" refname="ztarget"> + <system_message backrefs="id4" ids="id3" level="3" line="11" source="test data" type="ERROR"> + <paragraph> + Indirect hyperlink target (id="id2") refers to target "ztarget", which is a duplicate, and cannot be used as a unique reference. +"""], +["""\ +The next anonymous hyperlink reference is parsed (and discarded) at +some point, but nonetheless anonymous hyperlink references and targets +match in this snippet. + +.. |invalid| replace:: anonymous__ + +hyperlink__ + +__ URL +""", +"""\ +<document source="test data"> + <paragraph> + The next anonymous hyperlink reference is parsed (and discarded) at + some point, but nonetheless anonymous hyperlink references and targets + match in this snippet. + <system_message level="3" line="5" source="test data" type="ERROR"> + <paragraph> + Substitution definition contains illegal element: + <literal_block xml:space="preserve"> + <reference anonymous="1" name="anonymous"> + anonymous + <literal_block xml:space="preserve"> + .. |invalid| replace:: anonymous__ + <paragraph> + <reference anonymous="1" name="hyperlink" refuri="URL"> + hyperlink + <target anonymous="1" ids="id1" refuri="URL"> +"""], +["""\ +An `embedded uri <http://direct>`_. + +Another reference to the same `embedded URI`_. +""", +"""\ +<document source="test data"> + <paragraph> + An \n\ + <reference name="embedded uri" refuri="http://direct"> + embedded uri + <target ids="embedded-uri" names="embedded\ uri" refuri="http://direct"> + . + <paragraph> + Another reference to the same \n\ + <reference name="embedded URI" refuri="http://direct"> + embedded URI + . +"""], +["""\ +An `anonymous embedded uri <http://direct>`__. +""", +"""\ +<document source="test data"> + <paragraph> + An \n\ + <reference name="anonymous embedded uri" refuri="http://direct"> + anonymous embedded uri + . +"""], +["""\ +.. _target: + +.. [1] Footnote; target_ +""", +"""\ +<document source="test data"> + <target ids="target" names="target"> + <footnote ids="id1" names="1"> + <label> + 1 + <paragraph> + Footnote; \n\ + <reference name="target" refid="target"> + target +"""], +["""\ +.. _target: + +.. [cit] Citation; target_ +""", +"""\ +<document source="test data"> + <target ids="target" names="target"> + <citation ids="cit" names="cit"> + <label> + cit + <paragraph> + Citation; \n\ + <reference name="target" refid="target"> + target +"""], +]) + +totest['hyperlinks'] = ((PropagateTargets, AnonymousHyperlinks, + IndirectHyperlinks, ExternalTargets, + InternalTargets, DanglingReferences), [ +["""\ +.. _internal hyperlink: + +This paragraph referenced. + +By this `internal hyperlink`_ reference. +""", +"""\ +<document source="test data"> + <target refid="internal-hyperlink"> + <paragraph ids="internal-hyperlink" names="internal\ hyperlink"> + This paragraph referenced. + <paragraph> + By this \n\ + <reference name="internal hyperlink" refid="internal-hyperlink"> + internal hyperlink + reference. +"""], +["""\ +.. _chained: +.. _internal hyperlink: + +This paragraph referenced. + +By this `internal hyperlink`_ reference +as well as by this chained_ reference. + +The results of the transform are not visible at the XML level. +""", +"""\ +<document source="test data"> + <target refid="chained"> + <target refid="internal-hyperlink"> + <paragraph ids="internal-hyperlink chained" names="internal\ hyperlink chained"> + This paragraph referenced. + <paragraph> + By this \n\ + <reference name="internal hyperlink" refid="internal-hyperlink"> + internal hyperlink + reference + as well as by this \n\ + <reference name="chained" refid="chained"> + chained + reference. + <paragraph> + The results of the transform are not visible at the XML level. +"""], +["""\ +.. _chained: +__ http://anonymous + +Anonymous__ and chained_ both refer to the same URI. +""", +"""\ +<document source="test data"> + <target refid="chained"> + <target anonymous="1" ids="id1 chained" names="chained" refuri="http://anonymous"> + <paragraph> + <reference anonymous="1" name="Anonymous" refuri="http://anonymous"> + Anonymous + and \n\ + <reference name="chained" refuri="http://anonymous"> + chained + both refer to the same URI. +"""], +["""\ +.. _a: +.. _b: + +x +""", +"""\ +<document source="test data"> + <target refid="a"> + <target refid="b"> + <paragraph ids="b a" names="b a"> + x + <system_message level="1" line="1" source="test data" type="INFO"> + <paragraph> + Hyperlink target "a" is not referenced. + <system_message level="1" line="2" source="test data" type="INFO"> + <paragraph> + Hyperlink target "b" is not referenced. +"""], +["""\ +.. _a: +.. _b: + +a_ +""", +"""\ +<document source="test data"> + <target refid="a"> + <target refid="b"> + <paragraph ids="b a" names="b a"> + <reference name="a" refid="a"> + a + <system_message level="1" line="2" source="test data" type="INFO"> + <paragraph> + Hyperlink target "b" is not referenced. +"""], +["""\ +.. _a: +.. _b: + +b_ +""", +"""\ +<document source="test data"> + <target refid="a"> + <target refid="b"> + <paragraph ids="b a" names="b a"> + <reference name="b" refid="b"> + b + <system_message level="1" line="1" source="test data" type="INFO"> + <paragraph> + Hyperlink target "a" is not referenced. +"""], +["""\ +.. _a: +.. _b: + +a_\ b_ +""", +"""\ +<document source="test data"> + <target refid="a"> + <target refid="b"> + <paragraph ids="b a" names="b a"> + <reference name="a" refid="a"> + a + <reference name="b" refid="b"> + b +"""], +["""\ +.. _external hyperlink: http://uri + +`External hyperlink`_ reference. +""", +"""\ +<document source="test data"> + <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri"> + <paragraph> + <reference name="External hyperlink" refuri="http://uri"> + External hyperlink + reference. +"""], +["""\ +.. _external hyperlink: http://uri +.. _indirect target: `external hyperlink`_ +""", +"""\ +<document source="test data"> + <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri"> + <target ids="indirect-target" names="indirect\ target" refuri="http://uri"> + <system_message level="1" line="2" source="test data" type="INFO"> + <paragraph> + Hyperlink target "indirect target" is not referenced. +"""], +["""\ +.. _chained: +.. _external hyperlink: http://uri + +`External hyperlink`_ reference +and a chained_ reference too. +""", +"""\ +<document source="test data"> + <target refid="chained"> + <target ids="external-hyperlink chained" names="external\ hyperlink chained" refuri="http://uri"> + <paragraph> + <reference name="External hyperlink" refuri="http://uri"> + External hyperlink + reference + and a \n\ + <reference name="chained" refuri="http://uri"> + chained + reference too. +"""], +["""\ +.. _external hyperlink: http://uri +.. _indirect hyperlink: `external hyperlink`_ + +`Indirect hyperlink`_ reference. +""", +"""\ +<document source="test data"> + <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri"> + <target ids="indirect-hyperlink" names="indirect\ hyperlink" refuri="http://uri"> + <paragraph> + <reference name="Indirect hyperlink" refuri="http://uri"> + Indirect hyperlink + reference. +"""], +["""\ +.. _external hyperlink: http://uri +.. _chained: +.. _indirect hyperlink: `external hyperlink`_ + +Chained_ `indirect hyperlink`_ reference. +""", +"""\ +<document source="test data"> + <target ids="external-hyperlink" names="external\ hyperlink" refuri="http://uri"> + <target refuri="http://uri"> + <target ids="indirect-hyperlink chained" names="indirect\ hyperlink chained" refuri="http://uri"> + <paragraph> + <reference name="Chained" refuri="http://uri"> + Chained + \n\ + <reference name="indirect hyperlink" refuri="http://uri"> + indirect hyperlink + reference. +"""], +["""\ +.. __: http://full +__ +__ http://simplified +.. _external: http://indirect.external +__ external_ +__ + +`Full syntax anonymous external hyperlink reference`__, +`chained anonymous external reference`__, +`simplified syntax anonymous external hyperlink reference`__, +`indirect anonymous hyperlink reference`__, +`internal anonymous hyperlink reference`__. +""", +"""\ +<document source="test data"> + <target anonymous="1" ids="id1" refuri="http://full"> + <target anonymous="1" refid="id2"> + <target anonymous="1" ids="id3 id2" refuri="http://simplified"> + <target ids="external" names="external" refuri="http://indirect.external"> + <target anonymous="1" ids="id4" refuri="http://indirect.external"> + <target anonymous="1" refid="id5"> + <paragraph ids="id5"> + <reference anonymous="1" name="Full syntax anonymous external hyperlink reference" refuri="http://full"> + Full syntax anonymous external hyperlink reference + , + <reference anonymous="1" name="chained anonymous external reference" refuri="http://simplified"> + chained anonymous external reference + , + <reference anonymous="1" name="simplified syntax anonymous external hyperlink reference" refuri="http://simplified"> + simplified syntax anonymous external hyperlink reference + , + <reference anonymous="1" name="indirect anonymous hyperlink reference" refuri="http://indirect.external"> + indirect anonymous hyperlink reference + , + <reference anonymous="1" name="internal anonymous hyperlink reference" refid="id5"> + internal anonymous hyperlink reference + . +"""], +["""\ +Duplicate external target_'s (different URIs): + +.. _target: first + +.. _target: second +""", +"""\ +<document source="test data"> + <paragraph> + Duplicate external \n\ + <problematic ids="id3" refid="id2"> + target_ + 's (different URIs): + <target dupnames="target" ids="target" refuri="first"> + <system_message backrefs="id1" level="2" line="5" source="test data" type="WARNING"> + <paragraph> + Duplicate explicit target name: "target". + <target dupnames="target" ids="id1" refuri="second"> + <system_message backrefs="id3" ids="id2" level="3" line="1" source="test data" type="ERROR"> + <paragraph> + Duplicate target name, cannot be used as a unique reference: "target". +"""], +["""\ +Duplicate external targets (different URIs) without reference: + +.. _target: first + +.. _target: second +""", +"""\ +<document source="test data"> + <paragraph> + Duplicate external targets (different URIs) without reference: + <target dupnames="target" ids="target" refuri="first"> + <system_message backrefs="id1" level="2" line="5" source="test data" type="WARNING"> + <paragraph> + Duplicate explicit target name: "target". + <target dupnames="target" ids="id1" refuri="second"> +"""], +["""\ +Several__ anonymous__ hyperlinks__, but not enough targets. + +__ http://example.org +""", +"""\ +<document source="test data"> + <paragraph> + <problematic ids="id3" refid="id2"> + Several__ + \n\ + <problematic ids="id4" refid="id2"> + anonymous__ + \n\ + <problematic ids="id5" refid="id2"> + hyperlinks__ + , but not enough targets. + <target anonymous="1" ids="id1" refuri="http://example.org"> + <system_message backrefs="id3 id4 id5" ids="id2" level="3" source="test data" type="ERROR"> + <paragraph> + Anonymous hyperlink mismatch: 3 references but 1 targets. + See "backrefs" attribute for IDs. +"""], +["""\ +.. _external: http://uri +.. _indirect: external_ +.. _internal: + +.. image:: picture.png + :target: external_ + +.. image:: picture.png + :target: indirect_ + +.. image:: picture.png + :target: internal_ +""", +"""\ +<document source="test data"> + <target ids="external" names="external" refuri="http://uri"> + <target ids="indirect" names="indirect" refuri="http://uri"> + <target refid="internal"> + <reference ids="internal" name="external" names="internal" refuri="http://uri"> + <image uri="picture.png"> + <reference name="indirect" refuri="http://uri"> + <image uri="picture.png"> + <reference name="internal" refid="internal"> + <image uri="picture.png"> +"""], +["""\ +.. contents:: Table of Contents +.. _indirect reference to the table of contents: `table of contents`_ + +Section +======= + +Testing an `indirect reference to the table of contents`_. +""", +"""\ +<document source="test data"> + <topic classes="contents" ids="table-of-contents" names="table\ of\ contents"> + <title> + Table of Contents + <bullet_list> + <list_item> + <paragraph> + <reference ids="id1" refid="section"> + Section + <target ids="indirect-reference-to-the-table-of-contents" names="indirect\ reference\ to\ the\ table\ of\ contents" refid="table-of-contents"> + <section ids="section" names="section"> + <title refid="id1"> + Section + <paragraph> + Testing an + <reference name="indirect reference to the table of contents" refid="table-of-contents"> + indirect reference to the table of contents + . +"""], +["""\ +.. _explicit target: + +Title +----- + +Let's reference it (`explicit target`_) to avoid an irrelevant error. +""", +"""\ +<document source="test data"> + <target refid="explicit-target"> + <section ids="title explicit-target" names="title explicit\ target"> + <title> + Title + <paragraph> + Let's reference it ( + <reference name="explicit target" refid="explicit-target"> + explicit target + ) to avoid an irrelevant error. +"""], +["""\ +target1_ should refer to target2_, not the Title. + +.. _target1: +.. _target2: URI + +Title +===== +""", +"""\ +<document source="test data"> + <paragraph> + <reference name="target1" refuri="URI"> + target1 + should refer to \n\ + <reference name="target2" refuri="URI"> + target2 + , not the Title. + <target refid="target1"> + <target ids="target2 target1" names="target2 target1" refuri="URI"> + <section ids="title" names="title"> + <title> + Title +"""], +["""\ +Unknown reference_. +""", +"""\ +<document source="test data"> + <paragraph> + Unknown \n\ + <problematic ids="id2" refid="id1"> + reference_ + . + <system_message backrefs="id2" ids="id1" level="3" line="1" source="test data" type="ERROR"> + <paragraph> + Unknown target name: "reference". +"""], +["""\ +Duplicate manual footnote labels, with reference ([1]_): + +.. [1] Footnote. + +.. [1] Footnote. +""", +"""\ +<document source="test data"> + <paragraph> + Duplicate manual footnote labels, with reference ( + <problematic ids="id5 id1" refid="id4"> + [1]_ + ): + <footnote dupnames="1" ids="id2"> + <label> + 1 + <paragraph> + Footnote. + <footnote dupnames="1" ids="id3"> + <label> + 1 + <system_message backrefs="id3" level="2" line="5" source="test data" type="WARNING"> + <paragraph> + Duplicate explicit target name: "1". + <paragraph> + Footnote. + <system_message backrefs="id5" ids="id4" level="3" line="1" source="test data" type="ERROR"> + <paragraph> + Duplicate target name, cannot be used as a unique reference: "1". +"""], +]) + + +if __name__ == '__main__': + import unittest + unittest.main(defaultTest='suite') |