diff -r f5050f1da672 -r 04becd199f91 javaextensions/location/tsrc/vipertest/src/ViperUnitTest.java --- /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()); + } + } + } + +}