← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 20361: Moved some tests from support-system to support-commons. Set test scope on junit dependencies.

 

------------------------------------------------------------
revno: 20361
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Fri 2015-09-25 14:29:08 +0200
message:
  Moved some tests from support-system to support-commons. Set test scope on junit dependencies.
removed:
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DebugUtilsTest.java
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ExpressionUtilsTest.java
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ListUtilsTest.java
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PageRangeTest.java
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PaginatedListTest.java
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java
added:
  dhis-2/dhis-support/dhis-support-commons/src/test/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/IntegrationTest.java
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/DebugUtilsTest.java
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ExpressionUtilsTest.java
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ListUtilsTest.java
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PageRangeTest.java
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PaginatedListTest.java
  dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/TextUtilsTest.java
modified:
  dhis-2/dhis-api/pom.xml
  dhis-2/dhis-support/dhis-support-commons/pom.xml
  dhis-2/dhis-support/dhis-support-hibernate/pom.xml
  dhis-2/dhis-support/dhis-support-jdbc/pom.xml
  dhis-2/dhis-support/dhis-support-system/pom.xml
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/filter/AggregatableDataElementFilterTest.java
  dhis-2/dhis-web/dhis-web-api-mobile/pom.xml


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/pom.xml'
--- dhis-2/dhis-api/pom.xml	2015-09-04 09:00:49 +0000
+++ dhis-2/dhis-api/pom.xml	2015-09-25 12:29:08 +0000
@@ -16,10 +16,6 @@
 
   <dependencies>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-lang3</artifactId>
     </dependency>
@@ -91,6 +87,14 @@
       <groupId>org.javassist</groupId>
       <artifactId>javassist</artifactId>
     </dependency>
+    
+    <!-- Test -->
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
 
   </dependencies>
 

=== modified file 'dhis-2/dhis-support/dhis-support-commons/pom.xml'
--- dhis-2/dhis-support/dhis-support-commons/pom.xml	2015-09-16 18:32:40 +0000
+++ dhis-2/dhis-support/dhis-support-commons/pom.xml	2015-09-25 12:29:08 +0000
@@ -35,6 +35,15 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-jexl</artifactId>
     </dependency>
+    
+    <!-- Test -->
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
   </dependencies>
 
   <properties>

=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test'
=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test/java'
=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org'
=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp'
=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis'
=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/IntegrationTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/IntegrationTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/IntegrationTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,36 @@
+package org.hisp.dhis;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public interface IntegrationTest
+{
+}

=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons'
=== added directory 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util'
=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/DebugUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/DebugUtilsTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/DebugUtilsTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,70 @@
+package org.hisp.dhis.commons.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+import static org.hisp.dhis.commons.util.DebugUtils.SEPARATOR;
+import static org.hisp.dhis.commons.util.DebugUtils.logDuplicates;
+import static org.hisp.dhis.commons.util.DebugUtils.resetDuplicates;
+import junit.framework.TestCase;
+
+/**
+ * @author Lars Helge Overland
+ * @version $Id$
+ */
+public class DebugUtilsTest
+    extends TestCase
+{
+    public void testLogDuplicate()
+    {
+        String keyA = "name";
+        String keyB = "code";
+        String keyC = "identifier";
+        
+        assertNull( logDuplicates( keyA, "john" ) );
+        assertNull( logDuplicates( keyA, "tom" ) );
+        assertNull( logDuplicates( keyA, "george" ) );
+        assertEquals( "tom", logDuplicates( keyA, "tom" ) );
+        assertNull( logDuplicates( keyA, "will" ) );
+        assertEquals( "john", logDuplicates( keyA, "john" ) );
+                
+        assertNull( logDuplicates( keyB, "john" ) );
+        assertNull( logDuplicates( keyB, "A2", "A3" ) );
+        assertNull( logDuplicates( keyB, "B1" ) );
+        assertEquals( "A2" + SEPARATOR + "A3", logDuplicates( keyB, "A2", "A3" ) );
+        assertEquals( "A2" + SEPARATOR + "A3", logDuplicates( keyB, "A2", "A3" ) );
+        assertNull( logDuplicates( keyB, "C1" ) );
+        
+        assertNull( logDuplicates( keyC, 1, 2, 3 ) );
+        assertNull( logDuplicates( keyC, 1, 2, 4 ) );
+        assertEquals( 1 + SEPARATOR + 2 + SEPARATOR + 3, logDuplicates( keyC, 1, 2, 3 ) );        
+        
+        assertTrue( resetDuplicates( keyA ) );
+        assertNull( logDuplicates( keyA, "tom" ) );
+    }
+}

