--- /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());
+ }
+ }
+ }
+
+}