diff options
Diffstat (limited to 'src/engine/SCons/Scanner/DTests.py')
| -rw-r--r-- | src/engine/SCons/Scanner/DTests.py | 282 | 
1 files changed, 282 insertions, 0 deletions
diff --git a/src/engine/SCons/Scanner/DTests.py b/src/engine/SCons/Scanner/DTests.py new file mode 100644 index 0000000..58fbe76 --- /dev/null +++ b/src/engine/SCons/Scanner/DTests.py @@ -0,0 +1,282 @@ +# +# Copyright (c) 2001 - 2017 The SCons Foundation +# +# 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__ = "src/engine/SCons/Scanner/DTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" + +import unittest + +import TestCmd +import TestUnit + +import SCons.Scanner.D + +test = TestCmd.TestCmd(workdir = '') + +import collections +import os + +class DummyEnvironment(collections.UserDict): +    def __init__(self, **kw): +        collections.UserDict.__init__(self) +        self.data.update(kw) +        self.fs = SCons.Node.FS.FS(test.workpath('')) + +    def Dictionary(self, *args): +        return self.data + +    def subst(self, strSubst, target=None, source=None, conv=None): +        if strSubst[0] == '$': +            return self.data[strSubst[1:]] +        return strSubst + +    def subst_list(self, strSubst, target=None, source=None, conv=None): +        if strSubst[0] == '$': +            return [self.data[strSubst[1:]]] +        return [[strSubst]] + +    def subst_path(self, path, target=None, source=None, conv=None): +        if not isinstance(path, list): +            path = [path] +        return list(map(self.subst, path)) + +    def get_calculator(self): +        return None + +    def get_factory(self, factory): +        return factory or self.fs.File + +    def Dir(self, filename): +        return self.fs.Dir(filename) + +    def File(self, filename): +        return self.fs.File(filename) + +if os.path.normcase('foo') == os.path.normcase('FOO'): +    my_normpath = os.path.normcase +else: +    my_normpath = os.path.normpath + +def deps_match(self, deps, headers): +    global my_normpath +    scanned = list(map(my_normpath, list(map(str, deps)))) +    expect = list(map(my_normpath, headers)) +    self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned)) + +""" +Examples from https://dlang.org/spec/module.html + +D Language: 2.071.1 +Accessed: 11 August 2016 +""" + +# Regular import +test.write('basic.d',""" +import A; + +void main() {} +""") + +# Static import +test.write('static.d',""" +static import A; + +void main() +{ +    std.stdio.writeln("hello!"); // ok, writeln is fully qualified +} +""") + +# Public import +test.write('public.d',""" +public import A; + +void main() {} +""") + +# Renamed import +test.write('rename.d',""" +import B = A; + +void main() +{ +    io.writeln("hello!");        // ok, calls std.stdio.writeln +} +""") + +# Selective import +test.write('selective.d',""" +import A : B, C; + +void main() +{ +    writeln("hello!");           // ok, writeln bound into current namespace +    foo("world");                // ok, calls std.stdio.write() +} +""") + +# Renamed and Selective import +test.write('renameAndSelective.d',""" +import B = A : C = D; + +void main() +{ +} +""") + +# Scoped import +test.write('scoped.d',""" +void main() +{ +    import A; +} +""") + +# Combinatorial import +test.write('combinatorial.d',""" +import A, B, CCC = C, DDD = D : EEE = FFF; + +void main() +{ +} +""") + +# Subdirs import +test.write('subdirs.d',""" +import X.Y, X.Z, X.X.X; + +void main() {} +""") + +# Multiple import +test.write('multiple.d',""" +public import B; +static import C; + +import X = X.Y : Q, R, S, T = U; +void main() +{ +    import A; +} +""") + +# Multiline import +test.write('multiline.d',""" +import +A; + +void main() {} +""") + +test.write('A.d',""" +module A; +void main() {} +""") + +test.write('B.d',""" +module B; +void main() {} +""") + +test.write('C.d',""" +module C; +void main() {} +""") + +test.write('D.d',""" +module D; +void main() {} +""") + +test.subdir('X', os.path.join('X','X')) + +test.write(os.path.join('X','Y.d'),""" +module Y; +void main() {} +""") + +test.write(os.path.join('X','Z.d'),""" +module Z; +void main() {} +""") + +test.write(os.path.join('X','X','X.d'),""" +module X; +void main() {} +""") + +class DScannerTestCase(unittest.TestCase): +    def helper(self, filename, headers): +        env = DummyEnvironment() +        s = SCons.Scanner.D.DScanner() +        path = s.path(env) +        deps = s(env.File(filename), env, path) +        deps_match(self, deps, headers) + +    def test_BasicImport(self): +        self.helper('basic.d', ['A.d']) + +    def test_StaticImport(self): +        self.helper('static.d', ['A.d']) + +    def test_publicImport(self): +        self.helper('public.d', ['A.d']) +     +    def test_RenameImport(self): +        self.helper('rename.d', ['A.d']) + +    def test_SelectiveImport(self): +        self.helper('selective.d', ['A.d']) + +    def test_RenameAndSelectiveImport(self): +        self.helper('renameAndSelective.d', ['A.d']) + +    def test_ScopedImport(self): +        self.helper('scoped.d', ['A.d']) + +    def test_CombinatorialImport(self): +        self.helper('combinatorial.d', ['A.d', 'B.d', 'C.d', 'D.d']) + +    def test_SubdirsImport(self): +        self.helper('subdirs.d', [os.path.join('X','X','X.d'), os.path.join('X','Y.d'), os.path.join('X','Z.d')]) + +    def test_MultipleImport(self): +        self.helper('multiple.d', ['A.d', 'B.d', 'C.d', os.path.join('X','Y.d')]) + +    def test_MultilineImport(self): +        self.helper('multiline.d', ['A.d']) + +if __name__ == "__main__": +    suite = unittest.TestSuite() +    tclasses = [ +        DScannerTestCase, +    ] +    for tclass in tclasses: +        names = unittest.getTestCaseNames(tclass, 'test_') +        suite.addTests(list(map(tclass, names))) +    TestUnit.run(suite) + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4:  | 
