Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ apply plugin: 'maven'

android {
compileSdkVersion 26
buildToolsVersion '25.0.3'
buildToolsVersion '26.0.2'

defaultConfig {
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName VERSION_NAME
consumerProguardFiles 'proguard-rules.pro'
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
Expand All @@ -20,13 +21,17 @@ android {
}

dataBinding {
enabled = true;
enabled = true
}
}

dependencies {
compile 'com.android.support:support-fragment:26.0.1'
compile 'com.android.support:appcompat-v7:26.0.1'
compile 'com.android.support:support-fragment:26.1.0'
compile 'com.android.support:appcompat-v7:26.1.0'

androidTestCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:1.0.1'
androidTestCompile 'com.android.support.test:rules:1.0.1'
}

task androidJavadocs(type: Javadoc) {
Expand Down
8 changes: 8 additions & 0 deletions library/src/androidTest/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.inloop.viewmodel" >

<application>
<activity android:name=".fixture.activity.VMTestActivity" android:theme="@style/Theme.AppCompat" />
</application>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
package eu.inloop.viewmodel;


import android.content.pm.ActivityInfo;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Map;

import eu.inloop.viewmodel.fixture.activity.VMTestActivity;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;


@RunWith(AndroidJUnit4.class)
public final class ViewModelActivityTest {

@Rule
public final ActivityTestRule<VMTestActivity> mActivityTestRule =
new ActivityTestRule<>(VMTestActivity.class, false, false);

@SmallTest
@Test
public void viewModelActivity_onBindView_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), true));

assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK));
}

@SmallTest
@Test
public void viewModelActivity_getViewModel_getView_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));
mActivityTestRule.getActivity().getViewModel().loadData();

assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK));
}

@SmallTest
@Test
public void viewModelActivity_getViewModel_getViewOptional_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));
mActivityTestRule.getActivity().getViewModel().loadDataOptional();

assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK));
}

@SmallTest
@Test
public void viewModelActivity_clearView_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));
mActivityTestRule.getActivity().getViewModel().clearView();

assertThat(mActivityTestRule.getActivity().getViewModel().getView(), is(nullValue()));
}

@SmallTest
@Test
public void viewModelActivity_uniqueIdentifier_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));
String uniqueIdentifier = mActivityTestRule.getActivity().getViewModel().getUniqueIdentifier();

assertThat(uniqueIdentifier, is(notNullValue()));
}

@SmallTest
@Test
public void viewModelActivity_fragment_getView_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));

mActivityTestRule.getActivity().getTestFragment().getViewModel().loadData();

assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK));
}

@SmallTest
@Test
public void viewModelActivity_fragment_remove_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));

String uniqueIdentifierActivity = mActivityTestRule.getActivity().getViewModel().getUniqueIdentifier();
String uniqueIdentifierFragment = mActivityTestRule.getActivity().getTestFragment().getViewModel().getUniqueIdentifier();

Map<String, AbstractViewModel<? extends IView>> viewModels =
mActivityTestRule.getActivity().getViewModelProvider().getViewModels();

assertThat(viewModels.containsKey(uniqueIdentifierActivity), is(true));
assertThat(viewModels.containsKey(uniqueIdentifierFragment), is(true));

InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mActivityTestRule.getActivity().removeTestFragment();
}
});

//Check If ViewModel is removed after removing fragment
viewModels = mActivityTestRule.getActivity().getViewModelProvider().getViewModels();

assertThat(viewModels.containsKey(uniqueIdentifierActivity), is(true));
assertThat(viewModels.containsKey(uniqueIdentifierFragment), is(false));
}

@SmallTest
@Test
public void viewModelActivity_fragment_model_state_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));

final int stateValue = 1;
mActivityTestRule.getActivity().getTestFragment().getViewModel().setStateValue(stateValue);

rotateScreen(1);

int actualStateValue = mActivityTestRule.getActivity().getTestFragment().getViewModel().getStateValue();

assertThat(stateValue, is(actualStateValue));
}

@MediumTest
@Test
public void viewModelActivity_instance_count_test() {
mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false));

