package kr.debop4j.core.reflect; import com.carrotsearch.junitbenchmarks.BenchmarkOptions; import kr.debop4j.core.AbstractTest; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; /** * kr.debop4j.core.reflect.FieldAccessTest * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 1. 21 */ @Slf4j public class FieldAccessTest extends AbstractTest { @BenchmarkOptions(benchmarkRounds = 100, warmupRounds = 1) @Test public void nameSetAndGet() { FieldAccess access = FieldAccess.get(SomeClass.class); SomeClass test = new SomeClass(); assertEquals(null, test.name); access.set(test, "name", "first"); assertEquals("first", test.name); assertEquals("first", access.get(test, "name")); assertEquals(0, test.intValue); access.set(test, "intValue", 1234); assertEquals(1234, test.intValue); assertEquals(1234, access.get(test, "intValue")); } @BenchmarkOptions(benchmarkRounds = 100, warmupRounds = 1) @Test public void indexSetAndGet() { FieldAccess access = FieldAccess.get(SomeClass.class); SomeClass test = new SomeClass(); int index; assertEquals(null, test.name); index = access.getIndex("name"); access.set(test, index, "first"); assertEquals("first", test.name); assertEquals("first", access.get(test, index)); index = access.getIndex("intValue"); assertEquals(0, test.intValue); access.set(test, index, 1234); assertEquals(1234, test.intValue); assertEquals(1234, access.get(test, index)); assertEquals(false, access.getBoolean(test, access.getIndex("booleanField"))); access.setBoolean(test, access.getIndex("booleanField"), true); assertEquals(true, access.getBoolean(test, access.getIndex("booleanField"))); assertEquals(0, access.getByte(test, access.getIndex("byteField"))); access.setByte(test, access.getIndex("byteField"), (byte) 23); assertEquals(23, access.getByte(test, access.getIndex("byteField"))); assertEquals(0, access.getChar(test, access.getIndex("charField"))); access.setChar(test, access.getIndex("charField"), (char) 53); assertEquals(53, access.getChar(test, access.getIndex("charField"))); assertEquals(0, access.getShort(test, access.getIndex("shortField"))); access.setShort(test, access.getIndex("shortField"), (short) 123); assertEquals(123, access.getShort(test, access.getIndex("shortField"))); assertEquals(0, access.getInt(test, access.getIndex("intField"))); access.setInt(test, access.getIndex("intField"), 123); assertEquals(123, access.getInt(test, access.getIndex("intField"))); assertEquals(0, access.getLong(test, access.getIndex("longField"))); access.setLong(test, access.getIndex("longField"), 123456789l); assertEquals(123456789l, access.getLong(test, access.getIndex("longField"))); assertEquals(0f, access.getFloat(test, access.getIndex("floatField")), 1.0e-10f); access.setFloat(test, access.getIndex("floatField"), 1.23f); assertEquals(1.23f, access.getFloat(test, access.getIndex("floatField")), 1.0e-10f); assertEquals(0d, access.getDouble(test, access.getIndex("doubleField")), 1.0e-10d); access.setDouble(test, access.getIndex("doubleField"), 123.456); assertEquals(123.456, access.getDouble(test, access.getIndex("doubleField")), 1.0e-10d); } @BenchmarkOptions(benchmarkRounds = 100, warmupRounds = 1) @Test public void emptyClass() { FieldAccess access = FieldAccess.get(EmptyClass.class); try { access.getIndex("name"); fail(); } catch (IllegalArgumentException expected) { // expected.printStackTrace(); } try { access.get(new EmptyClass(), "meow"); fail(); } catch (IllegalArgumentException expected) { // expected.printStackTrace(); } try { access.get(new EmptyClass(), 0); fail(); } catch (IllegalArgumentException expected) { // expected.printStackTrace(); } try { access.set(new EmptyClass(), "foo", "moo"); fail(); } catch (IllegalArgumentException expected) { // expected.printStackTrace(); } } static public class SomeClass { public String name; public int intValue; protected float test1; Float test2; private String test3; public boolean booleanField; public byte byteField; public char charField; public short shortField; public int intField; public long longField; public float floatField; public double doubleField; } static public class EmptyClass { } }