[Jiemamy-notify:1347] commit [2605] オブジェクトグラフ上に同一のオブジェクトが出現した場合にキャッシュ値を利用する、CachedObjectConverterを作成

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2009年 2月 2日 (月) 23:36:23 JST


Revision: 2605
          http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=2605
Author:   ashigeru
Date:     2009-02-02 23:36:23 +0900 (Mon, 02 Feb 2009)

Log Message:
-----------
オブジェクトグラフ上に同一のオブジェクトが出現した場合にキャッシュ値を利用する、CachedObjectConverterを作成

Modified Paths:
--------------
    artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/DefaultObjectConverter.java

Added Paths:
-----------
    artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java
    artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/PrimitiveConverter.java
    artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/CachedObjectConverterTest.java
    artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/PrimitiveConverterTest.java


-------------- next part --------------
Added: artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java
===================================================================
--- artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java	                        (rev 0)
+++ artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java	2009-02-02 14:36:23 UTC (rev 2605)
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2009 Jiemamy Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.gtree.converter;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jiemamy.utils.gtree.model.Terminal;
+import org.jiemamy.utils.gtree.model.Value;
+
+/**
+ * {@link ConverterDriver}の組み合わせによる{@link ObjectConverter}の実装。
+ * @version $Date$
+ * @author Suguru ARAKAWA
+ */
+public class CachedObjectConverter implements ObjectConverter {
+	
+	private static class ObjectGraphCache {
+		
+		/**
+		 * オブジェクトグラフを管理するマップ。
+		 */
+		private Map<Object, Integer> map;
+		
+		/**
+		 * 現在構築中のグラフの深さ。
+		 */
+		private int graphDepth;
+		
+
+		/**
+		 * インスタンスを生成する。
+		 */
+		public ObjectGraphCache() {
+			super();
+			graphDepth = 0;
+		}
+		
+		/**
+		 * 指定のオブジェクトをキャッシュに追加する。
+		 * @param object 追加するオブジェクト
+		 * @return 追加済みならそのオブジェクトの番号({@code >= 0})、そうでなければ {@code -1}
+		 */
+		public int enter(Object object) {
+			if (graphDepth == 0) {
+				reinitialize();
+			}
+			int result;
+			if (object != null) {
+				Integer cached = map.get(object);
+				if (cached != null) {
+					result = cached;
+				} else {
+					result = -1;
+					map.put(object, map.size());
+				}
+			} else {
+				result = -1;
+			}
+			graphDepth++;
+			return result;
+		}
+		
+		/**
+		 * 現在のオブジェクトに対する処理が終了したことを通知する。
+		 */
+		public void exit() {
+			--graphDepth;
+			if (graphDepth == 0) {
+				map = null;
+			}
+		}
+		
+		private void reinitialize() {
+			map = new IdentityHashMap<Object, Integer>();
+		}
+	}
+	
+
+	/**
+	 * {@link Terminal}に変換する組み込みの変換器。
+	 */
+	private static final List<ConverterDriver> TERMINALS;
+	
+	static {
+		ArrayList<ConverterDriver> list = new ArrayList<ConverterDriver>();
+		list.add(PrimitiveConverter.INSTANCE);
+		list.add(EnumConverter.INSTANCE);
+		list.trimToSize();
+		TERMINALS = Collections.unmodifiableList(list);
+	}
+	
+
+	/**
+	 * 標準的なドライバセットに、拡張のドライバセットを追加した変換器を生成して返す。
+	 * <p>
+	 * 生成される変換器は、次のようなドライバセットを有する。
+	 * </p>
+	 * <ol>
+	 *   <li> {@link PrimitiveConverter} </li>
+	 *   <li> {@link EnumConverter} </li>
+	 *   <li> {@link ArrayConverter} </li>
+	 *   <li> {@link CollectionConverter} </li>
+	 *   <li> {@link MapConverter} </li>
+	 *   <li> {@code [extraDrivers]} </li>
+	 *   <li> {@link GeneralObjectConverter} </li>
+	 * </ol>
+	 * <p>
+	 * 登録されるドライバは上記の順に並べられており、番号が若いドライバほど優先して適用される。
+	 * ただし、あるドライバがオブジェクトを変換できなかった場合、この変換器は次のドライバによって
+	 * オブジェクトの変換を試みる。
+	 * すべてのドライバによって変換できない場合、この変換器は結果として{@code null}を返す。
+	 * ただし、{@link GeneralObjectConverter}は基本的に失敗しないため、
+	 * この呼び出しによって生成されたインスタンスが{@link #convert(Object)}の結果によって
+	 * {@code null}を返すことはほぼない。
+	 * </p>
+	 * <p>
+	 * 登録されたドライバセットのうち、{@link PrimitiveConverter}と{@link EnumConverter}を
+	 * <b>のぞく</b>変換器に同一のオブジェクトが2回以上対象となった場合、
+	 * そのオブジェクトは循環が存在するものとして強制的に
+	 * {@code #COPY-n}という形式に変換される (nには任意の数値が入る)。
+	 * </p>
+	 * @param extraDrivers ユーザ定義のドライバ一覧
+	 * @return 生成したオブジェクト
+	 * @throws NullPointerException 引数に{@code null}が指定された場合
+	 */
+	public static CachedObjectConverter newInstance(List<? extends ConverterDriver> extraDrivers) {
+		if (extraDrivers == null) {
+			throw new NullPointerException("extraDrivers"); //$NON-NLS-1$
+		}
+		List<ConverterDriver> drivers = new ArrayList<ConverterDriver>();
+		drivers.add(ArrayConverter.INSTANCE);
+		drivers.add(CollectionConverter.INSTANCE);
+		drivers.add(MapConverter.INSTANCE);
+		drivers.addAll(extraDrivers);
+		return new CachedObjectConverter(drivers);
+	}
+	
+
+	private final List<ConverterDriver> drivers;
+	
+	private final ThreadLocal<ObjectGraphCache> cache;
+	
+
+	/**
+	 * インスタンスを生成する。
+	 * @param drivers この変換器に登録するドライバの一覧
+	 */
+	private CachedObjectConverter(List<ConverterDriver> drivers) {
+		super();
+		assert drivers != null;
+		this.drivers = new ArrayList<ConverterDriver>(drivers);
+		cache = new ThreadLocal<ObjectGraphCache>() {
+			
+			@Override
+			protected ObjectGraphCache initialValue() {
+				return new ObjectGraphCache();
+			}
+		};
+	}
+	
+	public Value convert(Object object) {
+		// ターミナルに変換される(循環構造を持たない)ことが自明であるものだけ先に処理
+		for (ConverterDriver drv : TERMINALS) {
+			Value result = drv.convert(object, this);
+			if (result != null) {
+				return result;
+			}
+		}
+		
+		// コピーを検出する。
+		ObjectGraphCache graph = cache.get();
+		int number = graph.enter(object);
+		try {
+			if (number >= 0) {
+				return Terminal.of(String.format("#COPY-%d", number));
+			}
+			for (ConverterDriver drv : drivers) {
+				Value result = drv.convert(object, this);
+				if (result != null) {
+					return result;
+				}
+			}
+		} finally {
+			graph.exit();
+		}
+		
+		// 最後に汎用の変換機で変換
+		return GeneralObjectConverter.INSTANCE.convert(object);
+	}
+}


