from contextlib import contextmanager
import os
import pytest

from buildstream._project import Project
from buildstream._exceptions import LoadError
from buildstream.exceptions import LoadErrorReason
from buildstream._pipeline import Pipeline

from tests.testutils import dummy_context

DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "pluginloading",)


@contextmanager
def create_pipeline(tmpdir, basedir, target):
    with dummy_context() as context:
        context.deploydir = os.path.join(str(tmpdir), "deploy")
        context.casdir = os.path.join(str(tmpdir), "cas")
        project = Project(basedir, context)

        pipeline = Pipeline(context, project, None)
        (targets,) = pipeline.load([(target,)])
        yield targets


@pytest.mark.datafiles(os.path.join(DATA_DIR, "customsource"))
def test_customsource(datafiles, tmpdir):

    basedir = str(datafiles)
    with create_pipeline(tmpdir, basedir, "simple.bst") as targets:
        assert targets[0].get_kind() == "autotools"


@pytest.mark.datafiles(os.path.join(DATA_DIR, "customelement"))
def test_customelement(datafiles, tmpdir):

    basedir = str(datafiles)
    with create_pipeline(tmpdir, basedir, "simple.bst") as targets:
        assert targets[0].get_kind() == "foo"


@pytest.mark.datafiles(os.path.join(DATA_DIR, "badversionsource"))
def test_badversionsource(datafiles, tmpdir):
    basedir = str(datafiles)

    with pytest.raises(LoadError) as exc, create_pipeline(tmpdir, basedir, "simple.bst"):
        pass

    assert exc.value.reason == LoadErrorReason.UNSUPPORTED_PLUGIN


@pytest.mark.datafiles(os.path.join(DATA_DIR, "badversionelement"))
def test_badversionelement(datafiles, tmpdir):
    basedir = str(datafiles)

    with pytest.raises(LoadError) as exc, create_pipeline(tmpdir, basedir, "simple.bst"):
        pass

    assert exc.value.reason == LoadErrorReason.UNSUPPORTED_PLUGIN