=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ExpressionUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ExpressionUtilsTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ExpressionUtilsTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,196 @@
+package org.hisp.dhis.commons.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.hisp.dhis.commons.util.ExpressionUtils;
+import org.junit.Test;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class ExpressionUtilsTest
+{
+    private static final double DELTA = 0.01;
+    
+    @Test
+    public void testEvaluateToDouble()
+    {
+        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "3", null ), DELTA );
+        assertEquals( 3.45, ExpressionUtils.evaluateToDouble( "3.45", null ), DELTA );
+        assertEquals( 5d, ExpressionUtils.evaluateToDouble( "2 + 3", null ), DELTA );
+        assertEquals( 15.6, ExpressionUtils.evaluateToDouble( "12.4 + 3.2", null ), DELTA );
+        assertEquals( 2.0, ExpressionUtils.evaluateToDouble( "2 > 1 ? 2.0 : 1.0", null ), DELTA );
+        assertEquals( 1.0, ExpressionUtils.evaluateToDouble( "2 > 4 ? 2.0 : 1.0", null ), DELTA );
+        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "d2:zing(3)", null ), DELTA );        
+        assertEquals( 2d, ExpressionUtils.evaluateToDouble( "d2:zing(-3) + 2.0", null ), DELTA );
+        assertEquals( 4d, ExpressionUtils.evaluateToDouble( "d2:zing(-1) + 4 + d2:zing(-2)", null ), DELTA );
+        assertEquals( 0d, ExpressionUtils.evaluateToDouble( "d2:oizp(-4)", null ), DELTA );
+        assertEquals( 1d, ExpressionUtils.evaluateToDouble( "d2:oizp(0)", null ), DELTA );
+        assertEquals( 2d, ExpressionUtils.evaluateToDouble( "d2:oizp(-4) + d2:oizp(0) + d2:oizp(3.0)", null ), DELTA );
+        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "d2:daysBetween('2015-03-01','2015-03-04')", null ), DELTA );
+        assertEquals( 1d, ExpressionUtils.evaluateToDouble( "d2:oizp(d2:zing(3))", null ), DELTA );
+        assertEquals( 1d, ExpressionUtils.evaluateToDouble( "d2:zing(d2:oizp(3))", null ), DELTA );
+        assertEquals( 2d, ExpressionUtils.evaluateToDouble( "d2:zpvc(1,3)", null ), DELTA );
+        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "d2:zpvc(1,-1,2,-3,0)", null ), DELTA );
+    }
+    
+    @Test
+    public void testEvaluateToDoubleWithVars()
+    {
+        Map<String, Object> vars = new HashMap<>();
+        
+        vars.put( "v1", 4d );
+        vars.put( "v2", -5d );
+        
+        assertEquals( 7d, ExpressionUtils.evaluateToDouble( "v1 + 3", vars ), DELTA );
+        assertEquals( 4d, ExpressionUtils.evaluateToDouble( "d2:zing(v1)", vars ), DELTA );
+        assertEquals( 0d, ExpressionUtils.evaluateToDouble( "d2:zing(v2)", vars ), DELTA );
+        assertEquals( 4d, ExpressionUtils.evaluateToDouble( "d2:zing(v1) + d2:zing(v2)", vars ), DELTA );
+    }
+    
+    //@Test
+    public void testEvaluateToDoubleZeroPositiveValueCount()
+    {
+        String expression = "d2:zing(3";
+    }
+
+    @Test
+    public void testEvaluate()
+    {
+        assertEquals( 4, ExpressionUtils.evaluate( "d2:condition('3 > 2',4,3)", null ) );
+        assertEquals( 3, ExpressionUtils.evaluate( "d2:condition('5 > 7',4,3)", null ) );
+        assertEquals( "yes", ExpressionUtils.evaluate( "d2:condition(\"'goat' == 'goat'\",'yes','no')", null ) );
+        assertEquals( "no", ExpressionUtils.evaluate( "d2:condition(\"'goat' != 'goat'\",'yes','no')", null ) );
+        assertEquals( "indoor", ExpressionUtils.evaluate( "d2:condition(\"'weather' == 'nice'\",'beach','indoor')", null ) );
+    }
+    
+    @Test
+    public void testIsTrue()
+    {
+        assertTrue( ExpressionUtils.isTrue( "2 > 1", null ) );
+        assertTrue( ExpressionUtils.isTrue( "(2 * 3) == 6", null ) );
+        assertTrue( ExpressionUtils.isTrue( "\"a\" == \"a\"", null ) );
+        assertTrue( ExpressionUtils.isTrue( "'b' == 'b'", null ) );
+        assertTrue( ExpressionUtils.isTrue( "('b' == 'b') && ('c' == 'c')", null ) );
+        assertTrue( ExpressionUtils.isTrue( "'goat' == 'goat'", null ) );
+        
+        assertFalse( ExpressionUtils.isTrue( "2 < 1", null ) );
+        assertFalse( ExpressionUtils.isTrue( "(2 * 3) == 8", null ) );
+        assertFalse( ExpressionUtils.isTrue( "\"a\" == \"b\"", null ) );
+        assertFalse( ExpressionUtils.isTrue( "'b' == 'c'", null ) );
+        assertFalse( ExpressionUtils.isTrue( "'goat' == 'cow'", null ) );
+    }
+    
+    @Test
+    public void testIsTrueWithVars()
+    {
+        Map<String, Object> vars = new HashMap<>();
+        
+        vars.put( "v1", "4" );
+        vars.put( "v2", "12" );
+        vars.put( "v3", "goat" );
+        vars.put( "v4", "horse" );
+        
+        assertTrue( ExpressionUtils.isTrue( "v1 > 1", vars ) );
+        assertTrue( ExpressionUtils.isTrue( "v2 < 18", vars ) );
+        assertTrue( ExpressionUtils.isTrue( "v2 < '23'", vars ) );
+        assertTrue( ExpressionUtils.isTrue( "v3 == 'goat'", vars ) );
+        assertTrue( ExpressionUtils.isTrue( "v4 == 'horse'", vars ) );
+        assertTrue( ExpressionUtils.isTrue( "v4 == \"horse\"", vars ) );
+
+        assertFalse( ExpressionUtils.isTrue( "v1 < 1", vars ) );
+        assertFalse( ExpressionUtils.isTrue( "v2 > 18", vars ) );
+        assertFalse( ExpressionUtils.isTrue( "v2 > '23'", vars ) );
+        assertFalse( ExpressionUtils.isTrue( "v3 == 'cow'", vars ) );
+        assertFalse( ExpressionUtils.isTrue( "v4 == 'goat'", vars ) );
+        assertFalse( ExpressionUtils.isTrue( "v4 == \"goat\"", vars ) );
+    }
+    
+    @Test
+    public void testIsBoolean()
+    {
+        Map<String, Object> vars = new HashMap<>();
+        
+        vars.put( "uA2hsh8j26j", "FEMALE" );
+        vars.put( "v2", "12" );
+        
+        assertTrue( ExpressionUtils.isBoolean( "2 > 1", null ) );
+        assertTrue( ExpressionUtils.isBoolean( "(2 * 3) == 6", null ) );
+        assertTrue( ExpressionUtils.isBoolean( "\"a\" == \"a\"", null ) );
+        assertTrue( ExpressionUtils.isBoolean( "'b' == 'b'", null ) );
+        assertTrue( ExpressionUtils.isBoolean( "('b' == 'b') && ('c' == 'c')", null ) );
+        assertTrue( ExpressionUtils.isBoolean( "'goat' == 'goat'", null ) );
+
+        assertFalse( ExpressionUtils.isBoolean( "4", null ) );
+        assertFalse( ExpressionUtils.isBoolean( "3 + 2", null ) );
+        assertFalse( ExpressionUtils.isBoolean( "someinvalid expr", null ) );
+    }
+    
+    @Test
+    public void testAsSql()
+    {
+        assertEquals( "2 > 1 and 3 < 4", ExpressionUtils.asSql( "2 > 1 && 3 < 4" ) );
+        assertEquals( "2 > 1 or 3 < 4", ExpressionUtils.asSql( "2 > 1 || 3 < 4" ) );
+        assertEquals( "'a' = 1", ExpressionUtils.asSql( "'a' == 1" ) );
+        assertEquals( "\"oZg33kd9taw\" = 'Female'", ExpressionUtils.asSql( "\"oZg33kd9taw\" == 'Female'" ) );
+    }
+        
+    @Test
+    public void testIsValid()
+    {
+        Map<String, Object> vars = new HashMap<>();
+        
+        vars.put( "v1", "12" );
+        
+        assertTrue( ExpressionUtils.isValid( "2 + 8", null ) );
+        assertTrue( ExpressionUtils.isValid( "3 - v1", vars ) );
+        assertTrue( ExpressionUtils.isValid( "d2:zing(1)", null ) );
+        assertTrue( ExpressionUtils.isValid( "d2:oizp(1)", null ) );
+        assertTrue( ExpressionUtils.isValid( "d2:oizp(d2:zing(1))", null ) );
+        assertTrue( ExpressionUtils.isValid( "d2:daysBetween('2015-02-01','2015-04-02')", null ) );
+        assertTrue( ExpressionUtils.isValid( "(d2:zing(1)+d2:zing(1))*50/1", null ) );
+        assertTrue( ExpressionUtils.isValid( "d2:condition('1 > 100',5,100)", null ) );
+        assertTrue( ExpressionUtils.isValid( "1/(1/100)", null ) );
+        assertTrue( ExpressionUtils.isValid( "SUM(1)", null ) );
+        assertTrue( ExpressionUtils.isValid( "average(2+1)", null ) );
+        
+        assertFalse( ExpressionUtils.isValid( "2 a 3", null ) );
+        assertFalse( ExpressionUtils.isValid( "v2 + 3", vars ) );
+        assertFalse( ExpressionUtils.isValid( "4 + abc", vars ) );
+        assertFalse( ExpressionUtils.isValid( "'goat' == goat", null ) );
+        assertFalse( ExpressionUtils.isValid( "aver(2+1)", null ) );
+    }
+}

