package it.geosolutions.geocollect.android.core.test;
import it.geosolutions.android.map.wfs.geojson.feature.Feature;
import it.geosolutions.geocollect.android.app.R;
import it.geosolutions.geocollect.android.core.form.FormEditActivity;
import it.geosolutions.geocollect.android.core.mission.Mission;
import it.geosolutions.geocollect.android.core.mission.utils.MissionUtils;
import it.geosolutions.geocollect.android.core.wmc.model.Configuration;
import it.geosolutions.geocollect.android.core.wmc.service.events.WMCConnectionStateChangedEvent;
import it.geosolutions.geocollect.android.core.wmc.ui.WMCForm;
import it.geosolutions.geocollect.android.core.wmc.wmc.WMCMock;
import it.geosolutions.geocollect.model.config.MissionTemplate;
import java.util.Locale;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.test.ActivityUnitTestCase;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Spinner;
/**
* Created by Robert Oehler on 08.11.16.
*
*/
public class WMCFormTest extends ActivityUnitTestCase<FormEditActivity> {
private final static String TAG = "FormTest";
private final static int TEST_MAX_DURATION_SEC = 60;
private final static int TEST_TS_1_START = 1;
private final static int TEST_TS_1_STOP = 2;
private final static int TEST_TS_2_START = 2;
private final static int TEST_TS_2_STOP = 3;
private final static int TEST_LF_CONST = 42;
private final static int TEST_LITRES = 66;
private final static int TEST_SENSOR_TYPE = 0;
private CountDownLatch latch;
private WMCForm form;
private MissionTemplate template;
public WMCFormTest(){
super(FormEditActivity.class);
}
public WMCFormTest(Class<FormEditActivity> activityClass) {
super(activityClass);
}
public void setUp() throws Exception {
super.setUp();
template = MissionUtils.getDefaultTemplate(getInstrumentation().getTargetContext());
Mission m = new Mission();
m.setTemplate(template);
m.setOrigin(new Feature());
Bundle testBundle = new Bundle();
testBundle.putSerializable("MISSION", m);
setActivity(launchActivity(getInstrumentation().getTargetContext().getPackageName(), FormEditActivity.class, testBundle));
}
public void testForm() throws InterruptedException {
assertNotNull(getActivity());
Log.i(TAG,"form test start");
latch = new CountDownLatch(1);
final Context context = getActivity();
assertNotNull(context);
assertTrue(context instanceof Activity);
assertTrue(context instanceof FormEditActivity);
//inflate form and test
LinearLayout formView = (LinearLayout) ((FormEditActivity) context).findViewById(R.id.formcontent);
assertNotNull(formView);
for(Fragment fragment : getActivity().getSupportFragmentManager().getFragments()){
if(fragment instanceof WMCForm){
form = (WMCForm) fragment;
}
}
assertNotNull(form);
EventBus.getDefault().register(this);
//make sure the form uses the mock WMC, not a real device
form.setDebug(true);
//and it does not listen itself for WMC service events
form.setTest(true);
//"connect" - will only work if at least one paired device is available on the device
((Activity)context).runOnUiThread(new Runnable() {
@Override
public void run() {
Button connectButton = (Button) ((Activity)context).findViewById(R.id.connect_device_button);
assertNotNull(connectButton);
connectButton.performClick();
}
});
try {
assertTrue("FormTest time expired", latch.await(TEST_MAX_DURATION_SEC, TimeUnit.SECONDS));
EventBus.getDefault().unregister(this);
Log.i(TAG,"FormTest successfully terminated");
} catch (InterruptedException e) {
fail("timeout exceeded");
}
}
@Subscribe
public void onEvent(WMCConnectionStateChangedEvent event){
switch (event.getState()){
case CONNECTED:
Log.i(TAG,"device connected");
final Context context = getActivity();
assertNotNull(context);
final Configuration mockConf = WMCMock.getMockConfiguration();
//Testing the UI in five steps
//1. get references
EditText ts1 = ((EditText) ((Activity)context).findViewById(R.id.tslots_t1_b_et));
EditText ts2 = ((EditText) ((Activity)context).findViewById(R.id.tslots_t1_e_et));
EditText ts3 = ((EditText) ((Activity)context).findViewById(R.id.tslots_t2_b_et));
EditText ts4 = ((EditText) ((Activity)context).findViewById(R.id.tslots_t2_e_et));
EditText litres_et = ((EditText) ((Activity)context).findViewById(R.id.hf_et));
EditText lf_et = ((EditText) ((Activity)context).findViewById(R.id.k_const_et));
EditText provider_et = ((EditText) ((Activity)context).findViewById(R.id.provider_et));
EditText pincode_et = ((EditText) ((Activity)context).findViewById(R.id.pin_code_et));
EditText recipient_et= ((EditText) ((Activity)context).findViewById(R.id.sms_rec_et));
EditText ntp_et = ((EditText) ((Activity)context).findViewById(R.id.time_server_et));
EditText origin_et = ((EditText) ((Activity)context).findViewById(R.id.sms_origin_et));
EditText site_code_et = ((EditText) ((Activity)context).findViewById(R.id.code_et));
Spinner sensorTypeSpinner = ((Spinner) ((Activity)context).findViewById(R.id.type_spinner));
Spinner digitsSpinner = ((Spinner) ((Activity)context).findViewById(R.id.digits_spinner));
Spinner deviceSpinner = (Spinner) ((Activity)context).findViewById(R.id.device_spinner);
Spinner weekdaySpinner = (Spinner) ((Activity)context).findViewById(R.id.weekday_spinner);
Button presetButton = (Button) ((Activity)context).findViewById(R.id.button_preset);
Button clearButton = (Button) ((Activity)context).findViewById(R.id.button_clear);
Button graphButton = (Button) ((Activity)context).findViewById(R.id.button_graph);
Button syncButton = (Button) ((Activity)context).findViewById(R.id.sync_button);
Button smsTestButton = (Button) ((Activity)context).findViewById(R.id.sms_test_button);
Button gsmOnButton = (Button) ((Activity)context).findViewById(R.id.gsm_on_button);
Button connectButton = (Button) ((Activity)context).findViewById(R.id.connect_device_button);
ImageButton refreshButton = (ImageButton) ((Activity)context).findViewById(R.id.refresh_devices_button);
//2. Not connected yet, assert disabled mode
boolean enabled = false;
assertEquals(presetButton.isEnabled(), enabled);
assertEquals(clearButton.isEnabled(), enabled);
assertEquals(graphButton.isEnabled(), enabled);
assertEquals(syncButton.isEnabled(), enabled);
assertEquals(smsTestButton.isEnabled(), enabled);
assertEquals(gsmOnButton.isEnabled(), enabled);
assertEquals(sensorTypeSpinner.isEnabled(), enabled);
assertEquals(digitsSpinner.isEnabled(), enabled);
assertEquals(weekdaySpinner.isEnabled(), enabled);
assertEquals(site_code_et.isFocusable(), enabled);
assertEquals(litres_et.isFocusable(), enabled);
assertEquals(lf_et.isFocusable(), enabled);
assertEquals(ts1.isFocusable(), enabled);
assertEquals(ts2.isFocusable(), enabled);
assertEquals(ts3.isFocusable(), enabled);
assertEquals(ts4.isFocusable(), enabled);
assertEquals(provider_et.isFocusable(), enabled);
assertEquals(pincode_et.isFocusable(), enabled);
assertEquals(recipient_et.isFocusable(), enabled);
assertEquals(ntp_et.isFocusable(), enabled);
assertEquals(origin_et.isFocusable(), enabled);
//these are enabled/"connect"/visible when not connected
assertEquals(deviceSpinner.isEnabled(), !enabled);
assertEquals(connectButton.getText(), ((Activity)context).getString(R.string.button_connect));
assertEquals(refreshButton.getVisibility(), View.VISIBLE);
//now "connect"
form.hideProgress();
form.changeState(true, true);
form.onConfigurationRead(mockConf, "formTest");
enabled = true;
//3.check form enabling
//these become editable
assertEquals(presetButton.isEnabled(), enabled);
assertEquals(clearButton.isEnabled(), enabled);
assertEquals(graphButton.isEnabled(), enabled);
assertEquals(syncButton.isEnabled(), enabled);
assertEquals(gsmOnButton.isEnabled(), enabled);
assertEquals(site_code_et.isFocusable(), enabled);
assertEquals(litres_et.isFocusable(), enabled);
assertEquals(lf_et.isFocusable(), enabled);
assertEquals(ts1.isFocusable(), enabled);
assertEquals(ts2.isFocusable(), enabled);
assertEquals(ts3.isFocusable(), enabled);
assertEquals(ts4.isFocusable(), enabled);
assertEquals(provider_et.isFocusable(), enabled);
assertEquals(pincode_et.isFocusable(), enabled);
assertEquals(recipient_et.isFocusable(), enabled);
assertEquals(ntp_et.isFocusable(), enabled);
assertEquals(origin_et.isFocusable(), enabled);
//sms test button is only enabled when rssi was received
assertEquals(smsTestButton.isEnabled(), false);
//these are disabled/"Disconnect"/invisible when connected
assertEquals(deviceSpinner.isEnabled(), !enabled);
assertEquals(connectButton.getText(), form.getString(R.string.button_disconnect));
assertEquals(refreshButton.getVisibility(), View.GONE);
//4. check form is populated
assertEquals(ts1.getText().toString(), Integer.toString(mockConf.timerSlot1Start));
assertEquals(ts2.getText().toString(), Integer.toString(mockConf.timerSlot1Stop));
assertEquals(ts3.getText().toString(), Integer.toString(mockConf.timerSlot2Start));
assertEquals(ts4.getText().toString(), Integer.toString(mockConf.timerSlot2Stop));
assertEquals(litres_et.getText().toString(), Integer.toString(mockConf.sensorLitresRound));
assertEquals(lf_et.getText().toString(), Integer.toString(mockConf.sensor_LF_Const));
assertEquals(sensorTypeSpinner.getSelectedItemPosition(), mockConf.sensorType);
assertEquals(provider_et.getText().toString(), new String(mockConf.provider));
assertEquals(pincode_et.getText().toString(), new String(mockConf.pinCode));
assertEquals(recipient_et.getText().toString(), new String(mockConf.recipientNum));
assertEquals(ntp_et.getText().toString(), new String(mockConf.ntpAddress));
assertEquals(origin_et.getText().toString(), new String(mockConf.originNum));
assertEquals(site_code_et.getText().toString(), String.format(Locale.getDefault(),"%04d",mockConf.siteCode));
if (mockConf.sensorType == 1) { //sensorType "HF & Dir" makes lf const non-editable
assertFalse(lf_et.isEnabled());
} else { // with sensorType "LF" this const is editable
assertTrue(lf_et.isEnabled());
}
if(mockConf.version >= 0x200) {
//enable and set according to config
assertTrue(digitsSpinner.isEnabled());
if (mockConf.digits == 6) {
assertEquals(digitsSpinner.getSelectedItemPosition(), 0);
} else if (mockConf.digits == 7){
assertEquals(digitsSpinner.getSelectedItemPosition(), 1);
} else {
assertEquals(digitsSpinner.getSelectedItemPosition(), 2);
}
}else{
assertFalse(digitsSpinner.isEnabled());
assertEquals(digitsSpinner.getSelectedItemPosition(), 0);
}
//5. now test editing, type some time slot values
ts1.setText(Integer.toString(TEST_TS_1_START));
ts2.setText(Integer.toString(TEST_TS_1_STOP));
ts3.setText(Integer.toString(TEST_TS_2_START));
ts4.setText(Integer.toString(TEST_TS_2_STOP));
lf_et.setText(Integer.toString(TEST_LF_CONST));
litres_et.setText(Integer.toString(TEST_LITRES));
//sensor type spinner
assertNotSame(sensorTypeSpinner.getSelectedItemPosition(), TEST_SENSOR_TYPE);
assertNotNull(sensorTypeSpinner.getAdapter());
assertEquals(sensorTypeSpinner.getAdapter().getCount(), 2);
sensorTypeSpinner.performClick();
sensorTypeSpinner.setSelection(TEST_SENSOR_TYPE);
assertTrue(sensorTypeSpinner.isEnabled());
assertEquals(sensorTypeSpinner.getSelectedItemPosition(), TEST_SENSOR_TYPE);
final Configuration currentConfig = form.getCurrentConfiguration();
assertEquals(currentConfig.timerSlot1Start, TEST_TS_1_START);
assertEquals(currentConfig.timerSlot1Stop, TEST_TS_1_STOP);
assertEquals(currentConfig.timerSlot2Start, TEST_TS_2_START);
assertEquals(currentConfig.timerSlot2Stop, TEST_TS_2_STOP);
assertEquals(currentConfig.sensor_LF_Const, TEST_LF_CONST);
assertEquals(currentConfig.sensorLitresRound, TEST_LITRES);
Log.i(TAG,"asserts successful");
//6. "disconnect"
form.disconnect(true);
break;
case DISCONNECTED:
Log.i(TAG,"disconnected");
latch.countDown();
break;
case CONNECTION_ERROR:
fail("Connection failed");
break;
}
}
}