package com.example.wordbook.provider;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
import android.test.RenamingDelegatingContext;

/**
 * DB管理クラステストクラス
 */
public class WBHelperTest extends AndroidTestCase {

	/** テスト用接頭辞 */
	private static final String TEST_PREFIX = "test_";

	/** WBHelper */
	private WBHelper mHelper;

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.test.AndroidTestCase#setUp()
	 */
	@Override
	protected void setUp() throws Exception {
		super.setUp();

		Context context = new RenamingDelegatingContext(getContext(),
				TEST_PREFIX);
		mHelper = WBHelper.getInstance(context);

		// クリア
		SQLiteDatabase db = mHelper.getWritableDatabase();
		db.delete(WBData.TABLE_NAME_INFO, null, null);
		db.close();
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.test.AndroidTestCase#tearDown()
	 */
	@Override
	protected void tearDown() throws Exception {
		super.tearDown();

		if (mHelper != null) {
			mHelper.close();
		}
		mHelper = null;
	}

	/**
	 * testGetInstance()
	 */
	public void testGetInstance() {

		// 同一のインスタンスであること
		assertSame(mHelper, WBHelper.getInstance(getContext()));
	}

	/**
	 * testOnCreate()
	 */
	public void testOnCreate() {

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 例外が発生しないこと
		try {
			mHelper.onCreate(db);
		} catch (Exception e) {
			fail();
		}

		db.close();
	}

	/**
	 * testOnUpgrade()
	 */
	public void testOnUpgrade() {

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 例外が発生しないこと
		try {
			mHelper.onUpgrade(db, 1, 2);
		} catch (Exception e) {
			fail();
		}

		db.close();
	}

	/**
	 * testInsert()
	 */
	public void testInsert() {
		final int DATA_NUM = 8;
		ContentValues values = new ContentValues();
		values.put(WBData.InfoColumns.INFO_FILE, 0); // 固定
		values.put(WBData.InfoColumns.INFO_NUM, 1);
		values.put(WBData.InfoColumns.INFO_STAT, 2);
		values.put(WBData.InfoColumns.INFO_LEVEL, 3);
		values.put(WBData.InfoColumns.INFO_FLAG, 4);
		values.put(WBData.InfoColumns.INFO_OK, 5);
		values.put(WBData.InfoColumns.INFO_NG, 6);
		values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
		values.put(WBData.InfoColumns.INFO_ANSWER, "A");
		values.put(WBData.InfoColumns.INFO_DATA1, "D1");
		values.put(WBData.InfoColumns.INFO_DATA2, "D2");

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 挿入行IDの初期値
		long id = db.insert(WBData.TABLE_NAME_INFO, null, values);
		for (int i = 1; i < DATA_NUM; i++) {
			// 戻り値は挿入行ID
			long id_new = db.insert(WBData.TABLE_NAME_INFO, null, values);
			assertEquals(++id, id_new);
		}

		// 全項目
		String sel = null;
		String[] arg = null;
		Cursor c = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null, null,
				null);
		assertEquals(DATA_NUM, c.getCount());

		db.close();
	}

	/**
	 * testDelete()
	 */
	public void testDelete() {
		// 偶数項目数＝奇数項目数
		final int DATA_NUM = 8;
		ContentValues[] array = new ContentValues[DATA_NUM * 2];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, i);
			values.put(WBData.InfoColumns.INFO_NUM, i % 2); // 0 or 1
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 偶数項目
		String sel0 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg0 = new String[] { "0" };
		assertEquals(DATA_NUM, db.delete(WBData.TABLE_NAME_INFO, sel0, arg0));

		// 奇数項目
		String sel1 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg1 = new String[] { "1" };
		assertEquals(DATA_NUM, db.delete(WBData.TABLE_NAME_INFO, sel1, arg1));

		// 非存在項目
		String sel2 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg2 = new String[] { "2" };
		assertEquals(0, db.delete(WBData.TABLE_NAME_INFO, sel2, arg2));

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 全項目
		String sel3 = null;
		String[] arg3 = null;
		assertEquals(DATA_NUM * 2,
				db.delete(WBData.TABLE_NAME_INFO, sel3, arg3));

