Fix _CheckUniquePtr

The PRESUBMIT test _CheckUniquePtr reported the following
false-positive:
std::unique_ptr<ParseResult> result = std::make_unique<ParseResult>();
suggesting that one uses nullptr instead.

This CL fixes that bug and also adds regression tests for this
presubmit check.

Bug: 827961
Change-Id: I60a088f6590f01c51be7e3ffc0c6d65ad9e5c329
Reviewed-on: https://chromium-review.googlesource.com/989972
Reviewed-by: Dirk Pranke <[email protected]>
Commit-Queue: Vaclav Brozek <[email protected]>
Cr-Commit-Position: refs/heads/master@{#547635}
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index 886d802..a07ba05 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -1638,5 +1638,44 @@
     self.assertEqual(0, len(results))
 
 
+class CheckUniquePtr(unittest.TestCase):
+  def testTruePositives(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockFile('dir/java/src/foo.cc', ['return std::unique_ptr<T>(foo);']),
+      MockFile('dir/java/src/bar.mm', ['bar = std::unique_ptr<T>(foo)']),
+      MockFile('dir/java/src/baz.cc', ['std::unique_ptr<T>()']),
+      MockFile('dir/java/src/baz-p.cc', ['std::unique_ptr<T<P>>()']),
+      # TODO(crbug.com/827961) Fix multi-line support.
+      #MockFile('dir/java/src/mult.cc', [
+      #  'barVeryVeryLongLongBaaaaaarSoThatTheLineLimitIsAlmostReached =',
+      #  '    std::unique_ptr<T>(foo);'
+      #]),
+    ]
+
+    results = PRESUBMIT._CheckUniquePtr(mock_input_api, MockOutputApi())
+    # TODO(crbug.com/827961) Make the check return just one result, listing all
+    # affected files in it.
+    self.assertEqual(4, len(results))
+    self.assertTrue('foo.cc' in results[0].message)
+    self.assertTrue('bar.mm' in results[1].message)
+    self.assertTrue('baz.cc' in results[2].message)
+    self.assertTrue('baz-p.cc' in results[3].message)
+
+  def testFalsePositives(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockFile('dir/java/src/foo.cc', ['return std::unique_ptr<T[]>(foo);']),
+      MockFile('dir/java/src/bar.mm', ['bar = std::unique_ptr<T[]>(foo)']),
+      MockFile('dir/java/src/file.cc', ['std::unique_ptr<T> p = Foo();']),
+      MockFile('dir/java/src/baz.cc', [
+        'std::unique_ptr<T> result = std::make_unique<T>();'
+      ]),
+    ]
+
+    results = PRESUBMIT._CheckUniquePtr(mock_input_api, MockOutputApi())
+    self.assertEqual(0, len(results))
+
+
 if __name__ == '__main__':
   unittest.main()