| Index: tests/patch_test.py
 | 
| diff --git a/tests/patch_test.py b/tests/patch_test.py
 | 
| index 4ca45e7e5d630417582741a9c29f96b9c7d90e28..dd4b72efebf0c333113a9fb866100611f6682400 100755
 | 
| --- a/tests/patch_test.py
 | 
| +++ b/tests/patch_test.py
 | 
| @@ -5,6 +5,7 @@
 | 
|  
 | 
|  """Unit tests for patch.py."""
 | 
|  
 | 
| +import logging
 | 
|  import os
 | 
|  import sys
 | 
|  import unittest
 | 
| @@ -125,21 +126,30 @@ GIT_NEW = (
 | 
|      '+bar\n')
 | 
|  
 | 
|  
 | 
| +NEW = (
 | 
| +    '--- /dev/null\n'
 | 
| +    '+++ foo\n'
 | 
| +    '@@ -0,0 +1 @@\n'
 | 
| +    '+bar\n')
 | 
| +
 | 
| +
 | 
|  class PatchTest(unittest.TestCase):
 | 
|    def testFilePatchDelete(self):
 | 
|      c = patch.FilePatchDelete('foo', False)
 | 
| -    self.assertEquals(c.is_delete, True)
 | 
| -    self.assertEquals(c.is_binary, False)
 | 
|      self.assertEquals(c.filename, 'foo')
 | 
| +    self.assertEquals(c.is_binary, False)
 | 
| +    self.assertEquals(c.is_delete, True)
 | 
| +    self.assertEquals(c.is_new, False)
 | 
|      try:
 | 
|        c.get()
 | 
|        self.fail()
 | 
|      except NotImplementedError:
 | 
|        pass
 | 
|      c = patch.FilePatchDelete('foo', True)
 | 
| -    self.assertEquals(c.is_delete, True)
 | 
| -    self.assertEquals(c.is_binary, True)
 | 
|      self.assertEquals(c.filename, 'foo')
 | 
| +    self.assertEquals(c.is_binary, True)
 | 
| +    self.assertEquals(c.is_delete, True)
 | 
| +    self.assertEquals(c.is_new, False)
 | 
|      try:
 | 
|        c.get()
 | 
|        self.fail()
 | 
| @@ -147,59 +157,97 @@ class PatchTest(unittest.TestCase):
 | 
|        pass
 | 
|  
 | 
|    def testFilePatchBinary(self):
 | 
| -    c = patch.FilePatchBinary('foo', 'data', [])
 | 
| -    self.assertEquals(c.is_delete, False)
 | 
| +    c = patch.FilePatchBinary('foo', 'data', [], is_new=False)
 | 
| +    self.assertEquals(c.filename, 'foo')
 | 
|      self.assertEquals(c.is_binary, True)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
| +    self.assertEquals(c.is_new, False)
 | 
| +    self.assertEquals(c.get(), 'data')
 | 
| +
 | 
| +  def testFilePatchBinaryNew(self):
 | 
| +    c = patch.FilePatchBinary('foo', 'data', [], is_new=True)
 | 
|      self.assertEquals(c.filename, 'foo')
 | 
| +    self.assertEquals(c.is_binary, True)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
| +    self.assertEquals(c.is_new, True)
 | 
|      self.assertEquals(c.get(), 'data')
 | 
|  
 | 
|    def testFilePatchDiff(self):
 | 
|      c = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, [])
 | 
| -    self.assertEquals(c.is_delete, False)
 | 
| -    self.assertEquals(c.is_binary, False)
 | 
|      self.assertEquals(c.filename, 'chrome/file.cc')
 | 
| +    self.assertEquals(c.is_binary, False)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
|      self.assertEquals(c.is_git_diff, False)
 | 
| +    self.assertEquals(c.is_new, False)
 | 
|      self.assertEquals(c.patchlevel, 0)
 | 
|      self.assertEquals(c.get(), SVN_PATCH)
 | 
| +
 | 
| +  def testFilePatchDiffHeaderMode(self):
 | 
|      diff = (
 | 
|          'diff --git a/git_cl/git-cl b/git_cl/git-cl\n'
 | 
|          'old mode 100644\n'
 | 
|          'new mode 100755\n')
 | 
|      c = patch.FilePatchDiff('git_cl/git-cl', diff, [])
 | 
