[Jython-checkins] jython: Fix calling Java vararg methods with no arguments fails

darjus.loktevic jython-checkins at python.org
Sun Nov 13 17:48:49 EST 2016


https://hg.python.org/jython/rev/f79c9a94b17e
changeset:   7966:f79c9a94b17e
user:        James Mudd <james.mudd at gmail.com>
date:        Mon Nov 14 09:48:08 2016 +1100
summary:
  Fix calling Java vararg methods with no arguments fails
Also add additional testing for vararg methods to improve test coverage
of boxing varargs.

files:
  Lib/test/test_joverload.py             |  39 ++++++++++++++
  src/org/python/core/ReflectedArgs.java |   3 +-
  tests/java/javatests/Reflection.java   |  23 ++++++++
  3 files changed, 64 insertions(+), 1 deletions(-)


diff --git a/Lib/test/test_joverload.py b/Lib/test/test_joverload.py
--- a/Lib/test/test_joverload.py
+++ b/Lib/test/test_joverload.py
@@ -138,6 +138,20 @@
                          "String...:[abc]")
         self.assertEqual(t.test([]),
                          "String...:[]")
+        
+        self.assertEqual(t.testOneFixedArg("abc"),
+                         "String arg1:abc String...:[]");
+        self.assertEqual(t.testOneFixedArg("abc", "xyz"),
+                         "String arg1:abc String...:[xyz]");
+        self.assertEqual(t.testOneFixedArg("abc", "xyz", "123"),
+                         "String arg1:abc String...:[xyz, 123]");
+                         
+        self.assertEqual(t.testTwoFixedArg("fix1", "fix2"),
+                         "String arg1:fix1 String arg2:fix2 String...:[]");
+        self.assertEqual(t.testTwoFixedArg("fix1", "fix2", "var1"),
+                         "String arg1:fix1 String arg2:fix2 String...:[var1]");
+        self.assertEqual(t.testTwoFixedArg("fix1", "fix2", "var1", "var2"),
+                         "String arg1:fix1 String arg2:fix2 String...:[var1, var2]");
 
 
     def test_lists(self):
@@ -155,6 +169,31 @@
                          "List...:[[1, 2, 3]]")
         self.assertEqual(t.test([]),
                          "List...:[]")
+        
+    def test_booleans(self):
+        t = Reflection.BooleanVarargs()
+        
+                
+        self.assertEqual(t.test(True, False),
+                         "booleans...:[true, false]")
+        self.assertEqual(t.test(True),
+                         "booleans...:[true]")
+        self.assertEqual(t.test(),
+                         "booleans...:[]")
+        
+        self.assertEqual(t.testOneFixedArg(True),
+                         "boolean arg1:true booleans...:[]");
+        self.assertEqual(t.testOneFixedArg(True, False),
+                         "boolean arg1:true booleans...:[false]");
+        self.assertEqual(t.testOneFixedArg(True, False, True),
+                         "boolean arg1:true booleans...:[false, true]");
+                         
+        self.assertEqual(t.testTwoFixedArg(True, False),
+                         "boolean arg1:true boolean arg2:false booleans...:[]");
+        self.assertEqual(t.testTwoFixedArg(True, False, True),
+                         "boolean arg1:true boolean arg2:false booleans...:[true]");
+        self.assertEqual(t.testTwoFixedArg(True, False, True, False),
+                         "boolean arg1:true boolean arg2:false booleans...:[true, false]");
 
 
 class ComplexOverloadingTests(unittest.TestCase):
diff --git a/src/org/python/core/ReflectedArgs.java b/src/org/python/core/ReflectedArgs.java
--- a/src/org/python/core/ReflectedArgs.java
+++ b/src/org/python/core/ReflectedArgs.java
@@ -152,7 +152,8 @@
     /* Boxes argument in the varargs position if not already boxed */
     private PyObject[] ensureBoxedVarargs(PyObject[] pyArgs, int n) {
         if (pyArgs.length == 0) {
-            return pyArgs;
+        	// If there are no args return an empty list
+            return new PyObject[]{new PyList()};
         }
         PyObject lastArg = pyArgs[pyArgs.length - 1];
         if (lastArg instanceof PySequenceList ||
diff --git a/tests/java/javatests/Reflection.java b/tests/java/javatests/Reflection.java
--- a/tests/java/javatests/Reflection.java
+++ b/tests/java/javatests/Reflection.java
@@ -9,11 +9,34 @@
 
 public class Reflection {
 
+    public static class BooleanVarargs {
+
+        public String test(boolean... args) {
+            return "booleans...:" + Arrays.toString(args);
+        }
+        
+        public String testOneFixedArg(boolean arg1, boolean... args) {
+            return "boolean arg1:" + arg1 + " booleans...:" + Arrays.toString(args);
+        }
+        
+        public String testTwoFixedArg(boolean arg1, boolean arg2, boolean... args) {
+            return "boolean arg1:" + arg1 + " boolean arg2:" + arg2 + " booleans...:" + Arrays.toString(args);
+        }
+    }
+
     public static class StringVarargs {
 
         public String test(String... args) {
             return "String...:" + Arrays.toString(args);
         }
+        
+        public String testOneFixedArg(String arg1, String... args) {
+            return "String arg1:" + arg1 + " String...:" + Arrays.toString(args);
+        }
+        
+        public String testTwoFixedArg(String arg1, String arg2, String... args) {
+            return "String arg1:" + arg1 + " String arg2:" + arg2 + " String...:" + Arrays.toString(args);
+        }
     }
 
     public static class ListVarargs {

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list