=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ListUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ListUtilsTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/ListUtilsTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,76 @@
+package org.hisp.dhis.commons.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.hisp.dhis.commons.collection.ListUtils;
+import org.junit.Test;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class ListUtilsTest
+{
+    @Test
+    public void testRemoveAll()
+    {
+        List<String> list = new ArrayList<>( Arrays.asList( "a", "b", "c", "d", "e", "f", "g", "h" ) );
+        
+        Integer[] indexes = { 0, 2, 5, 7, -1, 78 };
+
+        assertEquals( 8, list.size() );
+        
+        ListUtils.removeAll( list, indexes );
+        
+        assertEquals( 4, list.size() );
+        assertTrue( list.contains( "b" ) );
+        assertTrue( list.contains( "d" ) );
+        assertTrue( list.contains( "e" ) );
+        assertTrue( list.contains( "g" ) );
+    }
+    
+    @Test
+    public void testGetDuplicates()
+    {
+        List<String> list = new ArrayList<>( Arrays.asList( "a", "b", "c", "c", "d", "e", "e", "e", "f" ) );
+        Set<String> expected = new HashSet<>( Arrays.asList( "c", "e" ) );
+        assertEquals( expected, ListUtils.getDuplicates( list ) );
+        
+        list = new ArrayList<>( Arrays.asList( "a", "b", "c", "d", "e", "f", "g", "h" ) );
+        assertEquals( 0, ListUtils.getDuplicates( list ).size() );
+    }
+}

=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PageRangeTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PageRangeTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PageRangeTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,98 @@
+package org.hisp.dhis.commons.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+import java.util.List;
+
+import org.hisp.dhis.commons.util.PageRange;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class PageRangeTest
+{
+    @Test
+    public void testPageSize()
+    {
+        PageRange range = new PageRange( 12 ).setPageSize( 5 );
+        
+        assertTrue( range.nextPage() );        
+        assertEquals( 0, range.getFromIndex() );
+        assertEquals( 5, range.getToIndex() );
+
+        assertTrue( range.nextPage() );        
+        assertEquals( 5, range.getFromIndex() );
+        assertEquals( 10, range.getToIndex() );
+        
+        assertTrue( range.nextPage() );        
+        assertEquals( 10, range.getFromIndex() );
+        assertEquals( 12, range.getToIndex() );
+        
+        assertFalse( range.nextPage() );
+    }
+
+    @Test
+    public void testPages()
+    {
+        PageRange range = new PageRange( 11 ).setPages( 3 );
+        
+        assertTrue( range.nextPage() );        
+        assertEquals( 0, range.getFromIndex() );
+        assertEquals( 4, range.getToIndex() );
+
+        assertTrue( range.nextPage() );        
+        assertEquals( 4, range.getFromIndex() );
+        assertEquals( 8, range.getToIndex() );
+        
+        assertTrue( range.nextPage() );        
+        assertEquals( 8, range.getFromIndex() );
+        assertEquals( 11, range.getToIndex() );
+        
+        assertFalse( range.nextPage() );
+    }
+    
+    @Test
+    public void testGetPages()
+    {
+        PageRange range = new PageRange( 12 ).setPageSize( 5 );
+        
+        List<int[]> pages = range.getPages();
+        
+        assertEquals( 3, pages.size() );
+        assertEquals( 0, pages.get( 0 )[0] );
+        assertEquals( 5, pages.get( 0 )[1] );
+        assertEquals( 5, pages.get( 1 )[0] );
+        assertEquals( 10, pages.get( 1 )[1] );
+        assertEquals( 10, pages.get( 2 )[0] );
+        assertEquals( 12, pages.get( 2 )[1] );
+    }
+}

=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PaginatedListTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PaginatedListTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/PaginatedListTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,160 @@
+package org.hisp.dhis.commons.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.hisp.dhis.commons.collection.PaginatedList;
+import org.junit.Test;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class PaginatedListTest
+{
+    @Test
+    public void testNextPage()
+    {
+        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C" ) ).setPageSize( 2 );
+        
+        List<String> page = list.nextPage();
+        
+        assertNotNull( page );
+        assertEquals( 2, page.size() );
+        assertTrue( page.contains( "A" ) );
+        assertTrue( page.contains( "B" ) );
+        
+        page = list.nextPage();
+        
+        assertNotNull( page );
+        assertEquals( 1, page.size() );
+        assertTrue( page.contains( "C" ) );
+        
+        page = list.nextPage();
+        
+        assertNull( page );
+    }
+    
+    @Test
+    public void testGetPageEmpty()
+    {
+        PaginatedList<String> list = new PaginatedList<>( new ArrayList<String>() ).setPageSize( 2 );
+        
+        List<String> page = list.nextPage();
+        
+        assertNull( page );
+    }
+    
+    @Test
+    public void testPageCount()
+    {
+        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C" ) ).setPageSize( 2 );
+        
+        assertEquals( 2, list.pageCount() );
+        
+        list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D" ) ).setPageSize( 2 );
+        
+        assertEquals( 2, list.pageCount() );
+
+        list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setPageSize( 2 );
+        
+        assertEquals( 3, list.pageCount() );
+    }
+    
+    @Test
+    public void testReset()
+    {
+        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C" ) ).setPageSize( 2 );
+        
+        assertTrue( list.nextPage().contains( "A" ) );
+        
+        list.reset();
+
+        assertTrue( list.nextPage().contains( "A" ) );        
+    }
+    
+    @Test
+    public void testSetNumberOfPages()
+    {
+        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setNumberOfPages( 3 );
+        
+        assertEquals( 3, list.pageCount() );
+        
+        assertEquals( 2, list.nextPage().size() );
+    }
+    
+    @Test
+    public void testNextPageNumberOfPages()
+    {
+        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setNumberOfPages( 2 );
+        
+        List<String> page = list.nextPage();
+        
+        assertNotNull( page );
+        assertEquals( 3, page.size() );
+        assertTrue( page.contains( "A" ) );
+        assertTrue( page.contains( "B" ) );
+        assertTrue( page.contains( "C" ) );
+        
+        page = list.nextPage();
+        
+        assertNotNull( page );
+        assertEquals( 2, page.size() );
+        assertTrue( page.contains( "D" ) );
+        assertTrue( page.contains( "E" ) );
+        
+        page = list.nextPage();
+        
+        assertNull( page );
+    }
+    
+    @Test
+    public void testGetPages()
+    {
+        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setPageSize( 2 );
+        
+        List<List<String>> pages = list.getPages();
+
+        assertNotNull( pages );
+        assertEquals( 3, pages.size() );
+        
+        List<String> page = pages.get( 0 );
+        assertNotNull( page );
+        assertEquals( 2, page.size() );
+        assertTrue( page.contains( "A" ) );
+        assertTrue( page.contains( "B" ) );
+    }
+}

