"""
Tests checkers
"""

import doctest

import grass.gunittest.case
import grass.gunittest.main
import grass.gunittest.utils

import grass.pygrass.raster as pgrass


# doctest does not allow changing the base classes of test case, skip test case
# and test suite, so we need to create a new type which inherits from our class
# and contains doctest's methods
# the alternative is to copy 500 from doctest and change what is needed
# (this might be necessary anyway because of the reports and stdout and stderr)
doctest.DocFileCase = type(
    "DocFileCase", (grass.gunittest.case.TestCase,), dict(doctest.DocFileCase.__dict__)
)
doctest.SkipDocTestCase = type(
    "SkipDocTestCase",
    (grass.gunittest.case.TestCase,),
    dict(doctest.SkipDocTestCase.__dict__),
)


def load_tests(loader, tests, ignore):
    # TODO: this must be somewhere when doctest is called, not here
    # TODO: ultimate solution is not to use _ as a buildin in lib/python
    # for now it is the only place where it works
    grass.gunittest.utils.do_doctest_gettext_workaround()
    # this should be called at some top level

    from grass.pygrass.modules import Module

    Module("g.region", n=40, s=0, e=40, w=0, res=10)
    Module(
        "r.mapcalc",
        expression="%s = row() + (10 * col())" % (pgrass.test_raster_name),
        overwrite=True,
    )
    Module(
        "r.support",
        map=pgrass.test_raster_name,
        title="A test map",
        history="Generated by r.mapcalc",
        description="This is a test map",
    )
    cats = """11:A
            12:B
            13:C
            14:D
            21:E
            22:F
            23:G
            24:H
            31:I
            32:J
            33:K
            34:L
            41:M
            42:n
            43:O
            44:P"""
    Module(
        "r.category", rules="-", map=pgrass.test_raster_name, stdin_=cats, separator=":"
    )

    Module(
        "r.mapcalc",
        expression="%s = row() + (10 * col())" % (pgrass.abstract.test_raster_name),
        overwrite=True,
    )

    tests.addTests(doctest.DocTestSuite(pgrass))
    tests.addTests(doctest.DocTestSuite(pgrass.abstract))
    return tests


if __name__ == "__main__":
    grass.gunittest.main.test()
