mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
	
	
		
			215 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			215 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | #!/usr/bin/python | ||
|  | 
 | ||
|  | # Copyright 2014 Steven Watanabe | ||
|  | # Copyright 2015 Artur Shepilko | ||
|  | # Distributed under the Boost Software License, Version 1.0. | ||
|  | # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) | ||
|  | 
 | ||
|  | # This tests the GLOB_ARCHIVE rule. | ||
|  | 
 | ||
|  | import os | ||
|  | import sys | ||
|  | import StringIO | ||
|  | import BoostBuild | ||
|  | 
 | ||
|  | vms = ( os.name == 'posix' and sys.platform == 'OpenVMS') | ||
|  | 
 | ||
|  | t = BoostBuild.Tester() | ||
|  | 
 | ||
|  | ## Setup test archive sources and symbols they contain. | ||
|  | sources = { | ||
|  |     "a.cpp" : ["a"], | ||
|  |     "b.cpp" : ["b"], | ||
|  |     "b_match.cpp" : ["b_match"], | ||
|  |     "c/nopath_check.cpp" : ["nopath_check"], | ||
|  |     "CaseCheck.cpp" : ["CaseCheck"], | ||
|  |     "seq_check1.cpp" : ["seq_check1"], | ||
|  |     "seq_check2.cpp" : ["seq_check2"], | ||
|  |     "seq_check3.cpp" : ["seq_check3"], | ||
|  |     "symbols_check.c" : ["symbol", "symbol_match"], | ||
|  |     "members_and_symbols_check.c" : ["member_and_symbol_match"], | ||
|  |     "symbol_case_check.c" : ["SymbolCaseCheck"], | ||
|  |     "main_check.cpp" : ["main"] | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | def create_sources(path, sources): | ||
|  |     for s in sources : | ||
|  |         f = os.path.join(path, s) | ||
|  |         t.write(f, "") | ||
|  |         output = StringIO.StringIO() | ||
|  |         for sym in sources[s] : | ||
|  |             output.write("int %s() { return 0; }\n" % sym) | ||
|  |         t.write(f, output.getvalue()) | ||
|  | 
 | ||
|  | 
 | ||
|  | def setup_archive(name, sources): | ||
|  |     global archive | ||
|  |     global obj_suffix | ||
|  |     archive = t.adjust_names(name)[0] | ||
|  |     obj_suffix = t.adjust_names(".obj")[0] | ||
|  |     output = StringIO.StringIO() | ||
|  |     t.write("jamroot.jam","") | ||
|  |     output.write("""\
 | ||
|  | static-lib %s : | ||
|  | """ % name.split(".")[0])
 | ||
|  |     ## sort the sources, so we can test order of the globbed members | ||
|  |     for s in sorted(sources) : | ||
|  |         output.write("""\
 | ||
|  |     %s | ||
|  | """ % s)
 | ||
|  |     output.write("""\
 | ||
|  |     ; | ||
|  | """)
 | ||
|  |     t.write("lib/jamfile.jam", output.getvalue()) | ||
|  |     create_sources("lib", sources) | ||
|  |     t.run_build_system(subdir="lib") | ||
|  |     built_archive = "lib/bin/$toolset/debug/%s" % name | ||
|  |     t.expect_addition(built_archive) | ||
|  |     t.copy(built_archive, name) | ||
|  |     t.rm("lib") | ||
|  | 
 | ||
|  | 
 | ||
|  | def test_glob_archive(archives, glob, expected, sort_results = False): | ||
|  |     output = StringIO.StringIO() | ||
|  |     ## replace placeholders | ||
|  |     glob = glob.replace("$archive1", archives[0]).replace("$obj", obj_suffix) | ||
|  |     expected = [ m.replace("$archive1", | ||
|  |                archives[0]).replace("$obj", obj_suffix) for m in expected ] | ||
|  |     if len(archives) > 1 : | ||
|  |         glob = glob.replace("$archive2", archives[1]).replace("$obj", obj_suffix) | ||
|  |         expected = [ m.replace("$archive2", | ||
|  |                archives[1]).replace("$obj", obj_suffix) for m in expected ] | ||
|  |     ## create test jamfile | ||
|  |     if sort_results : glob = "[ SORT %s ]" % glob | ||
|  |     output.write("""\
 | ||
|  |     for local p in %s | ||
|  |     { | ||
|  |         ECHO $(p) ; | ||
|  |     } | ||
|  |     UPDATE ; | ||
|  |     """ % glob)
 | ||
|  |     t.write("file.jam", output.getvalue()) | ||
|  |     ## run test jamfile and match against expected results | ||
|  |     if sort_results : expected.sort() | ||
|  |     t.run_build_system(["-ffile.jam"], stdout="\n".join(expected + [""])) | ||
|  |     t.rm("file.jam") | ||
|  | 
 | ||
|  | 
 | ||
|  | ## RUN TESTS | ||
|  | setup_archive("auxilliary1.lib", sources) | ||
|  | archive1 = archive | ||
|  | setup_archive("auxilliary2.lib", sources) | ||
|  | archive2 = archive | ||
|  | 
 | ||
|  | ## all arguments empty | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE ]", []) | ||
|  | 
 | ||
|  | ## empty query | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : ]", []) | ||
|  | 
 | ||
|  | ## no-match | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : a ]", []) | ||
|  | 
 | ||
|  | ## match exact | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : a$obj ]", | ||
|  |                   ["$archive1(a$obj)"]) | ||
|  | 
 | ||
