package com.gh.mygreen.xlsmapper; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; /** * {@link PropertyNavigator}のテスタ * @since 1.0 * @author T.TSUCHIE * */ public class PropertyNavigatorTest { @AfterClass public static void tearDownAfterClass() throws Exception { } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void test_getProperty() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); obj.name = "山田太郎"; obj.age = 20; String value1 = (String) navigator.getProperty(obj, "name"); assertThat(value1, is("山田太郎")); int value2 = (int) navigator.getProperty(obj, "age"); assertThat(value2, is(20)); } @Test public void test_getProperty_list() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); Book value1 = (Book) navigator.getProperty(obj, "books[1]"); assertThat(value1, is(nullValue())); obj.books = new ArrayList<>(); Book value2 = (Book) navigator.getProperty(obj, "books[1]"); assertThat(value2, is(nullValue())); obj.books.add(new Book("本0", 500)); obj.books.add(new Book("本1", 600)); obj.books.add(new Book("本2", 700)); Book value3 = (Book) navigator.getProperty(obj, "books[1]"); assertThat(value3, is(not(nullValue()))); assertThat(value3.title, is("本1")); String value4 = (String) navigator.getProperty(obj, "books[1].title"); assertThat(value4, is("本1")); } @Test public void test_getProperty_map() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); Boolean value1 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value1, is(nullValue())); obj.attend = new LinkedHashMap<String, Boolean>(); Boolean value2 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value2, is(nullValue())); obj.attend.put("2015-01-01", true); obj.attend.put("2015-01-02", false); obj.attend.put("2015-01-03", true); Boolean value3 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value3, is(true)); } @Test public void test_getProperty_map_list() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); Book value1 = (Book) navigator.getProperty(obj, "bookData[history][1]"); assertThat(value1, is(nullValue())); obj.bookData = new LinkedHashMap<>(); Book value2 = (Book) navigator.getProperty(obj, "bookData[history][1]"); assertThat(value2, is(nullValue())); obj.bookData.put("special", Arrays.asList(new Book("book0", 100), new Book("book1", 200))); obj.bookData.put("history", Arrays.asList(new Book("本0", 300), new Book("本1", 400))); Book value3 = (Book) navigator.getProperty(obj, "bookData[history][1]"); assertThat(value3, is(not(nullValue()))); assertThat(value3.title, is("本1")); String value4 = (String) navigator.getProperty(obj, "bookData[history][1].title"); assertThat(value4, is("本1")); } @Test public void test_option_cacheWithPath() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(true); navigator.setIgnoreNotFoundKey(true); navigator.setCacheWithPath(true); Person obj = new Person(); obj.name = "山田太郎"; obj.age = 20; String value1 = (String) navigator.getProperty(obj, "name"); assertThat(value1, is("山田太郎")); String value2 = (String) navigator.getProperty(obj, "name"); assertThat(value2, is("山田太郎")); navigator.clearCache(); String value3 = (String) navigator.getProperty(obj, "name"); assertThat(value3, is("山田太郎")); } @Test public void test_option_ignoreNull_true() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(true); // ルートがnull Person obj = null; String value1 = (String) navigator.getProperty(obj, "name"); assertThat(value1, is(nullValue())); // 末端がnull obj = new Person(); String value2 = (String) navigator.getProperty(obj, "name"); assertThat(value2, is(nullValue())); // 途中がnull String value3 = (String) navigator.getProperty(obj, "books[0].title"); assertThat(value3, is(nullValue())); } @Test public void test_option_ignoreNull_false() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNull(false); Person obj = null; try { // ルートがnull String value1 = (String) navigator.getProperty(obj, "name"); fail(); } catch(Exception e) { assertThat(e, instanceOf(NullPointerException.class)); } // 末端がnull obj = new Person(); String value2 = (String) navigator.getProperty(obj, "name"); assertThat(value2, is(nullValue())); // 途中がnull try { String value3 = (String) navigator.getProperty(obj, "books[0].title"); fail(); } catch(Exception e) { assertThat(e, instanceOf(NullPointerException.class)); } } @Test public void test_option_ignoreNotFoundKey_collection_true() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); obj.books = new ArrayList<>(); // 空のとき Book value1 = (Book) navigator.getProperty(obj, "books[1]"); assertThat(value1, is(nullValue())); // 空でない場合 obj.books.add(new Book("本0", 500)); obj.books.add(new Book("本1", 600)); obj.books.add(new Book("本2", 700)); Book value2 = (Book) navigator.getProperty(obj, "books[-1]"); assertThat(value2, is(nullValue())); Book value3 = (Book) navigator.getProperty(obj, "books[3]"); assertThat(value3, is(nullValue())); Book value4 = (Book) navigator.getProperty(obj, "books[1]"); assertThat(value4.title, is(not(nullValue()))); } @Test public void test_option_ignoreNotFoundKey_collection_false() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(false); Person obj = new Person(); // リストの場合 obj.books = new ArrayList<>(); // リスト - 空のとき try { Book value1 = (Book) navigator.getProperty(obj, "books[1]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IndexOutOfBoundsException.class)); } // リスト - 空でない場合 obj.books.add(new Book("本0", 500)); obj.books.add(new Book("本1", 600)); obj.books.add(new Book("本2", 700)); try { Book value2 = (Book) navigator.getProperty(obj, "books[-1]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IndexOutOfBoundsException.class)); } try { Book value3 = (Book) navigator.getProperty(obj, "books[3]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IndexOutOfBoundsException.class)); } Book value4 = (Book) navigator.getProperty(obj, "books[1]"); assertThat(value4.title, is(not(nullValue()))); } @Test public void test_option_ignoreNotFoundKey_array_true() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); obj.arrayBooks = new Book[0]; // 空のとき Book value1 = (Book) navigator.getProperty(obj, "arrayBooks[1]"); assertThat(value1, is(nullValue())); // 空でない場合 obj.arrayBooks = new Book[3]; obj.arrayBooks[0] = new Book("本0", 500); obj.arrayBooks[1] = new Book("本1", 600); obj.arrayBooks[2] = new Book("本2", 700); Book value2 = (Book) navigator.getProperty(obj, "arrayBooks[-1]"); assertThat(value2, is(nullValue())); Book value3 = (Book) navigator.getProperty(obj, "arrayBooks[3]"); assertThat(value3, is(nullValue())); Book value4 = (Book) navigator.getProperty(obj, "arrayBooks[1]"); assertThat(value4.title, is(not(nullValue()))); } @Test public void test_option_ignoreNotFoundKey_array_false() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(false); Person obj = new Person(); obj.arrayBooks = new Book[0]; // 空のとき try { Book value1 = (Book) navigator.getProperty(obj, "arrayBooks[1]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IndexOutOfBoundsException.class)); } // 空出ない場合 obj.arrayBooks = new Book[3]; obj.arrayBooks[0] = new Book("本0", 500); obj.arrayBooks[1] = new Book("本1", 600); obj.arrayBooks[2] = new Book("本2", 700); try { Book value2 = (Book) navigator.getProperty(obj, "arrayBooks[-1]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IndexOutOfBoundsException.class)); } try { Book value3 = (Book) navigator.getProperty(obj, "arrayBooks[3]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IndexOutOfBoundsException.class)); } Book value4 = (Book) navigator.getProperty(obj, "arrayBooks[1]"); assertThat(value4.title, is(not(nullValue()))); } @Test public void test_option_ignoreNotFoundKey_map_true() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); obj.attend = new LinkedHashMap<String, Boolean>(); // 空のとき Boolean value1 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value1, is(nullValue())); // 空でない場合 obj.attend.put("2015-01-01", true); obj.attend.put("2015-01-02", false); obj.attend.put("2015-01-03", true); Boolean value2 = (Boolean) navigator.getProperty(obj, "attend[2015-01-04]"); assertThat(value2, is(nullValue())); Boolean value3 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value3, is(true)); } @Test public void test_option_ignoreNotFoundKey_map_false() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(false); Person obj = new Person(); obj.attend = new LinkedHashMap<String, Boolean>(); // 空のとき try { Boolean value1 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IllegalStateException.class)); } // 空でない場合 obj.attend.put("2015-01-01", true); obj.attend.put("2015-01-02", false); obj.attend.put("2015-01-03", true); try { Boolean value2 = (Boolean) navigator.getProperty(obj, "attend[2015-01-04]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IllegalStateException.class)); } Boolean value3 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value3, is(true)); } /** * コレクションのキーのトリム、パース処理 */ @Test public void test_collection_key() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(false); Person obj = new Person(); obj.books = new ArrayList<>(); obj.books.add(new Book("本0", 500)); obj.books.add(new Book("本1", 600)); obj.books.add(new Book("本2", 700)); // トリム処理 Book value1 = (Book) navigator.getProperty(obj, "books[ 1 ]"); assertThat(value1, is(not(nullValue()))); // 文字列の場合 try { Book value2 = (Book) navigator.getProperty(obj, "books[abc]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(PropertyAccessException.class)); } } /** * 配列のキーのトリム、パース処理 */ @Test public void test_array_key() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(false); Person obj = new Person(); obj.arrayBooks = new Book[3]; obj.arrayBooks[0] = new Book("本0", 500); obj.arrayBooks[1] = new Book("本1", 600); obj.arrayBooks[2] = new Book("本2", 700); // トリム処理 Book value1 = (Book) navigator.getProperty(obj, "arrayBooks[ 1 ]"); assertThat(value1, is(not(nullValue()))); // 文字列の場合 try { Book value2 = (Book) navigator.getProperty(obj, "arrayBooks[abc]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(PropertyAccessException.class)); } } /** * マップのキーのトリム、パース処理 */ @Test public void test_map_key() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(false); Person obj = new Person(); obj.attend = new LinkedHashMap<String, Boolean>(); obj.attend.put("2015-01-01", true); obj.attend.put("2015-01-02", false); obj.attend.put("2015-01-03", true); // トリム処理なし Boolean value1 = (Boolean) navigator.getProperty(obj, "attend[2015-01-01]"); assertThat(value1, is(true)); // 空白を含む場合 try { Boolean value2 = (Boolean) navigator.getProperty(obj, "attend[ 2015-01-01 ]"); fail(); } catch(Exception e) { assertThat(e, instanceOf(IllegalStateException.class)); } } /** * プロパティがメソッドの場合 */ @Test public void test_property_method() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); obj.checked = true; obj.age = 20; Boolean value1 = (Boolean) navigator.getProperty(obj, "checked"); assertThat(value1, is(true)); int value2 = (int) navigator.getProperty(obj, "age"); assertThat(value2, is(20)); } /** * プロパティがメソッドの場合 */ @Test(expected=PropertyAccessException.class) public void test_notFound_property() { PropertyNavigator navigator = new PropertyNavigator(); navigator.setAllowPrivate(true); navigator.setIgnoreNotFoundKey(true); Person obj = new Person(); Object value1 = navigator.getProperty(obj, "abc"); fail(); } private static class Person { private String name; private int age; private List<Book> books; private Book[] arrayBooks; private boolean checked; private Map<String, Boolean> attend; private Map<String, List<Book>> bookData; public int getAge() { return age; } public boolean isChecked() { return true; } } private static class Book { private String title; private long price; private Book(String title, long price) { this.title = title; this.price = price; } } }