=== added file 'dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/TextUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/TextUtilsTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/test/java/org/hisp/dhis/commons/util/TextUtilsTest.java	2015-09-25 12:29:08 +0000
@@ -0,0 +1,134 @@
+package org.hisp.dhis.commons.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * 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 the HISP project 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.hisp.dhis.commons.util.TextUtils.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.hisp.dhis.commons.util.TextUtils;
+import org.junit.Test;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class TextUtilsTest
+{
+    private static final String STRING = "abcdefghij";
+    
+    @Test
+    public void testHtmlLinks()
+    {
+        assertEquals( "<a href=\"http://dhis2.org\";>http://dhis2.org</a>", htmlLinks( "http://dhis2.org"; ) );
+        assertEquals( "<a href=\"https://dhis2.org\";>https://dhis2.org</a>", htmlLinks( "https://dhis2.org"; ) );
+        assertEquals( "<a href=\"http://www.dhis2.org\";>www.dhis2.org</a>", htmlLinks( "www.dhis2.org" ) );        
+        assertEquals( "Navigate to <a href=\"http://dhis2.org\";>http://dhis2.org</a> or <a href=\"http://www.dhis2.com\";>www.dhis2.com</a> to read more.", 
+            htmlLinks( "Navigate to http://dhis2.org or www.dhis2.com to read more." ) );
+    }
+    
+    @Test
+    public void testSubString()
+    {
+        assertEquals( "abcdefghij", subString( STRING, 0, 10 ) );        
+        assertEquals( "cdef", subString( STRING, 2, 4 ) );
+        assertEquals( "ghij", subString( STRING, 6, 4 ) );        
+        assertEquals( "ghij", subString( STRING, 6, 6 ) );
+        assertEquals( "", subString( STRING, 11, 3 ) );        
+        assertEquals( "j", subString( STRING, 9, 1 ) );        
+        assertEquals( "", subString( STRING, 4, 0 ) );
+    }
+    
+    @Test
+    public void testTrim()
+    {
+        assertEquals( "abcdefgh", trimEnd( "abcdefghijkl", 4 ) );
+    }
+    
+    @Test
+    public void testGetTokens()
+    {
+        assertEquals( new ArrayList<>( Arrays.asList( "John", "Doe", "Main", "Road", "25" ) ), TextUtils.getTokens( "John Doe Main Road 25" ) );
+        assertEquals( new ArrayList<>( Arrays.asList( "Ted,Johnson", "Upper-Road", "45" ) ), TextUtils.getTokens( "Ted,Johnson Upper-Road 45" ) );
+    }
+
+    @Test
+    public void testRemoveLastOr()
+    {
+        assertEquals( null, TextUtils.removeLastOr( null ) );
+        assertEquals( "", TextUtils.removeLastOr( "" ) );
+        assertEquals( "or name='tom' or name='john' ", TextUtils.removeLastOr( "or name='tom' or name='john' or" ) );
+        assertEquals( "or name='tom' or name='john' ", TextUtils.removeLastOr( "or name='tom' or name='john' or " ) );
+        assertEquals( "or name='tom' or name='john' ", TextUtils.removeLastOr( "or name='tom' or name='john' or  " ) );
+    }
+    
+    @Test
+    public void testRemoveLastAnd()
+    {
+        assertEquals( null, TextUtils.removeLastAnd( null ) );
+        assertEquals( "", TextUtils.removeLastAnd( "" ) );
+        assertEquals( "and name='tom' and name='john' ", TextUtils.removeLastAnd( "and name='tom' and name='john' and" ) );
+        assertEquals( "and name='tom' and name='john' ", TextUtils.removeLastAnd( "and name='tom' and name='john' and " ) );
+        assertEquals( "and name='tom' and name='john' ", TextUtils.removeLastAnd( "and name='tom' and name='john' and  " ) );
+    }
+    
+    @Test
+    public void testRemoveLastComma()
+    {
+        assertEquals( null, TextUtils.removeLastComma( null ) );
+        assertEquals( "", TextUtils.removeLastComma( "" ) );
+        assertEquals( "tom,john", TextUtils.removeLastComma( "tom,john," ) );
+        assertEquals( "tom, john", TextUtils.removeLastComma( "tom, john, " ) );
+        assertEquals( "tom, john", TextUtils.removeLastComma( "tom, john,  " ) );
+    }
+    
+    @Test
+    public void testJoinReplaceNull()
+    {
+        assertEquals( "green-red-blue", TextUtils.join( Arrays.asList( "green", "red", "blue" ), "-", "[n/a]" ) );
+        assertEquals( "green-[n/a]-blue", TextUtils.join( Arrays.asList( "green", null, "blue" ), "-", "[n/a]" ) );
+        assertEquals( "green-red-[n/a]", TextUtils.join( Arrays.asList( "green", "red", null ), "-", "[n/a]" ) );
+        assertEquals( "greenred[n/a]", TextUtils.join( Arrays.asList( "green", "red", null ), null, "[n/a]" ) );
+        assertEquals( "greenred", TextUtils.join( Arrays.asList( "green", "red", null ), null, null ) );
+    }
+    
+    @Test
+    public void testSplitSafe()
+    {
+        assertEquals( "green", TextUtils.splitSafe( "red-green-blue", "-", 1 ) );
+        assertEquals( "green", TextUtils.splitSafe( "red.green.blue", "\\.", 1 ) );
+        assertEquals( "red", TextUtils.splitSafe( "red-green-blue", "-", 0 ) );
+        assertEquals( "blue", TextUtils.splitSafe( "red-green-blue", "-", 2 ) );
+        assertNull( TextUtils.splitSafe( "red-green-blue", "-", 3 ) );
+        assertNull( TextUtils.splitSafe( "red-green-blue", "-", -2 ) );
+        assertNull( TextUtils.splitSafe( "red-green-blue-", "-", 3 ) );        
+    }    
+}

=== modified file 'dhis-2/dhis-support/dhis-support-hibernate/pom.xml'
--- dhis-2/dhis-support/dhis-support-hibernate/pom.xml	2015-07-20 02:01:37 +0000
+++ dhis-2/dhis-support/dhis-support-hibernate/pom.xml	2015-09-25 12:29:08 +0000
@@ -94,6 +94,14 @@
       <artifactId>commons-logging</artifactId>
     </dependency>
 
+    <!-- Test -->
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
   </dependencies>
   <properties>
     <rootDir>../../</rootDir>

=== modified file 'dhis-2/dhis-support/dhis-support-jdbc/pom.xml'
--- dhis-2/dhis-support/dhis-support-jdbc/pom.xml	2015-07-20 02:01:37 +0000
+++ dhis-2/dhis-support/dhis-support-jdbc/pom.xml	2015-09-25 12:29:08 +0000
@@ -48,7 +48,15 @@
       <groupId>org.hisp.dhis</groupId>
       <artifactId>dhis-support-hibernate</artifactId>
     </dependency>
