############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import atf
import pytest


# Setup
def setup():
    atf.require_nodes(3, [("CPUs", 1), ("Features", "f1")])
    atf.require_nodes(3, [("CPUs", 1), ("Features", "f2")])
    atf.require_slurm_running()


def get_nodes_with_feature(feat, nodelist):
    nodes = 0
    for node in nodelist:
        if feat in atf.get_node_parameter(node, "features"):
            nodes += 1
    return nodes


@pytest.mark.parametrize(
    "f1, f2",
    [
        (1, 1),
        (1, 2),
        (2, 3),
    ],
)
@pytest.mark.parametrize("command", ["srun", "salloc", "sbatch"])
def test_ntasks_multiple_count(f1, f2, command):
    """Test that number of nodes and nodes are the right ones requesting constrains."""

    # Submit job with constraints
    n = f1 + f2
    params = f'-n{n} --ntasks-per-node=1 -C "[f1*{f1}&f2*{f2}]"'

    job_id = atf.submit_job(command, params, "hostname", fatal=True)
    atf.wait_for_job_state(job_id, "DONE")

    # Make sure NumNodes is correct
    assert (
        atf.get_job_parameter(job_id, "NumNodes") == n
    ), f"Verify number of nodes is {n}"

    # Make sure that NodeList is correct
    nodelist = atf.node_range_to_list(atf.get_job_parameter(job_id, "NodeList"))
    assert f1 == get_nodes_with_feature(
        "f1", nodelist
    ), f"Verify nodelist contains {f1} nodes with f1"
    assert f2 == get_nodes_with_feature(
        "f2", nodelist
    ), f"Verify nodelist contains {f2} nodes with f2"


@pytest.mark.parametrize(
    "f1, f2",
    [
        (0, 1),
        (1, 0),
        ("!", "*"),
        ("*", "!"),
        ("#", "^"),
        ("^", "#"),
    ],
)
def test_bad_constraint(f1, f2):
    """Test that invalid feature requests should fail."""

    params = f'--ntasks-per-node=1 -C "[f1*{f1}&f2*{f2}]"'
    job = ' env|egrep -i "SLURM.NNODES|SLURM_JOB_NODELIST"'
    output = atf.run_command_error(f"srun {params} {job}", xfail=True)

    assert (
        "Invalid feature specification" in output
    ), "Verify that 'Invalid feature specification' message"
