Forward port benchmark for type checking
[scons.git] / test / Command.py
blob5abdf169a6f8e2270b34f0af8df87b594568636b
1 #!/usr/bin/env python
3 # __COPYRIGHT__
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:
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
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.
24 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
26 import TestSCons
28 python = TestSCons.python
29 _python_ = TestSCons._python_
31 test = TestSCons.TestSCons()
33 test.subdir('expand_chdir_sub')
34 test.subdir('sub')
36 build_py = r"""
37 import sys
38 with open(sys.argv[1], 'w') as f, open(sys.argv[2], 'r') as infp:
39 f.write(infp.read())
40 """
41 test.write('build.py', build_py)
42 test.write(['expand_chdir_sub', 'subbuild.py'], build_py)
44 test.write('SConstruct', """
45 import os
46 import sys
48 def buildIt(env, target, source):
49 with open(str(target[0]), 'w') as f, open(str(source[0]), 'r') as infp:
50 xyzzy = env.get('XYZZY', '')
51 if xyzzy:
52 f.write(xyzzy + '\\n')
53 f.write(infp.read())
54 return 0
56 def sub(env, target, source):
57 target = str(target[0])
58 source = str(source[0])
59 with open(target, 'w') as t:
60 for f in sorted(os.listdir(source)):
61 with open(os.path.join(source, f), 'r') as s:
62 t.write(s.read())
63 return 0
65 def source_scanner(node, env, path, builder):
66 print("Source scanner node=", node, "builder =", builder,file=sys.stderr)
67 return []
69 def target_scanner(node, env, path, builder):
70 print("Target scanner node=", node, "builder =", builder,file=sys.stderr)
71 return []
73 def factory(node,*lst,**kw):
74 print("factory called on:",node,file=sys.stderr)
75 return env.File(node)
77 env = Environment(COPY_THROUGH_TEMP = r'%(_python_)s build.py .tmp $SOURCE' + '\\n' + r'%(_python_)s build.py $TARGET .tmp',
78 EXPAND = '$COPY_THROUGH_TEMP')
79 env.Command(target = 'f1.out', source = 'f1.in',
80 action = buildIt)
81 env.Command(target = 'f2.out', source = 'f2.in',
82 action = r'%(_python_)s build.py temp2 $SOURCES' + '\\n' + r'%(_python_)s build.py $TARGET temp2')
83 env.Command(target = 'f3.out', source = 'f3.in',
84 action = [ [ r'%(_python_)s', 'build.py', 'temp3', '$SOURCES' ],
85 [ r'%(_python_)s', 'build.py', '$TARGET', 'temp3'] ])
86 Command(target = 'f4.out', source = 'sub', action = sub)
87 env.Command(target = 'f5.out', source = 'f5.in', action = buildIt,
88 XYZZY='XYZZY is set')
89 env.Command(target = 'f5.out', source = 'f5.in', action = buildIt,
90 XYZZY='XYZZY is set')
91 Command(target = 'f6.out', source = 'f6.in',
92 action = r'%(_python_)s build.py f6.out f6.in')
93 env.Command(target = 'f7.out', source = 'f7.in',
94 action = r'%(_python_)s build.py $TARGET $SOURCE')
95 Command(target = 'f8.out', source = 'f8.in',
96 action = r'%(_python_)s build.py $TARGET $SOURCE')
97 env.Command(target = 'f7s.out', source = 'f7.in',
98 action = r'%(_python_)s build.py $TARGET $SOURCE',
99 target_scanner=Scanner(lambda node, env, path: target_scanner(node, env, path, "w-env")),
100 source_scanner=Scanner(lambda node, env, path: source_scanner(node, env, path, "w-env")))
101 Command(target = 'f8s.out', source = 'f8.in',
102 action = r'%(_python_)s build.py $TARGET $SOURCE',
103 target_scanner=Scanner(lambda node, env, path: target_scanner(node, env, path, "wo-env")),
104 source_scanner=Scanner(lambda node, env, path: source_scanner(node, env, path, "wo-env")))
105 Command(target = 'f8f.out', source = 'f8.in',
106 action = r'%(_python_)s build.py $TARGET $SOURCE',
107 target_factory=factory,
108 source_factory=factory
110 env.Command(target = 'f9.out', source = 'f9.in',
111 action = r'$EXPAND')
112 env.Command(target = '${F10}.out', source = '${F10}.in',
113 action = r'%(_python_)s build.py $TARGET $SOURCE',
114 F10 = 'f10')
115 env['SUB'] = 'expand_chdir_sub'
116 env.Command(target = '$SUB/${F11}.out', source = '$SUB/${F11}.in',
117 action = r'%(_python_)s subbuild.py ${F11}.out ${F11}.in',
118 chdir = '$SUB',
119 F11 = 'f11')
120 """ % locals())
122 test.write('f1.in', "f1.in\n")
123 test.write('f2.in', "f2.in\n")
124 test.write('f3.in', "f3.in\n")
125 test.write(['sub', 'f4a'], "sub/f4a\n")
126 test.write(['sub', 'f4b'], "sub/f4b\n")
127 test.write(['sub', 'f4c'], "sub/f4c\n")
128 test.write('f5.in', "f5.in\n")
129 test.write('f6.in', "f6.in\n")
130 test.write('f7.in', "f7.in\n")
131 test.write('f8.in', "f8.in\n")
132 test.write('f9.in', "f9.in\n")
133 test.write('f10.in', "f10.in\n")
134 test.write(['expand_chdir_sub', 'f11.in'], "expand_chdir_sub/f11.in\n")
136 test_str = r'''factory called on: f8.in
137 factory called on: f8f.out
138 Source scanner node= f7.in builder = w-env
139 Target scanner node= f7s.out builder = w-env
140 Source scanner node= f8.in builder = wo-env
141 Target scanner node= f8s.out builder = wo-env
144 out = test.run(arguments='.',
145 stderr=test_str,
146 match=TestSCons.match_re_dotall)
149 test.must_match('f1.out', "f1.in\n", mode='r')
150 test.must_match('f2.out', "f2.in\n", mode='r')
151 test.must_match('f3.out', "f3.in\n", mode='r')
152 test.must_match('f4.out', "sub/f4a\nsub/f4b\nsub/f4c\n", mode='r')
153 test.must_match('f5.out', "XYZZY is set\nf5.in\n", mode='r')
154 test.must_match('f6.out', "f6.in\n", mode='r')
155 test.must_match('f7.out', "f7.in\n", mode='r')
156 test.must_match('f8.out', "f8.in\n", mode='r')
157 test.must_match('f7s.out', "f7.in\n", mode='r')
158 test.must_match('f8s.out', "f8.in\n", mode='r')
159 test.must_match('f9.out', "f9.in\n", mode='r')
160 test.must_match('f10.out', "f10.in\n", mode='r')
161 test.must_match(['expand_chdir_sub', 'f11.out'],
162 "expand_chdir_sub/f11.in\n", mode='r')
164 test.pass_test()
166 # Local Variables:
167 # tab-width:4
168 # indent-tabs-mode:nil
169 # End:
170 # vim: set expandtab tabstop=4 shiftwidth=4: