diff options
Diffstat (limited to 'src/boost/tools/build/test/builtin_glob.py')
-rwxr-xr-x | src/boost/tools/build/test/builtin_glob.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/boost/tools/build/test/builtin_glob.py b/src/boost/tools/build/test/builtin_glob.py new file mode 100755 index 000000000..bb6153f5d --- /dev/null +++ b/src/boost/tools/build/test/builtin_glob.py @@ -0,0 +1,87 @@ +#!/usr/bin/python + +# Copyright 2014 Steven Watanabe +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt) + +# This tests the GLOB rule. + +import os +import BoostBuild + +def test_glob(files, glob, expected, setup=""): + t = BoostBuild.Tester(["-ffile.jam"], pass_toolset=0) + t.write("file.jam", setup + """ + for local p in [ SORT %s ] + { + ECHO $(p) ; + } + UPDATE ; + """ % glob) + for f in files: + t.write(f, "") + # convert / into \ on windows + expected = [os.path.join(*p.split("/")) for p in expected] + expected.sort() + t.run_build_system(stdout="\n".join(expected + [""])) + t.cleanup() + +# one or both arguments empty +test_glob([], "[ GLOB : ]", []) +test_glob([], "[ GLOB . : ]", []) +test_glob([], "[ GLOB : * ]", []) + +# a single result +test_glob([], "[ GLOB . : * ]", ["./file.jam"]) + +# * can match any number of characters +test_glob([], "[ GLOB . : file*.jam ]", ["./file.jam"]) +test_glob([], "[ GLOB . : f*am ]", ["./file.jam"]) +# ? should match a single character, but not more than one +test_glob([], "[ GLOB . : fi?e.?am ]", ["./file.jam"]) +test_glob([], "[ GLOB . : fi?.jam ]", []) +# [abc-fh-j] matches a set of characters +test_glob([], '[ GLOB . : "[f][i][l][e].jam" ]', ["./file.jam"]) +test_glob([], '[ GLOB . : "[fghau][^usdrwe][k-o][^f-s].jam" ]', ["./file.jam"]) +# \x matches x +test_glob([], "[ GLOB . : \\f\\i\\l\\e.jam ]", ["./file.jam"]) + +# multiple results +test_glob(["test.txt"], "[ GLOB . : * ]", ["./file.jam", "./test.txt"]) + +# directories +test_glob(["dir1/dir2/test.txt"], "[ GLOB dir1 : * ]", ["dir1/dir2"]); + +# non-existent directory +test_glob([], "[ GLOB dir1 : * ] ", []) + +# multiple directories and patterns +test_glob(["dir1/file1.txt", "dir2/file1.txt", + "dir2/file2.txt"], + "[ GLOB dir1 dir2 : file1* file2* ]", + ["dir1/file1.txt", "dir2/file1.txt", + "dir2/file2.txt"]) + +# The directory can contain . and .. +test_glob(["dir/test.txt"], "[ GLOB dir/. : test.txt ]", ["dir/./test.txt"]) +test_glob(["dir/test.txt"], "[ GLOB dir/.. : file.jam ]", ["dir/../file.jam"]) + +# On case insensitive filesystems, the result should +# be normalized. It should NOT be downcased. +test_glob(["TEST.TXT"], "[ GLOB . : TEST.TXT ]", ["./TEST.TXT"]) + +case_insensitive = (os.path.normcase("FILE") == "file") + +if case_insensitive: + test_glob(["TEST.TXT"], "[ GLOB . : test.txt ]", ["./TEST.TXT"]) + # This used to fail because the caching routines incorrectly + # reported that . and .. do not exist. + test_glob(["D1/D2/TEST.TXT"], "[ GLOB D1/./D2 : test.txt ]", + ["D1/./D2/TEST.TXT"]) + test_glob(["D1/TEST.TXT", "TEST.TXT"], "[ GLOB D1/../D1 : test.txt ]", + ["D1/../D1/TEST.TXT"]) + # This also failed because directories that were first found + # by GLOB were recorded as non-existent. + test_glob(["D1/D2/TEST.TXT"], "[ GLOB d1/d2 : test.txt ]", + ["D1/D2/TEST.TXT"], + "GLOB . : * ;") |