-        
+    
+    <!-- Test -->
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
   </dependencies>
   <properties>
     <rootDir>../../</rootDir>

=== modified file 'dhis-2/dhis-support/dhis-support-system/pom.xml'
--- dhis-2/dhis-support/dhis-support-system/pom.xml	2015-07-20 02:01:37 +0000
+++ dhis-2/dhis-support/dhis-support-system/pom.xml	2015-09-25 12:29:08 +0000
@@ -194,13 +194,18 @@
       <artifactId>guava</artifactId>
     </dependency>
     <dependency>
+      <groupId>net.sourceforge.javacsv</groupId>
+      <artifactId>javacsv</artifactId>
+    </dependency>
+    
+    <!-- Test -->
+    
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>net.sourceforge.javacsv</groupId>
-      <artifactId>javacsv</artifactId>
-    </dependency>
+      <scope>test</scope>
+    </dependency>
+    
   </dependencies>
   <properties>
     <rootDir>../../</rootDir>

=== modified file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/filter/AggregatableDataElementFilterTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/filter/AggregatableDataElementFilterTest.java	2015-09-04 09:29:23 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/filter/AggregatableDataElementFilterTest.java	2015-09-25 12:29:08 +0000
@@ -29,10 +29,12 @@
  */
 
 import com.google.common.collect.Sets;
+
 import org.hisp.dhis.DhisConvenienceTest;
 import org.hisp.dhis.common.ValueType;
 import org.hisp.dhis.commons.filter.FilterUtils;
 import org.hisp.dhis.dataelement.DataElement;
+import org.hisp.dhis.system.filter.AggregatableDataElementFilter;
 import org.junit.Test;
 
 import java.util.Set;

=== removed file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DebugUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DebugUtilsTest.java	2015-06-15 13:44:20 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DebugUtilsTest.java	1970-01-01 00:00:00 +0000
@@ -1,70 +0,0 @@
-package org.hisp.dhis.system.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * 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 the HISP project 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.
- */
-
-import static org.hisp.dhis.commons.util.DebugUtils.SEPARATOR;
-import static org.hisp.dhis.commons.util.DebugUtils.logDuplicates;
-import static org.hisp.dhis.commons.util.DebugUtils.resetDuplicates;
-import junit.framework.TestCase;
-
-/**
- * @author Lars Helge Overland
- * @version $Id$
- */
-public class DebugUtilsTest
-    extends TestCase
-{
-    public void testLogDuplicate()
-    {
-        String keyA = "name";
-        String keyB = "code";
-        String keyC = "identifier";
-        
-        assertNull( logDuplicates( keyA, "john" ) );
-        assertNull( logDuplicates( keyA, "tom" ) );
-        assertNull( logDuplicates( keyA, "george" ) );
-        assertEquals( "tom", logDuplicates( keyA, "tom" ) );
-        assertNull( logDuplicates( keyA, "will" ) );
-        assertEquals( "john", logDuplicates( keyA, "john" ) );
-                
-        assertNull( logDuplicates( keyB, "john" ) );
-        assertNull( logDuplicates( keyB, "A2", "A3" ) );
-        assertNull( logDuplicates( keyB, "B1" ) );
-        assertEquals( "A2" + SEPARATOR + "A3", logDuplicates( keyB, "A2", "A3" ) );
-        assertEquals( "A2" + SEPARATOR + "A3", logDuplicates( keyB, "A2", "A3" ) );
-        assertNull( logDuplicates( keyB, "C1" ) );
-        
-        assertNull( logDuplicates( keyC, 1, 2, 3 ) );
-        assertNull( logDuplicates( keyC, 1, 2, 4 ) );
-        assertEquals( 1 + SEPARATOR + 2 + SEPARATOR + 3, logDuplicates( keyC, 1, 2, 3 ) );        
-        
-        assertTrue( resetDuplicates( keyA ) );
-        assertNull( logDuplicates( keyA, "tom" ) );
-    }
-}