		db.close();
	}

	/**
	 * testUpdate()
	 */
	public void testUpdate() {
		// 偶数項目数＝奇数項目数
		final int DATA_NUM = 8;
		ContentValues[] array = new ContentValues[DATA_NUM * 2];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, i);
			values.put(WBData.InfoColumns.INFO_NUM, i % 2); // 0 or 1
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}
		// 更新項目
		ContentValues update = new ContentValues();
		update.put(WBData.InfoColumns.INFO_FILE, 99); // 範囲外指定
		update.put(WBData.InfoColumns.INFO_NUM, 99); // 範囲外指定
		update.put(WBData.InfoColumns.INFO_STAT, 2);
		update.put(WBData.InfoColumns.INFO_LEVEL, 3);
		update.put(WBData.InfoColumns.INFO_FLAG, 4);
		update.put(WBData.InfoColumns.INFO_OK, 5);
		update.put(WBData.InfoColumns.INFO_NG, 6);
		update.put(WBData.InfoColumns.INFO_QUESTION, "Q");
		update.put(WBData.InfoColumns.INFO_ANSWER, "A");
		update.put(WBData.InfoColumns.INFO_DATA1, "D1");
		update.put(WBData.InfoColumns.INFO_DATA2, "D2");

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 偶数項目
		String sel0 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg0 = new String[] { "0" };
		assertEquals(DATA_NUM,
				db.update(WBData.TABLE_NAME_INFO, update, sel0, arg0));

		// 奇数項目
		String sel1 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg1 = new String[] { "1" };
		assertEquals(DATA_NUM,
				db.update(WBData.TABLE_NAME_INFO, update, sel1, arg1));

		// 非存在項目
		String sel2 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg2 = new String[] { "2" };
		assertEquals(0, db.update(WBData.TABLE_NAME_INFO, update, sel2, arg2));

		// 全項目
		String sel3 = null;
		String[] arg3 = null;
		assertEquals(DATA_NUM * 2,
				db.update(WBData.TABLE_NAME_INFO, update, sel3, arg3));

		db.close();
	}

	/**
	 * testQuery()
	 */
	public void testQuery() {
		// 偶数項目数＝奇数項目数
		final int DATA_NUM = 8;
		ContentValues[] array = new ContentValues[DATA_NUM * 2];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, i);
			values.put(WBData.InfoColumns.INFO_NUM, i % 2); // 0 or 1
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}
		// 確認対象キー
		String k0 = WBData.InfoColumns.INFO_FILE;
		String k1 = WBData.InfoColumns.INFO_NUM;
		String k2 = WBData.InfoColumns.INFO_STAT;
		String k3 = WBData.InfoColumns.INFO_LEVEL;
		String k4 = WBData.InfoColumns.INFO_FLAG;
		String k5 = WBData.InfoColumns.INFO_OK;
		String k6 = WBData.InfoColumns.INFO_NG;
		String ks0 = WBData.InfoColumns.INFO_QUESTION;
		String ks1 = WBData.InfoColumns.INFO_ANSWER;
		String ks2 = WBData.InfoColumns.INFO_DATA1;
		String ks3 = WBData.InfoColumns.INFO_DATA2;

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 偶数項目取得
		String sel0 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg0 = new String[] { "0" };
		Cursor c0 = db.query(WBData.TABLE_NAME_INFO, null, sel0, arg0, null,
				null, null);
		// 項目数一致
		assertEquals(DATA_NUM, c0.getCount());
		for (int i = 0; i < array.length; i += 2) {
			// 取得
			assertTrue(c0.moveToNext());
			// カラム数一致（_id追加）
			assertEquals(array[i].size() + 1, c0.getColumnCount());
			// 内容一致
			assertEquals(array[i].get(k0), c0.getInt(c0.getColumnIndex(k0)));
			assertEquals(array[i].get(k1), c0.getInt(c0.getColumnIndex(k1)));
			assertEquals(array[i].get(k2), c0.getInt(c0.getColumnIndex(k2)));
			assertEquals(array[i].get(k3), c0.getInt(c0.getColumnIndex(k3)));
			assertEquals(array[i].get(k4), c0.getInt(c0.getColumnIndex(k4)));
			assertEquals(array[i].get(k5), c0.getInt(c0.getColumnIndex(k5)));
			assertEquals(array[i].get(k6), c0.getInt(c0.getColumnIndex(k6)));
			assertEquals(array[i].get(ks0),
					c0.getString(c0.getColumnIndex(ks0)));
			assertEquals(array[i].get(ks1),
					c0.getString(c0.getColumnIndex(ks1)));
			assertEquals(array[i].get(ks2),
					c0.getString(c0.getColumnIndex(ks2)));
			assertEquals(array[i].get(ks3),
					c0.getString(c0.getColumnIndex(ks3)));
		}
		// 取得不可
		assertFalse(c0.moveToNext());

		// 奇数項目取得
		String sel1 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg1 = new String[] { "1" };
		Cursor c1 = db.query(WBData.TABLE_NAME_INFO, null, sel1, arg1, null,
				null, null);
		// 項目数一致
		assertEquals(DATA_NUM, c1.getCount());
		for (int i = 1; i < array.length; i += 2) {
			// 取得
			assertTrue(c1.moveToNext());
			// カラム数一致（_id追加）
			assertEquals(array[i].size() + 1, c1.getColumnCount());
			// 内容一致
			assertEquals(array[i].get(k0), c1.getInt(c1.getColumnIndex(k0)));
			assertEquals(array[i].get(k1), c1.getInt(c1.getColumnIndex(k1)));
			assertEquals(array[i].get(k2), c1.getInt(c1.getColumnIndex(k2)));
			assertEquals(array[i].get(k3), c1.getInt(c1.getColumnIndex(k3)));
			assertEquals(array[i].get(k4), c1.getInt(c1.getColumnIndex(k4)));
			assertEquals(array[i].get(k5), c1.getInt(c1.getColumnIndex(k5)));
			assertEquals(array[i].get(k6), c1.getInt(c1.getColumnIndex(k6)));
			assertEquals(array[i].get(ks0),
					c1.getString(c1.getColumnIndex(ks0)));
			assertEquals(array[i].get(ks1),
					c1.getString(c1.getColumnIndex(ks1)));
			assertEquals(array[i].get(ks2),
					c1.getString(c1.getColumnIndex(ks2)));
			assertEquals(array[i].get(ks3),
					c1.getString(c1.getColumnIndex(ks3)));
		}
		// 取得不可
		assertFalse(c1.moveToNext());

		// 非存在項目取得
		String sel2 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg2 = new String[] { "2" };
		Cursor c2 = db.query(WBData.TABLE_NAME_INFO, null, sel2, arg2, null,
				null, null);
		// 項目数一致
		assertEquals(0, c2.getCount());
		// 取得不可
		assertFalse(c2.moveToNext());

		// 全項目取得
		String sel3 = null;
		String[] arg3 = null;
		Cursor c3 = db.query(WBData.TABLE_NAME_INFO, null, sel3, arg3, null,
				null, null);
		// 項目数一致
		assertEquals(DATA_NUM * 2, c3.getCount());
		for (int i = 0; i < array.length; i++) {
			// 取得
			assertTrue(c3.moveToNext());
			// カラム数一致（_id追加）
			assertEquals(array[i].size() + 1, c3.getColumnCount());
			// 内容一致
			assertEquals(array[i].get(k0), c3.getInt(c3.getColumnIndex(k0)));
			assertEquals(array[i].get(k1), c3.getInt(c3.getColumnIndex(k1)));
			assertEquals(array[i].get(k2), c3.getInt(c3.getColumnIndex(k2)));
			assertEquals(array[i].get(k3), c3.getInt(c3.getColumnIndex(k3)));
			assertEquals(array[i].get(k4), c3.getInt(c3.getColumnIndex(k4)));
			assertEquals(array[i].get(k5), c3.getInt(c3.getColumnIndex(k5)));
			assertEquals(array[i].get(k6), c3.getInt(c3.getColumnIndex(k6)));
			assertEquals(array[i].get(ks0),
					c3.getString(c3.getColumnIndex(ks0)));
			assertEquals(array[i].get(ks1),
					c3.getString(c3.getColumnIndex(ks1)));
			assertEquals(array[i].get(ks2),
					c3.getString(c3.getColumnIndex(ks2)));
			assertEquals(array[i].get(ks3),
					c3.getString(c3.getColumnIndex(ks3)));
		}
		// 取得不可
		assertFalse(c3.moveToNext());

		db.close();
	}

	/**
	 * testQuery_Projection()
	 */
	public void testQuery_Projection() {
		final int DATA_NUM = 8;
		ContentValues[] array = new ContentValues[DATA_NUM];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, i);
			values.put(WBData.InfoColumns.INFO_NUM, 1);
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}
		// 確認対象キー
		String k0 = WBData.InfoColumns.INFO_FILE;
		String k1 = WBData.InfoColumns.INFO_NUM;
		String k2 = WBData.InfoColumns.INFO_STAT;
		String k3 = WBData.InfoColumns.INFO_LEVEL;
		String k4 = WBData.InfoColumns.INFO_FLAG;
		String k5 = WBData.InfoColumns.INFO_OK;
		String k6 = WBData.InfoColumns.INFO_NG;
		String ks0 = WBData.InfoColumns.INFO_QUESTION;
		String ks1 = WBData.InfoColumns.INFO_ANSWER;
		String ks2 = WBData.InfoColumns.INFO_DATA1;
		String ks3 = WBData.InfoColumns.INFO_DATA2;
		// 取得列リスト
		String[] pjt = { k0, k2, k5, k6, ks2, ks3 };

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 対象項目(FILE==0)のみ取得
		String sel0 = WBData.InfoColumns.INFO_FILE + "=?";
		String[] arg0 = new String[] { "0" };
		ContentValues cv0 = array[0];
		Cursor c0 = db.query(WBData.TABLE_NAME_INFO, pjt, sel0, arg0, null,
				null, null);
		assertTrue(c0.moveToNext());
		// 取得列の内容が一致
		assertEquals(cv0.get(k0), c0.getInt(c0.getColumnIndex(k0)));
		assertEquals(cv0.get(k2), c0.getInt(c0.getColumnIndex(k2)));
		assertEquals(cv0.get(k5), c0.getInt(c0.getColumnIndex(k5)));
		assertEquals(cv0.get(k6), c0.getInt(c0.getColumnIndex(k6)));
		assertEquals(cv0.get(ks2), c0.getString(c0.getColumnIndex(ks2)));
		assertEquals(cv0.get(ks3), c0.getString(c0.getColumnIndex(ks3)));
		// 存在しない場合はindexが-1
		assertEquals(-1, c0.getColumnIndex(k1));
		assertEquals(-1, c0.getColumnIndex(k3));
		assertEquals(-1, c0.getColumnIndex(k4));
		assertEquals(-1, c0.getColumnIndex(ks0));
		assertEquals(-1, c0.getColumnIndex(ks1));

		db.close();
	}

	/**
	 * testQuery_Sort()
	 */
	public void testQuery_Sort() {
		final int DATA_NUM = 8;
		ContentValues[] array = new ContentValues[DATA_NUM];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, i);
			values.put(WBData.InfoColumns.INFO_NUM, array.length - i - 1); // 逆
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}
		// 確認対象キー
		String k0 = WBData.InfoColumns.INFO_FILE;
		String k1 = WBData.InfoColumns.INFO_NUM;

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 全項目取得
		String sel = null;
		String[] arg = null;
		// デフォルト時は登録順
		Cursor c0 = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null,
				null, null);
		for (int i = 0; i < array.length; i++) {
			ContentValues cv = array[i];
			assertTrue(c0.moveToNext());
			assertEquals(cv.get(k0), c0.getInt(c0.getColumnIndex(k0)));
		}
		// NUM昇順
		Cursor c1 = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null,
				null, k1 + " ASC");
		for (int i = 0; i < array.length; i++) {
			ContentValues cv = array[array.length - i - 1];
			assertTrue(c1.moveToNext());
			assertEquals(cv.get(k1), c1.getInt(c1.getColumnIndex(k1)));
		}
		// NUM降順
		Cursor c2 = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null,
				null, k1 + " DESC");
		for (int i = 0; i < array.length; i++) {
			ContentValues cv = array[i];
			assertTrue(c2.moveToNext());
			assertEquals(cv.get(k1), c2.getInt(c2.getColumnIndex(k1)));
		}

		db.close();
	}

	/**
	 * testQuery_Limit()
	 */
	public void testQuery_Limit() {
		final int NUM1 = 8;
		final int NUM2 = 16;
		ContentValues[] array = new ContentValues[NUM1 + NUM2];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, i);
			values.put(WBData.InfoColumns.INFO_NUM, 1);
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 全項目取得
		String sel = null;
		String[] arg = null;
		// デフォルト時は全て
		String limit0 = null;
		Cursor c0 = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null,
				null, null, limit0);
		assertEquals(NUM1 + NUM2, c0.getCount());
		// 最初からNUM1まで
		String limit1 = Integer.toString(0) + "," + Integer.toString(NUM1);
		Cursor c1 = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null,
				null, null, limit1);
		assertEquals(NUM1, c1.getCount());
		// NUM2から最後まで
		String limit2 = Integer.toString(NUM1) + "," + Integer.toString(NUM2);
		Cursor c2 = db.query(WBData.TABLE_NAME_INFO, null, sel, arg, null,
				null, null, limit2);
		assertEquals(NUM2, c2.getCount());

		db.close();
	}

	/**
	 * testQuery_Distinct()
	 */
	public void testQuery_Distinct() {
		// 偶数項目数＝奇数項目数
		final int DATA_NUM = 8;
		ContentValues[] array = new ContentValues[DATA_NUM * 2];
		for (int i = 0; i < array.length; i++) {
			ContentValues values = new ContentValues();
			values.put(WBData.InfoColumns.INFO_FILE, 0);
			values.put(WBData.InfoColumns.INFO_NUM, i % 2); // 0 or 1
			values.put(WBData.InfoColumns.INFO_STAT, 2);
			values.put(WBData.InfoColumns.INFO_LEVEL, 3);
			values.put(WBData.InfoColumns.INFO_FLAG, 4);
			values.put(WBData.InfoColumns.INFO_OK, 5);
			values.put(WBData.InfoColumns.INFO_NG, 6);
			values.put(WBData.InfoColumns.INFO_QUESTION, "Q");
			values.put(WBData.InfoColumns.INFO_ANSWER, "A");
			values.put(WBData.InfoColumns.INFO_DATA1, "D1");
			values.put(WBData.InfoColumns.INFO_DATA2, "D2");
			array[i] = values;
		}
		// 確認対象キー
		String k0 = WBData.InfoColumns.INFO_FILE;
		String k2 = WBData.InfoColumns.INFO_STAT;
		String k5 = WBData.InfoColumns.INFO_OK;
		String k6 = WBData.InfoColumns.INFO_NG;
		String ks2 = WBData.InfoColumns.INFO_DATA1;
		String ks3 = WBData.InfoColumns.INFO_DATA2;
		// 取得列リスト
		String[] pjt = { k0, k2, k5, k6, ks2, ks3 };

		SQLiteDatabase db = mHelper.getWritableDatabase();

		// 初期化
		for (int i = 0; i < array.length; i++) {
			db.insert(WBData.TABLE_NAME_INFO, null, array[i]);
		}

		// 偶数項目取得
		String sel0 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg0 = new String[] { "0" };
		// 重複排除
		Cursor c0_0 = db.query(true, WBData.TABLE_NAME_INFO, pjt, sel0, arg0,
				null, null, null, null);
		assertEquals(1, c0_0.getCount());
		// 重複包含
		Cursor c0_1 = db.query(false, WBData.TABLE_NAME_INFO, pjt, sel0, arg0,
				null, null, null, null);
		assertEquals(DATA_NUM, c0_1.getCount());

		// 奇数項目取得
		String sel1 = WBData.InfoColumns.INFO_NUM + "=?";
		String[] arg1 = new String[] { "1" };
		// 重複排除
		Cursor c1_0 = db.query(true, WBData.TABLE_NAME_INFO, pjt, sel1, arg1,
				null, null, null, null);
		assertEquals(1, c1_0.getCount());
		// 重複包含
		Cursor c1_1 = db.query(false, WBData.TABLE_NAME_INFO, pjt, sel1, arg1,
				null, null, null, null);
		assertEquals(DATA_NUM, c1_1.getCount());

		db.close();
	}

}
