#!/usr/bin/env python3

"""Test filtering statements exclusively."""

import argparse
import sys
import shlex
import subprocess
import tempfile

DOCUMENTS = {
    "ntriples": """
    <urn:example:s> <urn:example:p> <urn:example:o> .
    <urn:example:s> <urn:example:q> <urn:example:r> .
""",
    "nquads": """
    <urn:example:s> <urn:example:p> <urn:example:o> <urn:example:g> .
    <urn:example:s> <urn:example:q> <urn:example:r> <urn:example:g> .
""",
}

parser = argparse.ArgumentParser(description=__doc__)

parser.add_argument("--serdi", default="./serdi", help="path to serdi")
parser.add_argument("--wrapper", default="", help="executable wrapper")

args = parser.parse_args(sys.argv[1:])


def check_pattern(syntax, pattern, result):
    command = shlex.split(args.wrapper) + [
        args.serdi,
        "-i",
        syntax,
        "-G",
        pattern,
        "-s",
        DOCUMENTS[syntax],
    ]

    with tempfile.TemporaryFile() as out:
        proc = subprocess.run(
            command,
            check=False,
            encoding="utf-8",
            capture_output=True,
        )

        assert proc.returncode == 0
        assert args.wrapper or len(proc.stderr) == 0
        assert proc.stdout == result


check_pattern(
    "ntriples",
    "?s <urn:example:p> <urn:example:o> .",
    "<urn:example:s> <urn:example:p> <urn:example:o> .\n",
)

check_pattern(
    "ntriples",
    "<urn:example:s> ?p <urn:example:o> .",
    "<urn:example:s> <urn:example:p> <urn:example:o> .\n",
)

check_pattern(
    "ntriples",
    "<urn:example:s> <urn:example:p> ?o .",
    "<urn:example:s> <urn:example:p> <urn:example:o> .\n",
)

check_pattern(
    "nquads",
    "?s <urn:example:p> <urn:example:o> <urn:example:g> .",
    "<urn:example:s> <urn:example:p> <urn:example:o> <urn:example:g> .\n",
)

check_pattern(
    "nquads",
    "<urn:example:s> ?p <urn:example:o> <urn:example:g> .",
    "<urn:example:s> <urn:example:p> <urn:example:o> <urn:example:g> .\n",
)

check_pattern(
    "nquads",
    "<urn:example:s> <urn:example:p> ?o <urn:example:g> .",
    "<urn:example:s> <urn:example:p> <urn:example:o> <urn:example:g> .\n",
)

check_pattern(
    "nquads",
    "<urn:example:s> <urn:example:p> <urn:example:o> ?g .",
    "<urn:example:s> <urn:example:p> <urn:example:o> <urn:example:g> .\n",
)