=== removed file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ExpressionUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ExpressionUtilsTest.java	2015-09-24 19:18:20 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ExpressionUtilsTest.java	1970-01-01 00:00:00 +0000
@@ -1,190 +0,0 @@
-package org.hisp.dhis.system.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * 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 the HISP project 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.
- */
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.hisp.dhis.commons.util.ExpressionUtils;
-import org.junit.Test;
-
-/**
- * @author Lars Helge Overland
- */
-public class ExpressionUtilsTest
-{
-    private static final double DELTA = 0.01;
-    
-    @Test
-    public void testEvaluateToDouble()
-    {
-        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "3", null ), DELTA );
-        assertEquals( 3.45, ExpressionUtils.evaluateToDouble( "3.45", null ), DELTA );
-        assertEquals( 5d, ExpressionUtils.evaluateToDouble( "2 + 3", null ), DELTA );
-        assertEquals( 15.6, ExpressionUtils.evaluateToDouble( "12.4 + 3.2", null ), DELTA );
-        assertEquals( 2.0, ExpressionUtils.evaluateToDouble( "2 > 1 ? 2.0 : 1.0", null ), DELTA );
-        assertEquals( 1.0, ExpressionUtils.evaluateToDouble( "2 > 4 ? 2.0 : 1.0", null ), DELTA );
-        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "d2:zing(3)", null ), DELTA );        
-        assertEquals( 2d, ExpressionUtils.evaluateToDouble( "d2:zing(-3) + 2.0", null ), DELTA );
-        assertEquals( 4d, ExpressionUtils.evaluateToDouble( "d2:zing(-1) + 4 + d2:zing(-2)", null ), DELTA );
-        assertEquals( 0d, ExpressionUtils.evaluateToDouble( "d2:oizp(-4)", null ), DELTA );
-        assertEquals( 1d, ExpressionUtils.evaluateToDouble( "d2:oizp(0)", null ), DELTA );
-        assertEquals( 2d, ExpressionUtils.evaluateToDouble( "d2:oizp(-4) + d2:oizp(0) + d2:oizp(3.0)", null ), DELTA );
-        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "d2:daysBetween('2015-03-01','2015-03-04')", null ), DELTA );
-        assertEquals( 1d, ExpressionUtils.evaluateToDouble( "d2:oizp(d2:zing(3))", null ), DELTA );
-        assertEquals( 1d, ExpressionUtils.evaluateToDouble( "d2:zing(d2:oizp(3))", null ), DELTA );
-        assertEquals( 2d, ExpressionUtils.evaluateToDouble( "d2:zpvc(1,3)", null ), DELTA );
-        assertEquals( 3d, ExpressionUtils.evaluateToDouble( "d2:zpvc(1,-1,2,-3,0)", null ), DELTA );
-    }
-    
-    @Test
-    public void testEvaluateToDoubleWithVars()
-    {
-        Map<String, Object> vars = new HashMap<>();
-        
-        vars.put( "v1", 4d );
-        vars.put( "v2", -5d );
-        
-        assertEquals( 7d, ExpressionUtils.evaluateToDouble( "v1 + 3", vars ), DELTA );
-        assertEquals( 4d, ExpressionUtils.evaluateToDouble( "d2:zing(v1)", vars ), DELTA );
-        assertEquals( 0d, ExpressionUtils.evaluateToDouble( "d2:zing(v2)", vars ), DELTA );
-        assertEquals( 4d, ExpressionUtils.evaluateToDouble( "d2:zing(v1) + d2:zing(v2)", vars ), DELTA );
-    }
-
-    @Test
-    public void testEvaluate()
-    {
-        assertEquals( 4, ExpressionUtils.evaluate( "d2:condition('3 > 2',4,3)", null ) );
-        assertEquals( 3, ExpressionUtils.evaluate( "d2:condition('5 > 7',4,3)", null ) );
-        assertEquals( "yes", ExpressionUtils.evaluate( "d2:condition(\"'goat' == 'goat'\",'yes','no')", null ) );
-        assertEquals( "no", ExpressionUtils.evaluate( "d2:condition(\"'goat' != 'goat'\",'yes','no')", null ) );
-        assertEquals( "indoor", ExpressionUtils.evaluate( "d2:condition(\"'weather' == 'nice'\",'beach','indoor')", null ) );
-    }
-    
-    @Test
-    public void testIsTrue()
-    {
-        assertTrue( ExpressionUtils.isTrue( "2 > 1", null ) );
-        assertTrue( ExpressionUtils.isTrue( "(2 * 3) == 6", null ) );
-        assertTrue( ExpressionUtils.isTrue( "\"a\" == \"a\"", null ) );
-        assertTrue( ExpressionUtils.isTrue( "'b' == 'b'", null ) );
-        assertTrue( ExpressionUtils.isTrue( "('b' == 'b') && ('c' == 'c')", null ) );
-        assertTrue( ExpressionUtils.isTrue( "'goat' == 'goat'", null ) );
-        
-        assertFalse( ExpressionUtils.isTrue( "2 < 1", null ) );
-        assertFalse( ExpressionUtils.isTrue( "(2 * 3) == 8", null ) );
-        assertFalse( ExpressionUtils.isTrue( "\"a\" == \"b\"", null ) );
-        assertFalse( ExpressionUtils.isTrue( "'b' == 'c'", null ) );
-        assertFalse( ExpressionUtils.isTrue( "'goat' == 'cow'", null ) );
-    }
-    
-    @Test
-    public void testIsTrueWithVars()
-    {
-        Map<String, Object> vars = new HashMap<>();
-        
-        vars.put( "v1", "4" );
-        vars.put( "v2", "12" );
-        vars.put( "v3", "goat" );
-        vars.put( "v4", "horse" );
-        
-        assertTrue( ExpressionUtils.isTrue( "v1 > 1", vars ) );
-        assertTrue( ExpressionUtils.isTrue( "v2 < 18", vars ) );
-        assertTrue( ExpressionUtils.isTrue( "v2 < '23'", vars ) );
-        assertTrue( ExpressionUtils.isTrue( "v3 == 'goat'", vars ) );
-        assertTrue( ExpressionUtils.isTrue( "v4 == 'horse'", vars ) );
-        assertTrue( ExpressionUtils.isTrue( "v4 == \"horse\"", vars ) );
-
-        assertFalse( ExpressionUtils.isTrue( "v1 < 1", vars ) );
-        assertFalse( ExpressionUtils.isTrue( "v2 > 18", vars ) );
-        assertFalse( ExpressionUtils.isTrue( "v2 > '23'", vars ) );
-        assertFalse( ExpressionUtils.isTrue( "v3 == 'cow'", vars ) );
-        assertFalse( ExpressionUtils.isTrue( "v4 == 'goat'", vars ) );
-        assertFalse( ExpressionUtils.isTrue( "v4 == \"goat\"", vars ) );
-    }
-    
-    @Test
-    public void testIsBoolean()
-    {
-        Map<String, Object> vars = new HashMap<>();
-        
-        vars.put( "uA2hsh8j26j", "FEMALE" );
-        vars.put( "v2", "12" );
-        
-        assertTrue( ExpressionUtils.isBoolean( "2 > 1", null ) );
-        assertTrue( ExpressionUtils.isBoolean( "(2 * 3) == 6", null ) );
-        assertTrue( ExpressionUtils.isBoolean( "\"a\" == \"a\"", null ) );
-        assertTrue( ExpressionUtils.isBoolean( "'b' == 'b'", null ) );
-        assertTrue( ExpressionUtils.isBoolean( "('b' == 'b') && ('c' == 'c')", null ) );
-        assertTrue( ExpressionUtils.isBoolean( "'goat' == 'goat'", null ) );
-
-        assertFalse( ExpressionUtils.isBoolean( "4", null ) );
-        assertFalse( ExpressionUtils.isBoolean( "3 + 2", null ) );
-        assertFalse( ExpressionUtils.isBoolean( "someinvalid expr", null ) );
-    }
-    
-    @Test
-    public void testAsSql()
-    {
-        assertEquals( "2 > 1 and 3 < 4", ExpressionUtils.asSql( "2 > 1 && 3 < 4" ) );
-        assertEquals( "2 > 1 or 3 < 4", ExpressionUtils.asSql( "2 > 1 || 3 < 4" ) );
-        assertEquals( "'a' = 1", ExpressionUtils.asSql( "'a' == 1" ) );
-        assertEquals( "\"oZg33kd9taw\" = 'Female'", ExpressionUtils.asSql( "\"oZg33kd9taw\" == 'Female'" ) );
-    }
-        
-    @Test
-    public void testIsValid()
-    {
-        Map<String, Object> vars = new HashMap<>();
-        
-        vars.put( "v1", "12" );
-        
-        assertTrue( ExpressionUtils.isValid( "2 + 8", null ) );
-        assertTrue( ExpressionUtils.isValid( "3 - v1", vars ) );
-        assertTrue( ExpressionUtils.isValid( "d2:zing(1)", null ) );
-        assertTrue( ExpressionUtils.isValid( "d2:oizp(1)", null ) );
-        assertTrue( ExpressionUtils.isValid( "d2:oizp(d2:zing(1))", null ) );
-        assertTrue( ExpressionUtils.isValid( "d2:daysBetween('2015-02-01','2015-04-02')", null ) );
-        assertTrue( ExpressionUtils.isValid( "(d2:zing(1)+d2:zing(1))*50/1", null ) );
-        assertTrue( ExpressionUtils.isValid( "d2:condition('1 > 100',5,100)", null ) );
-        assertTrue( ExpressionUtils.isValid( "1/(1/100)", null ) );
-        assertTrue( ExpressionUtils.isValid( "SUM(1)", null ) );
-        assertTrue( ExpressionUtils.isValid( "average(2+1)", null ) );
-        
-        assertFalse( ExpressionUtils.isValid( "2 a 3", null ) );
-        assertFalse( ExpressionUtils.isValid( "v2 + 3", vars ) );
-        assertFalse( ExpressionUtils.isValid( "4 + abc", vars ) );
-        assertFalse( ExpressionUtils.isValid( "'goat' == goat", null ) );
-        assertFalse( ExpressionUtils.isValid( "aver(2+1)", null ) );
-    }
-}

