javaextensions/location/tsrc/vipertest/src/ViperUnitTest.java
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/tsrc/vipertest/src/ViperUnitTest.java	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,347 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+import java.util.Enumeration;
+
+import javax.microedition.location.*;
+import javax.microedition.lcdui.*;
+
+public class ViperUnitTest
+{
+    final static int TIMETOFIX = 5;
+
+    protected LocationProvider iLP = null;
+
+    final protected String iTestSuite;
+
+    protected String iTestName;
+
+    long[] iTimeArray;
+
+    private static Display iDisplay;
+
+    ViperUnitTest()
+    {
+        iTestSuite = "Test (no name)";
+    }
+
+    protected ViperUnitTest(String aTestSuite)
+    {
+        iTestSuite = aTestSuite;
+    }
+
+    static String run1()
+    {
+        ViperUnitTest testRunner = new ViperUnitTest();
+        String title = "Running fast unit tests";
+        ViperUnitTest[] tests = new ViperUnitTest[] { new CoordinatesTest(),
+                new QualifiedCoordinatesTest(), new AddressInfoTest(),
+                new CriteriaTest(), new LandmarkTest(),
+                new LandmarkStoreTest(), new MultipleLandmarkStoresTest(),
+                new ErrorsTest()
+                                                    };
+
+        return testRunner.run(tests, title);
+    }
+
+    static String run2(Display aDisplay)
+    {
+        iDisplay = aDisplay;
+        ViperUnitTest testRunner = new ViperUnitTest();
+        String title = "Running LocationProvider unit tests";
+        ViperUnitTest[] tests = new ViperUnitTest[] { new GetLocationTest(),
+                new PeriodicUpdateTest()
+                                                    };
+
+        return testRunner.run(tests, title);
+    }
+
+    String run(ViperUnitTest[] tests, String title)
+    {
+        echo(title);
+        String result = null;
+        int current = 0;
+        iTimeArray = new long[tests.length];
+        long startTime = System.currentTimeMillis();
+
+        try
+        {
+            for (current = 0; current < tests.length; ++current)
+            {
+                tests[current].runTest();
+                iTimeArray[current] = System.currentTimeMillis();
+            }
+
+            echo("\n-= Time info =-");
+            long testStartTime = startTime;
+            for (int i = 0; i < tests.length; ++i)
+            {
+                long time = iTimeArray[i] - testStartTime;
+                echo(tests[i].iTestSuite + ": " + time + " ms");
+                testStartTime = iTimeArray[i];
+            }
+            echo("---------------");
+            echo("Total = " + (iTimeArray[tests.length - 1] - startTime) + "ms");
+            echo("---------------\n");
+
+            result = "All tests completed successfully";
+        }
+        catch (Throwable t)
+        {
+            echo("\n\n##### TEST FAILED #####\n\n");
+            ViperUnitTest tst = tests[current];
+            result = tst.iTestSuite + "." + tst.iTestName + " failed!\n" + t;
+        }
+        echo(result);
+        return result;
+    }
+
+    protected void runTest() throws Throwable
+    {
+    }
+
+    // ------------------------ Helper methods -----------------------
+
+    // Unit test helper methods
+
+    protected void assertTrue(boolean aCondition, String aErrorMessage)
+    throws Error
+    {
+        if (!aCondition)
+            throw new Error(aErrorMessage);
+    }
+
+    protected void assertFalse(boolean aCondition, String aErrorMessage)
+    throws Error
+    {
+        if (aCondition)
+            throw new Error(aErrorMessage);
+    }
+
+    protected void assertNoMessage(Exception e)
+    {
+        assertTrue(e.getMessage() == null,
+                   "Message not allowed for exception: " + e);
+    }
+
+    protected void setCurrentTest(String aTestName)
+    {
+        iTestName = aTestName;
+        System.out.println("Running: " + aTestName);
+    }
+
+    protected void echo(String aStr)
+    {
+        System.out.println(aStr);
+    }
+
+    protected String diff(String s1, String s2)
+    {
+        if (s1.length() != s2.length())
+        {
+            return "Different length";
+        }
+
+        char[] chs = new char[s1.length()];
+
+        for (int i = 0; i < s1.length(); i++)
+        {
+            if (s1.charAt(i) != s2.charAt(i))
+            {
+                chs[i] = '^';
+            }
+            else
+            {
+                chs[i] = ' ';
+            }
+        }
+
+        return new String(chs);
+    }
+
+    protected void userMessage(String aStr)
+    {
+        if (iDisplay == null)
+        {
+            throw new Error("userMessage: No display set");
+        }
+        Alert a = new Alert(iTestName, aStr, null, AlertType.INFO);
+
+        CommandListener cl = new CommandListener()
+        {
+            public void commandAction(Command c, Displayable d)
+            {
+                synchronized (this)
+                {
+                    notifyAll();
+                }
+            }
+        };
+
+        a.setCommandListener(cl);
+        a.setTimeout(Alert.FOREVER);
+
+        Displayable d = iDisplay.getCurrent();
+        iDisplay.setCurrent(a);
+        try
+        {
+            synchronized (cl)
+            {
+                cl.wait();
+            }
+        }
+        catch (InterruptedException ie)
+        {
+        }
+        iDisplay.setCurrent(d);
+    }
+
+    // Location API specific helper methods
+
+    protected void providerSetUp(Criteria aCriteria)
+    {
+        iLP = null;
+        try
+        {
+            iLP = LocationProvider.getInstance(aCriteria);
+            // if (aCriteria == null) {
+            // echo("Default provider: " + iLP);
+            // } else {
+            // echo("Selected provider: " + iLP);
+            // }
+            if (iLP != null)
+            {
+                int state = iLP.getState();
+                assertTrue(state == LocationProvider.AVAILABLE,
+                           "Initial state=" + state + ", expected AVAILABLE");
+            }
+        }
+        catch (LocationException le)
+        {
+            echo("Could not create location provider: " + le);
+        }
+    }
+
+    protected void checkLocationData(Location aLoc)
+    {
+        assertTrue(aLoc != null, "Location is null");
+        assertTrue(aLoc.isValid(), "Location is invalid");
+        assertTrue(aLoc.getQualifiedCoordinates() != null,
+                   "Location is valid, but Coordinates are null");
+
+        long timestamp = aLoc.getTimestamp();
+        long now = System.currentTimeMillis();
+        assertTrue(now >= timestamp && (now - timestamp < 30000)
+                   && timestamp > 0, "Timestamp incorrect: t=" + timestamp
+                   + ", now=" + now);
+
+        QualifiedCoordinates coords = aLoc.getQualifiedCoordinates();
+        double lat = coords.getLatitude();
+        double lon = coords.getLongitude();
+
+        // echo("Lat: " + lat + " Lon: " + lon);
+
+        assertTrue(lat >= -90.0 || lat <= 90.0, "Latitude out of range");
+        assertTrue(lon >= -180.0 || lon < 180.0, "Longitude out of range");
+
+        float hacc = coords.getHorizontalAccuracy();
+        assertTrue(Float.isNaN(hacc) || hacc >= 0,
+                   "Horizontal accuracy is negative");
+
+        float vacc = coords.getVerticalAccuracy();
+        assertTrue(Float.isNaN(vacc) || vacc >= 0,
+                   "Vertical accuracy is negative");
+
+        float speed = aLoc.getSpeed();
+        assertTrue(Float.isNaN(speed) || speed >= 0, "Speed is negative");
+
+        float course = aLoc.getCourse();
+        assertTrue(Float.isNaN(course) || (course >= 0 && course < 360),
+                   "Course out of range");
+
+        String nmea = aLoc.getExtraInfo("application/X-jsr179-location-nmea");
+        if (nmea != null)
+        {
+            assertTrue(nmea.startsWith("$GP"), "Bad NMEA data");
+            echo("Extra info:\n" + nmea);
+        }
+    }
+
+    protected void addLandmarkToStore(LandmarkStore ls, Landmark landmark,
+                                      String category) throws Exception
+    {
+
+        Enumeration e = ls.getLandmarks();
+        int numLandmarksBefore = 0;
+        if (e != null)
+        {
+            while (e.hasMoreElements())
+            {
+                Object o = e.nextElement();
+                ++numLandmarksBefore;
+            }
+        }
+
+        ls.addLandmark(landmark, category);
+
+        // check that landmark was added
+        e = ls.getLandmarks();
+        assertTrue(e != null, "Landmarks enumeration is null");
+
+        int numLandmarksAfter = 0;
+        while (e.hasMoreElements())
+        {
+            ++numLandmarksAfter;
+            Object o = e.nextElement();
+        }
+
+        assertTrue(numLandmarksAfter - numLandmarksBefore == 1,
+                   "Expected only one landmark to be added");
+    }
+
+    protected void removeExistingStores() throws Exception
+    {
+        String[] stores = LandmarkStore.listLandmarkStores();
+        if (stores != null)
+        {
+            for (int i = 0; i < stores.length; ++i)
+            {
+                LandmarkStore.deleteLandmarkStore(stores[i]);
+            }
+        }
+    }
+
+    protected void deleteAllLandmarksAndCategories() throws Exception
+    {
+        // Delete all the categories and Landmarks from the store
+        LandmarkStore ls = LandmarkStore.getInstance(null);
+        Enumeration c = ls.getCategories();
+        while (c.hasMoreElements())
+        {
+            ls.deleteCategory((String) c.nextElement());
+        }
+
+        Enumeration l = ls.getLandmarks();
+        if (l != null)
+        {
+            while (l.hasMoreElements())
+            {
+                ls.deleteLandmark((Landmark) l.nextElement());
+            }
+        }
+    }
+
+}