summaryrefslogtreecommitdiff
path: root/lib/spack/spack/test/spec_syntax.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spack/spack/test/spec_syntax.py')
-rw-r--r--lib/spack/spack/test/spec_syntax.py136
1 files changed, 99 insertions, 37 deletions
diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py
index ec92cc877e..41a75a3fcb 100644
--- a/lib/spack/spack/test/spec_syntax.py
+++ b/lib/spack/spack/test/spec_syntax.py
@@ -31,63 +31,97 @@ from spack.spec import (
)
from spack.variant import DuplicateVariantError
-# Sample output for a complex lexing.
-complex_lex = [
+# Building blocks for complex lexing.
+complex_root = [
Token(sp.ID, "mvapich_foo"),
- Token(sp.DEP),
- Token(sp.ID, "_openmpi"),
- Token(sp.AT),
- Token(sp.ID, "1.2"),
- Token(sp.COLON),
- Token(sp.ID, "1.4"),
- Token(sp.COMMA),
- Token(sp.ID, "1.6"),
+]
+
+kv_root = [
+ Token(sp.ID, "mvapich_foo"),
+ Token(sp.ID, "debug"),
+ Token(sp.EQ),
+ Token(sp.VAL, "4"),
+]
+
+complex_compiler = [
Token(sp.PCT),
Token(sp.ID, "intel"),
- Token(sp.AT),
+]
+
+complex_compiler_v = [
+ Token(sp.VER, "@12.1"),
+ Token(sp.COLON),
+ Token(sp.ID, "12.6"),
+]
+
+complex_compiler_v_space = [
+ Token(sp.VER, "@"),
Token(sp.ID, "12.1"),
Token(sp.COLON),
Token(sp.ID, "12.6"),
- Token(sp.ON),
- Token(sp.ID, "debug"),
- Token(sp.OFF),
- Token(sp.ID, "qt_4"),
+]
+
+complex_dep1 = [
Token(sp.DEP),
- Token(sp.ID, "stackwalker"),
- Token(sp.AT),
- Token(sp.ID, "8.1_1e"),
+ Token(sp.ID, "_openmpi"),
+ Token(sp.VER, "@1.2"),
+ Token(sp.COLON),
+ Token(sp.ID, "1.4"),
+ Token(sp.COMMA),
+ Token(sp.ID, "1.6"),
]
-# Another sample lexer output with a kv pair.
-kv_lex = [
- Token(sp.ID, "mvapich_foo"),
- Token(sp.ID, "debug"),
- Token(sp.EQ),
- Token(sp.VAL, "4"),
+complex_dep1_space = [
Token(sp.DEP),
Token(sp.ID, "_openmpi"),
- Token(sp.AT),
+ Token(sp.VER, "@"),
Token(sp.ID, "1.2"),
Token(sp.COLON),
Token(sp.ID, "1.4"),
Token(sp.COMMA),
Token(sp.ID, "1.6"),
- Token(sp.PCT),
- Token(sp.ID, "intel"),
- Token(sp.AT),
- Token(sp.ID, "12.1"),
- Token(sp.COLON),
- Token(sp.ID, "12.6"),
+]
+
+complex_dep1_var = [
Token(sp.ON),
Token(sp.ID, "debug"),
Token(sp.OFF),
Token(sp.ID, "qt_4"),
+]
+
+complex_dep2 = [
+ Token(sp.DEP),
+ Token(sp.ID, "stackwalker"),
+ Token(sp.VER, "@8.1_1e"),
+]
+
+complex_dep2_space = [
Token(sp.DEP),
Token(sp.ID, "stackwalker"),
- Token(sp.AT),
+ Token(sp.VER, "@"),
Token(sp.ID, "8.1_1e"),
]
+# Sample output from complex lexing
+complex_lex = (
+ complex_root
+ + complex_dep1
+ + complex_compiler
+ + complex_compiler_v
+ + complex_dep1_var
+ + complex_dep2
+)
+
+# Another sample lexer output with a kv pair.
+kv_lex = (
+ kv_root
+ + complex_dep1
+ + complex_compiler
+ + complex_compiler_v_space
+ + complex_dep1_var
+ + complex_dep2_space
+)
+
class TestSpecSyntax(object):
# ========================================================================
@@ -120,7 +154,7 @@ class TestSpecSyntax(object):
lex_output = sp.SpecLexer().lex(spec)
assert len(tokens) == len(lex_output), "unexpected number of tokens"
for tok, spec_tok in zip(tokens, lex_output):
- if tok.type == sp.ID or tok.type == sp.VAL:
+ if tok.type in (sp.ID, sp.VAL, sp.VER):
assert tok == spec_tok
else:
# Only check the type for non-identifiers.
@@ -716,14 +750,22 @@ class TestSpecSyntax(object):
)
def test_spaces_between_dependences(self):
+ lex_key = (
+ complex_root
+ + complex_dep1
+ + complex_compiler
+ + complex_compiler_v
+ + complex_dep1_var
+ + complex_dep2_space
+ )
self.check_lex(
- complex_lex,
+ lex_key,
"mvapich_foo "
"^_openmpi@1.2:1.4,1.6%intel@12.1:12.6+debug -qt_4 "
"^stackwalker @ 8.1_1e",
)
self.check_lex(
- complex_lex,
+ lex_key,
"mvapich_foo "
"^_openmpi@1.2:1.4,1.6%intel@12.1:12.6+debug~qt_4 "
"^stackwalker @ 8.1_1e",
@@ -738,14 +780,30 @@ class TestSpecSyntax(object):
)
def test_way_too_many_spaces(self):
+ lex_key = (
+ complex_root
+ + complex_dep1
+ + complex_compiler
+ + complex_compiler_v_space
+ + complex_dep1_var
+ + complex_dep2_space
+ )
self.check_lex(
- complex_lex,
+ lex_key,
"mvapich_foo "
"^ _openmpi @1.2 : 1.4 , 1.6 % intel @ 12.1 : 12.6 + debug - qt_4 "
"^ stackwalker @ 8.1_1e",
)
+ lex_key = (
+ complex_root
+ + complex_dep1
+ + complex_compiler
+ + complex_compiler_v_space
+ + complex_dep1_var
+ + complex_dep2_space
+ )
self.check_lex(
- complex_lex,
+ lex_key,
"mvapich_foo "
"^ _openmpi @1.2 : 1.4 , 1.6 % intel @ 12.1 : 12.6 + debug ~ qt_4 "
"^ stackwalker @ 8.1_1e",
@@ -838,6 +896,10 @@ class TestSpecSyntax(object):
# Check that we can compare without raising an error
assert a <= b or b < a
+ def test_git_ref_specs_with_variants(self):
+ spec_str = "develop-branch-version@git.{h}=develop+var1+var2".format(h="a" * 40)
+ self.check_parse(spec_str)
+
def test_git_ref_spec_equivalences(self, mock_packages, mock_stage):
s1 = sp.Spec("develop-branch-version@git.{hash}=develop".format(hash="a" * 40))
s2 = sp.Spec("develop-branch-version@git.{hash}=develop".format(hash="b" * 40))