=== removed file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ListUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ListUtilsTest.java	2015-06-15 13:44:20 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/ListUtilsTest.java	1970-01-01 00:00:00 +0000
@@ -1,78 +0,0 @@
-package org.hisp.dhis.system.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * 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 the HISP project 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.
- */
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.hisp.dhis.commons.collection.ListUtils;
-import org.junit.Test;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-/**
- * @author Lars Helge Overland
- */
-public class ListUtilsTest
-{
-    @Test
-    public void testRemoveAll()
-    {
-        List<String> list = Lists.newArrayList( "a", "b", "c", "d", "e", "f", "g", "h" );
-        
-        Integer[] indexes = { 0, 2, 5, 7, -1, 78 };
-
-        assertEquals( 8, list.size() );
-        
-        ListUtils.removeAll( list, indexes );
-        
-        assertEquals( 4, list.size() );
-        assertTrue( list.contains( "b" ) );
-        assertTrue( list.contains( "d" ) );
-        assertTrue( list.contains( "e" ) );
-        assertTrue( list.contains( "g" ) );
-    }
-    
-    @Test
-    public void testGetDuplicates()
-    {
-        List<String> list = Lists.newArrayList( "a", "b", "c", "c", "d", "e", "e", "e", "f" );
-        Set<String> expected = Sets.newHashSet( "c", "e" );
-        assertEquals( expected, ListUtils.getDuplicates( list ) );
-        
-        list = new ArrayList<>( Arrays.asList( "a", "b", "c", "d", "e", "f", "g", "h" ) );
-        assertEquals( 0, ListUtils.getDuplicates( list ).size() );
-    }
-}

=== removed file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PageRangeTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PageRangeTest.java	2015-06-15 13:44:20 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PageRangeTest.java	1970-01-01 00:00:00 +0000
@@ -1,98 +0,0 @@
-package org.hisp.dhis.system.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * 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 the HISP project 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.
- */
-
-import java.util.List;
-
-import org.hisp.dhis.commons.util.PageRange;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * @author Lars Helge Overland
- */
-public class PageRangeTest
-{
-    @Test
-    public void testPageSize()
-    {
-        PageRange range = new PageRange( 12 ).setPageSize( 5 );
-        
-        assertTrue( range.nextPage() );        
-        assertEquals( 0, range.getFromIndex() );
-        assertEquals( 5, range.getToIndex() );
-
-        assertTrue( range.nextPage() );        
-        assertEquals( 5, range.getFromIndex() );
-        assertEquals( 10, range.getToIndex() );
-        
-        assertTrue( range.nextPage() );        
-        assertEquals( 10, range.getFromIndex() );
-        assertEquals( 12, range.getToIndex() );
-        
-        assertFalse( range.nextPage() );
-    }
-
-    @Test
-    public void testPages()
-    {
-        PageRange range = new PageRange( 11 ).setPages( 3 );
-        
-        assertTrue( range.nextPage() );        
-        assertEquals( 0, range.getFromIndex() );
-        assertEquals( 4, range.getToIndex() );
-
-        assertTrue( range.nextPage() );        
-        assertEquals( 4, range.getFromIndex() );
-        assertEquals( 8, range.getToIndex() );
-        
-        assertTrue( range.nextPage() );        
-        assertEquals( 8, range.getFromIndex() );
-        assertEquals( 11, range.getToIndex() );
-        
-        assertFalse( range.nextPage() );
-    }
-    
-    @Test
-    public void testGetPages()
-    {
-        PageRange range = new PageRange( 12 ).setPageSize( 5 );
-        
-        List<int[]> pages = range.getPages();
-        
-        assertEquals( 3, pages.size() );
-        assertEquals( 0, pages.get( 0 )[0] );
-        assertEquals( 5, pages.get( 0 )[1] );
-        assertEquals( 5, pages.get( 1 )[0] );
-        assertEquals( 10, pages.get( 1 )[1] );
-        assertEquals( 10, pages.get( 2 )[0] );
-        assertEquals( 12, pages.get( 2 )[1] );
-    }
-}

=== removed file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PaginatedListTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PaginatedListTest.java	2015-06-15 13:44:20 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/PaginatedListTest.java	1970-01-01 00:00:00 +0000
@@ -1,160 +0,0 @@
-package org.hisp.dhis.system.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * 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 the HISP project 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.
- */
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.hisp.dhis.commons.collection.PaginatedList;
-import org.junit.Test;
-
-/**
- * @author Lars Helge Overland
- */
-public class PaginatedListTest
-{
-    @Test
-    public void testNextPage()
-    {
-        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C" ) ).setPageSize( 2 );
-        
-        List<String> page = list.nextPage();
-        
-        assertNotNull( page );
-        assertEquals( 2, page.size() );
-        assertTrue( page.contains( "A" ) );
-        assertTrue( page.contains( "B" ) );
-        
-        page = list.nextPage();
-        
-        assertNotNull( page );
-        assertEquals( 1, page.size() );
-        assertTrue( page.contains( "C" ) );
-        
-        page = list.nextPage();
-        
-        assertNull( page );
-    }
-    
-    @Test
-    public void testGetPageEmpty()
-    {
-        PaginatedList<String> list = new PaginatedList<>( new ArrayList<String>() ).setPageSize( 2 );
-        
-        List<String> page = list.nextPage();
-        
-        assertNull( page );
-    }
-    
-    @Test
-    public void testPageCount()
-    {
-        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C" ) ).setPageSize( 2 );
-        
-        assertEquals( 2, list.pageCount() );
-        
-        list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D" ) ).setPageSize( 2 );
-        
-        assertEquals( 2, list.pageCount() );
-
-        list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setPageSize( 2 );
-        
-        assertEquals( 3, list.pageCount() );
-    }
-    
-    @Test
-    public void testReset()
-    {
-        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C" ) ).setPageSize( 2 );
-        
-        assertTrue( list.nextPage().contains( "A" ) );
-        
-        list.reset();
-
-        assertTrue( list.nextPage().contains( "A" ) );        
-    }
-    
-    @Test
-    public void testSetNumberOfPages()
-    {
-        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setNumberOfPages( 3 );
-        
-        assertEquals( 3, list.pageCount() );
-        
-        assertEquals( 2, list.nextPage().size() );
-    }
-    
-    @Test
-    public void testNextPageNumberOfPages()
-    {
-        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setNumberOfPages( 2 );
-        
-        List<String> page = list.nextPage();
-        
-        assertNotNull( page );
-        assertEquals( 3, page.size() );
-        assertTrue( page.contains( "A" ) );
-        assertTrue( page.contains( "B" ) );
-        assertTrue( page.contains( "C" ) );
-        
-        page = list.nextPage();
-        
-        assertNotNull( page );
-        assertEquals( 2, page.size() );
-        assertTrue( page.contains( "D" ) );
-        assertTrue( page.contains( "E" ) );
-        
-        page = list.nextPage();
-        
-        assertNull( page );
-    }
-    
-    @Test
-    public void testGetPages()
-    {
-        PaginatedList<String> list = new PaginatedList<>( Arrays.asList( "A", "B", "C", "D", "E" ) ).setPageSize( 2 );
-        
-        List<List<String>> pages = list.getPages();
-
-        assertNotNull( pages );
-        assertEquals( 3, pages.size() );
-        
-        List<String> page = pages.get( 0 );
-        assertNotNull( page );
-        assertEquals( 2, page.size() );
-        assertTrue( page.contains( "A" ) );
-        assertTrue( page.contains( "B" ) );
-    }
-}

