############################################################################
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
############################################################################
import re

import atf


def setup_module():
    atf.require_version(
        (26, 5), "bin/squeue", reason="Ticket 22180: SLUID availability added in 26.05+"
    )
    atf.require_nodes(1, [("CPUs", 1)])
    atf.require_slurm_running()


def test_squeue_sluid():
    """Verify squeue SLUID format and filtering by job_id, SLUID, and mixed."""

    job_id = atf.submit_job_sbatch("-n1 --wrap 'srun sleep infinity'", fatal=True)
    atf.wait_for_job_state(job_id, "RUNNING", fatal=True)

    sluid = atf.get_job_parameter(job_id, "SLUID")
    assert sluid is not None, f"Job {job_id} has no SLUID"

    fmt = "--noheader -o '%.6i %.14s'"

    # squeue -j <job_id> prints the SLUID
    output = atf.run_command_output(f"squeue -j {job_id} {fmt}", fatal=True)
    assert re.search(
        rf"{job_id}\s+{re.escape(sluid)}", output
    ), f"Expected job_id and SLUID in output: {output}"

    # squeue -j <SLUID> finds the job
    output = atf.run_command_output(f"squeue -j {sluid} {fmt}", fatal=True)
    assert re.search(
        rf"{job_id}\s+{re.escape(sluid)}", output
    ), f"Expected job found by SLUID in output: {output}"

    # squeue -j <job_id>,<SLUID> (both refer to the same job)
    output = atf.run_command_output(f"squeue -j {job_id},{sluid} {fmt}", fatal=True)
    assert re.search(
        rf"{job_id}\s+{re.escape(sluid)}", output
    ), f"Expected job found by mixed ids in output: {output}"
