summaryrefslogblamecommitdiffstats
path: root/rtemsspec/tests/test_content_sphinx.py
blob: f9235089fdbb103e5227453e99a1da3fb38d57b2 (plain) (tree)
1
2
3
4
                                       
                                                          
 
                                                                               























                                                                             
                                                               
                               

                                                                       


                     


                                    
   

 
                     



                                        
 

     


                                                      
 









         
                      


                               

   

                               






   
                                 

                                                 
                              
                                           



   
                                                    
                                
                                           








               

 
                         



                                                    

                                       

 





















                                                





















                                           

                             
                             
                             
                                          




                               








                                                     


   
                  


                               
   


                                   

     

                                   
     
 
   


                             


                                          

            

                                          



            


                               


                                                


     


                                              

      




                                                          

 









                                      
                   
                             
                                   




                                                                      

   


                                  
                             
                                   




                                                                      



                  

 









                                       















                                                         
                            


                                                                         

                                           

                                                                                 
                                    
                                                         
                                                                
                                                                       
                                                      
# SPDX-License-Identifier: BSD-2-Clause
""" Unit tests for the rtemsspec.sphinxcontent module. """

# Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

import pytest

from rtemsspec.sphinxcontent import get_reference, get_label, \
    SphinxContent, SphinxMapper
from rtemsspec.items import Item, ItemCache, ItemMapper
from rtemsspec.tests.util import create_item_cache_config_and_copy_spec


def test_add_label():
    content = SphinxContent()
    content.add_label("x")
    assert str(content) == """.. _x:
"""


def test_directive():
    content = SphinxContent()
    with content.directive("x"):
        content.add("y")
        assert str(content) == """.. x::

    y
"""
    with content.directive("z", "xy", [":a:", ":b:"]):
        content.add("c")
        assert str(content) == """.. x::

    y

.. z:: xy
    :a:
    :b:

    c
"""


def test_add_header():
    content = SphinxContent()
    content.add_header("x")
    assert str(content) == """x
=
"""
    content.add_header("yz", 1)
    assert str(content) == """x
=

yz
**
"""


def test_add_header_with_label():
    content = SphinxContent()
    label = content.add_header_with_label("x", 1)
    assert label == "SectionX"
    assert str(content) == """.. _SectionX:

x
*
"""
    label = content.add_header_with_label("yz w", 2)
    assert label == "SectionYzW"
    assert str(content) == """.. _SectionX:

x
*

.. _SectionYzW:

yz w
====
"""


def test_get_reference():
    assert get_reference("a") == ":ref:`a`"
    assert get_reference("a", "b") == ":ref:`b <a>`"


def test_get_label():
    assert get_label("ab cd") == "AbCd"


def test_section():
    content = SphinxContent()
    with content.section("ab cd") as label:
        content.add(label)
        with content.section("ef gh") as label2:
            content.add(label2)
    assert str(content) == """.. _SectionAbCd:

ab cd
=====

SectionAbCd

.. _SectionEfGh:

ef gh
-----

SectionEfGh
"""


def test_list_item():
    content = SphinxContent()
    with content.list_item("ab cd"):
        content.paste("ef gh")
        with content.list_item("ij kl"):
            content.add("mn op")
        content.paste("qr st")
    with content.list_item("uv"):
        pass
    content.add_list_item("wx")
    assert str(content) == """* ab cd ef gh

  * ij kl

  mn op qr st

* uv

* wx
"""


def test_add_list():
    content = SphinxContent()
    content.add_list([], "a")
    assert str(content) == ""
    content.add_list(["b", "c"], "a", "d")
    assert str(content) == """a

* b

* c

d
"""
    content = SphinxContent()
    content.add_list(["b", "c"], add_blank_line=True)
    assert str(content) == """* b

* c

"""


def test_append():
    content = SphinxContent()
    content.append("x")
    assert str(content) == """x
"""
    with content.indent():
        content.append("y")
        assert str(content) == """x
    y
"""
        content.append("")
        assert str(content) == """x
    y

"""


def test_add_index_entries():
    content = SphinxContent()
    content.add_index_entries(["x", "y"])
    assert str(content) == """.. index:: x
.. index:: y
"""
    content.add_index_entries("z")
    assert str(content) == """.. index:: x
.. index:: y

.. index:: z
"""


def test_add_definition_item():
    content = SphinxContent()
    content.add_definition_item("x", ["y", "z"])
    assert str(content) == """x
    y
    z
"""
    content = SphinxContent()
    content.add_definition_item("a", "\n b\n")
    assert str(content) == """a
     b
"""
    content = SphinxContent()
    content.add_definition_item("a", "\n b\nc", wrap=True)
    assert str(content) == """a
    b c
"""


def test_definition_item():
    content = SphinxContent()
    with content.definition_item("x"):
        content.add(["y", "z"])
    assert str(content) == """x
    y
    z
"""


def test_license():
    content = SphinxContent()
    with pytest.raises(ValueError):
        content.register_license("x")
    content.register_license("CC-BY-SA-4.0")
    assert str(content) == ""
    content.add_licence_and_copyrights()
    assert str(content) == """.. SPDX-License-Identifier: CC-BY-SA-4.0

"""


def test_license_and_copyrights():
    content = SphinxContent()
    with pytest.raises(ValueError):
        content.register_license("x")
    content.register_copyright("Copyright (C) A")
    assert str(content) == ""
    content.add_licence_and_copyrights()
    assert str(content) == """.. SPDX-License-Identifier: CC-BY-SA-4.0

.. Copyright (C) A

"""


def test_comment():
    content = SphinxContent()
    with content.comment_block():
        content.add(["abc", "", "def"])
    assert str(content) == """.. abc
..
.. def
"""


def test_simple_table():
    content = SphinxContent()
    content.add_simple_table([])
    assert str(content) == ""
    content.add_simple_table([["a", "b"], ["cc", "ddd"]])
    assert str(content) == """.. table::
    :class: longtable

    == ===
    a  b
    == ===
    cc ddd
    == ===
"""


def test_substitute(tmpdir):
    config = create_item_cache_config_and_copy_spec(tmpdir,
                                                    "spec-sphinx",
                                                    with_spec_types=True)
    item_cache = ItemCache(config)
    mapper = SphinxMapper(item_cache["/x"])
    match = r"substitution for spec:/x using prefix '' failed for text: \${x:/y}"
    with pytest.raises(ValueError, match=match):
        mapper.substitute("${x:/y}")
    assert mapper.substitute("${x:/term}") == ":term:`y`"
    assert mapper.substitute("${x:/plural}") == ":term:`ys <y>`"
    mapper.add_get_value("other:/name", lambda ctx: ctx.value[ctx.key])
    assert mapper.substitute("${y:/name}") == "foobar"