Merge pull request #614 from tkruse/groovy-7290
GROOVY-7290: Groovysh: More robust and eager-failing command detection
diff --git a/gradle/quality.gradle b/gradle/quality.gradle
index bdf91ca..ad4d281 100644
--- a/gradle/quality.gradle
+++ b/gradle/quality.gradle
@@ -91,6 +91,7 @@
sourceSets = [sourceSets.main]
}
tasks.withType(FindBugs) {
+ effort = 'max'
reports {
xml.enabled = false
html.enabled = true
diff --git a/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index e75d633..61ac5c7 100644
--- a/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -5515,6 +5515,90 @@
}
/**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert (1+2+3+4 as byte) == ([1,2,3,4] as byte[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static byte sum(byte[] self) {
+ return sum(self, (byte) 0);
+ }
+
+ /**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert (1+2+3+4 as short) == ([1,2,3,4] as short[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static short sum(short[] self) {
+ return sum(self, (short) 0);
+ }
+
+ /**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert 1+2+3+4 == ([1,2,3,4] as int[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static int sum(int[] self) {
+ return sum(self, 0);
+ }
+
+ /**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert (1+2+3+4 as long) == ([1,2,3,4] as long[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static long sum(long[] self) {
+ return sum(self, (long) 0);
+ }
+
+ /**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert (1+2+3+4 as char) == ([1,2,3,4] as char[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static char sum(char[] self) {
+ return sum(self, (char) 0);
+ }
+
+ /**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert (1+2+3+4 as float) == ([1,2,3,4] as float[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static float sum(float[] self) {
+ return sum(self, (float) 0);
+ }
+
+ /**
+ * Sums the items in an array.
+ * <pre class="groovyTestCase">assert (1+2+3+4 as double) == ([1,2,3,4] as double[]).sum()</pre>
+ *
+ * @param self The array of values to add together
+ * @return The sum of all of the items
+ * @since 2.4.2
+ */
+ public static double sum(double[] self) {
+ return sum(self, (double) 0);
+ }
+
+ /**
* @deprecated Use the Iterable version of sum instead
* @see #sum(Iterable, Object)
* @since 1.5.0
@@ -5582,6 +5666,125 @@
}
/**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert (5+1+2+3+4 as byte) == ([1,2,3,4] as byte[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static byte sum(byte[] self, byte initialValue) {
+ byte s = initialValue;
+ for (byte v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert (5+1+2+3+4 as short) == ([1,2,3,4] as short[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static short sum(short[] self, short initialValue) {
+ short s = initialValue;
+ for (short v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert 5+1+2+3+4 == ([1,2,3,4] as int[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static int sum(int[] self, int initialValue) {
+ int s = initialValue;
+ for (int v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert (5+1+2+3+4 as long) == ([1,2,3,4] as long[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static long sum(long[] self, long initialValue) {
+ long s = initialValue;
+ for (long v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert (5+1+2+3+4 as char) == ([1,2,3,4] as char[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static char sum(char[] self, char initialValue) {
+ char s = initialValue;
+ for (char v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert (5+1+2+3+4 as float) == ([1,2,3,4] as float[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static float sum(float[] self, float initialValue) {
+ float s = initialValue;
+ for (float v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
+ * Sums the items in an array, adding the result to some initial value.
+ * <pre class="groovyTestCase">assert (5+1+2+3+4 as double) == ([1,2,3,4] as double[]).sum(5)</pre>
+ *
+ * @param self an array of values to sum
+ * @param initialValue the items in the array will be summed to this initial value
+ * @return The sum of all of the items.
+ * @since 2.4.2
+ */
+ public static double sum(double[] self, double initialValue) {
+ double s = initialValue;
+ for (double v : self) {
+ s += v;
+ }
+ return s;
+ }
+
+ /**
* @deprecated Use the Iterable version of sum instead
* @see #sum(Iterable, Closure)
* @since 1.0
@@ -5595,7 +5798,7 @@
* Sums the result of apply a closure to each item of an Iterable.
* <code>coll.sum(closure)</code> is equivalent to:
* <code>coll.collect(closure).sum()</code>.
- * <pre class="groovyTestCase">assert 4+6+10+12 == [2,3,5,6].sum() { it * 2 }</pre>
+ * <pre class="groovyTestCase">assert 4+6+10+12 == [2,3,5,6].sum { it * 2 }</pre>
*
* @param self an Iterable
* @param closure a single parameter closure that returns a numeric value.
diff --git a/src/test/groovy/ArrayTest.groovy b/src/test/groovy/ArrayTest.groovy
index 735e31d..5e290b0 100644
--- a/src/test/groovy/ArrayTest.groovy
+++ b/src/test/groovy/ArrayTest.groovy
@@ -461,4 +461,30 @@
assert "1, 2" == a7.join(", ")
assert "1, 2" == a8.join(", ")
}
+
+ void testSum() {
+ def a1 = [1, 2, 3] as byte[]
+ def a2 = [1, 2, 3] as short[]
+ def a3 = [1, 2, 3] as int[]
+ def a4 = [1, 2, 3] as long[]
+ def a5 = [1, 2, 3] as char[]
+ def a6 = [1, 2, 3] as float[]
+ def a7 = [1, 2, 3] as double[]
+
+ assert ((byte) 6) == a1.sum()
+ assert ((short) 6) == a2.sum()
+ assert ((int) 6) == a3.sum()
+ assert ((long) 6) == a4.sum()
+ assert ((char) 6) == a5.sum()
+ assert ((float) 6) == a6.sum()
+ assert ((double) 6) == a7.sum()
+
+ assert ((byte) 10) == a1.sum((byte) 4)
+ assert ((short) 10) == a2.sum((short) 4)
+ assert ((int) 10) == a3.sum(4)
+ assert ((long) 10) == a4.sum(4)
+ assert ((char) 10) == a5.sum((char) 4)
+ assert ((float) 10) == a6.sum(4)
+ assert ((double) 10) == a7.sum(4)
+ }
}
diff --git a/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/Groovysh.groovy b/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/Groovysh.groovy
index 56e559a..cf9d35c 100644
--- a/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/Groovysh.groovy
+++ b/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/Groovysh.groovy
@@ -152,8 +152,8 @@
if (isExecutable(line)) {
result = executeCommand(line)
- // For commands, only set the last result when its non-null/true
- if (result) {
+ // For commands, only set the last result when its non-null
+ if (result != null) {
setLastResult(result)
}