| -    self.assertEquals(c.is_delete, False)
 | 
| -    self.assertEquals(c.is_binary, False)
 | 
|      self.assertEquals(c.filename, 'git_cl/git-cl')
 | 
| +    self.assertEquals(c.is_binary, False)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
|      self.assertEquals(c.is_git_diff, True)
 | 
| +    self.assertEquals(c.is_new, False)
 | 
|      self.assertEquals(c.patchlevel, 1)
 | 
|      self.assertEquals(c.get(), diff)
 | 
| +
 | 
| +  def testFilePatchDiffHeaderModeIndex(self):
 | 
|      diff = (
 | 
|          'Index: Junk\n'
 | 
|          'diff --git a/git_cl/git-cl b/git_cl/git-cl\n'
 | 
|          'old mode 100644\n'
 | 
|          'new mode 100755\n')
 | 
|      c = patch.FilePatchDiff('git_cl/git-cl', diff, [])
 | 
| -    self.assertEquals(c.is_delete, False)
 | 
| -    self.assertEquals(c.is_binary, False)
 | 
|      self.assertEquals(c.filename, 'git_cl/git-cl')
 | 
| +    self.assertEquals(c.is_binary, False)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
|      self.assertEquals(c.is_git_diff, True)
 | 
| +    self.assertEquals(c.is_new, False)
 | 
|      self.assertEquals(c.patchlevel, 1)
 | 
|      self.assertEquals(c.get(), diff)
 | 
|  
 | 
| -  def testFilePatchBadDiff(self):
 | 
| +  def testFilePatchDiffSvnNew(self):
 | 
| +    # The code path is different for git and svn.
 | 
| +    c = patch.FilePatchDiff('foo', NEW, [])
 | 
| +    self.assertEquals(c.filename, 'foo')
 | 
| +    self.assertEquals(c.is_binary, False)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
| +    self.assertEquals(c.is_git_diff, False)
 | 
| +    self.assertEquals(c.is_new, True)
 | 
| +    self.assertEquals(c.patchlevel, 0)
 | 
| +    self.assertEquals(c.get(), NEW)
 | 
| +
 | 
| +  def testFilePatchDiffGitNew(self):
 | 
| +    # The code path is different for git and svn.
 | 
| +    c = patch.FilePatchDiff('foo', GIT_NEW, [])
 | 
| +    self.assertEquals(c.filename, 'foo')
 | 
| +    self.assertEquals(c.is_binary, False)
 | 
| +    self.assertEquals(c.is_delete, False)
 | 
| +    self.assertEquals(c.is_git_diff, True)
 | 
| +    self.assertEquals(c.is_new, True)
 | 
| +    self.assertEquals(c.patchlevel, 1)
 | 
| +    self.assertEquals(c.get(), GIT_NEW)
 | 
| +
 | 
| +  def testFilePatchDiffBad(self):
 | 
|      try:
 | 
|        patch.FilePatchDiff('foo', 'data', [])
 | 
|        self.fail()
 | 
|      except patch.UnsupportedPatchFormat:
 | 
|        pass
 | 
|  
 | 
| -  def testFilePatchNoDiff(self):
 | 
| +  def testFilePatchDiffEmpty(self):
 | 
|      try:
 | 
|        patch.FilePatchDiff('foo', '', [])
 | 
|        self.fail()
 | 
|      except patch.UnsupportedPatchFormat:
 | 
|        pass
 | 
|  
 | 
| -  def testFilePatchNoneDiff(self):
 | 
| +  def testFilePatchDiffNone(self):
 | 
|      try:
 | 
|        patch.FilePatchDiff('foo', None, [])
 | 
|        self.fail()
 | 
| @@ -210,10 +258,60 @@ class PatchTest(unittest.TestCase):
 | 
|      try:
 | 
|        patch.FilePatchDiff('foo', SVN_PATCH, [])
 | 
|        self.fail()
 | 
| +    except patch.UnsupportedPatchFormat, e:
 | 
| +      self.assertEquals(
 | 
| +          "Can't process patch for file foo.\nUnexpected diff: chrome/file.cc.",
 | 
| +          str(e))
 | 
| +
 | 
| +  def testFilePatchDiffBadHeader(self):
 | 
| +    try:
 | 
