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


# Setup
@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_slurm_running()


class Test_mem_mincpus_tmp:
    def test_mincpus(self):
        """Verify node configuration specification --mincpus option"""

        # Submit a job with invalid mincpus requirement
        min_cpus = 999999
        exit_code = atf.run_command_exit(f"srun --mincpus={min_cpus} true")
        assert exit_code != 0, "srun ran with an invalid value for --mincpus"

        # Submit a job with valid mincpus requirement
        min_cpus = 1
        exit_code = atf.run_command_exit(f"srun --mincpus={min_cpus} true")
        assert exit_code == 0, "srun did not run with a valid value for --mincpus"

    def test_mem(self):
        """Verify node configuration specification --mem option"""

        # Submit a job with invalid mem requirement
        mem = 999999
        exit_code = atf.run_command_exit(f"srun --mem={mem} true")
        assert exit_code != 0, "srun ran with an invalid value for --mem"

        # Submit a job with valid mem requirement
        mem = 1
        exit_code = atf.run_command_exit(f"srun --mem={mem} true")
        assert exit_code == 0, "srun did not run with a valid value for --mem"

    def test_tmp(self):
        """Verify node configuration specification --tmp option"""

        # Submit a job with invalid tmp requirement
        tmp_disk = 999999
        exit_code = atf.run_command_exit(f"srun --tmp={tmp_disk} true")
        assert exit_code != 0, "srun ran with an invalid value for --tmp"

        # Submit a job with valid tmp requirement
        tmp_disk = 0
        exit_code = atf.run_command_exit(f"srun --tmp={tmp_disk} true")
        assert exit_code == 0, "srun did not run with a valid value for --tmp"