Property changes on: artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Modified: artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/DefaultObjectConverter.java
===================================================================
--- artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/DefaultObjectConverter.java	2009-02-02 13:29:23 UTC (rev 2604)
+++ artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/DefaultObjectConverter.java	2009-02-02 14:36:23 UTC (rev 2605)
@@ -26,85 +26,86 @@
  * @author Suguru ARAKAWA
  */
 public class DefaultObjectConverter implements ObjectConverter {
-    
-    private final List<ConverterDriver> drivers;
-    
-    /**
-     * インスタンスを生成する。
-     * <p>
-     * ドライバは引数{@code drivers}に格納された順序で登録され、
-     * 順序が若いドライバほど優先して適用される。
-     * ただし、あるドライバがオブジェクトを変換できなかった場合、この変換器は次のドライバによって
-     * オブジェクトの変換を試みる。
-     * すべてのドライバによって変換できない場合、この変換器の
-     * {@link #convert(Object)}メソッドは結果として{@code null}を返す。
-     * </p>
-     * <p>
-     * このコンストラクタによるインスタンス生成では、標準的なドライバセットはひとつも登録されない。
-     * 標準的なドライバセットの登録を自動的に行う場合、
-     * {@link #newInstance(List)}を利用する。
-     * </p>
-     * @param drivers この変換器に登録するドライバの一覧
-     * @throws NullPointerException 引数に{@code null}が指定された場合
-     */
-    public DefaultObjectConverter(List<ConverterDriver> drivers) {
-        super();
-        if (drivers == null) {
-            throw new NullPointerException("drivers"); //$NON-NLS-1$
-        }
-        this.drivers = new ArrayList<ConverterDriver>(drivers);
-    }
+	
+	/**
+	 * 標準的なドライバセットに、拡張のドライバセットを追加した変換器を生成して返す。
+	 * <p>
+	 * 生成される変換器は、次のようなドライバセットを有する。
+	 * </p>
+	 * <ol>
+	 *   <li> {@link PrimitiveConverter} </li>
+	 *   <li> {@link EnumConverter} </li>
+	 *   <li> {@link ArrayConverter} </li>
+	 *   <li> {@link CollectionConverter} </li>
+	 *   <li> {@link MapConverter} </li>
+	 *   <li> {@code [extraDrivers]} </li>
+	 *   <li> {@link GeneralObjectConverter} </li>
+	 * </ol>
+	 * <p>
+	 * 登録されるドライバは上記の順に並べられており、番号が若いドライバほど優先して適用される。
+	 * ただし、あるドライバがオブジェクトを変換できなかった場合、この変換器は次のドライバによって
+	 * オブジェクトの変換を試みる。
+	 * すべてのドライバによって変換できない場合、この変換器は結果として{@code null}を返す。
+	 * ただし、{@link GeneralObjectConverter}は基本的に失敗しないため、
+	 * この呼び出しによって生成されたインスタンスが{@link #convert(Object)}の結果によって
+	 * {@code null}を返すことはほぼない。
+	 * </p>
+	 * @param extraDrivers ユーザ定義のドライバ一覧
+	 * @return 生成したオブジェクト
+	 * @throws NullPointerException 引数に{@code null}が指定された場合
+	 */
+	public static DefaultObjectConverter newInstance(List<? extends ConverterDriver> extraDrivers) {
+		if (extraDrivers == null) {
+			throw new NullPointerException("extraDrivers"); //$NON-NLS-1$
+		}
+		List<ConverterDriver> drivers = new ArrayList<ConverterDriver>();
+		drivers.add(PrimitiveConverter.INSTANCE);
+		drivers.add(EnumConverter.INSTANCE);
+		drivers.add(ArrayConverter.INSTANCE);
+		drivers.add(CollectionConverter.INSTANCE);
+		drivers.add(MapConverter.INSTANCE);
+		drivers.addAll(extraDrivers);
+		drivers.add(GeneralObjectConverter.INSTANCE);
+		return new DefaultObjectConverter(drivers);
+	}
+	
 
-    /**
-     * 標準的なドライバセットに、拡張のドライバセットを追加した変換器を生成して返す。
-     * <p>
-     * 生成される変換器は、次のようなドライバセットを有する。
-     * </p>
-     * <ol>
-     *   <li> {@link ArrayConverter} </li>
-     *   <li> {@link CollectionConverter} </li>
-     *   <li> {@link MapConverter} </li>
-     *   <li> {@link CharStringConverter} </li>
-     *   <li> {@link EnumConverter} </li>
-     *   <li> {@code [extraDrivers]} </li>
-     *   <li> {@link GeneralObjectConverter} </li>
-     * </ol>
-     * <p>
-     * 登録されるドライバは上記の順に並べられており、番号が若いドライバほど優先して適用される。
-     * ただし、あるドライバがオブジェクトを変換できなかった場合、この変換器は次のドライバによって
-     * オブジェクトの変換を試みる。
-     * すべてのドライバによって変換できない場合、この変換器は結果として{@code null}を返す。
-     * ただし、{@link GeneralObjectConverter}は基本的に失敗しないため、
-     * この呼び出しによって生成されたインスタンスが{@link #convert(Object)}の結果によって
-     * {@code null}を返すことはほぼない。
-     * </p>
-     * @param extraDrivers ユーザ定義のドライバ一覧
-     * @return 生成したオブジェクト
-     * @throws NullPointerException 引数に{@code null}が指定された場合
-     */
-    public static DefaultObjectConverter newInstance(
-            List<? extends ConverterDriver> extraDrivers) {
-        if (extraDrivers == null) {
-            throw new NullPointerException("extraDrivers"); //$NON-NLS-1$
-        }
-        List<ConverterDriver> drivers = new ArrayList<ConverterDriver>();
-        drivers.add(ArrayConverter.INSTANCE);
-        drivers.add(CollectionConverter.INSTANCE);
-        drivers.add(MapConverter.INSTANCE);
-        drivers.add(CharStringConverter.INSTANCE);
-        drivers.add(EnumConverter.INSTANCE);
-        drivers.addAll(extraDrivers);
-        drivers.add(GeneralObjectConverter.INSTANCE);
-        return new DefaultObjectConverter(drivers);
-    }
+	private final List<ConverterDriver> drivers;
+	
 
-    public Value convert(Object object) {
-        for (ConverterDriver drv : drivers) {
-            Value result = drv.convert(object, this);
-            if (result != null) {
-                return result;
-            }
-        }
-        return null;
-    }
+	/**
+	 * インスタンスを生成する。
+	 * <p>
+	 * ドライバは引数{@code drivers}に格納された順序で登録され、
+	 * 順序が若いドライバほど優先して適用される。
+	 * ただし、あるドライバがオブジェクトを変換できなかった場合、この変換器は次のドライバによって
+	 * オブジェクトの変換を試みる。
+	 * すべてのドライバによって変換できない場合、この変換器の
+	 * {@link #convert(Object)}メソッドは結果として{@code null}を返す。
+	 * </p>
+	 * <p>
+	 * このコンストラクタによるインスタンス生成では、標準的なドライバセットはひとつも登録されない。
+	 * 標準的なドライバセットの登録を自動的に行う場合、
+	 * {@link #newInstance(List)}を利用する。
+	 * </p>
+	 * @param drivers この変換器に登録するドライバの一覧
+	 * @throws NullPointerException 引数に{@code null}が指定された場合
+	 */
+	public DefaultObjectConverter(List<ConverterDriver> drivers) {
+		super();
+		if (drivers == null) {
+			throw new NullPointerException("drivers"); //$NON-NLS-1$
+		}
+		this.drivers = new ArrayList<ConverterDriver>(drivers);
+	}
+	
+	public Value convert(Object object) {
+		for (ConverterDriver drv : drivers) {
+			Value result = drv.convert(object, this);
+			if (result != null) {
+				return result;
+			}
+		}
+		return null;
+	}
 }