=== removed file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java	2015-07-03 11:42:28 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java	1970-01-01 00:00:00 +0000
@@ -1,134 +0,0 @@
-package org.hisp.dhis.system.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * 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 the HISP project 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.
- */
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.hisp.dhis.commons.util.TextUtils.*;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.hisp.dhis.commons.util.TextUtils;
-import org.junit.Test;
-
-/**
- * @author Lars Helge Overland
- */
-public class TextUtilsTest
-{
-    private static final String STRING = "abcdefghij";
-    
-    @Test
-    public void testHtmlLinks()
-    {
-        assertEquals( "<a href=\"http://dhis2.org\";>http://dhis2.org</a>", htmlLinks( "http://dhis2.org"; ) );
-        assertEquals( "<a href=\"https://dhis2.org\";>https://dhis2.org</a>", htmlLinks( "https://dhis2.org"; ) );
-        assertEquals( "<a href=\"http://www.dhis2.org\";>www.dhis2.org</a>", htmlLinks( "www.dhis2.org" ) );        
-        assertEquals( "Navigate to <a href=\"http://dhis2.org\";>http://dhis2.org</a> or <a href=\"http://www.dhis2.com\";>www.dhis2.com</a> to read more.", 
-            htmlLinks( "Navigate to http://dhis2.org or www.dhis2.com to read more." ) );
-    }
-    
-    @Test
-    public void testSubString()
-    {
-        assertEquals( "abcdefghij", subString( STRING, 0, 10 ) );        
-        assertEquals( "cdef", subString( STRING, 2, 4 ) );
-        assertEquals( "ghij", subString( STRING, 6, 4 ) );        
-        assertEquals( "ghij", subString( STRING, 6, 6 ) );
-        assertEquals( "", subString( STRING, 11, 3 ) );        
-        assertEquals( "j", subString( STRING, 9, 1 ) );        
-        assertEquals( "", subString( STRING, 4, 0 ) );
-    }
-    
-    @Test
-    public void testTrim()
-    {
-        assertEquals( "abcdefgh", trimEnd( "abcdefghijkl", 4 ) );
-    }
-    
-    @Test
-    public void testGetTokens()
-    {
-        assertEquals( new ArrayList<>( Arrays.asList( "John", "Doe", "Main", "Road", "25" ) ), TextUtils.getTokens( "John Doe Main Road 25" ) );
-        assertEquals( new ArrayList<>( Arrays.asList( "Ted,Johnson", "Upper-Road", "45" ) ), TextUtils.getTokens( "Ted,Johnson Upper-Road 45" ) );
-    }
-
-    @Test
-    public void testRemoveLastOr()
-    {
-        assertEquals( null, TextUtils.removeLastOr( null ) );
-        assertEquals( "", TextUtils.removeLastOr( "" ) );
-        assertEquals( "or name='tom' or name='john' ", TextUtils.removeLastOr( "or name='tom' or name='john' or" ) );
-        assertEquals( "or name='tom' or name='john' ", TextUtils.removeLastOr( "or name='tom' or name='john' or " ) );
-        assertEquals( "or name='tom' or name='john' ", TextUtils.removeLastOr( "or name='tom' or name='john' or  " ) );
-    }
-    
-    @Test
-    public void testRemoveLastAnd()
-    {
-        assertEquals( null, TextUtils.removeLastAnd( null ) );
-        assertEquals( "", TextUtils.removeLastAnd( "" ) );
-        assertEquals( "and name='tom' and name='john' ", TextUtils.removeLastAnd( "and name='tom' and name='john' and" ) );
-        assertEquals( "and name='tom' and name='john' ", TextUtils.removeLastAnd( "and name='tom' and name='john' and " ) );
-        assertEquals( "and name='tom' and name='john' ", TextUtils.removeLastAnd( "and name='tom' and name='john' and  " ) );
-    }
-    
-    @Test
-    public void testRemoveLastComma()
-    {
-        assertEquals( null, TextUtils.removeLastComma( null ) );
-        assertEquals( "", TextUtils.removeLastComma( "" ) );
-        assertEquals( "tom,john", TextUtils.removeLastComma( "tom,john," ) );
-        assertEquals( "tom, john", TextUtils.removeLastComma( "tom, john, " ) );
-        assertEquals( "tom, john", TextUtils.removeLastComma( "tom, john,  " ) );
-    }
-    
-    @Test
-    public void testJoinReplaceNull()
-    {
-        assertEquals( "green-red-blue", TextUtils.join( Arrays.asList( "green", "red", "blue" ), "-", "[n/a]" ) );
-        assertEquals( "green-[n/a]-blue", TextUtils.join( Arrays.asList( "green", null, "blue" ), "-", "[n/a]" ) );
-        assertEquals( "green-red-[n/a]", TextUtils.join( Arrays.asList( "green", "red", null ), "-", "[n/a]" ) );
-        assertEquals( "greenred[n/a]", TextUtils.join( Arrays.asList( "green", "red", null ), null, "[n/a]" ) );
-        assertEquals( "greenred", TextUtils.join( Arrays.asList( "green", "red", null ), null, null ) );
-    }
-    
-    @Test
-    public void testSplitSafe()
-    {
-        assertEquals( "green", TextUtils.splitSafe( "red-green-blue", "-", 1 ) );
-        assertEquals( "green", TextUtils.splitSafe( "red.green.blue", "\\.", 1 ) );
-        assertEquals( "red", TextUtils.splitSafe( "red-green-blue", "-", 0 ) );
-        assertEquals( "blue", TextUtils.splitSafe( "red-green-blue", "-", 2 ) );
-        assertNull( TextUtils.splitSafe( "red-green-blue", "-", 3 ) );
-        assertNull( TextUtils.splitSafe( "red-green-blue", "-", -2 ) );
-        assertNull( TextUtils.splitSafe( "red-green-blue-", "-", 3 ) );        
-    }    
-}

=== modified file 'dhis-2/dhis-web/dhis-web-api-mobile/pom.xml'
--- dhis-2/dhis-web/dhis-web-api-mobile/pom.xml	2015-07-20 02:01:37 +0000
+++ dhis-2/dhis-web/dhis-web-api-mobile/pom.xml	2015-09-25 12:29:08 +0000
@@ -37,6 +37,15 @@
       <groupId>com.jcraft</groupId>
       <artifactId>jzlib</artifactId>
     </dependency>
+    
+    <!-- Test -->
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
   </dependencies>
 
   <properties>