| #!/usr/bin/env python |
| |
| # Copyright (c) 2011, Google Inc. |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above |
| # copyright notice, this list of conditions and the following disclaimer |
| # in the documentation and/or other materials provided with the |
| # distribution. |
| # * Neither the name of Google Inc. nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| """Some simple additions to the unittest framework useful for gflags testing.""" |
| |
| |
| |
| import re |
| import unittest |
| |
| |
| def Sorted(lst): |
| """Equivalent of sorted(), but not dependent on python version.""" |
| sorted_list = lst[:] |
| sorted_list.sort() |
| return sorted_list |
| |
| |
| def MultiLineEqual(expected, actual): |
| """Returns True if expected == actual, or returns False and logs.""" |
| if actual == expected: |
| return True |
| |
| print "Error: FLAGS.MainModuleHelp() didn't return the expected result." |
| print "Got:" |
| print actual |
| print "[End of got]" |
| |
| actual_lines = actual.split("\n") |
| expected_lines = expected.split("\n") |
| |
| num_actual_lines = len(actual_lines) |
| num_expected_lines = len(expected_lines) |
| |
| if num_actual_lines != num_expected_lines: |
| print "Number of actual lines = %d, expected %d" % ( |
| num_actual_lines, num_expected_lines) |
| |
| num_to_match = min(num_actual_lines, num_expected_lines) |
| |
| for i in range(num_to_match): |
| if actual_lines[i] != expected_lines[i]: |
| print "One discrepancy: Got:" |
| print actual_lines[i] |
| print "Expected:" |
| print expected_lines[i] |
| break |
| else: |
| # If we got here, found no discrepancy, print first new line. |
| if num_actual_lines > num_expected_lines: |
| print "New help line:" |
| print actual_lines[num_expected_lines] |
| elif num_expected_lines > num_actual_lines: |
| print "Missing expected help line:" |
| print expected_lines[num_actual_lines] |
| else: |
| print "Bug in this test -- discrepancy detected but not found." |
| |
| return False |
| |
| |
| class TestCase(unittest.TestCase): |
| def assertListEqual(self, list1, list2): |
| """Asserts that, when sorted, list1 and list2 are identical.""" |
| # This exists in python 2.7, but not previous versions. Use the |
| # built-in version if possible. |
| if hasattr(unittest.TestCase, "assertListEqual"): |
| unittest.TestCase.assertListEqual(self, Sorted(list1), Sorted(list2)) |
| else: |
| self.assertEqual(Sorted(list1), Sorted(list2)) |
| |
| def assertMultiLineEqual(self, expected, actual): |
| # This exists in python 2.7, but not previous versions. Use the |
| # built-in version if possible. |
| if hasattr(unittest.TestCase, "assertMultiLineEqual"): |
| unittest.TestCase.assertMultiLineEqual(self, expected, actual) |
| else: |
| self.assertTrue(MultiLineEqual(expected, actual)) |
| |
| def assertRaisesWithRegexpMatch(self, exception, regexp, fn, *args, **kwargs): |
| try: |
| fn(*args, **kwargs) |
| except exception, why: |
| self.assertTrue(re.search(regexp, str(why)), |
| "'%s' does not match '%s'" % (regexp, why)) |
| return |
| self.fail(exception.__name__ + " not raised") |
| |
| |
| def main(): |
| unittest.main() |