Added: artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/PrimitiveConverter.java
===================================================================
--- artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/PrimitiveConverter.java	                        (rev 0)
+++ artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/PrimitiveConverter.java	2009-02-02 14:36:23 UTC (rev 2605)
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/02/02
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.gtree.converter;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jiemamy.utils.gtree.model.Terminal;
+import org.jiemamy.utils.gtree.model.Value;
+
+/**
+ * プリミティブな値を変換する。
+ * @author Suguru ARAKAWA
+ */
+public enum PrimitiveConverter implements ConverterDriver {
+	
+	/**
+	 * この変換器のインスタンス。
+	 */
+	INSTANCE, ;
+	
+	private static final Set<Class<?>> TARGETS;
+	static {
+		Set<Class<?>> targets = new HashSet<Class<?>>();
+		targets.add(Integer.class);
+		targets.add(Long.class);
+		targets.add(Float.class);
+		targets.add(Double.class);
+		targets.add(Byte.class);
+		targets.add(Short.class);
+		targets.add(Character.class);
+		targets.add(Boolean.class);
+		targets.add(BigDecimal.class);
+		targets.add(String.class);
+		TARGETS = Collections.unmodifiableSet(targets);
+	}
+	
+
+	/**
+	 * またはプリミティブな値、および{@code null}を{@link Terminal}に変換する。
+	 * <p>
+	 * この変換器が対象とする値は、以下のクラスに属するものである。
+	 * </p>
+	 * <ul>
+	 *   <li> {@link Integer} </li>
+	 *   <li> {@link Long} </li>
+	 *   <li> {@link Float} </li>
+	 *   <li> {@link Double} </li>
+	 *   <li> {@link Short} </li>
+	 *   <li> {@link Byte} </li>
+	 *   <li> {@link Character} </li>
+	 *   <li> {@link Boolean} </li>
+	 *   <li> {@link BigDecimal} </li>
+	 *   <li> {@link String} </li>
+	 * </ul>
+	 */
+	public Value convert(Object object, ObjectConverter converter) {
+		if (object == null) {
+			return Terminal.of("null"); //$NON-NLS-1$
+		}
+		Class<? extends Object> klass = object.getClass();
+		if (TARGETS.contains(klass)) {
+			String representation = String.valueOf(object);
+			return Terminal.of(representation);
+		}
+		return null;
+	}
+}


