Add emacs and vim editing settings to the bottom of *.py files.
[scons.git] / test / Scanner / multi-env.py
1 #!/usr/bin/env python
2 #
3 # __COPYRIGHT__
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
17 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 #
24
25 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
26
27
28 """
29 Verifies that using the same source file in different environments
30 will get the proper scanner for the environment being used.
31 """
32
33 import TestSCons
34
35 _python_ = TestSCons._python_
36
37 test = TestSCons.TestSCons()
38
39
40 test.write('SConstruct', """
41 import re
42
43 include_re = re.compile(r'^include\s+(\S+)$', re.M)
44 input_re = re.compile(r'^input\s+(\S+)$', re.M)
45
46 scan1 = Scanner(name = 'Include',
47                 function = lambda N,E,P,A: A.findall(N.get_text_contents()),
48                 argument = include_re,
49                 skeys = ['.inp'])
50
51 scan2 = Scanner(name = 'Input',
52                 function = lambda N,E,P,A: A.findall(N.get_text_contents()),
53                 argument = input_re,
54                 skeys = ['.inp'])
55
56 env1 = Environment()
57 env2 = Environment()
58
59 env1.Append(SCANNERS=scan1)
60 env2.Append(SCANNERS=scan2)
61
62 env1.Command('frog.1', 'frog.inp', r'%(_python_)s do_incl.py $TARGET $SOURCES')
63 env2.Command('frog.2', 'frog.inp', r'%(_python_)s do_inp.py $TARGET $SOURCES')
64
65 """ % locals())
66
67 process = r"""
68 import sys
69
70 def process(infp, outfp):
71     prefix = '%(command)s '
72     l = len(prefix)
73     for line in infp.readlines():
74         if line[:l] == prefix:
75             process(open(line[l:-1], 'rb'), outfp)
76         else:
77             outfp.write(line)
78
79 process(open(sys.argv[2], 'rb'),
80         open(sys.argv[1], 'wb'))
81 sys.exit(0)
82 """
83
84 test.write('do_incl.py', process % { 'command' : 'include' })
85 test.write('do_inp.py', process % { 'command' : 'input' })
86
87 test.write('frog.inp', """\
88 include sound1
89 input sound2
90 """)
91
92 test.write('sound1', 'croak\n')
93 test.write('sound2', 'ribbet\n')
94
95 expect = test.wrap_stdout("""\
96 %(_python_)s do_incl.py frog.1 frog.inp
97 %(_python_)s do_inp.py frog.2 frog.inp
98 """ % locals())
99
100 test.run(arguments='.', stdout=expect)
101
102 test.must_match('frog.1', 'croak\ninput sound2\n')
103 test.must_match('frog.2', 'include sound1\nribbet\n')
104
105 test.write('sound2', 'rudeep\n')
106
107 expect = test.wrap_stdout("""\
108 %(_python_)s do_inp.py frog.2 frog.inp
109 """ % locals())
110
111 test.run(arguments='.', stdout=expect)
112
113 test.must_match('frog.1', 'croak\ninput sound2\n')
114 test.must_match('frog.2', 'include sound1\nrudeep\n')
115
116 test.pass_test()
117
118 # Local Variables:
119 # tab-width:4
120 # indent-tabs-mode:nil
121 # End:
122 # vim: set expandtab tabstop=4 shiftwidth=4: