diff options
Diffstat (limited to 'lib/spack/spack/test/spec_syntax.py')
-rw-r--r-- | lib/spack/spack/test/spec_syntax.py | 136 |
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)) |