import py
import os, sys
from py._plugin.pytest__pytest import HookRecorder
from py._test.pluginmanager import Registry

def test_hookrecorder_basic():
    rec = HookRecorder(Registry())
    class ApiClass:
        def pytest_xyz(self, arg):
            "x"
    rec.start_recording(ApiClass)
    rec.hook.pytest_xyz(arg=123)
    call = rec.popcall("pytest_xyz")
    assert call.arg == 123
    assert call._name == "pytest_xyz"
    py.test.raises(ValueError, "rec.popcall('abc')")

def test_hookrecorder_basic_no_args_hook():
    rec = HookRecorder(Registry())
    apimod = type(os)('api')
    def pytest_xyz():
        "x"
    apimod.pytest_xyz = pytest_xyz
    rec.start_recording(apimod)
    rec.hook.pytest_xyz()
    call = rec.popcall("pytest_xyz")
    assert call._name == "pytest_xyz"

def test_functional(testdir, linecomp):
    reprec = testdir.inline_runsource("""
        import py
        from py._test.pluginmanager import HookRelay, Registry
        pytest_plugins="_pytest"
        def test_func(_pytest):
            class ApiClass:
                def pytest_xyz(self, arg):  "x"
            hook = HookRelay([ApiClass], Registry())
            rec = _pytest.gethookrecorder(hook)
            class Plugin:
                def pytest_xyz(self, arg):
                    return arg + 1
            rec._registry.register(Plugin())
            res = rec.hook.pytest_xyz(arg=41)
            assert res == [42]
    """)
    reprec.assertoutcome(passed=1)