String uniqueIdentifierActivity = mActivityTestRule.getActivity().getViewModel().getUniqueIdentifier();
String uniqueIdentifierFragment = mActivityTestRule.getActivity().getTestFragment().getViewModel().getUniqueIdentifier();

rotateScreen(5);

Map<String, AbstractViewModel<? extends IView>> viewModels =
mActivityTestRule.getActivity().getViewModelProvider().getViewModels();

assertThat(viewModels.size(), is(2)); //activity + fragment

assertThat(viewModels.containsKey(uniqueIdentifierActivity), is(true));
assertThat(viewModels.containsKey(uniqueIdentifierFragment), is(true));
}

private void rotateScreen(int numOfTimes) {
for (int i = 0; i < numOfTimes; i++) {
mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package eu.inloop.viewmodel.fixture.activity;

import eu.inloop.viewmodel.IView;

public interface IVMTestActivityView extends IView {

void onLoadData(boolean loaded);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package eu.inloop.viewmodel.fixture.activity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.widget.LinearLayout;

import eu.inloop.viewmodel.base.ViewModelBaseActivity;
import eu.inloop.viewmodel.fixture.fragment.VMTestFragment;

public class VMTestActivity extends ViewModelBaseActivity<IVMTestActivityView, VMTestActivityViewModel> implements IVMTestActivityView {

public static final int RESULT_CODE_OK = 1;
public static final String EXTRA_CALL_ON_BIND = "EXTRA_CALL_ON_BIND";

@NonNull
public static Intent makeIntent(@NonNull Context context, boolean callOnBindModel) {
Intent intent = new Intent(context, VMTestActivity.class);
intent.putExtra(EXTRA_CALL_ON_BIND, callOnBindModel);

return intent;
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

LinearLayout view = new LinearLayout(this);
view.setId(android.R.id.content);
setContentView(view);

if (savedInstanceState == null) {
addTestFragment();
}

setModelView(this);
}

public void addTestFragment() {
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new VMTestFragment())
.commitNow();
}

public void removeTestFragment() {
getSupportFragmentManager()
.beginTransaction()
.remove(getTestFragment())
.commitNow();
}

@NonNull
public VMTestFragment getTestFragment() {
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment instanceof VMTestFragment) {
return (VMTestFragment) fragment;
}
}
throw new AssertionError("Fragment not found");
}

@Override
public void onLoadData(boolean loaded) {
setResult(RESULT_CODE_OK);
finish();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package eu.inloop.viewmodel.fixture.activity;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import eu.inloop.viewmodel.AbstractViewModel;

public class VMTestActivityViewModel extends AbstractViewModel<IVMTestActivityView> {

private boolean mCallOnBind;

@Override
public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) {
super.onCreate(arguments, savedInstanceState);
if (arguments == null) {
throw new AssertionError("Arguments must be set for this ViewModel");
}
mCallOnBind = arguments.getBoolean(VMTestActivity.EXTRA_CALL_ON_BIND);
}

@Override
public void onBindView(@NonNull IVMTestActivityView view) {
super.onBindView(view);

if (mCallOnBind) {
loadData();
}
}

public void loadData() {
getView().onLoadData(true);
}

public void loadDataOptional() {
getViewOptional().onLoadData(true);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package eu.inloop.viewmodel.fixture.fragment;

import eu.inloop.viewmodel.IView;

public interface IVMTestFragmentView extends IView {

void onLoadData(boolean loaded);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package eu.inloop.viewmodel.fixture.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import eu.inloop.viewmodel.base.ViewModelBaseFragment;
import eu.inloop.viewmodel.fixture.activity.VMTestActivity;

public class VMTestFragment extends ViewModelBaseFragment<IVMTestFragmentView, VMTestFragmentViewModel>
implements IVMTestFragmentView {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return new LinearLayout(getContext());
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setModelView(this);
}

@Override
public void onLoadData(boolean loaded) {
getActivity().setResult(VMTestActivity.RESULT_CODE_OK);
getActivity().finish();
}
}
Loading