Property changes on: artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/PrimitiveConverter.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/CachedObjectConverterTest.java
===================================================================
--- artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/CachedObjectConverterTest.java	                        (rev 0)
+++ artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/CachedObjectConverterTest.java	2009-02-02 14:36:23 UTC (rev 2605)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/02/02
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.gtree.converter;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+/**
+ * Test for {@link CachedObjectConverter}.
+ * @author Suguru ARAKAWA
+ */
+public class CachedObjectConverterTest {
+	
+	/**
+	 * Test method for {@link CachedObjectConverter#convert(Object)}.
+	 */
+	@Test(timeout = 1000L)
+	public void testConvert_Brother() {
+		Object[] parent = new Object[2];
+		Object[] child = new Object[0];
+		parent[0] = parent[1] = child;
+		CachedObjectConverter conv = CachedObjectConverter.newInstance(Arrays.<ConverterDriver> asList());
+		conv.convert(parent);
+	}
+	
+	/**
+	 * Test method for {@link CachedObjectConverter#convert(Object)}.
+	 */
+	@Test(timeout = 1000L)
+	public void testConvert_ChildLoop() {
+		Object[] a1 = new Object[1];
+		a1[0] = a1;
+		CachedObjectConverter conv = CachedObjectConverter.newInstance(Arrays.<ConverterDriver> asList());
+		conv.convert(a1);
+	}
+}