|  | ## glob wildcards:1 | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : b.* ]", | ||
|  |                   ["$archive1(b$obj)"]) | ||
|  | 
 | ||
|  | ## glob wildcards:2 | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : \\b?match[\.]* ]", | ||
|  |                   ["$archive1(b_match$obj)"]) | ||
|  | 
 | ||
|  | ## glob wildcards:3 | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : b* ]", | ||
|  |                   ["$archive1(b$obj)", "$archive1(b_match$obj)"]) | ||
|  | 
 | ||
|  | ## glob multiple patterns with multiple results. | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : b.* b_* ]", | ||
|  |                   ["$archive1(b$obj)", "$archive1(b_match$obj)"]) | ||
|  | 
 | ||
|  | ## glob multiple archives and patterns. | ||
|  | test_glob_archive([archive1, archive2], | ||
|  |                   "[ GLOB_ARCHIVE $archive1 $archive2 : b.* b_* ]", | ||
|  |                   ["$archive1(b$obj)", "$archive1(b_match$obj)", | ||
|  |                    "$archive2(b$obj)", "$archive2(b_match$obj)"]) | ||
|  | 
 | ||
|  | ## glob same archive multiple times. | ||
|  | test_glob_archive([archive1, archive1], | ||
|  |                   "[ GLOB_ARCHIVE $archive1 $archive2 $archive1 : b.* ]", | ||
|  |                    ["$archive1(b$obj)", "$archive2(b$obj)", "$archive1(b$obj)"]) | ||
|  | 
 | ||
|  | ## returned archive member has no path, even though its source object-file did. | ||
|  | ## this is rather NT-specific, where members also store their object-file's path. | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : nopath_check$obj ]", | ||
|  |                   ["$archive1(nopath_check$obj)"]) | ||
|  | 
 | ||
|  | ## case insensitive matching, when archives support case sensitive member names. | ||
|  | ## VMS implementation forces case-insensitive matching and downcased member names. | ||
|  | 
 | ||
|  | case_sensitive_members = ( not vms ) | ||
|  | 
 | ||
|  | if case_sensitive_members: | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : casecheck$obj : true ]", | ||
|  |                       ["$archive1(CaseCheck$obj)"]) | ||
|  | elif vms: | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : CaseCheck$obj : false ]", | ||
|  |                       ["$archive1(casecheck$obj)"]) | ||
|  | 
 | ||
|  | 
 | ||
|  | ## test the order of matched members, in general it should match the | ||
|  | ## insertion sequence. | ||
|  | test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : seq_check*$obj ]", | ||
|  |                   ["$archive1(seq_check1$obj)", "$archive1(seq_check2$obj)", | ||
|  |                    "$archive1(seq_check3$obj)"]) | ||
|  | 
 | ||
|  | 
 | ||
|  | ## glob members by symbols they contain. | ||
|  | ## Currently supported only on VMS. | ||
|  | symbol_glob_supported = ( vms ) | ||
|  | 
 | ||
|  | if symbol_glob_supported : | ||
|  |     ## NOTE: generated symbols are compiler-dependent and may be specifically | ||
|  |     ## mangled (as in C++ case), so globbing by exact symbol is non-trivial. | ||
|  |     ## However, C-generated symbols are likely to have more portable names, | ||
|  |     ## so for the glob-by-symbol tests we glob C-generated archive members. | ||
|  | 
 | ||
|  |     ## glob members by exact symbol. | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : : : symbol ]", | ||
|  |                       ["$archive1(symbols_check$obj)"]) | ||
|  | 
 | ||
|  |     ## glob members by symbol wildcard. | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : : : symbol_* ]", | ||
|  |                       ["$archive1(symbols_check$obj)"]) | ||
|  | 
 | ||
|  |     ## glob members by member pattern AND symbol pattern. | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : *symbol* : : *member* ]", | ||
|  |                       ["$archive1(members_and_symbols_check$obj)"]) | ||
|  | 
 | ||
|  |     ## case insensitive symbol glob. | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : : true : symbolcasecheck ]", | ||
|  |                       ["$archive1(symbol_case_check$obj)"]) | ||
|  | 
 | ||
|  |     ## glob member that contains main symbol. | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : : : main _main ]", | ||
|  |                       ["$archive1(main_check$obj)"]) | ||
|  | 
 | ||
|  | else: | ||
|  |     test_glob_archive([archive1], | ||
|  |                       "[ GLOB_ARCHIVE $archive1 : : : symbol ]", | ||
|  |                       []) | ||
|  | 
 | ||
|  | 
 | ||
|  | t.cleanup() | ||
|  | 
 |