# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import pytest
import spack.solver.asp
import spack.spec
pytestmark = [
pytest.mark.not_on_windows("Windows uses old concretizer"),
pytest.mark.only_clingo("Original concretizer does not support configuration requirements"),
]
version_error_messages = [
"Cannot satisfy 'fftw@:1.0' and 'fftw@1.1:",
" required because quantum-espresso depends on fftw@:1.0",
" required because quantum-espresso ^fftw@1.1: requested explicitly",
" required because quantum-espresso ^fftw@1.1: requested explicitly",
]
external_error_messages = [
(
"Attempted to build package quantum-espresso which is not buildable and does not have"
" a satisfying external"
),
(
" 'quantum-espresso~veritas' is an external constraint for quantum-espresso"
" which was not satisfied"
),
" 'quantum-espresso+veritas' required",
" required because quantum-espresso+veritas requested explicitly",
]
variant_error_messages = [
"'fftw' required multiple values for single-valued variant 'mpi'",
" Requested '~mpi' and '+mpi'",
" required because quantum-espresso depends on fftw+mpi when +invino",
" required because quantum-espresso+invino ^fftw~mpi requested explicitly",
" required because quantum-espresso+invino ^fftw~mpi requested explicitly",
]
external_config = {
"packages:quantum-espresso": {
"buildable": False,
"externals": [{"spec": "quantum-espresso@1.0~veritas", "prefix": "/path/to/qe"}],
}
}
@pytest.mark.parametrize(
"error_messages,config_set,spec",
[
(version_error_messages, {}, "quantum-espresso^fftw@1.1:"),
(external_error_messages, external_config, "quantum-espresso+veritas"),
(variant_error_messages, {}, "quantum-espresso+invino^fftw~mpi"),
],
)
def test_error_messages(error_messages, config_set, spec, mock_packages, mutable_config):
for path, conf in config_set.items():
spack.config.set(path, conf)
with pytest.raises(spack.solver.asp.UnsatisfiableSpecError) as e:
_ = spack.spec.Spec(spec).concretized()
for em in error_messages:
assert em in str(e.value)