summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/AddOption/longopts.py60
-rw-r--r--test/Configure/Streamer1.py85
-rw-r--r--test/D/CoreScanner/Common/__init__.py0
-rw-r--r--test/D/CoreScanner/Common/common.py99
-rw-r--r--test/D/CoreScanner/Common/sconstest.skip0
-rw-r--r--test/D/CoreScanner/Image/SConstruct_template9
-rw-r--r--test/D/CoreScanner/Image/ignored.d3
-rw-r--r--test/D/CoreScanner/Image/module1.d3
-rw-r--r--test/D/CoreScanner/Image/module2.d3
-rw-r--r--test/D/CoreScanner/Image/module3.di3
-rw-r--r--test/D/CoreScanner/Image/p/ignored.d3
-rw-r--r--test/D/CoreScanner/Image/p/submodule1.d3
-rw-r--r--test/D/CoreScanner/Image/p/submodule2.d3
-rw-r--r--test/D/CoreScanner/Image/test1.d9
-rw-r--r--test/D/CoreScanner/Image/test2.d11
-rw-r--r--test/D/CoreScanner/sconstest-dmd.py37
-rw-r--r--test/D/CoreScanner/sconstest-gdc.py37
-rw-r--r--test/D/CoreScanner/sconstest-ldc.py37
-rw-r--r--test/D/DMD2.py64
-rw-r--r--test/D/DMD2_Alt.py64
-rw-r--r--test/D/GDC.py64
-rw-r--r--test/D/GDC_Alt.py64
-rw-r--r--test/D/HSTeoh/ArLibIssue/SConstruct_template3
-rw-r--r--test/D/HSTeoh/ArLibIssue/a.d0
-rw-r--r--test/D/HSTeoh/ArLibIssue/b.d0
-rw-r--r--test/D/HSTeoh/Common/__init__.py0
-rw-r--r--test/D/HSTeoh/Common/arLibIssue.py63
-rw-r--r--test/D/HSTeoh/Common/libCompileOptions.py63
-rw-r--r--test/D/HSTeoh/Common/linkingProblem.py61
-rw-r--r--test/D/HSTeoh/Common/sconstest.skip0
-rw-r--r--test/D/HSTeoh/Common/singleStringCannotBeMultipleOptions.py66
-rw-r--r--test/D/HSTeoh/LibCompileOptions/SConstruct_template9
-rw-r--r--test/D/HSTeoh/LibCompileOptions/mylib.d0
-rw-r--r--test/D/HSTeoh/LibCompileOptions/prog.d3
-rw-r--r--test/D/HSTeoh/LinkingProblem/SConstruct_template20
-rw-r--r--test/D/HSTeoh/LinkingProblem/cprog.c7
-rw-r--r--test/D/HSTeoh/LinkingProblem/ncurs_impl.c13
-rw-r--r--test/D/HSTeoh/LinkingProblem/prog.d13
-rw-r--r--test/D/HSTeoh/README.txt1
-rw-r--r--test/D/HSTeoh/SingleStringCannotBeMultipleOptions/SConstruct_template16
-rw-r--r--test/D/HSTeoh/SingleStringCannotBeMultipleOptions/cmod.c5
-rw-r--r--test/D/HSTeoh/SingleStringCannotBeMultipleOptions/mod1.d6
-rw-r--r--test/D/HSTeoh/SingleStringCannotBeMultipleOptions/proj.d13
-rw-r--r--test/D/HSTeoh/sconstest-arLibIssue_dmd.py37
-rw-r--r--test/D/HSTeoh/sconstest-arLibIssue_gdc.py37
-rw-r--r--test/D/HSTeoh/sconstest-arLibIssue_ldc.py38
-rw-r--r--test/D/HSTeoh/sconstest-libCompileOptions_dmd.py37
-rw-r--r--test/D/HSTeoh/sconstest-libCompileOptions_gdc.py37
-rw-r--r--test/D/HSTeoh/sconstest-libCompileOptions_ldc.py38
-rw-r--r--test/D/HSTeoh/sconstest-linkingProblem_dmd.py37
-rw-r--r--test/D/HSTeoh/sconstest-linkingProblem_gdc.py37
-rw-r--r--test/D/HSTeoh/sconstest-linkingProblem_ldc.py38
-rw-r--r--test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_dmd.py37
-rw-r--r--test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_gdc.py37
-rw-r--r--test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_ldc.py37
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/Common/__init__.py0
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/Common/common.py68
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/Common/sconstest.skip0
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/Image/SConstruct_template9
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/Image/helloWorld.d6
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/sconstest-dmd.py37
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/sconstest-gdc.py37
-rw-r--r--test/D/HelloWorld/CompileAndLinkOneStep/sconstest-ldc.py37
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/Common/__init__.py0
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/Common/common.py68
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/Common/sconstest.skip0
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/Image/SConstruct_template11
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/Image/helloWorld.d6
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-dmd.py37
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-gdc.py37
-rw-r--r--test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-ldc.py37
-rw-r--r--test/D/LDC.py71
-rw-r--r--test/D/LDC_Alt.py71
-rw-r--r--test/D/MixedDAndC/Common/__init__.py0
-rw-r--r--test/D/MixedDAndC/Common/common.py56
-rw-r--r--test/D/MixedDAndC/Common/sconstest.skip0
-rw-r--r--test/D/MixedDAndC/Image/SConstruct13
-rw-r--r--test/D/MixedDAndC/Image/cmod.c3
-rw-r--r--test/D/MixedDAndC/Image/dmod.d6
-rw-r--r--test/D/MixedDAndC/Image/proj.d12
-rw-r--r--test/D/MixedDAndC/sconstest-dmd.py37
-rw-r--r--test/D/MixedDAndC/sconstest-gdc.py37
-rw-r--r--test/D/MixedDAndC/sconstest-ldc.py37
-rwxr-xr-xtest/D/Support/executablesSearch.py67
-rw-r--r--test/D/Support/sconstest.skip0
-rw-r--r--test/Depends/spurious-rebuilds.py72
-rw-r--r--test/Interactive/version.py12
-rw-r--r--test/option-v.py10
-rw-r--r--test/runtest/qmtest.py111
-rw-r--r--test/runtest/testargv.py75
-rw-r--r--test/update-release-info/update-release-info.py2
91 files changed, 2426 insertions, 126 deletions
diff --git a/test/AddOption/longopts.py b/test/AddOption/longopts.py
new file mode 100644
index 00000000..47ae4f17
--- /dev/null
+++ b/test/AddOption/longopts.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Verifies that the default name matching of optparse for long options
+gets properly suppressed. We don't allow for partial matching
+of argument names, because it would lead to trouble in the test
+case below...
+"""
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.write('SConstruct', """\
+AddOption('--myargument', dest='myargument', type='string', default='gully')
+AddOption('--myarg', dest='myarg', type='string', default='balla')
+print("myargument: " + str(GetOption('myargument')))
+print("myarg: " + str(GetOption('myarg')))
+""")
+
+test.run('-Q -q .',
+ stdout="myargument: gully\nmyarg: balla\n")
+
+test.run('-Q -q . --myargument=helloworld',
+ stdout="myargument: helloworld\nmyarg: balla\n")
+
+test.run('-Q -q . --myarg=helloworld',
+ stdout="myargument: gully\nmyarg: helloworld\n")
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/Configure/Streamer1.py b/test/Configure/Streamer1.py
new file mode 100644
index 00000000..8f353087
--- /dev/null
+++ b/test/Configure/Streamer1.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test for BitBucket PR 126:
+
+SConf doesn't work well with 'io' module on pre-3.0 Python. This is because
+io.StringIO (used by SCons.SConf.Streamer) accepts only unicode strings.
+Non-unicode input causes it to raise an exception.
+"""
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.write('SConstruct', """
+# SConstruct
+#
+# The CheckHello should return 'yes' if everything works fine. Otherwise it
+# returns 'failed'.
+#
+def hello(target, source, env):
+ import traceback
+ try:
+ print 'hello!\\n' # this breaks the script
+ with open(env.subst('$TARGET', target = target),'w') as f:
+ f.write('yes')
+ except:
+ # write to file, as stdout/stderr is broken
+ traceback.print_exc(file=open('traceback','w'))
+ return 0
+
+def CheckHello(context):
+ import sys
+ context.Display('Checking whether hello works... ')
+ stat,out = context.TryAction(hello,'','.in')
+ if stat and out:
+ context.Result(out)
+ else:
+ context.Result('failed')
+ return out
+
+env = Environment()
+cfg = Configure(env)
+
+cfg.AddTest('CheckHello', CheckHello)
+cfg.CheckHello()
+
+env = cfg.Finish()
+""")
+
+test.run(arguments = '.')
+test.must_contain_all_lines(test.stdout(), ['Checking whether hello works... yes'])
+test.must_not_exist('traceback')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/CoreScanner/Common/__init__.py b/test/D/CoreScanner/Common/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/CoreScanner/Common/__init__.py
diff --git a/test/D/CoreScanner/Common/common.py b/test/D/CoreScanner/Common/common.py
new file mode 100644
index 00000000..657e83ee
--- /dev/null
+++ b/test/D/CoreScanner/Common/common.py
@@ -0,0 +1,99 @@
+"""
+Verify that the D scanner can return multiple modules imported by
+a single statement.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ _obj = TestSCons._obj
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('Image')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format(tool))
+
+ arguments = 'test1%(_obj)s test2%(_obj)s' % locals()
+
+ if tool == 'dmd':
+ # The gdmd executable in Debian Unstable as at 2012-05-12, version 4.6.3 puts out messages on stderr
+ # that cause inappropriate failure of the tests, so simply ignore them.
+ test.run(arguments=arguments, stderr=None)
+ else:
+ test.run(arguments=arguments)
+
+ test.up_to_date(arguments=arguments)
+
+ test.write(['module2.d'], """\
+module module2;
+
+int something_else;
+""")
+
+ if tool == 'dmd':
+ # The gdmd executable in Debian Unstable as at 2012-05-12, version 4.6.3 puts out messages on stderr
+ # that cause inappropriate failure of the tests, so simply ignore them.
+ test.not_up_to_date(arguments=arguments, stderr=None)
+ else:
+ test.not_up_to_date(arguments=arguments)
+
+ test.up_to_date(arguments=arguments)
+
+ test.write(['p', 'submodule2.d'], """\
+module p.submodule2;
+
+int something_else;
+""")
+
+ if tool == 'dmd':
+ # The gdmd executable in Debian Unstable as at 2012-05-12, version 4.6.3 puts out messages on stderr
+ # that cause inappropriate failure of the tests, so simply ignore them.
+ test.not_up_to_date(arguments=arguments, stderr=None)
+ else:
+ test.not_up_to_date(arguments=arguments)
+
+ test.up_to_date(arguments=arguments)
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/CoreScanner/Common/sconstest.skip b/test/D/CoreScanner/Common/sconstest.skip
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/CoreScanner/Common/sconstest.skip
diff --git a/test/D/CoreScanner/Image/SConstruct_template b/test/D/CoreScanner/Image/SConstruct_template
new file mode 100644
index 00000000..a128c67b
--- /dev/null
+++ b/test/D/CoreScanner/Image/SConstruct_template
@@ -0,0 +1,9 @@
+# -*- mode:python; coding:utf-8; -*-
+
+import os
+
+environment = Environment(
+ ENV=os.environ,
+ tools=['link', '{}'])
+environment.Program('test1.d')
+environment.Program('test2.d')
diff --git a/test/D/CoreScanner/Image/ignored.d b/test/D/CoreScanner/Image/ignored.d
new file mode 100644
index 00000000..5b54a07b
--- /dev/null
+++ b/test/D/CoreScanner/Image/ignored.d
@@ -0,0 +1,3 @@
+module ignored;
+
+int something;
diff --git a/test/D/CoreScanner/Image/module1.d b/test/D/CoreScanner/Image/module1.d
new file mode 100644
index 00000000..487c3583
--- /dev/null
+++ b/test/D/CoreScanner/Image/module1.d
@@ -0,0 +1,3 @@
+module module1;
+
+int something;
diff --git a/test/D/CoreScanner/Image/module2.d b/test/D/CoreScanner/Image/module2.d
new file mode 100644
index 00000000..198fb748
--- /dev/null
+++ b/test/D/CoreScanner/Image/module2.d
@@ -0,0 +1,3 @@
+module module2;
+
+int something;
diff --git a/test/D/CoreScanner/Image/module3.di b/test/D/CoreScanner/Image/module3.di
new file mode 100644
index 00000000..effd4ebe
--- /dev/null
+++ b/test/D/CoreScanner/Image/module3.di
@@ -0,0 +1,3 @@
+module module3;
+
+int something;
diff --git a/test/D/CoreScanner/Image/p/ignored.d b/test/D/CoreScanner/Image/p/ignored.d
new file mode 100644
index 00000000..43d2bd87
--- /dev/null
+++ b/test/D/CoreScanner/Image/p/ignored.d
@@ -0,0 +1,3 @@
+module p.ignored;
+
+int something;
diff --git a/test/D/CoreScanner/Image/p/submodule1.d b/test/D/CoreScanner/Image/p/submodule1.d
new file mode 100644
index 00000000..1ec03693
--- /dev/null
+++ b/test/D/CoreScanner/Image/p/submodule1.d
@@ -0,0 +1,3 @@
+module p.submodule1;
+
+int something;
diff --git a/test/D/CoreScanner/Image/p/submodule2.d b/test/D/CoreScanner/Image/p/submodule2.d
new file mode 100644
index 00000000..57a28256
--- /dev/null
+++ b/test/D/CoreScanner/Image/p/submodule2.d
@@ -0,0 +1,3 @@
+module p.submodule2;
+
+int something;
diff --git a/test/D/CoreScanner/Image/test1.d b/test/D/CoreScanner/Image/test1.d
new file mode 100644
index 00000000..d386d977
--- /dev/null
+++ b/test/D/CoreScanner/Image/test1.d
@@ -0,0 +1,9 @@
+import module1;
+import module2;
+import module3;
+import p.submodule1;
+import p.submodule2;
+
+int main() {
+ return 0;
+}
diff --git a/test/D/CoreScanner/Image/test2.d b/test/D/CoreScanner/Image/test2.d
new file mode 100644
index 00000000..f880d2fa
--- /dev/null
+++ b/test/D/CoreScanner/Image/test2.d
@@ -0,0 +1,11 @@
+import
+ module1,
+ module2,
+ module3;
+import
+ p.submodule1,
+ p.submodule2;
+
+int main() {
+ return 0;
+}
diff --git a/test/D/CoreScanner/sconstest-dmd.py b/test/D/CoreScanner/sconstest-dmd.py
new file mode 100644
index 00000000..df6ddebd
--- /dev/null
+++ b/test/D/CoreScanner/sconstest-dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the dmd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/CoreScanner/sconstest-gdc.py b/test/D/CoreScanner/sconstest-gdc.py
new file mode 100644
index 00000000..068f2c4a
--- /dev/null
+++ b/test/D/CoreScanner/sconstest-gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/CoreScanner/sconstest-ldc.py b/test/D/CoreScanner/sconstest-ldc.py
new file mode 100644
index 00000000..f61efbc6
--- /dev/null
+++ b/test/D/CoreScanner/sconstest-ldc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/DMD2.py b/test/D/DMD2.py
new file mode 100644
index 00000000..cc8ab93c
--- /dev/null
+++ b/test/D/DMD2.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Amended by Russel Winder <russel@russel.org.uk> 2010-05-05
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+_exe = TestSCons._exe
+test = TestSCons.TestSCons()
+
+if not test.where_is('dmd') and not test.where_is('gdmd'):
+ test.skip_test("Could not find 'dmd' or 'gdmd', skipping test.\n")
+
+test.write('SConstruct', """\
+import os
+env = Environment(tools=['link', 'dmd'], ENV=os.environ)
+if env['PLATFORM'] == 'cygwin': env['OBJSUFFIX'] = '.obj' # trick DMD
+env.Program('foo', 'foo.d')
+""")
+
+test.write('foo.d', """\
+import std.stdio;
+int main(string[] args) {
+ printf("Hello!");
+ return 0;
+}
+""")
+
+test.run()
+
+test.run(program=test.workpath('foo'+_exe))
+
+test.fail_test(not test.stdout() == 'Hello!')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/DMD2_Alt.py b/test/D/DMD2_Alt.py
new file mode 100644
index 00000000..fbe2f2b8
--- /dev/null
+++ b/test/D/DMD2_Alt.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Amended by Russel Winder <russel@russel.org.uk> 2010-05-05
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+_exe = TestSCons._exe
+test = TestSCons.TestSCons()
+
+if not test.where_is('dmd') and not test.where_is('gdmd'):
+ test.skip_test("Could not find 'dmd' or 'gdmd', skipping test.\n")
+
+test.write('SConstruct', """\
+import os
+env = Environment(tools=['dmd', 'link'], ENV=os.environ)
+if env['PLATFORM'] == 'cygwin': env['OBJSUFFIX'] = '.obj' # trick DMD
+env.Program('foo', 'foo.d')
+""")
+
+test.write('foo.d', """\
+import std.stdio;
+int main(string[] args) {
+ printf("Hello!");
+ return 0;
+}
+""")
+
+test.run()
+
+test.run(program=test.workpath('foo'+_exe))
+
+test.fail_test(not test.stdout() == 'Hello!')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/GDC.py b/test/D/GDC.py
new file mode 100644
index 00000000..e24ec438
--- /dev/null
+++ b/test/D/GDC.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Amended by Russel Winder <russel@russel.org.uk> 2010-05-05
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+_exe = TestSCons._exe
+test = TestSCons.TestSCons()
+
+if not test.where_is('gdc'):
+ test.skip_test("Could not find 'gdc', skipping test.\n")
+
+test.write('SConstruct', """\
+import os
+env = Environment(tools=['link', 'gdc'], ENV=os.environ)
+if env['PLATFORM'] == 'cygwin': env['OBJSUFFIX'] = '.obj' # trick DMD
+env.Program('foo', 'foo.d')
+""")
+
+test.write('foo.d', """\
+import std.stdio;
+int main(string[] args) {
+ printf("Hello!");
+ return 0;
+}
+""")
+
+test.run()
+
+test.run(program=test.workpath('foo'+_exe))
+
+test.fail_test(not test.stdout() == 'Hello!')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/GDC_Alt.py b/test/D/GDC_Alt.py
new file mode 100644
index 00000000..cac79499
--- /dev/null
+++ b/test/D/GDC_Alt.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Amended by Russel Winder <russel@russel.org.uk> 2010-05-05
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+_exe = TestSCons._exe
+test = TestSCons.TestSCons()
+
+if not test.where_is('gdc'):
+ test.skip_test("Could not find 'gdc', skipping test.\n")
+
+test.write('SConstruct', """\
+import os
+env = Environment(tools=['gdc', 'link'], ENV=os.environ)
+if env['PLATFORM'] == 'cygwin': env['OBJSUFFIX'] = '.obj' # trick DMD
+env.Program('foo', 'foo.d')
+""")
+
+test.write('foo.d', """\
+import std.stdio;
+int main(string[] args) {
+ printf("Hello!");
+ return 0;
+}
+""")
+
+test.run()
+
+test.run(program=test.workpath('foo'+_exe))
+
+test.fail_test(not test.stdout() == 'Hello!')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/ArLibIssue/SConstruct_template b/test/D/HSTeoh/ArLibIssue/SConstruct_template
new file mode 100644
index 00000000..81f81f55
--- /dev/null
+++ b/test/D/HSTeoh/ArLibIssue/SConstruct_template
@@ -0,0 +1,3 @@
+env = Environment({})
+
+env.StaticLibrary('mylib', ['a.d', 'b.d'])
diff --git a/test/D/HSTeoh/ArLibIssue/a.d b/test/D/HSTeoh/ArLibIssue/a.d
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HSTeoh/ArLibIssue/a.d
diff --git a/test/D/HSTeoh/ArLibIssue/b.d b/test/D/HSTeoh/ArLibIssue/b.d
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HSTeoh/ArLibIssue/b.d
diff --git a/test/D/HSTeoh/Common/__init__.py b/test/D/HSTeoh/Common/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HSTeoh/Common/__init__.py
diff --git a/test/D/HSTeoh/Common/arLibIssue.py b/test/D/HSTeoh/Common/arLibIssue.py
new file mode 100644
index 00000000..fe5902be
--- /dev/null
+++ b/test/D/HSTeoh/Common/arLibIssue.py
@@ -0,0 +1,63 @@
+"""
+These tests check a problem with the lib/ar setting.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from SCons.Environment import Base
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('ArLibIssue')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format('tools=["{}", "ar"]'.format(tool)))
+
+ test.run()
+
+ test.must_exist(test.workpath('a.o'))
+ test.must_exist(test.workpath('b.o'))
+ test.must_exist(test.workpath('mylib.a' if Base()['PLATFORM'] == 'win32' else 'libmylib.a'))
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/Common/libCompileOptions.py b/test/D/HSTeoh/Common/libCompileOptions.py
new file mode 100644
index 00000000..dd95fc8e
--- /dev/null
+++ b/test/D/HSTeoh/Common/libCompileOptions.py
@@ -0,0 +1,63 @@
+"""
+These tests check a problem with the lib/ar setting.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from SCons.Environment import Base
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('LibCompileOptions')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format('tools=["{}", "link", "ar"]'.format(tool)))
+
+ test.run()
+
+ test.must_exist(test.workpath('mylib.o'))
+ test.must_exist(test.workpath('mylib.a' if Base()['PLATFORM'] == 'win32' else 'libmylib.a'))
+ test.must_exist(test.workpath('prog'))
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/Common/linkingProblem.py b/test/D/HSTeoh/Common/linkingProblem.py
new file mode 100644
index 00000000..59b409f4
--- /dev/null
+++ b/test/D/HSTeoh/Common/linkingProblem.py
@@ -0,0 +1,61 @@
+"""
+These tests check an issue with the LIBS environment variable.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('LinkingProblem')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format(tool))
+
+ test.run()
+
+ test.must_exist(test.workpath('ncurs_impl.o'))
+ test.must_exist(test.workpath('cprog'))
+ test.must_exist(test.workpath('prog'))
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/Common/sconstest.skip b/test/D/HSTeoh/Common/sconstest.skip
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HSTeoh/Common/sconstest.skip
diff --git a/test/D/HSTeoh/Common/singleStringCannotBeMultipleOptions.py b/test/D/HSTeoh/Common/singleStringCannotBeMultipleOptions.py
new file mode 100644
index 00000000..4dabf7bf
--- /dev/null
+++ b/test/D/HSTeoh/Common/singleStringCannotBeMultipleOptions.py
@@ -0,0 +1,66 @@
+"""
+These tests verify that SCons fails appropriately where the user has tried to supply multiple command line
+options via a single string rather than providing a list of strings, one string per option.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('SingleStringCannotBeMultipleOptions')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format(tool))
+
+ test.run(status=2, stdout=None, stderr=None)
+
+ result = {
+ 'dmd': ".*unrecognized switch '-m64 -O'.*",
+ 'gdc': ".*unrecognized command line option.*",
+ 'ldc': ".*Unknown command line argument '-m64 -O'.*",
+ }[tool]
+
+ test.fail_test(not test.match_re_dotall(test.stderr(), result))
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/LibCompileOptions/SConstruct_template b/test/D/HSTeoh/LibCompileOptions/SConstruct_template
new file mode 100644
index 00000000..7031f5c4
--- /dev/null
+++ b/test/D/HSTeoh/LibCompileOptions/SConstruct_template
@@ -0,0 +1,9 @@
+env = Environment({})
+
+env.Library('mylib', 'mylib.d')
+
+prog_env = env.Clone(
+ LIBS = ['mylib'],
+ LIBPATH = '#'
+ )
+prog_env.Program('prog', 'prog.d')
diff --git a/test/D/HSTeoh/LibCompileOptions/mylib.d b/test/D/HSTeoh/LibCompileOptions/mylib.d
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HSTeoh/LibCompileOptions/mylib.d
diff --git a/test/D/HSTeoh/LibCompileOptions/prog.d b/test/D/HSTeoh/LibCompileOptions/prog.d
new file mode 100644
index 00000000..33c14ce1
--- /dev/null
+++ b/test/D/HSTeoh/LibCompileOptions/prog.d
@@ -0,0 +1,3 @@
+int main() {
+ return 0;
+}
diff --git a/test/D/HSTeoh/LinkingProblem/SConstruct_template b/test/D/HSTeoh/LinkingProblem/SConstruct_template
new file mode 100644
index 00000000..6815cdf3
--- /dev/null
+++ b/test/D/HSTeoh/LinkingProblem/SConstruct_template
@@ -0,0 +1,20 @@
+# -*- mode:python; coding=utf-8; -*-
+
+import os
+
+environment = Environment(
+ ENV=os.environ,
+ tools = ['cc', 'link' , '{}'],
+ LIBS = ['ncurses'])
+
+environment.Object('ncurs_impl.o', 'ncurs_impl.c')
+
+environment.Program('prog', Split("""
+ prog.d
+ ncurs_impl.o
+"""))
+
+environment.Program('cprog', Split("""
+ cprog.c
+ ncurs_impl.o
+"""))
diff --git a/test/D/HSTeoh/LinkingProblem/cprog.c b/test/D/HSTeoh/LinkingProblem/cprog.c
new file mode 100644
index 00000000..674fd964
--- /dev/null
+++ b/test/D/HSTeoh/LinkingProblem/cprog.c
@@ -0,0 +1,7 @@
+extern void ncurs_init();
+extern void ncurs_cleanup();
+
+int main() {
+ ncurs_init();
+ ncurs_cleanup();
+}
diff --git a/test/D/HSTeoh/LinkingProblem/ncurs_impl.c b/test/D/HSTeoh/LinkingProblem/ncurs_impl.c
new file mode 100644
index 00000000..3ca6dd37
--- /dev/null
+++ b/test/D/HSTeoh/LinkingProblem/ncurs_impl.c
@@ -0,0 +1,13 @@
+/* Ncurses wrappers */
+#include <ncurses.h>
+
+void ncurs_init() {
+ initscr();
+ cbreak();
+ noecho();
+ keypad(stdscr, TRUE);
+}
+
+void ncurs_cleanup() {
+ endwin();
+}
diff --git a/test/D/HSTeoh/LinkingProblem/prog.d b/test/D/HSTeoh/LinkingProblem/prog.d
new file mode 100644
index 00000000..1337210e
--- /dev/null
+++ b/test/D/HSTeoh/LinkingProblem/prog.d
@@ -0,0 +1,13 @@
+/*
+ * Simple D program that links to ncurses via a C wrapping file.
+ */
+
+extern(C) {
+ void ncurs_init();
+ void ncurs_cleanup();
+}
+
+void main() {
+ ncurs_init();
+ ncurs_cleanup();
+}
diff --git a/test/D/HSTeoh/README.txt b/test/D/HSTeoh/README.txt
new file mode 100644
index 00000000..cb18b88b
--- /dev/null
+++ b/test/D/HSTeoh/README.txt
@@ -0,0 +1 @@
+The tests here are evolutions of test cases provided by H.S.Teoh via email.
diff --git a/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/SConstruct_template b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/SConstruct_template
new file mode 100644
index 00000000..89c603b1
--- /dev/null
+++ b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/SConstruct_template
@@ -0,0 +1,16 @@
+# -*- mode:python; coding=utf-8; -*-
+
+import os
+
+environment = Environment(
+ ENV=os.environ,
+ tools=['link', '{}'],
+ # It might be thought that a single string can contain multiple options space separated. Actually this
+ # is deemed to be a single option, so leads to an error.
+ DFLAGS = '-m64 -O')
+
+environment.Program('proj', Split("""
+proj.d
+mod1.d
+cmod.c
+"""))
diff --git a/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/cmod.c b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/cmod.c
new file mode 100644
index 00000000..41c57f3a
--- /dev/null
+++ b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/cmod.c
@@ -0,0 +1,5 @@
+/* This is a sample C module. */
+
+int csqr(int arg) {
+ return arg*arg;
+}
diff --git a/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/mod1.d b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/mod1.d
new file mode 100644
index 00000000..5f618020
--- /dev/null
+++ b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/mod1.d
@@ -0,0 +1,6 @@
+module mod1;
+import std.stdio;
+
+void print_msg() {
+ writeln("Hello, this is a test program for the new SCons D support");
+}
diff --git a/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/proj.d b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/proj.d
new file mode 100644
index 00000000..e97f9dd7
--- /dev/null
+++ b/test/D/HSTeoh/SingleStringCannotBeMultipleOptions/proj.d
@@ -0,0 +1,13 @@
+import std.stdio;
+import mod1;
+
+extern(C) {
+ int csqr(int arg);
+}
+
+void main() {
+ print_msg();
+
+ auto i = 17;
+ writefln("The square of %d is %d", i, csqr(i));
+}
diff --git a/test/D/HSTeoh/sconstest-arLibIssue_dmd.py b/test/D/HSTeoh/sconstest-arLibIssue_dmd.py
new file mode 100644
index 00000000..0b872b48
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-arLibIssue_dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the dmd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.arLibIssue import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-arLibIssue_gdc.py b/test/D/HSTeoh/sconstest-arLibIssue_gdc.py
new file mode 100644
index 00000000..45e1e363
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-arLibIssue_gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.arLibIssue import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-arLibIssue_ldc.py b/test/D/HSTeoh/sconstest-arLibIssue_ldc.py
new file mode 100644
index 00000000..7960d79a
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-arLibIssue_ldc.py
@@ -0,0 +1,38 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.arLibIssue import testForTool
+
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-libCompileOptions_dmd.py b/test/D/HSTeoh/sconstest-libCompileOptions_dmd.py
new file mode 100644
index 00000000..14f23487
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-libCompileOptions_dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the dmd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.libCompileOptions import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-libCompileOptions_gdc.py b/test/D/HSTeoh/sconstest-libCompileOptions_gdc.py
new file mode 100644
index 00000000..7b57546a
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-libCompileOptions_gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.libCompileOptions import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-libCompileOptions_ldc.py b/test/D/HSTeoh/sconstest-libCompileOptions_ldc.py
new file mode 100644
index 00000000..74343502
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-libCompileOptions_ldc.py
@@ -0,0 +1,38 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.libCompileOptions import testForTool
+
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-linkingProblem_dmd.py b/test/D/HSTeoh/sconstest-linkingProblem_dmd.py
new file mode 100644
index 00000000..f4bac72f
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-linkingProblem_dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.linkingProblem import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-linkingProblem_gdc.py b/test/D/HSTeoh/sconstest-linkingProblem_gdc.py
new file mode 100644
index 00000000..7346b664
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-linkingProblem_gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.linkingProblem import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-linkingProblem_ldc.py b/test/D/HSTeoh/sconstest-linkingProblem_ldc.py
new file mode 100644
index 00000000..72c19e42
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-linkingProblem_ldc.py
@@ -0,0 +1,38 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.linkingProblem import testForTool
+
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_dmd.py b/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_dmd.py
new file mode 100644
index 00000000..976f8207
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the dmd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.singleStringCannotBeMultipleOptions import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_gdc.py b/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_gdc.py
new file mode 100644
index 00000000..d65495ad
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.singleStringCannotBeMultipleOptions import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_ldc.py b/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_ldc.py
new file mode 100644
index 00000000..6718a886
--- /dev/null
+++ b/test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_ldc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.singleStringCannotBeMultipleOptions import testForTool
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/Common/__init__.py b/test/D/HelloWorld/CompileAndLinkOneStep/Common/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/Common/__init__.py
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/Common/common.py b/test/D/HelloWorld/CompileAndLinkOneStep/Common/common.py
new file mode 100644
index 00000000..618041bd
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/Common/common.py
@@ -0,0 +1,68 @@
+"""
+Support functions for all the tests.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('Image')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format(tool))
+
+ if tool == 'dmd':
+ # The gdmd executable in Debian Unstable as at 2012-05-12, version 4.6.3 puts out messages on stderr
+ # that cause inappropriate failure of the tests, so simply ignore them.
+ test.run(stderr=None)
+ else:
+ test.run()
+
+ test.must_exist(test.workpath('helloWorld.o'))
+ test.must_exist(test.workpath('helloWorld'))
+
+ test.run(program=test.workpath('helloWorld'+TestSCons._exe))
+ test.fail_test(test.stdout() != 'Hello World.\n')
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/Common/sconstest.skip b/test/D/HelloWorld/CompileAndLinkOneStep/Common/sconstest.skip
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/Common/sconstest.skip
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/Image/SConstruct_template b/test/D/HelloWorld/CompileAndLinkOneStep/Image/SConstruct_template
new file mode 100644
index 00000000..c688ab7f
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/Image/SConstruct_template
@@ -0,0 +1,9 @@
+# -*- mode:python; coding:utf-8; -*-
+
+import os
+
+environment = Environment(
+ ENV=os.environ,
+ tools=['link', '{}'])
+
+environment.Program('helloWorld.d')
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/Image/helloWorld.d b/test/D/HelloWorld/CompileAndLinkOneStep/Image/helloWorld.d
new file mode 100644
index 00000000..4d95b240
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/Image/helloWorld.d
@@ -0,0 +1,6 @@
+import std.stdio;
+
+int main(immutable string[] args) {
+ writeln("Hello World.");
+ return 0;
+}
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-dmd.py b/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-dmd.py
new file mode 100644
index 00000000..df6ddebd
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the dmd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-gdc.py b/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-gdc.py
new file mode 100644
index 00000000..068f2c4a
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gdc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-ldc.py b/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-ldc.py
new file mode 100644
index 00000000..f61efbc6
--- /dev/null
+++ b/test/D/HelloWorld/CompileAndLinkOneStep/sconstest-ldc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/__init__.py b/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/__init__.py
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/common.py b/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/common.py
new file mode 100644
index 00000000..618041bd
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/common.py
@@ -0,0 +1,68 @@
+"""
+Support functions for all the tests.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('Image')
+ test.write('SConstruct', open('SConstruct_template', 'r').read().format(tool))
+
+ if tool == 'dmd':
+ # The gdmd executable in Debian Unstable as at 2012-05-12, version 4.6.3 puts out messages on stderr
+ # that cause inappropriate failure of the tests, so simply ignore them.
+ test.run(stderr=None)
+ else:
+ test.run()
+
+ test.must_exist(test.workpath('helloWorld.o'))
+ test.must_exist(test.workpath('helloWorld'))
+
+ test.run(program=test.workpath('helloWorld'+TestSCons._exe))
+ test.fail_test(test.stdout() != 'Hello World.\n')
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/sconstest.skip b/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/sconstest.skip
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/Common/sconstest.skip
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/Image/SConstruct_template b/test/D/HelloWorld/CompileThenLinkTwoSteps/Image/SConstruct_template
new file mode 100644
index 00000000..425970a1
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/Image/SConstruct_template
@@ -0,0 +1,11 @@
+# -*- mode:python; coding:utf-8; -*-
+
+import os
+
+environment = Environment(
+ ENV=os.environ,
+ tools=['link', '{}'])
+
+objects = environment.Object('helloWorld.d')
+
+environment.Program('helloWorld', objects)
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/Image/helloWorld.d b/test/D/HelloWorld/CompileThenLinkTwoSteps/Image/helloWorld.d
new file mode 100644
index 00000000..4d95b240
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/Image/helloWorld.d
@@ -0,0 +1,6 @@
+import std.stdio;
+
+int main(immutable string[] args) {
+ writeln("Hello World.");
+ return 0;
+}
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-dmd.py b/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-dmd.py
new file mode 100644
index 00000000..df6ddebd
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the dmd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-gdc.py b/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-gdc.py
new file mode 100644
index 00000000..43bb8ebd
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the gcd tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-ldc.py b/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-ldc.py
new file mode 100644
index 00000000..f61efbc6
--- /dev/null
+++ b/test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-ldc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing using the ldc tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/LDC.py b/test/D/LDC.py
new file mode 100644
index 00000000..94acf1ca
--- /dev/null
+++ b/test/D/LDC.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Amended by Russel Winder <russel@russel.org.uk> 2010-05-05
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+_exe = TestSCons._exe
+test = TestSCons.TestSCons()
+
+if not isExecutableOfToolAvailable(test, 'ldc'):
+ test.skip_test("Could not find 'ldc', skipping test.\n")
+
+test.write('SConstruct', """\
+import os
+env = Environment(tools=['link', 'ldc'], ENV=os.environ)
+if env['PLATFORM'] == 'cygwin': env['OBJSUFFIX'] = '.obj' # trick DMD
+env.Program('foo', 'foo.d')
+""")
+
+test.write('foo.d', """\
+import std.stdio;
+int main(string[] args) {
+ printf("Hello!");
+ return 0;
+}
+""")
+
+test.run()
+
+test.run(program=test.workpath('foo'+_exe))
+
+test.fail_test(not test.stdout() == 'Hello!')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/LDC_Alt.py b/test/D/LDC_Alt.py
new file mode 100644
index 00000000..571b8f04
--- /dev/null
+++ b/test/D/LDC_Alt.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Amended by Russel Winder <russel@russel.org.uk> 2010-05-05
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+_exe = TestSCons._exe
+test = TestSCons.TestSCons()
+
+if not isExecutableOfToolAvailable(test, 'ldc'):
+ test.skip_test("Could not find 'ldc', skipping test.\n")
+
+test.write('SConstruct', """\
+import os
+env = Environment(tools=['ldc', 'link'], ENV=os.environ)
+if env['PLATFORM'] == 'cygwin': env['OBJSUFFIX'] = '.obj' # trick DMD
+env.Program('foo', 'foo.d')
+""")
+
+test.write('foo.d', """\
+import std.stdio;
+int main(string[] args) {
+ printf("Hello!");
+ return 0;
+}
+""")
+
+test.run()
+
+test.run(program=test.workpath('foo'+_exe))
+
+test.fail_test(not test.stdout() == 'Hello!')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/MixedDAndC/Common/__init__.py b/test/D/MixedDAndC/Common/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/MixedDAndC/Common/__init__.py
diff --git a/test/D/MixedDAndC/Common/common.py b/test/D/MixedDAndC/Common/common.py
new file mode 100644
index 00000000..66c738fd
--- /dev/null
+++ b/test/D/MixedDAndC/Common/common.py
@@ -0,0 +1,56 @@
+"""
+Test compiling and executing a project with a C module.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+from os.path import abspath, dirname
+
+import sys
+sys.path.insert(1, abspath(dirname(__file__) + '/../../Support'))
+
+from executablesSearch import isExecutableOfToolAvailable
+
+def testForTool(tool):
+
+ test = TestSCons.TestSCons()
+
+ if not isExecutableOfToolAvailable(test, tool) :
+ test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool))
+
+ test.dir_fixture('Image')
+
+ test.run()
+
+ test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/MixedDAndC/Common/sconstest.skip b/test/D/MixedDAndC/Common/sconstest.skip
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/MixedDAndC/Common/sconstest.skip
diff --git a/test/D/MixedDAndC/Image/SConstruct b/test/D/MixedDAndC/Image/SConstruct
new file mode 100644
index 00000000..47870d7a
--- /dev/null
+++ b/test/D/MixedDAndC/Image/SConstruct
@@ -0,0 +1,13 @@
+# -*- codig:utf-8; -*-
+
+import os
+
+environment = Environment(
+ ENV=os.environ,
+ DFLAGS=['-m64', '-O'])
+
+environment.Program('proj', [
+'proj.d',
+'dmod.d',
+'cmod.c',
+])
diff --git a/test/D/MixedDAndC/Image/cmod.c b/test/D/MixedDAndC/Image/cmod.c
new file mode 100644
index 00000000..31be5e9e
--- /dev/null
+++ b/test/D/MixedDAndC/Image/cmod.c
@@ -0,0 +1,3 @@
+int csqr(int arg) {
+ return arg*arg;
+}
diff --git a/test/D/MixedDAndC/Image/dmod.d b/test/D/MixedDAndC/Image/dmod.d
new file mode 100644
index 00000000..c609b9c7
--- /dev/null
+++ b/test/D/MixedDAndC/Image/dmod.d
@@ -0,0 +1,6 @@
+module dmod;
+import std.stdio;
+
+void print_msg() {
+ writeln("Hello, this is a test program for the new SCons D support");
+}
diff --git a/test/D/MixedDAndC/Image/proj.d b/test/D/MixedDAndC/Image/proj.d
new file mode 100644
index 00000000..3e0bf951
--- /dev/null
+++ b/test/D/MixedDAndC/Image/proj.d
@@ -0,0 +1,12 @@
+import std.stdio;
+import dmod;
+
+extern (C) {
+ int csqr(int arg);
+}
+
+void main() {
+ print_msg();
+ auto i = 17;
+ writefln("The square of %d is %d", i, csqr(i));
+}
diff --git a/test/D/MixedDAndC/sconstest-dmd.py b/test/D/MixedDAndC/sconstest-dmd.py
new file mode 100644
index 00000000..df662556
--- /dev/null
+++ b/test/D/MixedDAndC/sconstest-dmd.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing a project with a C module.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('dmd')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/MixedDAndC/sconstest-gdc.py b/test/D/MixedDAndC/sconstest-gdc.py
new file mode 100644
index 00000000..7ac95c08
--- /dev/null
+++ b/test/D/MixedDAndC/sconstest-gdc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing a project with a C module.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/MixedDAndC/sconstest-ldc.py b/test/D/MixedDAndC/sconstest-ldc.py
new file mode 100644
index 00000000..f9ab3429
--- /dev/null
+++ b/test/D/MixedDAndC/sconstest-ldc.py
@@ -0,0 +1,37 @@
+"""
+Test compiling and executing a project with a C module.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from Common.common import testForTool
+testForTool('ldc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/D/Support/executablesSearch.py b/test/D/Support/executablesSearch.py
new file mode 100755
index 00000000..e0487f6c
--- /dev/null
+++ b/test/D/Support/executablesSearch.py
@@ -0,0 +1,67 @@
+#! /usr/bin/env python
+
+"""
+Support functions for all the tests.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+def isExecutableOfToolAvailable(test, tool):
+ for executable in {
+ 'dmd': ['dmd', 'gdmd'],
+ 'gdc': ['gdc'],
+ 'ldc': ['ldc2', 'ldc']}[tool]:
+ if test.where_is(executable):
+ return True
+ return False
+
+if __name__ == '__main__':
+ import unittest
+ import sys
+ import os.path
+ sys.path.append(os.path.abspath('../../../QMTest'))
+ sys.path.append(os.path.abspath('../../../src/engine'))
+ import TestSCons
+
+ class VariousTests(unittest.TestCase):
+ def setUp(self):
+ self.test = TestSCons.TestSCons()
+ def test_None_tool(self):
+ self.assertRaises(KeyError, isExecutableOfToolAvailable, self.test, None)
+ def test_dmd_tool(self):
+ self.assertEqual(
+ self.test.where_is('dmd') is not None or self.test.where_is('gdmd') is not None,
+ isExecutableOfToolAvailable(self.test, 'dmd'))
+ def test_gdc_tool(self):
+ self.assertEqual(
+ self.test.where_is('gdc') is not None,
+ isExecutableOfToolAvailable(self.test, 'gdc'))
+ def test_ldc_tool(self):
+ self.assertEqual(
+ self.test.where_is('ldc2') is not None or self.test.where_is('ldc') is not None,
+ isExecutableOfToolAvailable(self.test, 'ldc'))
+
+ unittest.main()
diff --git a/test/D/Support/sconstest.skip b/test/D/Support/sconstest.skip
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/D/Support/sconstest.skip
diff --git a/test/Depends/spurious-rebuilds.py b/test/Depends/spurious-rebuilds.py
new file mode 100644
index 00000000..6afc829d
--- /dev/null
+++ b/test/Depends/spurious-rebuilds.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+After adding some code for reducing the overall memory consumption in
+revision b4bc497, a number of spurious rebuilds was observed by different
+people. The problem was, that the value of the Node.changed() method got cached
+too early for File nodes.
+
+This test verifies that the changed() function works properly, especially
+in connection with auto-generated sources, combined with an explicit Depends().
+"""
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.write('SConstruct', """\
+# This tests the too-many-rebuilds problem with SCons 2.3.1 (test)
+# Run like this: scons all-defuns.obj
+
+# Test setup (only runs once)
+import os.path
+if not os.path.exists('mkl'):
+ os.mkdir('mkl')
+if not os.path.exists('test.c'):
+ open('test.c', 'w').write('int i;')
+
+env=Environment()
+env.SharedObject('all-defuns.obj', 'all-defuns.c')
+results = env.Command('all-defuns.c', 'test.c', Copy('$TARGET', '$SOURCE'))
+env.Depends(results, '#mkl')
+""")
+
+test.run(arguments = 'all-defuns.obj')
+
+test.must_exist('all-defuns.c')
+test.must_exist('test.c')
+test.must_exist('all-defuns.obj')
+
+test.up_to_date(arguments = 'all-defuns.obj')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/Interactive/version.py b/test/Interactive/version.py
index bbca9efc..96ce51ed 100644
--- a/test/Interactive/version.py
+++ b/test/Interactive/version.py
@@ -36,15 +36,11 @@ test.write('SConstruct', "")
-# Construct the standard copyright marker so it doesn't get replaced
+# Standard copyright marker is mangled so it doesn't get replaced
# by the packaging build.
-copyright_marker = '__' + 'COPYRIGHT' + '__'
-
-fmt = '(%s|Copyright \\(c\\) %s The SCons Foundation)\n'
-
-copyright_line = fmt % (copyright_marker, TestSCons.copyright_years)
-
-
+copyright_line = """\
+(_{2}COPYRIGHT__|Copyright \\(c\\) 2001[-\d, ]+ The SCons Foundation)
+"""
expect1 = """\
scons>>>
diff --git a/test/option-v.py b/test/option-v.py
index 680f5417..f3eb61ce 100644
--- a/test/option-v.py
+++ b/test/option-v.py
@@ -31,13 +31,11 @@ test = TestSCons.TestSCons(match = TestCmd.match_re)
test.write('SConstruct', "")
-# Construct the standard copyright marker so it doesn't get replaced
+# Standard copyright marker is mangled so it doesn't get replaced
# by the packaging build.
-copyright_marker = '__' + 'COPYRIGHT' + '__'
-
-fmt = '(%s|Copyright \\(c\\) %s The SCons Foundation)\n'
-
-copyright_line = fmt % (copyright_marker, TestSCons.copyright_years)
+copyright_line = """\
+(_{2}COPYRIGHT__|Copyright \\(c\\) 2001[-\d, ]+ The SCons Foundation)
+"""
# Windows may or may not print a line for the script version
# depending on whether it's invoked through scons.py or scons.bat.
diff --git a/test/runtest/qmtest.py b/test/runtest/qmtest.py
deleted file mode 100644
index 4f158c4e..00000000
--- a/test/runtest/qmtest.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-#
-# __COPYRIGHT__
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
-
-"""
-Test that the --qmtest option invokes tests directly via QMTest,
-not directly via Python.
-"""
-
-import os.path
-import sys
-
-if sys.platform == 'win32':
- qmtest_py = 'qmtest.py'
-else:
- qmtest_py = 'qmtest'
-
-import TestRuntest
-
-test = TestRuntest.TestRuntest()
-
-
-qmtest = test.where_is('qmtest')
-if not qmtest:
- test.skip_test("Could not find 'qmtest'; skipping test(s).\n")
-
-test.subdir('test')
-
-test_fail_py = os.path.join('test', 'fail.py')
-test_no_result_py = os.path.join('test', 'no_result.py')
-test_pass_py = os.path.join('test', 'pass.py')
-
-test.write_failing_test(test_fail_py)
-test.write_no_result_test(test_no_result_py)
-test.write_passing_test(test_pass_py)
-
-# NOTE: the FAIL and PASS lines below have trailing spaces.
-
-expect_stdout = """\
-%(qmtest_py)s run --output results.qmr --format none --result-stream="scons_tdb.AegisChangeStream" %(test_fail_py)s %(test_no_result_py)s %(test_pass_py)s
---- TEST RESULTS -------------------------------------------------------------
-
- %(test_fail_py)s : FAIL
-
- FAILING TEST STDOUT
-
- FAILING TEST STDERR
-
- %(test_no_result_py)s : NO_RESULT
-
- NO RESULT TEST STDOUT
-
- NO RESULT TEST STDERR
-
- %(test_pass_py)s : PASS
-
---- TESTS THAT DID NOT PASS --------------------------------------------------
-
- %(test_fail_py)s : FAIL
-
- %(test_no_result_py)s : NO_RESULT
-
-
---- STATISTICS ---------------------------------------------------------------
-
- 3 tests total
-
- 1 ( 33%%) tests PASS
- 1 ( 33%%) tests FAIL
- 1 ( 33%%) tests NO_RESULT
-""" % locals()
-
-testlist = [
- test_fail_py,
- test_no_result_py,
- test_pass_py,
-]
-
-test.run(arguments='--qmtest %s' % ' '.join(testlist),
- status=1,
- stdout=expect_stdout)
-
-test.pass_test()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/runtest/testargv.py b/test/runtest/testargv.py
new file mode 100644
index 00000000..62faf51b
--- /dev/null
+++ b/test/runtest/testargv.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test subdir args for runtest.py, for example:
+
+ python runtest.py test/subdir
+
+"""
+
+import os
+
+import TestRuntest
+
+test = TestRuntest.TestRuntest()
+test.subdir('test', ['test', 'subdir'])
+
+files = {}
+files['pythonstring'] = TestRuntest.pythonstring
+
+files['one'] = os.path.join('test/subdir', 'test_one.py')
+files['two'] = os.path.join('test/subdir', 'two.py')
+files['three'] = os.path.join('test', 'test_three.py')
+
+test.write_passing_test(files['one'])
+test.write_passing_test(files['two'])
+test.write_passing_test(files['three'])
+
+expect_stdout = """\
+%(pythonstring)s -tt %(one)s
+PASSING TEST STDOUT
+%(pythonstring)s -tt %(two)s
+PASSING TEST STDOUT
+""" % files
+
+expect_stderr = """\
+PASSING TEST STDERR
+PASSING TEST STDERR
+"""
+
+test.run(arguments = '--no-progress test/subdir',
+ status = 0,
+ stdout = expect_stdout,
+ stderr = expect_stderr)
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/update-release-info/update-release-info.py b/test/update-release-info/update-release-info.py
index d3125c7b..e44aa990 100644
--- a/test/update-release-info/update-release-info.py
+++ b/test/update-release-info/update-release-info.py
@@ -201,7 +201,7 @@ RELEASE 2.0.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE
""", mode = 'r')
-years = ', '.join(map(str, range(2001, this_year + 1)))
+years = '2001 - %d'%(this_year + 1)
test.must_match(SConstruct, """
month_year = 'MONTH YEAR'
copyright_years = %s