From f03ff1b92efbffd410d744869a3b5327f5d211be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Fri, 5 Oct 2018 14:35:17 +0200 Subject: add test cases to exhibit bugs in must_[not_]contain() --- testing/framework/TestCommonTests.py | 56 ++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/testing/framework/TestCommonTests.py b/testing/framework/TestCommonTests.py index 7949cb8..c54f33f 100644 --- a/testing/framework/TestCommonTests.py +++ b/testing/framework/TestCommonTests.py @@ -306,6 +306,23 @@ class must_contain_TestCase(TestCommonTestCase): stderr = run_env.stderr() assert stderr == "PASSED\n", stderr + def test_success_index_0(self): + """Test must_contain(): success at index 0""" + run_env = self.run_env + + script = lstrip("""\ + from TestCommon import TestCommon + tc = TestCommon(workdir='') + tc.write('file1', "file1 contents\\n") + tc.must_contain('file1', "file1 c") + tc.pass_test() + """) + run_env.run(program=sys.executable, stdin=script) + stdout = run_env.stdout() + assert stdout == "", stdout + stderr = run_env.stderr() + assert stderr == "PASSED\n", stderr + def test_file_missing(self): """Test must_contain(): file missing""" run_env = self.run_env @@ -1145,6 +1162,9 @@ class must_match_TestCase(TestCommonTestCase): """) expect = lstrip("""\ + match_re: mismatch at line 0: + search re='^file1$' + line='file1 does not match' Unexpected contents of `file1' contents ======================================================================= 1c1 @@ -1324,6 +1344,31 @@ class must_not_contain_TestCase(TestCommonTestCase): stderr = run_env.stderr() assert stderr.find("FAILED") != -1, stderr + def test_failure_index_0(self): + """Test must_not_contain(): failure at index 0""" + run_env = self.run_env + + script = lstrip("""\ + from TestCommon import TestCommon + tc = TestCommon(workdir='') + tc.write('file1', "file1 does contain contents\\n") + tc.must_not_contain('file1', "file1 does") + tc.run() + """) + expect = lstrip("""\ + File `file1' contains banned string. + Banned string ================================================================== + file1 does + file1 contents ================================================================= + file1 does contain contents + + """) + run_env.run(program=sys.executable, stdin=script) + stdout = run_env.stdout() + assert stdout == expect, repr(stdout) + stderr = run_env.stderr() + assert stderr.find("FAILED") != -1, stderr + def test_mode(self): """Test must_not_contain(): mode""" run_env = self.run_env @@ -1812,6 +1857,7 @@ class run_TestCase(TestCommonTestCase): """) expect_stdout = lstrip("""\ + match_re: expected 1 lines, found 2 STDOUT ========================================================================= STDERR ========================================================================= @@ -2024,6 +2070,9 @@ class run_TestCase(TestCommonTestCase): """) expect_stdout = lstrip("""\ + match_re: mismatch at line 0: + search re='^Not found$' + line='%(pass_script)s: STDOUT: []' STDOUT ========================================================================= 1c1 < Not found @@ -2053,6 +2102,9 @@ class run_TestCase(TestCommonTestCase): """) expect_stdout = lstrip("""\ + match_re: mismatch at line 0: + search re='^Not found$' + line='%(stderr_script)s: STDERR: []' STDOUT ========================================================================= STDERR ========================================================================= @@ -2286,14 +2338,14 @@ class variables_TestCase(TestCommonTestCase): 'dll_suffix', ] - script = "from __future__ import print_function" + \ + script = "from __future__ import print_function\n" + \ "import TestCommon\n" + \ '\n'.join([ "print(TestCommon.%s)\n" % v for v in variables ]) run_env.run(program=sys.executable, stdin=script) stderr = run_env.stderr() assert stderr == "", stderr - script = "from __future__ import print_function" + \ + script = "from __future__ import print_function\n" + \ "from TestCommon import *\n" + \ '\n'.join([ "print(%s)" % v for v in variables ]) run_env.run(program=sys.executable, stdin=script) -- cgit v0.12 From 0846483714b5f94bd8f346333479a32b39c90e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Fri, 5 Oct 2018 14:35:41 +0200 Subject: fixed bugs in must_[not_]_contain() --- src/CHANGES.txt | 3 +++ testing/framework/TestCommon.py | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 6359560..72ba123 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,9 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Paweł Tomulik: + - Fixed must_contain() and must_not_contain() to work with substrings + located at zero offset in a file. From Daniel Moody: - Updated FS.py to handle removal of splitunc function from python 3.7 diff --git a/testing/framework/TestCommon.py b/testing/framework/TestCommon.py index e55b491..53c0388 100644 --- a/testing/framework/TestCommon.py +++ b/testing/framework/TestCommon.py @@ -292,14 +292,13 @@ class TestCommon(TestCmd): return o.index(l) except ValueError: return None - contains = find(file_contents, required) - if not contains: + if find(file_contents, required) is None: print("File `%s' does not contain required string." % file) print(self.banner('Required string ')) print(required) print(self.banner('%s contents ' % file)) print(file_contents) - self.fail_test(not contains) + self.fail_test() def must_contain_all(self, output, input, title=None, find=None): """Ensures that the specified output string (first argument) @@ -514,14 +513,14 @@ class TestCommon(TestCmd): return o.index(l) except ValueError: return None - contains = find(file_contents, banned) - if contains: + + if find(file_contents, banned) is not None: print("File `%s' contains banned string." % file) print(self.banner('Banned string ')) print(banned) print(self.banner('%s contents ' % file)) print(file_contents) - self.fail_test(contains) + self.fail_test() def must_not_contain_any_line(self, output, lines, title=None, find=None): """Ensures that the specified output string (first argument) -- cgit v0.12 From ec2f065ab7ab954c08ab6cae2d1e8b0a210be401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Fri, 5 Oct 2018 16:16:06 +0200 Subject: make the must[_not]_contain_...() functions compatible with str.find --- testing/framework/TestCommon.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/testing/framework/TestCommon.py b/testing/framework/TestCommon.py index 53c0388..6352214 100644 --- a/testing/framework/TestCommon.py +++ b/testing/framework/TestCommon.py @@ -275,8 +275,8 @@ class TestCommon(TestCmd): reading the file; current implementation will convert. mode (string): file open mode. find (func): optional custom search routine. Must take the - form "find(output, line)" returning non-zero on success - and None on failure. + form "find(output, line)" non-negative integer on success + and None, or -1, on failure. Calling test exits FAILED if search result is false """ @@ -292,7 +292,7 @@ class TestCommon(TestCmd): return o.index(l) except ValueError: return None - if find(file_contents, required) is None: + if find(file_contents, required) in (None,-1): print("File `%s' does not contain required string." % file) print(self.banner('Required string ')) print(required) @@ -321,7 +321,7 @@ class TestCommon(TestCmd): if is_List(output): output = os.newline.join(output) - if find(output, input) is None: + if find(output, input) in (None, -1): if title is None: title = 'output' print('Missing expected input from {}:'.format(title)) @@ -352,7 +352,7 @@ class TestCommon(TestCmd): output = '\n'.join(output) for line in lines: - if find(output, line) is None: + if find(output, line) in (None, -1): missing.append(line) if missing: @@ -383,7 +383,7 @@ class TestCommon(TestCmd): except ValueError: return None for line in lines: - if find(output, line) is not None: + if find(output, line) not in (None, -1): return if title is None: @@ -425,7 +425,7 @@ class TestCommon(TestCmd): missing = [] for line in exp: found = find(out, line) - if found is None: + if found in (None, -1): missing.append(line) else: out.pop(found) @@ -514,7 +514,7 @@ class TestCommon(TestCmd): except ValueError: return None - if find(file_contents, banned) is not None: + if find(file_contents, banned) not in (None, -1): print("File `%s' contains banned string." % file) print(self.banner('Banned string ')) print(banned) @@ -541,7 +541,7 @@ class TestCommon(TestCmd): return None unexpected = [] for line in lines: - if find(output, line) is not None: + if find(output, line) not in (None, -1): unexpected.append(line) if unexpected: -- cgit v0.12 From 0afde1f83a5682dc46493aa341ff0a813492839e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Fri, 5 Oct 2018 18:16:36 +0200 Subject: fixed some docs in TestCommon.py and refactored a little --- testing/framework/TestCommon.py | 98 ++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 59 deletions(-) diff --git a/testing/framework/TestCommon.py b/testing/framework/TestCommon.py index 6352214..60e0abd 100644 --- a/testing/framework/TestCommon.py +++ b/testing/framework/TestCommon.py @@ -206,6 +206,28 @@ def separate_files(flist): missing.append(f) return existing, missing +def contains(seq, subseq, find): + # Returns True or False. + if find is None: + return subseq in seq + else: + f = find(seq, subseq) + return f not in (None, -1) and f is not False + +def find_index(seq, subseq, find): + # Returns either an index of the subseq within the seq, or None. + # Accepts a function find(seq, subseq), which returns an integer on success + # and either: None, False, or -1, on failure. + if find is None: + try: + return seq.index(subseq) + except ValueError: + return None + else: + i = find(seq, subseq) + return None if (i in (None, -1) or i is False) else i + + if os.name == 'posix': def _failed(self, status = 0): if self.status is None or status is None: @@ -276,7 +298,7 @@ class TestCommon(TestCmd): mode (string): file open mode. find (func): optional custom search routine. Must take the form "find(output, line)" non-negative integer on success - and None, or -1, on failure. + and None, False, or -1, on failure. Calling test exits FAILED if search result is false """ @@ -286,13 +308,8 @@ class TestCommon(TestCmd): # (str) type in that, so convert. required = to_bytes(required) file_contents = self.read(file, mode) - if find is None: - def find(o, l): - try: - return o.index(l) - except ValueError: - return None - if find(file_contents, required) in (None,-1): + + if not contains(file_contents, required, find): print("File `%s' does not contain required string." % file) print(self.banner('Required string ')) print(required) @@ -308,20 +325,13 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(line, output), to use when searching + function, of the form "find(output, line), to use when searching for lines in the output. """ - if find is None: - def find(o, i): - try: - return o.index(i) - except ValueError: - return None - if is_List(output): output = os.newline.join(output) - if find(output, input) in (None, -1): + if not contains(output, input, find): if title is None: title = 'output' print('Missing expected input from {}:'.format(title)) @@ -338,21 +348,15 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(line, output), to use when searching + function, of the form "find(output, line), to use when searching for lines in the output. """ - if find is None: - def find(o, l): - try: - return o.index(l) - except ValueError: - return None missing = [] if is_List(output): output = '\n'.join(output) for line in lines: - if find(output, line) in (None, -1): + if not contains(output, line, find): missing.append(line) if missing: @@ -373,17 +377,11 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(line, output), to use when searching + function, of the form "find(output, line), to use when searching for lines in the output. """ - if find is None: - def find(o, l): - try: - return o.index(l) - except ValueError: - return None for line in lines: - if find(output, line) not in (None, -1): + if contains(output, line, find): return if title is None: @@ -404,7 +402,7 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(line, output), to use when searching + function, of the form "find(output, line), to use when searching for lines in the output. The function must return the index of the found line in the output, or None if the line is not found. """ @@ -416,19 +414,13 @@ class TestCommon(TestCmd): if sorted(out) == sorted(exp): # early out for exact match return - if find is None: - def find(o, l): - try: - return o.index(l) - except ValueError: - return None missing = [] for line in exp: - found = find(out, line) - if found in (None, -1): + i = find_index(out, line, find) + if i is None: missing.append(line) else: - out.pop(found) + out.pop(i) if not missing and not out: # all lines were matched @@ -507,14 +499,8 @@ class TestCommon(TestCmd): """Ensures that the specified file doesn't contain the banned text. """ file_contents = self.read(file, mode) - if find is None: - def find(o, l): - try: - return o.index(l) - except ValueError: - return None - - if find(file_contents, banned) not in (None, -1): + + if contains(file_contents, banned, find): print("File `%s' contains banned string." % file) print(self.banner('Banned string ')) print(banned) @@ -530,18 +516,12 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(line, output), to use when searching + function, of the form "find(output, line), to use when searching for lines in the output. """ - if find is None: - def find(o, l): - try: - return o.index(l) - except ValueError: - return None unexpected = [] for line in lines: - if find(output, line) not in (None, -1): + if contains(output, line, find): unexpected.append(line) if unexpected: -- cgit v0.12 From 488e42055a96491962e052f255acca7835fe2735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Fri, 5 Oct 2018 21:48:37 +0200 Subject: update src/CHANGES.txt --- src/CHANGES.txt | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 72ba123..4fefe98 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,22 +6,18 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE - From Paweł Tomulik: - - Fixed must_contain() and must_not_contain() to work with substrings - located at zero offset in a file. - From Daniel Moody: - Updated FS.py to handle removal of splitunc function from python 3.7 - Updated the vc.py to ignore MSVS versions where not compiler could be found From Matthew Marinets: - - Fixed an issue that caused the Java emitter to incorrectly parse arguments to constructors that + - Fixed an issue that caused the Java emitter to incorrectly parse arguments to constructors that implemented a class. From Bernard Blackham: - Fixed handling of side-effects in task master (fixes #3013). - + From Ray Donnelly: - Fix the PATH created by scons.bat (and other .bat files) to provide a normalized PATH. Some pythons in the 3.6 series are no longer able to handle paths which @@ -38,7 +34,7 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE - Fix issue # 3106 MSVC if using MSVC_BATCH and target dir had a space would fail due to quirk in MSVC's handling of escaped targetdirs when batch compiling. - Re-Enable parallel SCons (-j) when running via Pypy - - Move SCons test framework files to testing/framework and remove all references to QMtest. + - Move SCons test framework files to testing/framework and remove all references to QMtest. QMTest has not been used by SCons for some time now. - Updated logic for mingw and clang on win32 to search default tool install paths if not found in normal SCons PATH. If the user specifies PATH or tool specific paths they @@ -77,7 +73,7 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE - Updated gettext tools to setup default paths for windows with Cygwin/MinGW setups - Add common location for default paths for cygwin and mingw in Platform modules - Updated YACC tool to work on windows with Cygwin/MinGW setups - - Set the pickling protocal back to highest which was causing issues + - Set the pickling protocal back to highest which was causing issues with variant dir tests. This will cause issues if reading sconsigns pickled with the previous lower protocal. @@ -99,6 +95,10 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE Specifically, this fixes the test cases use by Configure.CheckCC() which would fail when using -Wstrict-prototypes. + From Paweł Tomulik: + - Fixed must_contain(), must_not_contain(), etc. to work with substrings + located at zero offset. + From Richard West: - Add SConstruct.py, Sconstruct.py, sconstruct.py to the search path for the root SConstruct file. Allows easier debugging within Visual Studio @@ -127,11 +127,11 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE - Quiet py3 warning in UtilTests.py - Fix tests specifying octal constants for py3 - Fix must_contain tests for py3 - - RPM package generation: + - RPM package generation: - Fix supplying a build architecture - Disable auto debug package generation on certain rpmbuild versions - Adjust some tests to only supply build-id file on certain rpmbuild versions - - Tests now use a file fixture for the repeated (trivial) main.c program. + - Tests now use a file fixture for the repeated (trivial) main.c program. - Document and comment cleanup. - Added new Environment Value X_RPM_EXTRADEFS to supply custom settings to the specfile without adding specific logic for each one to scons. @@ -157,9 +157,9 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE - Add xz compression format to packaging choices. - Syntax cleanups - trailing blanks, use "is" to compare with None, etc. Three uses of variables not defined are changed. - + From Hao Wu - - typo in customized decider example in user guide + - typo in customized decider example in user guide From Hao Wu - Replace usage of unittest.TestSuite with unittest.main() (fix #3113) @@ -173,24 +173,24 @@ RELEASE 3.0.1 - Mon, 12 Nov 2017 15:31:33 -0700 - Jar can take multiple targets, and will make a duplicate jar from the sources for each target - Added some warnings in case the Jar builder makes an implicit target - Added Jar method and changed jar build to be more specific. Jar method will take in - directories or classes as source. Added more tests to JAR to ensure the jar was + directories or classes as source. Added more tests to JAR to ensure the jar was packaged with the correct compiled class files. - - Added a No result test case to handle bug which seems unrelated to java in the + - Added a No result test case to handle bug which seems unrelated to java in the swig-dependencies.py test, more info here: http://scons.tigris.org/issues/show_bug.cgi?id=2907 - Added a travis script to test on ubuntu trusty now that the project is on github - so that Continuus Integration tests can be run automatically. It tests most case and considers - no result a pass as well. Improving this script can install more dependincies allowing for more + so that Continuus Integration tests can be run automatically. It tests most case and considers + no result a pass as well. Improving this script can install more dependincies allowing for more tests to be run. - + From Daniel Moody: - Updated the Jar Builder tool in Tool/__init__.py so that is doesn't force class files as sources, allowing directories to be passed, which was causing test/Java/JAR.py to fail. From William Deegan: - Fix issue where code in utility routine to_String_for_subst() had code whose result was never - properly returned. + properly returned. (Found by: James Rinkevich https://pairlist4.pair.net/pipermail/scons-users/2017-October/006358.html ) - - Fixed Variables.GenerateHelpText() to now use the sort parameter. Due to incorrect 2to3 fixer changes + - Fixed Variables.GenerateHelpText() to now use the sort parameter. Due to incorrect 2to3 fixer changes 8 years ago it was being used as a boolean parameter. Now you can specify sort to be a callable, or boolean value. (True = normal sort). Manpage also updated. - Fixed Tool loading logic from exploding sys.path with many site_scons/site_tools prepended on py3. @@ -209,7 +209,7 @@ RELEASE 3.0.1 - Mon, 12 Nov 2017 15:31:33 -0700 From Zachary Tessler: - Fix incorrect warning for repeated identical builder calls that use overrides - + RELEASE 3.0.0 - Mon, 18 Sep 2017 08:32:04 -0700 NOTE: This is a major release. You should expect that some targets may rebuild when upgrading. @@ -282,9 +282,9 @@ will cause rebuilds. - Add support for Visual Studio 2017. This support requires vswhere.exe a helper tool installed with newer installs of 2017. SCons expects it to be located at "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" - It can be downloaded separately at + It can be downloaded separately at https://github.com/Microsoft/vswhere - + From Tom Tanner: - Allow nested $( ... $) sections -- cgit v0.12 From 8c8deec7bee7fd90cc4006d583e5f4e5ad9f3ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Fri, 5 Oct 2018 22:07:56 +0200 Subject: fixed minor typos --- testing/framework/.TestCommonTests.py.swp | Bin 0 -> 16384 bytes testing/framework/TestCommon.py | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 testing/framework/.TestCommonTests.py.swp diff --git a/testing/framework/.TestCommonTests.py.swp b/testing/framework/.TestCommonTests.py.swp new file mode 100644 index 0000000..fcee08e Binary files /dev/null and b/testing/framework/.TestCommonTests.py.swp differ diff --git a/testing/framework/TestCommon.py b/testing/framework/TestCommon.py index 60e0abd..6b4b0bd 100644 --- a/testing/framework/TestCommon.py +++ b/testing/framework/TestCommon.py @@ -325,7 +325,7 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(output, line), to use when searching + function, of the form "find(output, line)", to use when searching for lines in the output. """ if is_List(output): @@ -348,7 +348,7 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(output, line), to use when searching + function, of the form "find(output, line)", to use when searching for lines in the output. """ missing = [] @@ -377,7 +377,7 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(output, line), to use when searching + function, of the form "find(output, line)", to use when searching for lines in the output. """ for line in lines: @@ -402,7 +402,7 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(output, line), to use when searching + function, of the form "find(output, line)", to use when searching for lines in the output. The function must return the index of the found line in the output, or None if the line is not found. """ @@ -516,7 +516,7 @@ class TestCommon(TestCmd): of output being searched, and only shows up in failure output. An optional fourth argument can be used to supply a different - function, of the form "find(output, line), to use when searching + function, of the form "find(output, line)", to use when searching for lines in the output. """ unexpected = [] -- cgit v0.12 From 01203bc7ac4f71fe0b76da0248f7139539b2d3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Mon, 8 Oct 2018 12:19:34 +0200 Subject: minor adjustment to src/CHANGES.txt --- src/CHANGES.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 4fefe98..c8ec110 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,7 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Daniel Moody: - Updated FS.py to handle removal of splitunc function from python 3.7 - Updated the vc.py to ignore MSVS versions where not compiler could be found @@ -17,7 +18,6 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE From Bernard Blackham: - Fixed handling of side-effects in task master (fixes #3013). - From Ray Donnelly: - Fix the PATH created by scons.bat (and other .bat files) to provide a normalized PATH. Some pythons in the 3.6 series are no longer able to handle paths which @@ -96,8 +96,9 @@ RELEASE 3.1.0.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE would fail when using -Wstrict-prototypes. From Paweł Tomulik: - - Fixed must_contain(), must_not_contain(), etc. to work with substrings - located at zero offset. + - In the testing framework, module TestCommon, fixed must_contain(), + must_not_contain(), and related methods of TestCommon class to work with + substrings located at zero offset. From Richard West: - Add SConstruct.py, Sconstruct.py, sconstruct.py to the search path for the root SConstruct file. -- cgit v0.12