package org.onebusaway.android.util.test;
import org.onebusaway.android.R;
import org.onebusaway.android.app.Application;
import org.onebusaway.android.io.elements.ObaAgency;
import org.onebusaway.android.io.elements.ObaArrivalInfo;
import org.onebusaway.android.io.elements.ObaRegion;
import org.onebusaway.android.io.elements.ObaRoute;
import org.onebusaway.android.io.elements.ObaSituation;
import org.onebusaway.android.io.elements.ObaStop;
import org.onebusaway.android.io.request.ObaArrivalInfoRequest;
import org.onebusaway.android.io.request.ObaArrivalInfoResponse;
import org.onebusaway.android.io.test.ObaTestCase;
import org.onebusaway.android.map.MapParams;
import org.onebusaway.android.mock.MockObaStop;
import org.onebusaway.android.mock.MockRegion;
import org.onebusaway.android.provider.ObaContract;
import org.onebusaway.android.ui.ArrivalInfo;
import org.onebusaway.android.util.ArrivalInfoUtils;
import org.onebusaway.android.util.UIUtils;
import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.util.Pair;
import android.text.TextUtils;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
/**
* Tests to evaluate utility methods related to the presentation of information to the user in the
* UI
*/
public class UIUtilTest extends ObaTestCase {
public void testSerializeRouteDisplayNames() {
ObaStop stop = MockObaStop.getMockStop();
HashMap<String, ObaRoute> routes = MockObaStop.getMockRoutes();
String serializedRoutes = UIUtils.serializeRouteDisplayNames(stop, routes);
assertEquals("1,5", serializedRoutes);
}
public void testDeserializeRouteDisplayNames() {
String serializedRoutes = "1,5";
List<String> routeList = UIUtils.deserializeRouteDisplayNames(serializedRoutes);
assertEquals("1", routeList.get(0));
assertEquals("5", routeList.get(1));
}
public void testFormatRouteDisplayNames() {
String formattedString;
ArrayList<String> routes = new ArrayList<String>();
ArrayList<String> highlightedRoutes = new ArrayList<String>();
routes.add("1");
routes.add("5");
formattedString = UIUtils.formatRouteDisplayNames(routes, highlightedRoutes);
assertEquals("1, 5", formattedString);
routes.clear();
routes.add("5");
routes.add("1");
formattedString = UIUtils.formatRouteDisplayNames(routes, highlightedRoutes);
assertEquals("1, 5", formattedString);
routes.clear();
routes.add("5");
routes.add("1");
routes.add("15");
routes.add("8b");
routes.add("8a");
formattedString = UIUtils.formatRouteDisplayNames(routes, highlightedRoutes);
assertEquals("1, 5, 8a, 8b, 15", formattedString);
// Test highlighting one URL
routes.clear();
routes.add("5");
routes.add("1");
routes.add("15");
routes.add("8b");
routes.add("8a");
highlightedRoutes.add("1");
formattedString = UIUtils.formatRouteDisplayNames(routes, highlightedRoutes);
assertEquals("1*, 5, 8a, 8b, 15", formattedString);
// Test highlighting several URLs
routes.clear();
highlightedRoutes.clear();
routes.add("5");
routes.add("1");
routes.add("15");
routes.add("8b");
routes.add("8a");
highlightedRoutes.add("1");
highlightedRoutes.add("8b");
highlightedRoutes.add("15");
formattedString = UIUtils.formatRouteDisplayNames(routes, highlightedRoutes);
assertEquals("1*, 5, 8a, 8b*, 15*", formattedString);
}
/**
* Tests formatting of stop names, trip headsigns, and route names
*/
public void testFormatDisplayText() {
// Stop names
assertEquals("SDSU Transit Center", UIUtils.formatDisplayText("SDSU Transit Center"));
assertEquals("VA Hospital", UIUtils.formatDisplayText("VA Hospital"));
assertEquals("SDSU", UIUtils.formatDisplayText("SDSU"));
assertEquals("UTC Transit Center", UIUtils.formatDisplayText("UTC Transit Center"));
// Trip headsigns
assertEquals("North to University Area TC",
UIUtils.formatDisplayText("North to University Area TC"));
assertEquals("North To University Area Tc",
UIUtils.formatDisplayText("NORTH TO UNIVERSITY AREA TC"));
assertEquals("SDSU", UIUtils.formatDisplayText("SDSU"));
// Route names
assertEquals("Downtown San Diego - UTC via Old Town",
UIUtils.formatDisplayText("Downtown San Diego - UTC via Old Town"));
assertEquals("UTC/VA Med CTR Express",
UIUtils.formatDisplayText("UTC/VA Med CTR Express"));
}
/**
* Tests building the trip options menu, based on various route/trip parameters
*/
public void testBuildTripOptions() {
// Initial setup to get an ObaArrivalInfo object from a test response
ObaRegion tampa = MockRegion.getTampa(getContext());
assertNotNull(tampa);
Application.get().setCurrentRegion(tampa);
ObaArrivalInfoResponse response =
new ObaArrivalInfoRequest.Builder(getContext(),
"Hillsborough Area Regional Transit_3105").build().call();
assertOK(response);
ObaStop stop = response.getStop();
assertNotNull(stop);
assertEquals("Hillsborough Area Regional Transit_3105", stop.getId());
List<ObaRoute> routes = response.getRoutes(stop.getRouteIds());
assertTrue(routes.size() > 0);
ObaAgency agency = response.getAgency(routes.get(0).getAgencyId());
assertEquals("Hillsborough Area Regional Transit", agency.getId());
ObaArrivalInfo[] arrivals = response.getArrivalInfo();
assertNotNull(arrivals);
ArrayList<ArrivalInfo> arrivalInfo = ArrivalInfoUtils.convertObaArrivalInfo(getContext(),
arrivals, null, response.getCurrentTime(), true);
ObaRoute route = response.getRoute(arrivalInfo.get(0).getInfo().getRouteId());
String url = route != null ? route.getUrl() : null;
boolean hasUrl = !TextUtils.isEmpty(url);
boolean isReminderVisible = false; // We don't have views here, so just fake it
boolean isRouteFavorite = false; // We'll fake this too, for our purposes
// HART has route schedule URLs in test data, so below options should allow the user to set
// a reminder and view the route schedule
List<String> options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl, isReminderVisible);
assertEquals(options.get(0), "Add star to route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Set a reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Show route schedule");
assertEquals(options.get(6), "Report arrival time problem");
isReminderVisible = true;
// Now we should see route schedules and *edit* the reminder
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl, isReminderVisible);
assertEquals(options.get(0), "Add star to route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Edit this reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Show route schedule");
assertEquals(options.get(6), "Report arrival time problem");
// Get a PSTA response - PSTA test data doesn't include route schedule URLs
ObaArrivalInfoResponse response2 =
new ObaArrivalInfoRequest.Builder(getContext(), "PSTA_4077").build().call();
assertOK(response2);
stop = response2.getStop();
assertNotNull(stop);
assertEquals("PSTA_4077", stop.getId());
routes = response2.getRoutes(stop.getRouteIds());
assertTrue(routes.size() > 0);
agency = response2.getAgency(routes.get(0).getAgencyId());
assertEquals("PSTA", agency.getId());
arrivals = response2.getArrivalInfo();
assertNotNull(arrivals);
arrivalInfo = ArrivalInfoUtils.convertObaArrivalInfo(getContext(),
arrivals, null, response2.getCurrentTime(), true);
route = response2.getRoute(arrivalInfo.get(0).getInfo().getRouteId());
url = route != null ? route.getUrl() : null;
boolean hasUrl2 = !TextUtils.isEmpty(url);
isReminderVisible = false; // We don't have views here, so just fake it
// PSTA does not have route schedule URLs in test data, so below options should allow the
// user to set a reminder but NOT view the route schedule
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl2, isReminderVisible);
assertEquals(options.get(0), "Add star to route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Set a reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Report arrival time problem");
isReminderVisible = true;
// Now we should see *edit* the reminder, and still no route schedule
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl2, isReminderVisible);
assertEquals(options.get(0), "Add star to route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Edit this reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Report arrival time problem");
// Now change route to favorite, and do all the above over again
isRouteFavorite = true;
// HART
isReminderVisible = false; // We don't have views here, so just fake it
// HART has route schedule URLs in test data, so below options should allow the user to set
// a reminder and view the route schedule
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl, isReminderVisible);
assertEquals(options.get(0), "Remove star from route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Set a reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Show route schedule");
assertEquals(options.get(6), "Report arrival time problem");
isReminderVisible = true;
// Now we should see route schedules and *edit* the reminder
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl, isReminderVisible);
assertEquals(options.get(0), "Remove star from route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Edit this reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Show route schedule");
assertEquals(options.get(6), "Report arrival time problem");
// PSTA
isReminderVisible = false; // We don't have views here, so just fake it
// PSTA does not have route schedule URLs in test data, so below options should allow the
// user to set a reminder but NOT view the route schedule
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl2, isReminderVisible);
assertEquals(options.get(0), "Remove star from route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Set a reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Report arrival time problem");
isReminderVisible = true;
// Now we should see *edit* the reminder, and still no route schedule
options = UIUtils
.buildTripOptions(getContext(), isRouteFavorite, hasUrl2, isReminderVisible);
assertEquals(options.get(0), "Remove star from route");
assertEquals(options.get(1), "Show route on map");
assertEquals(options.get(2), "Show trip status");
assertEquals(options.get(3), "Edit this reminder");
assertEquals(options.get(4), "Show only this route");
assertEquals(options.get(5), "Report arrival time problem");
}
public void testCreateStopDetailsDialogText() {
final String newLine = "\n";
Pair stopDetails;
StringBuilder expectedMessage;
// Stop details
String stopName = "University Area Transit Center";
String stopUserName = null;
String stopCode = "6497";
String stopDirection = null;
List<String> routeDisplayNames = new ArrayList<>();
routeDisplayNames.add("5");
// Test without stop nickname or direction
stopDetails = UIUtils.createStopDetailsDialogText(getContext(),
stopName,
stopUserName,
stopCode,
stopDirection,
routeDisplayNames);
assertEquals(stopName, (String) stopDetails.first);
expectedMessage = new StringBuilder();
expectedMessage.append("Stop # " + stopCode);
expectedMessage.append(newLine);
expectedMessage.append("Routes: " + routeDisplayNames.get(0));
assertEquals(expectedMessage.toString(), (String) stopDetails.second);
// Test with stop nickname and without direction
stopUserName = "My stop nickname";
stopDetails = UIUtils.createStopDetailsDialogText(getContext(),
stopName,
stopUserName,
stopCode,
stopDirection,
routeDisplayNames);
assertEquals(stopUserName, (String) stopDetails.first);
expectedMessage = new StringBuilder();
expectedMessage.append("Official name: " + stopName);
expectedMessage.append(newLine);
expectedMessage.append("Stop # " + stopCode);
expectedMessage.append(newLine);
expectedMessage.append("Routes: " + routeDisplayNames.get(0));
assertEquals(expectedMessage.toString(), (String) stopDetails.second);
// Test without stop nickname and with direction
stopUserName = null;
stopDirection = "S";
stopDetails = UIUtils.createStopDetailsDialogText(getContext(),
stopName,
stopUserName,
stopCode,
stopDirection,
routeDisplayNames);
assertEquals(stopName, (String) stopDetails.first);
expectedMessage = new StringBuilder();
expectedMessage.append("Stop # " + stopCode);
expectedMessage.append(newLine);
expectedMessage.append("Routes: " + routeDisplayNames.get(0));
expectedMessage.append(newLine);
expectedMessage.append(getContext().getString(UIUtils.getStopDirectionText(stopDirection)));
assertEquals(expectedMessage.toString(), (String) stopDetails.second);
// Test with stop nickname and direction
stopUserName = "My stop nickname";
stopDirection = "S";
stopDetails = UIUtils.createStopDetailsDialogText(getContext(),
stopName,
stopUserName,
stopCode,
stopDirection,
routeDisplayNames);
assertEquals(stopUserName, (String) stopDetails.first);
expectedMessage = new StringBuilder();
expectedMessage.append("Official name: " + stopName);
expectedMessage.append(newLine);
expectedMessage.append("Stop # " + stopCode);
expectedMessage.append(newLine);
expectedMessage.append("Routes: " + routeDisplayNames.get(0));
expectedMessage.append(newLine);
expectedMessage.append(getContext().getString(UIUtils.getStopDirectionText(stopDirection)));
assertEquals(expectedMessage.toString(), (String) stopDetails.second);
}
public void testArrivalTimeIndexSearch() {
// Initial setup to get an ObaArrivalInfo object from a test response
ObaRegion tampa = MockRegion.getTampa(getContext());
assertNotNull(tampa);
Application.get().setCurrentRegion(tampa);
ObaArrivalInfoResponse response =
new ObaArrivalInfoRequest.Builder(getContext(),
"Hillsborough Area Regional Transit_6497").build().call();
assertOK(response);
ObaStop stop = response.getStop();
assertNotNull(stop);
assertEquals("Hillsborough Area Regional Transit_6497", stop.getId());
List<ObaRoute> routes = response.getRoutes(stop.getRouteIds());
assertTrue(routes.size() > 0);
ObaAgency agency = response.getAgency(routes.get(0).getAgencyId());
assertEquals("Hillsborough Area Regional Transit", agency.getId());
// First de-select any existing route favorites, to make sure the test returns correct results
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_2",
"UATC to Downtown via Nebraska Ave",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_1",
"UATC to Downtown via Florida Ave",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_18",
"North to UATC/Livingston",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_5",
"South to Downtown/MTC",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_2",
"UATC to Downtown via Nebraska Ave",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_18",
"South to UATC/Downtown/MTC",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_12",
"North to University Area TC",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_9",
"UATC to Downtown via 15th St",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_12",
"South to Downtown/MTC",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_5",
"North to University Area TC",
stop.getId(),
false);
// Now mark 2 favorites - first non-negative index for this route/headsign will be index 11
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_6",
"North to University Area TC",
stop.getId(),
true);
// First non-negative index for this route/headsign will be index 13
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_6",
"South to Downtown/MTC",
stop.getId(),
true);
// Get the response
ObaArrivalInfo[] arrivals = response.getArrivalInfo();
assertNotNull(arrivals);
ArrayList<ArrivalInfo> arrivalInfo = ArrivalInfoUtils.convertObaArrivalInfo(getContext(),
arrivals, null, response.getCurrentTime(), true);
// Now confirm that we have the correct number of elements, and values for ETAs for the test
validateUatcArrivalInfo(arrivalInfo);
// First non-negative arrival should be "0", in index 5
int firstNonNegativeArrivalIndex = ArrivalInfoUtils.findFirstNonNegativeArrival(arrivalInfo);
assertEquals(5, firstNonNegativeArrivalIndex);
ArrayList<Integer> preferredArrivalIndexes = ArrivalInfoUtils
.findPreferredArrivalIndexes(arrivalInfo);
// Indexes 11 and 13 should hold the favorites
assertEquals(11, preferredArrivalIndexes.get(0).intValue());
assertEquals(13, preferredArrivalIndexes.get(1).intValue());
// Now clear the favorites
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_6",
"North to University Area TC",
stop.getId(),
false);
ObaContract.RouteHeadsignFavorites.markAsFavorite(getContext(),
"Hillsborough Area Regional Transit_6",
"South to Downtown/MTC",
stop.getId(),
false);
// Process the response again (resetting the included favorite info)
arrivalInfo = ArrivalInfoUtils.convertObaArrivalInfo(getContext(),
arrivals, null, response.getCurrentTime(), true);
preferredArrivalIndexes = ArrivalInfoUtils.findPreferredArrivalIndexes(arrivalInfo);
// Now the first two non-negative arrival times should be returned - indexes 5 and 6
assertEquals(5, preferredArrivalIndexes.get(0).intValue());
assertEquals(6, preferredArrivalIndexes.get(1).intValue());
}
/**
* Tests the status and time labels for arrival info
*/
public void testArrivalInfoLabels() {
// Initial setup to get an ObaArrivalInfo object from a test response
ObaRegion tampa = MockRegion.getTampa(getContext());
assertNotNull(tampa);
Application.get().setCurrentRegion(tampa);
ObaArrivalInfoResponse response =
new ObaArrivalInfoRequest.Builder(getContext(),
"Hillsborough Area Regional Transit_6497").build().call();
assertOK(response);
ObaStop stop = response.getStop();
assertNotNull(stop);
assertEquals("Hillsborough Area Regional Transit_6497", stop.getId());
List<ObaRoute> routes = response.getRoutes(stop.getRouteIds());
assertTrue(routes.size() > 0);
ObaAgency agency = response.getAgency(routes.get(0).getAgencyId());
assertEquals("Hillsborough Area Regional Transit", agency.getId());
// Get the response
ObaArrivalInfo[] arrivals = response.getArrivalInfo();
assertNotNull(arrivals);
/**
* Labels *with* arrive/depart included, and time labels
*/
boolean includeArriveDepartLabels = true;
ArrayList<ArrivalInfo> arrivalInfo = ArrivalInfoUtils.convertObaArrivalInfo(
getContext(),
arrivals, null, response.getCurrentTime(), includeArriveDepartLabels);
// Now confirm that we have the correct number of elements, and values for ETAs for the test
validateUatcArrivalInfo(arrivalInfo);
// Arrivals/departures that have already happened
assertEquals("Arrived on time", arrivalInfo.get(0).getStatusText());
assertEquals("Arrived at " + formatTime(1438804260000L),
arrivalInfo.get(0).getTimeText());
assertEquals("Departed 2 min late", arrivalInfo.get(1).getStatusText());
assertEquals("Departed at " + formatTime(1438804320000L), arrivalInfo.get(1).getTimeText());
assertEquals("Departed 1 min early", arrivalInfo.get(2).getStatusText());
assertEquals("Departed at " + formatTime(1438804440000L), arrivalInfo.get(2).getTimeText());
assertEquals("Arrived on time", arrivalInfo.get(3).getStatusText());
assertEquals("Arrived at " + formatTime(1438804440000L), arrivalInfo.get(3).getTimeText());
assertEquals("Departed 6 min early", arrivalInfo.get(4).getStatusText());
assertEquals("Departed at " + formatTime(1438804440000L), arrivalInfo.get(4).getTimeText());
// Arrivals and departures that will happen in the future
assertEquals("On time", arrivalInfo.get(5).getStatusText());
assertEquals("Departing at " + formatTime(1438804500000L),
arrivalInfo.get(5).getTimeText());
assertEquals("On time", arrivalInfo.get(6).getStatusText());
assertEquals("Arriving at " + formatTime(1438804500000L), arrivalInfo.get(6).getTimeText());
assertEquals("5 min delay", arrivalInfo.get(7).getStatusText());
assertEquals("Arriving at " + formatTime(1438804680000L), arrivalInfo.get(7).getTimeText());
assertEquals("On time", arrivalInfo.get(8).getStatusText());
assertEquals("Departing at " + formatTime(1438804800000L),
arrivalInfo.get(8).getTimeText());
assertEquals("On time", arrivalInfo.get(9).getStatusText());
assertEquals("Departing at " + formatTime(1438804800000L),
arrivalInfo.get(9).getTimeText());
assertEquals("10 min delay", arrivalInfo.get(10).getStatusText());
assertEquals("Arriving at " + formatTime(1438804860000L),
arrivalInfo.get(10).getTimeText());
assertEquals("1 min early", arrivalInfo.get(11).getStatusText());
assertEquals("Arriving at " + formatTime(1438804920000L),
arrivalInfo.get(11).getTimeText());
assertEquals("On time", arrivalInfo.get(12).getStatusText());
assertEquals("Arriving at " + formatTime(1438805100000L),
arrivalInfo.get(12).getTimeText());
assertEquals("1 min early", arrivalInfo.get(13).getStatusText());
assertEquals("Departing at " + formatTime(1438805340000L),
arrivalInfo.get(13).getTimeText());
assertEquals("1 min delay", arrivalInfo.get(14).getStatusText());
assertEquals("Arriving at " + formatTime(1438805520000L),
arrivalInfo.get(14).getTimeText());
assertEquals("On time", arrivalInfo.get(15).getStatusText());
assertEquals("Arriving at " + formatTime(1438805700000L),
arrivalInfo.get(15).getTimeText());
assertEquals("On time", arrivalInfo.get(16).getStatusText());
assertEquals("Departing at " + formatTime(1438805700000L),
arrivalInfo.get(16).getTimeText());
assertEquals("4 min delay", arrivalInfo.get(17).getStatusText());
assertEquals("Arriving at " + formatTime(1438805880000L),
arrivalInfo.get(17).getTimeText());
assertEquals("On time", arrivalInfo.get(18).getStatusText());
assertEquals("Departing at " + formatTime(1438806000000L),
arrivalInfo.get(18).getTimeText());
assertEquals("8 min delay", arrivalInfo.get(19).getStatusText());
assertEquals("Arriving at " + formatTime(1438806060000L),
arrivalInfo.get(19).getTimeText());
assertEquals("2 min delay", arrivalInfo.get(20).getStatusText());
assertEquals("Departing at " + formatTime(1438806124000L),
arrivalInfo.get(20).getTimeText());
assertEquals("3 min delay", arrivalInfo.get(21).getStatusText());
assertEquals("Arriving at " + formatTime(1438806180000L),
arrivalInfo.get(21).getTimeText());
assertEquals("On time", arrivalInfo.get(22).getStatusText());
assertEquals("Arriving at " + formatTime(1438806300000L),
arrivalInfo.get(22).getTimeText());
assertEquals("On time", arrivalInfo.get(23).getStatusText());
assertEquals("Departing at " + formatTime(1438806300000L),
arrivalInfo.get(23).getTimeText());
assertEquals("6 min delay", arrivalInfo.get(24).getStatusText());
assertEquals("Arriving at " + formatTime(1438806420000L),
arrivalInfo.get(24).getTimeText());
assertEquals("3 min delay", arrivalInfo.get(25).getStatusText());
assertEquals("Arriving at " + formatTime(1438806420000L),
arrivalInfo.get(25).getTimeText());
assertEquals("6 min delay", arrivalInfo.get(26).getStatusText());
assertEquals("Arriving at " + formatTime(1438806540000L),
arrivalInfo.get(26).getTimeText());
assertEquals("On time", arrivalInfo.get(27).getStatusText());
assertEquals("Arriving at " + formatTime(1438806540000L),
arrivalInfo.get(27).getTimeText());
assertEquals("On time", arrivalInfo.get(28).getStatusText());
assertEquals("Departing at " + formatTime(1438806600000L),
arrivalInfo.get(28).getTimeText());
assertEquals("On time", arrivalInfo.get(29).getStatusText());
assertEquals("Departing at " + formatTime(1438806600000L),
arrivalInfo.get(29).getTimeText());
assertEquals("9 min delay", arrivalInfo.get(30).getStatusText());
assertEquals("Arriving at " + formatTime(1438806600000L),
arrivalInfo.get(30).getTimeText());
assertEquals("On time", arrivalInfo.get(31).getStatusText());
assertEquals("Departing at " + formatTime(1438806600000L),
arrivalInfo.get(31).getTimeText());
/**
* Status labels *without* arrive/depart included
*/
includeArriveDepartLabels = false;
arrivalInfo = ArrivalInfoUtils.convertObaArrivalInfo(getContext(), arrivals, null,
response.getCurrentTime(), includeArriveDepartLabels);
// Now confirm that we have the correct number of elements, and values for ETAs for the test
validateUatcArrivalInfo(arrivalInfo);
assertEquals("On time", arrivalInfo.get(0).getStatusText());
assertEquals("2 min late", arrivalInfo.get(1).getStatusText());
assertEquals("1 min early", arrivalInfo.get(2).getStatusText());
assertEquals("On time", arrivalInfo.get(3).getStatusText());
assertEquals("6 min early", arrivalInfo.get(4).getStatusText());
// Arrivals and departures that will happen in the future
assertEquals("On time", arrivalInfo.get(5).getStatusText());
assertEquals("On time", arrivalInfo.get(6).getStatusText());
assertEquals("5 min delay", arrivalInfo.get(7).getStatusText());
assertEquals("On time", arrivalInfo.get(8).getStatusText());
assertEquals("On time", arrivalInfo.get(9).getStatusText());
assertEquals("10 min delay", arrivalInfo.get(10).getStatusText());
assertEquals("1 min early", arrivalInfo.get(11).getStatusText());
assertEquals("On time", arrivalInfo.get(12).getStatusText());
assertEquals("1 min early", arrivalInfo.get(13).getStatusText());
assertEquals("1 min delay", arrivalInfo.get(14).getStatusText());
assertEquals("On time", arrivalInfo.get(15).getStatusText());
assertEquals("On time", arrivalInfo.get(16).getStatusText());
assertEquals("4 min delay", arrivalInfo.get(17).getStatusText());
assertEquals("On time", arrivalInfo.get(18).getStatusText());
assertEquals("8 min delay", arrivalInfo.get(19).getStatusText());
assertEquals("2 min delay", arrivalInfo.get(20).getStatusText());
assertEquals("3 min delay", arrivalInfo.get(21).getStatusText());
assertEquals("On time", arrivalInfo.get(22).getStatusText());
assertEquals("On time", arrivalInfo.get(23).getStatusText());
assertEquals("6 min delay", arrivalInfo.get(24).getStatusText());
assertEquals("3 min delay", arrivalInfo.get(25).getStatusText());
assertEquals("6 min delay", arrivalInfo.get(26).getStatusText());
assertEquals("On time", arrivalInfo.get(27).getStatusText());
assertEquals("On time", arrivalInfo.get(28).getStatusText());
assertEquals("On time", arrivalInfo.get(29).getStatusText());
assertEquals("9 min delay", arrivalInfo.get(30).getStatusText());
assertEquals("On time", arrivalInfo.get(31).getStatusText());
/**
* Test notification texts
*/
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(0).getInfo())
+ " has arrived.", arrivalInfo.get(0).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(1).getInfo())
+ " has departed.", arrivalInfo.get(1).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(2).getInfo())
+ " has departed.", arrivalInfo.get(2).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(3).getInfo())
+ " has arrived.", arrivalInfo.get(3).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(4).getInfo())
+ " has departed.", arrivalInfo.get(4).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(5).getInfo())
+ " is departing now!", arrivalInfo.get(5).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(6).getInfo())
+ " is arriving now!", arrivalInfo.get(6).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(7).getInfo())
+ " is arriving in 3 min!", arrivalInfo.get(7).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(8).getInfo())
+ " is departing in 5 min!", arrivalInfo.get(8).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(9).getInfo())
+ " is departing in 5 min!", arrivalInfo.get(9).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(10).getInfo())
+ " is arriving in 6 min!", arrivalInfo.get(10).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(11).getInfo())
+ " is arriving in 7 min!", arrivalInfo.get(11).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(12).getInfo())
+ " is arriving in 10 min!", arrivalInfo.get(12).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(13).getInfo())
+ " is departing in 14 min!", arrivalInfo.get(13).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(14).getInfo())
+ " is arriving in 17 min!", arrivalInfo.get(14).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(15).getInfo())
+ " is arriving in 20 min!", arrivalInfo.get(15).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(16).getInfo())
+ " is departing in 20 min!", arrivalInfo.get(16).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(17).getInfo())
+ " is arriving in 23 min!", arrivalInfo.get(17).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(18).getInfo())
+ " is departing in 25 min!", arrivalInfo.get(18).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(19).getInfo())
+ " is arriving in 26 min!", arrivalInfo.get(19).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(20).getInfo())
+ " is departing in 27 min!", arrivalInfo.get(20).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(21).getInfo())
+ " is arriving in 28 min!", arrivalInfo.get(21).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(22).getInfo())
+ " is arriving in 30 min!", arrivalInfo.get(22).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(23).getInfo())
+ " is departing in 30 min!", arrivalInfo.get(23).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(24).getInfo())
+ " is arriving in 32 min!", arrivalInfo.get(24).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(25).getInfo())
+ " is arriving in 32 min!", arrivalInfo.get(25).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(26).getInfo())
+ " is arriving in 34 min!", arrivalInfo.get(26).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(27).getInfo())
+ " is arriving in 34 min!", arrivalInfo.get(27).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(28).getInfo())
+ " is departing in 35 min!", arrivalInfo.get(28).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(29).getInfo())
+ " is departing in 35 min!", arrivalInfo.get(29).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(30).getInfo())
+ " is arriving in 35 min!", arrivalInfo.get(30).getNotifyText());
assertEquals("Route " + UIUtils.getRouteDisplayName(arrivalInfo.get(31).getInfo())
+ " is departing in 35 min!", arrivalInfo.get(31).getNotifyText());
}
public void testMaybeShrinkRouteName() {
TextView tv = new TextView(getContext());
String routeShortName = "TST";
float textSize = tv.getTextSize();
UIUtils.maybeShrinkRouteName(getContext(), tv, routeShortName);
assertEquals(textSize, tv.getTextSize());
routeShortName = "Test";
UIUtils.maybeShrinkRouteName(getContext(), tv, routeShortName);
assertEquals(getContext().getResources().getDimension(R.dimen.route_name_text_size_medium),
tv.getTextSize());
routeShortName = "Test2";
UIUtils.maybeShrinkRouteName(getContext(), tv, routeShortName);
assertEquals(getContext().getResources().getDimension(R.dimen.route_name_text_size_small),
tv.getTextSize());
}
/**
* Validates the ETAs and number of arrivals for Tampa's University Area Transit Center. This
* data is used for a few tests and we want to make sure it's valid.
*/
private void validateUatcArrivalInfo(ArrayList<ArrivalInfo> arrivalInfo) {
assertEquals(32, arrivalInfo.size());
assertEquals(-4, arrivalInfo.get(0).getEta());
assertEquals(-3, arrivalInfo.get(1).getEta());
assertEquals(-1, arrivalInfo.get(2).getEta());
assertEquals(-1, arrivalInfo.get(3).getEta());
assertEquals(-1, arrivalInfo.get(4).getEta());
assertEquals(0, arrivalInfo.get(5).getEta()); // First non-negative ETA
assertEquals(0, arrivalInfo.get(6).getEta());
assertEquals(3, arrivalInfo.get(7).getEta());
assertEquals(5, arrivalInfo.get(8).getEta());
assertEquals(5, arrivalInfo.get(9).getEta());
assertEquals(6, arrivalInfo.get(10).getEta());
assertEquals(7, arrivalInfo.get(11).getEta());
assertEquals(10, arrivalInfo.get(12).getEta());
assertEquals(14, arrivalInfo.get(13).getEta());
assertEquals(17, arrivalInfo.get(14).getEta());
assertEquals(20, arrivalInfo.get(15).getEta());
assertEquals(20, arrivalInfo.get(16).getEta());
assertEquals(23, arrivalInfo.get(17).getEta());
assertEquals(25, arrivalInfo.get(18).getEta());
assertEquals(26, arrivalInfo.get(19).getEta());
assertEquals(27, arrivalInfo.get(20).getEta());
assertEquals(28, arrivalInfo.get(21).getEta());
assertEquals(30, arrivalInfo.get(22).getEta());
assertEquals(30, arrivalInfo.get(23).getEta());
assertEquals(32, arrivalInfo.get(24).getEta());
assertEquals(32, arrivalInfo.get(25).getEta());
assertEquals(34, arrivalInfo.get(26).getEta());
assertEquals(34, arrivalInfo.get(27).getEta());
assertEquals(35, arrivalInfo.get(28).getEta());
assertEquals(35, arrivalInfo.get(29).getEta());
assertEquals(35, arrivalInfo.get(30).getEta());
assertEquals(35, arrivalInfo.get(31).getEta());
}
public void testGetTransparentColor() {
String colorString = "#777777";
int alpha = 127;
int color = Color.parseColor(colorString);
int newColor = UIUtils.getTransparentColor(color, alpha);
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
int newR = Color.red(newColor);
int newG = Color.green(newColor);
int newB = Color.blue(newColor);
int newAlpha = Color.alpha(newColor);
assertEquals(r, newR);
assertEquals(g, newG);
assertEquals(b, newB);
assertEquals(alpha, newAlpha);
}
private String formatTime(long time) {
return UIUtils.formatTime(getContext(), time);
}
/**
* Tests getting map view center information from a bundle
*/
public void testGetMapCenter() {
// Check null and empty bundles
Bundle b = null;
assertNull(UIUtils.getMapCenter(b));
b = new Bundle();
assertNull(UIUtils.getMapCenter(b));
// Check single params
b.putDouble(MapParams.CENTER_LAT, 0.0);
assertNull(UIUtils.getMapCenter(b));
b = new Bundle();
b.putDouble(MapParams.CENTER_LON, 0.0);
assertNull(UIUtils.getMapCenter(b));
// Check invalid lat/long
b = new Bundle();
b.putDouble(MapParams.CENTER_LAT, 0.0);
b.putDouble(MapParams.CENTER_LON, 0.0);
assertNull(UIUtils.getMapCenter(b));
// Check valid lat/long
final double lat = 28.343243;
final double lon = -87.234234;
b = new Bundle();
b.putDouble(MapParams.CENTER_LAT, lat);
b.putDouble(MapParams.CENTER_LON, lon);
Location l = UIUtils.getMapCenter(b);
assertNotNull(l);
assertEquals(lat, l.getLatitude());
assertEquals(lon, l.getLongitude());
}
/**
* Tests including all situations (service alerts) from a response in the final list, including
* ones specific to routes
*/
public void testGetAllSituations() {
Application.get().setCustomApiUrl("sdmts.onebusway.org/api");
/**
* Test route-specific alerts only
*/
ObaArrivalInfoResponse response =
new ObaArrivalInfoRequest.Builder(getContext(), "MTS_11670").build().call();
assertOK(response);
List<ObaSituation> situations = response.getSituations();
assertNotNull(situations);
// No stop-specific alerts, and route-specific situations don't appear in the main situations element - see #700
assertEquals(0, situations.size());
// They do appear, however, in the references list and are referenced by each arrival info
// Make sure we build a list of all situations
List<ObaSituation> allSituations = UIUtils.getAllSituations(response);
// Build a set of all IDs returned
HashSet<String> situationIds = new HashSet<>();
for (ObaSituation situation : allSituations) {
situationIds.add(situation.getId());
}
// There are 7 route-specific alerts, and 0 stop-specific alert, so we should have 7 total
assertEquals(7, allSituations.size());
assertEquals(7, situationIds.size());
// Make sure all IDs are contained in list
assertTrue(situationIds.contains("MTS_38"));
assertTrue(situationIds.contains("MTS_37"));
assertTrue(situationIds.contains("MTS_28"));
assertTrue(situationIds.contains("MTS_34"));
assertTrue(situationIds.contains("MTS_11"));
assertTrue(situationIds.contains("MTS_33"));
assertTrue(situationIds.contains("MTS_3"));
// Make sure all objects exist in list
assertTrue(allSituations.contains(response.getSituation("MTS_38")));
assertTrue(allSituations.contains(response.getSituation("MTS_37")));
assertTrue(allSituations.contains(response.getSituation("MTS_28")));
assertTrue(allSituations.contains(response.getSituation("MTS_34")));
assertTrue(allSituations.contains(response.getSituation("MTS_11")));
assertTrue(allSituations.contains(response.getSituation("MTS_33")));
assertTrue(allSituations.contains(response.getSituation("MTS_3")));
/**
* Test route and stop alerts
*/
response = new ObaArrivalInfoRequest.Builder(getContext(), "MTS_13353").build().call();
assertOK(response);
situations = response.getSituations();
assertNotNull(situations);
// We should see the one stop alert, but not the route alerts - see #700
assertEquals(1, situations.size());
// They do appear, however, in the references list and are referenced by each arrival info
// Make sure we build a list of all situations
allSituations = UIUtils.getAllSituations(response);
// Build a set of all IDs returned
situationIds = new HashSet<>();
for (ObaSituation situation : allSituations) {
situationIds.add(situation.getId());
}
// There are 4 route-specific alerts, and 1 stop-specific alert, so we should have 5 total
assertEquals(5, allSituations.size());
assertEquals(5, situationIds.size());
// Make sure all route alert IDs are contained in list
assertTrue(situationIds.contains("MTS_32"));
assertTrue(situationIds.contains("MTS_34"));
assertTrue(situationIds.contains("MTS_14"));
assertTrue(situationIds.contains("MTS_13"));
// Make sure stop alert ID is in list
assertTrue(situationIds.contains("MTS_9c943ee8-d566-4cd8-8a89-a2a535ebe4fe"));
// Make sure all route situation objects exist in list
assertTrue(allSituations.contains(response.getSituation("MTS_32")));
assertTrue(allSituations.contains(response.getSituation("MTS_34")));
assertTrue(allSituations.contains(response.getSituation("MTS_14")));
assertTrue(allSituations.contains(response.getSituation("MTS_13")));
// Make sure the stop situation object exist in list
assertTrue(allSituations.contains(response.getSituations().get(0)));
}
}