package ru.gelin.android.weather.notification; import android.app.Instrumentation; import android.content.Context; import android.content.res.AssetManager; import android.os.Parcel; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import ru.gelin.android.weather.*; import ru.gelin.android.weather.google.GoogleWeather; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.TimeZone; import static android.test.AndroidTestCase.assertEquals; import static android.test.AndroidTestCase.assertTrue; public class WeatherUtils { public static enum Version { V_0_2, V_0_3 } private WeatherUtils() { //avoid instantiation } public static Weather createWeather(Context context) throws Exception { AssetManager assets = context.getAssets(); InputStream xml1 = assets.open("google_weather_api_en.xml"); InputStream xml2 = assets.open("google_weather_api_en.xml"); GoogleWeather weather = GoogleWeather.parse( new InputStreamReader(xml1, "UTF-8"), new InputStreamReader(xml2, "UTF-8")); return weather; } public static Weather createOpenWeather(Instrumentation instrumentation) throws Exception { return ru.gelin.android.weather.openweathermap.WeatherUtils.createOpenWeather(instrumentation); } public static Weather createIncompleteOpenWeather(Instrumentation instrumentation) throws Exception { return ru.gelin.android.weather.openweathermap.WeatherUtils.createIncompleteOpenWeather(instrumentation); } public static ru.gelin.android.weather.v_0_2.Weather createWeather_v_0_2(Context context) throws Exception { return new ru.gelin.android.weather.v_0_2.google.GoogleWeather( new InputStreamReader(context.getAssets().open("google_weather_api_en.xml"))); } public static ru.gelin.android.weather.v_0_2.Weather convert(Weather weather) { Parcel parcel = Parcel.obtain(); ParcelableWeather parcelable = new ParcelableWeather(weather); parcelable.writeToParcel(parcel, 0); parcel.setDataPosition(0); return ru.gelin.android.weather.v_0_2.notification.ParcelableWeather.CREATOR.createFromParcel(parcel); } public static Weather convert(ru.gelin.android.weather.v_0_2.Weather weather) { Parcel parcel = Parcel.obtain(); ru.gelin.android.weather.v_0_2.notification.ParcelableWeather parcelable = new ru.gelin.android.weather.v_0_2.notification.ParcelableWeather(weather); parcelable.writeToParcel(parcel, 0); parcel.setDataPosition(0); return ParcelableWeather.CREATOR.createFromParcel(parcel); } public static void checkWeather(Weather weather, Version version) throws MalformedURLException { switch (version) { case V_0_2: checkWeather_v_0_2(weather); break; default: checkWeather(weather); } } public static void checkWeather(Weather weather) throws MalformedURLException { assertEquals("Omsk, Omsk Oblast", weather.getLocation().getText()); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.set(Calendar.MILLISECOND, 0); calendar.set(2010, Calendar.DECEMBER, 28, 6, 0, 0); assertEquals(calendar.getTime(), weather.getTime()); calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.add(Calendar.MINUTE, -1); assertTrue(weather.getQueryTime().after(calendar.getTime())); assertEquals(4, weather.getConditions().size()); WeatherCondition condition0 = weather.getConditions().get(0); assertEquals("Clear", condition0.getConditionText()); Temperature temp0 = condition0.getTemperature(TemperatureUnit.F); assertEquals(-11, temp0.getCurrent()); assertEquals(-10, temp0.getLow()); assertEquals(-4, temp0.getHigh()); Humidity humidity = condition0.getHumidity(); assertEquals("Humidity: 66%", humidity.getText()); assertEquals(66, humidity.getValue()); Wind wind = condition0.getWind(WindSpeedUnit.MPH); assertEquals("Wind: SW at 2 mph", wind.getText()); assertEquals(WindDirection.SW, wind.getDirection()); assertEquals(2, wind.getSpeed()); WeatherCondition condition1 = weather.getConditions().get(1); assertEquals("Snow Showers", condition1.getConditionText()); Temperature temp1 = condition1.getTemperature(TemperatureUnit.F); assertEquals(7, temp1.getCurrent()); assertEquals(-7, temp1.getLow()); assertEquals(20, temp1.getHigh()); WeatherCondition condition2 = weather.getConditions().get(2); assertEquals("Partly Sunny", condition2.getConditionText()); Temperature temp2 = condition2.getTemperature(TemperatureUnit.F); assertEquals(-10, temp2.getCurrent()); assertEquals(-14, temp2.getLow()); assertEquals(-6, temp2.getHigh()); WeatherCondition condition3 = weather.getConditions().get(3); assertEquals("Partly Sunny", condition3.getConditionText()); Temperature temp3 = condition3.getTemperature(TemperatureUnit.F); assertEquals(-22, temp3.getCurrent()); assertEquals(-29, temp3.getLow()); assertEquals(-15, temp3.getHigh()); } public static void checkOpenWeather(Weather weather) throws MalformedURLException { assertEquals("Omsk", weather.getLocation().getText()); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar.set(2013, Calendar.AUGUST, 15, 14, 00, 00); calendar.set(Calendar.MILLISECOND, 0); assertEquals(calendar.getTime(), weather.getTime()); calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.add(Calendar.MINUTE, -1); assertTrue(weather.getQueryTime().after(calendar.getTime())); assertEquals(new URL("http://m.openweathermap.org/city/1496153#forecast"), weather.getForecastURL()); assertEquals(4, weather.getConditions().size()); WeatherCondition condition0 = weather.getConditions().get(0); assertEquals("Sky is clear", condition0.getConditionText()); Temperature temp0 = condition0.getTemperature(TemperatureUnit.K); assertEquals(294, temp0.getCurrent()); assertEquals(287, temp0.getLow()); assertEquals(294, temp0.getHigh()); Humidity humidity = condition0.getHumidity(); assertEquals("Humidity: 56%", humidity.getText()); assertEquals(56, humidity.getValue()); Wind wind = condition0.getWind(WindSpeedUnit.MPS); assertEquals("Wind: N, 4 m/s", wind.getText()); assertEquals(WindDirection.N, wind.getDirection()); assertEquals(4, wind.getSpeed()); Cloudiness cloudiness = condition0.getCloudiness(CloudinessUnit.PERCENT); assertEquals(0, cloudiness.getValue()); assertEquals(0f, condition0.getPrecipitation().getValue(PrecipitationPeriod.PERIOD_1H), 0.01f); assertEquals(1, condition0.getConditionTypes().size()); assertTrue(condition0.getConditionTypes().contains(WeatherConditionType.CLOUDS_CLEAR)); WeatherCondition condition1 = weather.getConditions().get(1); assertEquals("Light rain", condition1.getConditionText()); Temperature temp1 = condition1.getTemperature(TemperatureUnit.K); assertEquals(289, temp1.getCurrent()); assertEquals(284, temp1.getLow()); assertEquals(293, temp1.getHigh()); assertEquals(98, condition1.getHumidity().getValue()); assertEquals(WindDirection.N, condition1.getWind().getDirection()); assertEquals(2, condition1.getWind().getSpeed()); assertEquals(18, condition1.getCloudiness().getValue()); assertEquals(1f, condition1.getPrecipitation().getValue(PrecipitationPeriod.PERIOD_1H), 0.01f); assertEquals(2, condition1.getConditionTypes().size()); assertTrue(condition1.getConditionTypes().contains(WeatherConditionType.CLOUDS_FEW)); assertTrue(condition1.getConditionTypes().contains(WeatherConditionType.RAIN_LIGHT)); WeatherCondition condition2 = weather.getConditions().get(2); assertEquals("Rain", condition2.getConditionText()); Temperature temp2 = condition2.getTemperature(TemperatureUnit.K); assertEquals(288, temp2.getCurrent()); assertEquals(282, temp2.getLow()); assertEquals(293, temp2.getHigh()); assertEquals(93, condition2.getHumidity().getValue()); assertEquals(WindDirection.SW, condition2.getWind().getDirection()); assertEquals(2, condition2.getWind().getSpeed()); assertEquals(0, condition2.getCloudiness().getValue()); assertEquals(2f, condition2.getPrecipitation().getValue(PrecipitationPeriod.PERIOD_1H), 0.01f); assertEquals(2, condition2.getConditionTypes().size()); assertTrue(condition2.getConditionTypes().contains(WeatherConditionType.CLOUDS_BROKEN)); assertTrue(condition2.getConditionTypes().contains(WeatherConditionType.RAIN)); WeatherCondition condition3 = weather.getConditions().get(3); assertEquals("Shower rain", condition3.getConditionText()); Temperature temp3 = condition3.getTemperature(TemperatureUnit.K); assertEquals(289, temp3.getCurrent()); assertEquals(283, temp3.getLow()); assertEquals(295, temp3.getHigh()); assertEquals(90, condition3.getHumidity().getValue()); assertEquals(WindDirection.SW, condition3.getWind().getDirection()); assertEquals(2, condition3.getWind().getSpeed()); assertEquals(22, condition3.getCloudiness().getValue()); assertEquals(3f, condition3.getPrecipitation().getValue(PrecipitationPeriod.PERIOD_1H), 0.01f); assertEquals(2, condition3.getConditionTypes().size()); assertTrue(condition3.getConditionTypes().contains(WeatherConditionType.CLOUDS_OVERCAST)); assertTrue(condition3.getConditionTypes().contains(WeatherConditionType.RAIN_SHOWER)); } public static void checkWeather(ru.gelin.android.weather.v_0_2.Weather weather) { assertEquals("Omsk, Omsk Oblast", weather.getLocation().getText()); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.set(Calendar.MILLISECOND, 0); calendar.set(2010, Calendar.DECEMBER, 28, 6, 0, 0); assertEquals(calendar.getTime(), weather.getTime()); assertEquals(ru.gelin.android.weather.v_0_2.UnitSystem.US, weather.getUnitSystem()); assertEquals(4, weather.getConditions().size()); ru.gelin.android.weather.v_0_2.WeatherCondition condition0 = weather.getConditions().get(0); assertEquals("Clear", condition0.getConditionText()); ru.gelin.android.weather.v_0_2.Temperature temp0 = condition0.getTemperature(ru.gelin.android.weather.v_0_2.UnitSystem.US); assertEquals(-11, temp0.getCurrent()); assertEquals(-10, temp0.getLow()); assertEquals(-4, temp0.getHigh()); assertEquals("Humidity: 66%", condition0.getHumidityText()); assertEquals("Wind: SW at 2 mph", condition0.getWindText()); ru.gelin.android.weather.v_0_2.WeatherCondition condition1 = weather.getConditions().get(1); assertEquals("Snow Showers", condition1.getConditionText()); ru.gelin.android.weather.v_0_2.Temperature temp1 = condition1.getTemperature(ru.gelin.android.weather.v_0_2.UnitSystem.US); assertEquals(7, temp1.getCurrent()); assertEquals(-7, temp1.getLow()); assertEquals(20, temp1.getHigh()); ru.gelin.android.weather.v_0_2.WeatherCondition condition2 = weather.getConditions().get(2); assertEquals("Partly Sunny", condition2.getConditionText()); ru.gelin.android.weather.v_0_2.Temperature temp2 = condition2.getTemperature(ru.gelin.android.weather.v_0_2.UnitSystem.US); assertEquals(-10, temp2.getCurrent()); assertEquals(-14, temp2.getLow()); assertEquals(-6, temp2.getHigh()); ru.gelin.android.weather.v_0_2.WeatherCondition condition3 = weather.getConditions().get(3); assertEquals("Partly Sunny", condition3.getConditionText()); ru.gelin.android.weather.v_0_2.Temperature temp3 = condition3.getTemperature(ru.gelin.android.weather.v_0_2.UnitSystem.US); assertEquals(-22, temp3.getCurrent()); assertEquals(-29, temp3.getLow()); assertEquals(-15, temp3.getHigh()); } @SuppressWarnings("deprecation") public static void checkWeather_v_0_2(Weather weather) { assertEquals("Omsk, Omsk Oblast", weather.getLocation().getText()); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.set(Calendar.MILLISECOND, 0); calendar.set(2010, Calendar.DECEMBER, 28, 6, 0, 0); assertEquals(calendar.getTime(), weather.getTime()); assertEquals(4, weather.getConditions().size()); WeatherCondition condition0 = weather.getConditions().get(0); assertEquals("Clear", condition0.getConditionText()); Temperature temp0 = condition0.getTemperature(); assertEquals(-11, temp0.getCurrent()); assertEquals(-10, temp0.getLow()); assertEquals(-4, temp0.getHigh()); assertEquals("Humidity: 66%", condition0.getHumidityText()); assertEquals("Wind: SW at 2 mph", condition0.getWindText()); WeatherCondition condition1 = weather.getConditions().get(1); assertEquals("Snow Showers", condition1.getConditionText()); Temperature temp1 = condition1.getTemperature(); assertEquals(7, temp1.getCurrent()); assertEquals(-7, temp1.getLow()); assertEquals(20, temp1.getHigh()); WeatherCondition condition2 = weather.getConditions().get(2); assertEquals("Partly Sunny", condition2.getConditionText()); Temperature temp2 = condition2.getTemperature(); assertEquals(-10, temp2.getCurrent()); assertEquals(-14, temp2.getLow()); assertEquals(-6, temp2.getHigh()); WeatherCondition condition3 = weather.getConditions().get(3); assertEquals("Partly Sunny", condition3.getConditionText()); Temperature temp3 = condition3.getTemperature(); assertEquals(-22, temp3.getCurrent()); assertEquals(-29, temp3.getLow()); assertEquals(-15, temp3.getHigh()); } public static JSONObject readJSON(Context context, String assetName) throws IOException, JSONException { Reader reader = new InputStreamReader(context.getAssets().open(assetName)); StringBuilder buffer = new StringBuilder(); int c = reader.read(); while (c >= 0) { buffer.append((char)c); c = reader.read(); } JSONTokener parser = new JSONTokener(buffer.toString()); return (JSONObject)parser.nextValue(); } }