package com.example.wordbook; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import android.app.Instrumentation.ActivityMonitor; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.test.ActivityInstrumentationTestCase2; import com.example.wordbook.common.Common; import com.example.wordbook.common.Data; /** * 一覧画面テストクラス */ public class WBListActivityTest extends ActivityInstrumentationTestCase2 { /** * コンストラクタ */ public WBListActivityTest() { super(WBListActivity.class); } /* * (非 Javadoc) * * @see android.test.ActivityInstrumentationTestCase2#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); } /* * (非 Javadoc) * * @see android.test.ActivityInstrumentationTestCase2#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); } /** * パラメータを与えた場合は起動することを確認する * * @throws NoSuchFieldException * @throws IllegalAccessException */ public void testLaunch_succeed() throws NoSuchFieldException, IllegalAccessException { // パラメータ準備 int index = 1; int count = 2; Intent intent = new Intent(); intent.putExtra(Common.INTENT_INDEX, index); intent.putExtra(Common.INTENT_COUNT, count); setActivityIntent(intent); WBListActivity activity = getActivity(); // 作成できることを確認する assertNotNull("Activity should launch successfully.", activity); // 終了しないことを確認する assertFalse("Activity should not be finishing.", activity.isFinishing()); // クラスオブジェクト取得 Class c = activity.getClass(); // メンバ変数取得 Field f_index = c.getDeclaredField("mIndex"); Field f_count = c.getDeclaredField("mCount"); // アクセス権限追加 f_index.setAccessible(true); f_count.setAccessible(true); // 設定されていることを確認する assertEquals(index, ((Integer) f_index.get(activity)).intValue()); assertEquals(count, ((Integer) f_count.get(activity)).intValue()); } /** * パラメータを与えない場合は終了することを確認する */ public void testLaunch_failed() { WBListActivity activity = getActivity(); // 作成できることを確認する assertNotNull("Activity should launch successfully.", activity); // 終了することを確認する assertTrue("Activity should be finishing.", activity.isFinishing()); } /** * オリエンテーション時の動作を確認する * * @throws Throwable */ @SuppressWarnings("unchecked") public void testOrientation() throws Throwable { // パラメータ準備 int index = 1; int count = 2; Intent intent = new Intent(); intent.putExtra(Common.INTENT_INDEX, index); intent.putExtra(Common.INTENT_COUNT, count); setActivityIntent(intent); final WBListActivity activity = getActivity(); // クラスオブジェクト取得 Class c = activity.getClass(); // メンバ変数取得 Field f_index = c.getDeclaredField("mIndex"); Field f_count = c.getDeclaredField("mCount"); Field f_mPos = c.getDeclaredField("mPos"); Field f_mData = c.getDeclaredField("mData"); // アクセス権限追加 f_index.setAccessible(true); f_count.setAccessible(true); f_mPos.setAccessible(true); f_mData.setAccessible(true); // 初期状態 int pos = 3; int size = 4; List list = new ArrayList(); for (int i = 0; i < size; i++) { list.add(new Data(i, 0, i % 8, i % 8, 0, 0, "Q-" + i, "A-" + i, "D1-" + i, "D2-" + i)); } f_mPos.setInt(activity, pos); f_mData.set(activity, list); List res; ActivityMonitor monitor = new ActivityMonitor( WBListActivity.class.getName(), null, false); // 設定 getInstrumentation().addMonitor(monitor); runTestOnUiThread(new Runnable() { @Override public void run() { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } }); // 反映待ち getInstrumentation().waitForIdleSync(); getInstrumentation().waitForMonitor(monitor); // 設定されていることを確認する assertEquals("Activity should be LANDSCAPE mode", Configuration.ORIENTATION_LANDSCAPE, activity.getResources() .getConfiguration().orientation); // データの復帰を確認する assertEquals(index, ((Integer) f_index.get(activity)).intValue()); assertEquals(count, ((Integer) f_count.get(activity)).intValue()); assertEquals(pos, ((Integer) f_mPos.get(activity)).intValue()); res = (List) f_mData.get(activity); assertEquals(size, res.size()); for (int i = 0; i < size; i++) { assertEquals(i, res.get(i).num); } // 設定 getInstrumentation().addMonitor(monitor); runTestOnUiThread(new Runnable() { @Override public void run() { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } }); // 反映待ち getInstrumentation().waitForIdleSync(); getInstrumentation().waitForMonitor(monitor); // 設定されていることを確認する assertEquals("Activity should be PORTRAIT mode", Configuration.ORIENTATION_PORTRAIT, activity.getResources() .getConfiguration().orientation); // データの復帰を確認する assertEquals(index, ((Integer) f_index.get(activity)).intValue()); assertEquals(count, ((Integer) f_count.get(activity)).intValue()); assertEquals(pos, ((Integer) f_mPos.get(activity)).intValue()); res = (List) f_mData.get(activity); assertEquals(size, res.size()); for (int i = 0; i < size; i++) { assertEquals(i, res.get(i).num); } } }