| +      diff = (
 | 
| +        '+++ b/foo\n'
 | 
| +        '@@ -0,0 +1 @@\n'
 | 
| +        '+bar\n')
 | 
| +      patch.FilePatchDiff('foo', diff, [])
 | 
| +      self.fail()
 | 
|      except patch.UnsupportedPatchFormat:
 | 
|        pass
 | 
|  
 | 
| -  def testInvalidFilePatchDiffGit(self):
 | 
| +  def testFilePatchDiffBadGitHeader(self):
 | 
| +    try:
 | 
| +      diff = (
 | 
| +        'diff --git a/foo b/foo\n'
 | 
| +        '+++ b/foo\n'
 | 
| +        '@@ -0,0 +1 @@\n'
 | 
| +        '+bar\n')
 | 
| +      patch.FilePatchDiff('foo', diff, [])
 | 
| +      self.fail()
 | 
| +    except patch.UnsupportedPatchFormat:
 | 
| +      pass
 | 
| +
 | 
| +  def testFilePatchDiffBadHeaderReversed(self):
 | 
| +    try:
 | 
| +      diff = (
 | 
| +        '+++ b/foo\n'
 | 
| +        '--- b/foo\n'
 | 
| +        '@@ -0,0 +1 @@\n'
 | 
| +        '+bar\n')
 | 
| +      patch.FilePatchDiff('foo', diff, [])
 | 
| +      self.fail()
 | 
| +    except patch.UnsupportedPatchFormat:
 | 
| +      pass
 | 
| +
 | 
| +  def testFilePatchDiffGitBadHeaderReversed(self):
 | 
| +    try:
 | 
| +      diff = (
 | 
| +        'diff --git a/foo b/foo\n'
 | 
| +        '+++ b/foo\n'
 | 
| +        '--- b/foo\n'
 | 
| +        '@@ -0,0 +1 @@\n'
 | 
| +        '+bar\n')
 | 
| +      patch.FilePatchDiff('foo', diff, [])
 | 
| +      self.fail()
 | 
| +    except patch.UnsupportedPatchFormat:
 | 
| +      pass
 | 
| +
 | 
| +  def testFilePatchDiffInvalidGit(self):
 | 
|      try:
 | 
|        patch.FilePatchDiff('svn_utils_test.txt', (
 | 
|          'diff --git a/tests/svn_utils_test_data/svn_utils_test.txt '
 | 
| @@ -291,7 +389,7 @@ class PatchTest(unittest.TestCase):
 | 
|          patch.FilePatchDiff('pp', GIT_COPY, []),
 | 
|          patch.FilePatchDiff('foo', GIT_NEW, []),
 | 
|          patch.FilePatchDelete('other/place/foo', True),
 | 
| -        patch.FilePatchBinary('bar', 'data', []),
 | 
| +        patch.FilePatchBinary('bar', 'data', [], is_new=False),
 | 
|      ])
 | 
|      expected = [
 | 
|          'chrome/file.cc', 'tools/clang_check/README.chromium',
 | 
| @@ -326,6 +424,16 @@ class PatchTest(unittest.TestCase):
 | 
|      except patch.UnsupportedPatchFormat:
 | 
|        pass
 | 
|  
 | 
| +  def testRelPathEmpty(self):
 | 
| +    patches = patch.PatchSet([
 | 
| +        patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []),
 | 
| +        patch.FilePatchDelete('other\\place\\foo', True),
 | 
| +    ])
 | 
| +    patches.set_relpath('')
 | 
| +    self.assertEquals(
 | 
| +        ['chrome/file.cc', 'other/place/foo'],
 | 
| +        [f.filename for f in patches])
 | 
| +
 | 
|    def testBackSlash(self):
 | 
|      mangled_patch = SVN_PATCH.replace('chrome/', 'chrome\\')
 | 
|      patches = patch.PatchSet([
 | 
| @@ -407,4 +515,7 @@ class PatchTest(unittest.TestCase):
 | 
|  
 | 
|  
 | 
|  if __name__ == '__main__':
 | 
| +  logging.basicConfig(level=
 | 
| +      [logging.WARNING, logging.INFO, logging.DEBUG][
 | 
| +        min(2, sys.argv.count('-v'))])
 | 
|    unittest.main()
 | 
| 
 |