Property changes on: artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/CachedObjectConverterTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native

Added: artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/PrimitiveConverterTest.java
===================================================================
--- artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/PrimitiveConverterTest.java	                        (rev 0)
+++ artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/PrimitiveConverterTest.java	2009-02-02 14:36:23 UTC (rev 2605)
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/02/02
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.jiemamy.utils.gtree.converter;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.jiemamy.utils.gtree.converter.PrimitiveConverter.INSTANCE;
+import static org.junit.Assert.assertThat;
+
+import java.math.BigDecimal;
+
+import org.junit.Test;
+
+import org.jiemamy.utils.gtree.model.Terminal;
+import org.jiemamy.utils.gtree.model.Value;
+
+/**
+ * Test for {@link PrimitiveConverter}.
+ * @author Suguru ARAKAWA
+ */
+public class PrimitiveConverterTest {
+	
+	private Value t(Object value) {
+		return Terminal.of(String.valueOf(value));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_BigDecimal() {
+		Value result = INSTANCE.convert(new BigDecimal(10), new MockObjectConverter());
+		assertThat(result, is(t("10")));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Boolean() {
+		Value result = INSTANCE.convert(false, new MockObjectConverter());
+		assertThat(result, is(t("false")));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Byte() {
+		Value result = INSTANCE.convert((byte) 6, new MockObjectConverter());
+		assertThat(result, is(t(6)));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Character() {
+		Value result = INSTANCE.convert('a', new MockObjectConverter());
+		assertThat(result, is(t("a")));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Double() {
+		Value result = INSTANCE.convert(4.0d, new MockObjectConverter());
+		assertThat(result, is(t(4.0d)));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Float() {
+		Value result = INSTANCE.convert(3.0f, new MockObjectConverter());
+		assertThat(result, is(t(3.0f)));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Integer() {
+		Value result = INSTANCE.convert(1, new MockObjectConverter());
+		assertThat(result, is(t(1)));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Long() {
+		Value result = INSTANCE.convert(2L, new MockObjectConverter());
+		assertThat(result, is(t(2L)));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Null() {
+		Value result = INSTANCE.convert(null, new MockObjectConverter());
+		assertThat(result, is(t("null")));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Otherwise() {
+		Value result = INSTANCE.convert(new StringBuilder(), new MockObjectConverter());
+		assertThat(result, is(nullValue()));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_Short() {
+		Value result = INSTANCE.convert((short) 5, new MockObjectConverter());
+		assertThat(result, is(t(5)));
+	}
+	
+	/**
+	 * Test method for {@link PrimitiveConverter#convert(Object, ObjectConverter)}.
+	 */
+	@Test
+	public void testConvert_String() {
+		Value result = INSTANCE.convert("Hello, world!", new MockObjectConverter());
+		assertThat(result, is(t("Hello, world!")));
+	}
+}


Property changes on: artemis/trunk/generic-tree/src/test/java/org/jiemamy/utils/gtree/converter/PrimitiveConverterTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Author Id Revision HeadURL
Added: svn:eol-style
   + native



Jiemamy-notify メーリングリストの案内
アーカイブの一覧に戻る