package io.nlopez.smartlocation.rx;
import android.content.Context;
import android.location.Location;
import com.google.android.gms.location.DetectedActivity;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import io.nlopez.smartlocation.OnActivityUpdatedListener;
import io.nlopez.smartlocation.OnLocationUpdatedListener;
import io.nlopez.smartlocation.SmartLocation;
import io.nlopez.smartlocation.activity.ActivityProvider;
import io.nlopez.smartlocation.activity.config.ActivityParams;
import io.nlopez.smartlocation.location.LocationProvider;
import io.nlopez.smartlocation.location.config.LocationParams;
import io.nlopez.smartlocation.utils.Logger;
import io.reactivex.observers.TestObserver;
/**
* Tests {@link ObservableFactory}
*/
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class ObservableFactoryTest {
private TestActivityProvider mActivityProvider;
private TestLocationProvider mLocationProvider;
@Before
public void setup() {
mActivityProvider = new TestActivityProvider();
mLocationProvider = new TestLocationProvider();
}
@Test
public void test_observable_activity() {
TestObserver<DetectedActivity> testObserver = ObservableFactory.from(
SmartLocation.with(RuntimeEnvironment.application.getApplicationContext())
.activity(mActivityProvider)
).test();
DetectedActivity detectedActivity = new DetectedActivity(DetectedActivity.UNKNOWN,100);
mActivityProvider.fakeEmit(detectedActivity);
testObserver.assertNoErrors();
testObserver.assertValue(detectedActivity);
}
@Test
public void test_observable_location() {
TestObserver<Location> testObserver = ObservableFactory.from(
SmartLocation.with(RuntimeEnvironment.application.getApplicationContext())
.location(mLocationProvider)
).test();
Location location = new Location("bleh");
mLocationProvider.fakeEmit(location);
testObserver.assertNoErrors();
testObserver.assertValue(location);
}
class TestActivityProvider implements ActivityProvider {
private OnActivityUpdatedListener mListener;
@Override
public void init(Context context, Logger logger) {
}
@Override
public void start(OnActivityUpdatedListener listener, ActivityParams params) {
mListener = listener;
}
@Override
public void stop() {
}
@Override
public DetectedActivity getLastActivity() {
return null;
}
public void fakeEmit(DetectedActivity activity) {
mListener.onActivityUpdated(activity);
}
}
class TestLocationProvider implements LocationProvider {
private OnLocationUpdatedListener mListener;
@Override
public void init(Context context, Logger logger) {
}
@Override
public void start(OnLocationUpdatedListener listener, LocationParams params, boolean singleUpdate) {
mListener = listener;
}
@Override
public void stop() {
}
@Override
public Location getLastLocation() {
return null;
}
public void fakeEmit(Location location) {
mListener.onLocationUpdated(location);
}
}
}