/* * Copyright (C) 2015 Red Hat, Inc. and/or its affiliates. * * 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.jboss.errai.jpa.sync.test.client; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.PersistenceContextType; import javax.persistence.metamodel.EntityType; import org.jboss.errai.ioc.client.Container; import org.jboss.errai.ioc.client.container.IOC; import org.jboss.errai.jpa.sync.client.local.ErraiAttributeAccessor; import org.jboss.errai.jpa.sync.client.shared.JpaAttributeAccessor; import org.jboss.errai.jpa.sync.test.client.entity.MethodAccessedZentity; import org.jboss.errai.jpa.sync.test.client.entity.Zentity; import com.google.gwt.junit.client.GWTTestCase; /** * Tests the Errai client-side implementation of the * {@link JpaAttributeAccessor} interface. * <p> * There is a subclass of this test which runs all the same tests against the * server-side Java reflection implementation. * * @author Jonathan Fuerth <jfuerth@redhat.com> */ public class ErraiJpaAttributeAccessorTest extends GWTTestCase { @Override public String getModuleName() { return "org.jboss.errai.jpa.sync.test.DataSyncTests"; } @Override protected void gwtSetUp() throws Exception { super.gwtSetUp(); // We need to bootstrap the IoC container manually because GWTTestCase // doesn't call onModuleLoad() for us. new Container().bootstrapContainer(); } @Override protected void gwtTearDown() throws Exception { Container.reset(); IOC.reset(); } protected EntityManager getEntityManager() { return JpaTestClient.INSTANCE.entityManager; } protected JpaAttributeAccessor getAttributeAccessor() { return new ErraiAttributeAccessor(); } public void testReadBoxedTypesFieldAccess() throws Exception { final Zentity zentity = new Zentity(); zentity.setBoxedBool(true); zentity.setBoxedByte((byte) 4); zentity.setBoxedByteArray(new Byte[] { 1, null, 3, 4 }); zentity.setBoxedChar('\u1234'); zentity.setBoxedCharArray(new Character[] { 'a', '\u3030', 'c', null }); zentity.setBoxedDouble(0.0000012329378462346d); zentity.setBoxedFloat(19873743.34442f); zentity.setBoxedInt(-3333); zentity.setBoxedLong(99999999999999L); zentity.setBoxedShort((short) -42); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<Zentity> metaZentity = em.getMetamodel().entity(Zentity.class); assertEquals(true, a.get(metaZentity.getAttribute("boxedBool"), zentity)); assertEquals((byte) 4, a.get(metaZentity.getAttribute("boxedByte"), zentity)); assertEquals( Arrays.toString(new Byte[] { 1, null, 3, 4 }), Arrays.toString((Byte[]) a.get(metaZentity.getAttribute("boxedByteArray"), zentity))); assertEquals('\u1234', a.get(metaZentity.getAttribute("boxedChar"), zentity)); assertEquals( Arrays.toString(new Character[] { 'a', '\u3030', 'c', null }), Arrays.toString((Character[]) a.get(metaZentity.getAttribute("boxedCharArray"), zentity))); assertEquals(0.0000012329378462346d, a.get(metaZentity.getAttribute("boxedDouble"), zentity)); assertEquals(19873743.34442f, a.get(metaZentity.getAttribute("boxedFloat"), zentity)); assertEquals(-3333, a.get(metaZentity.getAttribute("boxedInt"), zentity)); assertEquals(99999999999999L, a.get(metaZentity.getAttribute("boxedLong"), zentity)); assertEquals((short) -42, a.get(metaZentity.getAttribute("boxedShort"), zentity)); } public void testReadBoxedTypesMethodAccess() throws Exception { final MethodAccessedZentity zentity = new MethodAccessedZentity(); zentity.setBoxedBool(true); zentity.setBoxedByte((byte) 4); zentity.setBoxedByteArray(new Byte[] { 1, null, 3, 4 }); zentity.setBoxedChar('\u1234'); zentity.setBoxedCharArray(new Character[] { 'a', '\u3030', 'c', null }); zentity.setBoxedDouble(0.0000012329378462346d); zentity.setBoxedFloat(19873743.34442f); zentity.setBoxedInt(-3333); zentity.setBoxedLong(99999999999999L); zentity.setBoxedShort((short) -42); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<MethodAccessedZentity> metaZentity = em.getMetamodel().entity(MethodAccessedZentity.class); assertEquals(true, a.get(metaZentity.getAttribute("boxedBool"), zentity)); assertEquals((byte) 4, a.get(metaZentity.getAttribute("boxedByte"), zentity)); assertEquals( Arrays.toString(new Byte[] { 1, null, 3, 4 }), Arrays.toString((Byte[]) a.get(metaZentity.getAttribute("boxedByteArray"), zentity))); assertEquals('\u1234', a.get(metaZentity.getAttribute("boxedChar"), zentity)); assertEquals( Arrays.toString(new Character[] { 'a', '\u3030', 'c', null }), Arrays.toString((Character[]) a.get(metaZentity.getAttribute("boxedCharArray"), zentity))); assertEquals(0.0000012329378462346d, a.get(metaZentity.getAttribute("boxedDouble"), zentity)); assertEquals(19873743.34442f, a.get(metaZentity.getAttribute("boxedFloat"), zentity)); assertEquals(-3333, a.get(metaZentity.getAttribute("boxedInt"), zentity)); assertEquals(99999999999999L, a.get(metaZentity.getAttribute("boxedLong"), zentity)); assertEquals((short) -42, a.get(metaZentity.getAttribute("boxedShort"), zentity)); } public void testWriteBoxedTypesFieldAccess() throws Exception { final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<Zentity> metaZentity = em.getMetamodel().entity(Zentity.class); final Zentity zentity = new Zentity(); a.set(metaZentity.getSingularAttribute("boxedBool", Boolean.class), zentity, true); a.set(metaZentity.getSingularAttribute("boxedByte", Byte.class), zentity, (byte) 4); a.set(metaZentity.getSingularAttribute("boxedByteArray", Byte[].class), zentity, new Byte[] { 1, null, 3, 4 }); a.set(metaZentity.getSingularAttribute("boxedChar", Character.class), zentity, '\u1234'); a.set(metaZentity.getSingularAttribute("boxedCharArray", Character[].class), zentity, new Character[] { 'a', '\u3030', 'c', null }); a.set(metaZentity.getSingularAttribute("boxedDouble", Double.class), zentity, 0.0000012329378462346d); a.set(metaZentity.getSingularAttribute("boxedFloat", Float.class), zentity, 19873743.34442f); a.set(metaZentity.getSingularAttribute("boxedInt", Integer.class), zentity, -3333); a.set(metaZentity.getSingularAttribute("boxedLong", Long.class), zentity, 99999999999999L); a.set(metaZentity.getSingularAttribute("boxedShort", Short.class), zentity, (short) -42); assertEquals(Boolean.valueOf(true), zentity.getBoxedBool()); assertEquals(Byte.valueOf((byte) 4), zentity.getBoxedByte()); assertEquals( Arrays.toString(new Byte[] { 1, null, 3, 4 }), Arrays.toString(zentity.getBoxedByteArray())); assertEquals(Character.valueOf('\u1234'), zentity.getBoxedChar()); assertEquals( Arrays.toString(new Character[] { 'a', '\u3030', 'c', null }), Arrays.toString(zentity.getBoxedCharArray())); assertEquals(0.0000012329378462346d, zentity.getBoxedDouble()); assertEquals(19873743.34442f, zentity.getBoxedFloat()); assertEquals(Integer.valueOf(-3333), zentity.getBoxedInt()); assertEquals(Long.valueOf(99999999999999L), zentity.getBoxedLong()); assertEquals(Short.valueOf((short) -42), zentity.getBoxedShort()); } public void testWriteBoxedTypesMethodAccess() throws Exception { final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<MethodAccessedZentity> metaZentity = em.getMetamodel().entity(MethodAccessedZentity.class); final MethodAccessedZentity zentity = new MethodAccessedZentity(); a.set(metaZentity.getSingularAttribute("boxedBool", Boolean.class), zentity, true); a.set(metaZentity.getSingularAttribute("boxedByte", Byte.class), zentity, (byte) 4); a.set(metaZentity.getSingularAttribute("boxedByteArray", Byte[].class), zentity, new Byte[] { 1, null, 3, 4 }); a.set(metaZentity.getSingularAttribute("boxedChar", Character.class), zentity, '\u1234'); a.set(metaZentity.getSingularAttribute("boxedCharArray", Character[].class), zentity, new Character[] { 'a', '\u3030', 'c', null }); a.set(metaZentity.getSingularAttribute("boxedDouble", Double.class), zentity, 0.0000012329378462346d); a.set(metaZentity.getSingularAttribute("boxedFloat", Float.class), zentity, 19873743.34442f); a.set(metaZentity.getSingularAttribute("boxedInt", Integer.class), zentity, -3333); a.set(metaZentity.getSingularAttribute("boxedLong", Long.class), zentity, 99999999999999L); a.set(metaZentity.getSingularAttribute("boxedShort", Short.class), zentity, (short) -42); assertEquals(Boolean.valueOf(true), zentity.getBoxedBool()); assertEquals(Byte.valueOf((byte) 4), zentity.getBoxedByte()); assertEquals( Arrays.toString(new Byte[] { 1, null, 3, 4 }), Arrays.toString(zentity.getBoxedByteArray())); assertEquals(Character.valueOf('\u1234'), zentity.getBoxedChar()); assertEquals( Arrays.toString(new Character[] { 'a', '\u3030', 'c', null }), Arrays.toString(zentity.getBoxedCharArray())); assertEquals(0.0000012329378462346d, zentity.getBoxedDouble()); assertEquals(19873743.34442f, zentity.getBoxedFloat()); assertEquals(Integer.valueOf(-3333), zentity.getBoxedInt()); assertEquals(Long.valueOf(99999999999999L), zentity.getBoxedLong()); assertEquals(Short.valueOf((short) -42), zentity.getBoxedShort()); } public void testReadNullBoxedTypesFieldAccess() throws Exception { final Zentity zentity = new Zentity(); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<Zentity> metaZentity = em.getMetamodel().entity(Zentity.class); assertEquals(null, a.get(metaZentity.getAttribute("boxedBool"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedByte"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedByteArray"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedChar"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedCharArray"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedDouble"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedFloat"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedInt"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedLong"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedShort"), zentity)); } public void testReadNullBoxedTypesMethodAccess() throws Exception { final MethodAccessedZentity zentity = new MethodAccessedZentity(); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<MethodAccessedZentity> metaZentity = em.getMetamodel().entity(MethodAccessedZentity.class); assertEquals(null, a.get(metaZentity.getAttribute("boxedBool"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedByte"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedByteArray"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedChar"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedCharArray"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedDouble"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedFloat"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedInt"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedLong"), zentity)); assertEquals(null, a.get(metaZentity.getAttribute("boxedShort"), zentity)); } public void testReadPrimitiveTypesFieldAccess() throws Exception { final Zentity zentity = new Zentity(); zentity.setPrimitiveBool(true); zentity.setPrimitiveByte((byte) 4); zentity.setPrimitiveByteArray(new byte[] { 1, 2, 3, 4 }); zentity.setPrimitiveChar('\u1234'); zentity.setPrimitiveCharArray(new char[] { 'a', '\u3030', 'c', 'd' }); zentity.setPrimitiveDouble(0.0000012329378462346d); zentity.setPrimitiveFloat(19873743.34442f); zentity.setPrimitiveInt(-3333); zentity.setPrimitiveLong(99999999999999L); zentity.setPrimitiveShort((short) -42); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<Zentity> metaZentity = em.getMetamodel().entity(Zentity.class); assertEquals(true, a.get(metaZentity.getAttribute("primitiveBool"), zentity)); assertEquals((byte) 4, a.get(metaZentity.getAttribute("primitiveByte"), zentity)); assertEquals( Arrays.toString(new byte[] { 1, 2, 3, 4 }), Arrays.toString((byte[]) a.get(metaZentity.getAttribute("primitiveByteArray"), zentity))); assertEquals('\u1234', a.get(metaZentity.getAttribute("primitiveChar"), zentity)); assertEquals( Arrays.toString(new char[] { 'a', '\u3030', 'c', 'd' }), Arrays.toString((char[]) a.get(metaZentity.getAttribute("primitiveCharArray"), zentity))); assertEquals(0.0000012329378462346d, a.get(metaZentity.getAttribute("primitiveDouble"), zentity)); assertEquals(19873743.34442f, a.get(metaZentity.getAttribute("primitiveFloat"), zentity)); assertEquals(-3333, a.get(metaZentity.getAttribute("primitiveInt"), zentity)); assertEquals(99999999999999L, a.get(metaZentity.getAttribute("primitiveLong"), zentity)); assertEquals((short) -42, a.get(metaZentity.getAttribute("primitiveShort"), zentity)); } public void testReadPrimitiveTypesMethodAccess() throws Exception { final MethodAccessedZentity zentity = new MethodAccessedZentity(); zentity.setPrimitiveBool(true); zentity.setPrimitiveByte((byte) 4); zentity.setPrimitiveByteArray(new byte[] { 1, 2, 3, 4 }); zentity.setPrimitiveChar('\u1234'); zentity.setPrimitiveCharArray(new char[] { 'a', '\u3030', 'c', 'd' }); zentity.setPrimitiveDouble(0.0000012329378462346d); zentity.setPrimitiveFloat(19873743.34442f); zentity.setPrimitiveInt(-3333); zentity.setPrimitiveLong(99999999999999L); zentity.setPrimitiveShort((short) -42); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<MethodAccessedZentity> metaZentity = em.getMetamodel().entity(MethodAccessedZentity.class); assertEquals(true, a.get(metaZentity.getAttribute("primitiveBool"), zentity)); assertEquals((byte) 4, a.get(metaZentity.getAttribute("primitiveByte"), zentity)); assertEquals( Arrays.toString(new byte[] { 1, 2, 3, 4 }), Arrays.toString((byte[]) a.get(metaZentity.getAttribute("primitiveByteArray"), zentity))); assertEquals('\u1234', a.get(metaZentity.getAttribute("primitiveChar"), zentity)); assertEquals( Arrays.toString(new char[] { 'a', '\u3030', 'c', 'd' }), Arrays.toString((char[]) a.get(metaZentity.getAttribute("primitiveCharArray"), zentity))); assertEquals(0.0000012329378462346d, a.get(metaZentity.getAttribute("primitiveDouble"), zentity)); assertEquals(19873743.34442f, a.get(metaZentity.getAttribute("primitiveFloat"), zentity)); assertEquals(-3333, a.get(metaZentity.getAttribute("primitiveInt"), zentity)); assertEquals(99999999999999L, a.get(metaZentity.getAttribute("primitiveLong"), zentity)); assertEquals((short) -42, a.get(metaZentity.getAttribute("primitiveShort"), zentity)); } public void testWritePrimitiveTypesFieldAccess() throws Exception { final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<Zentity> metaZentity = em.getMetamodel().entity(Zentity.class); final Zentity zentity = new Zentity(); a.set(metaZentity.getSingularAttribute("primitiveBool", boolean.class), zentity, true); a.set(metaZentity.getSingularAttribute("primitiveByte", byte.class), zentity, (byte) 4); a.set(metaZentity.getSingularAttribute("primitiveByteArray", byte[].class), zentity, new byte[] { 1, 2, 3, 4 }); a.set(metaZentity.getSingularAttribute("primitiveChar", char.class), zentity, '\u1234'); a.set(metaZentity.getSingularAttribute("primitiveCharArray", char[].class), zentity, new char[] { 'a', '\u3030', 'c', 'd' }); a.set(metaZentity.getSingularAttribute("primitiveDouble", double.class), zentity, 0.0000012329378462346d); a.set(metaZentity.getSingularAttribute("primitiveFloat", float.class), zentity, 19873743.34442f); a.set(metaZentity.getSingularAttribute("primitiveInt", int.class), zentity, -3333); a.set(metaZentity.getSingularAttribute("primitiveLong", long.class), zentity, 99999999999999L); a.set(metaZentity.getSingularAttribute("primitiveShort", short.class), zentity, (short) -42); assertEquals(true, zentity.getPrimitiveBool()); assertEquals((byte) 4, zentity.getPrimitiveByte()); assertEquals( Arrays.toString(new byte[] { 1, 2, 3, 4 }), Arrays.toString(zentity.getPrimitiveByteArray())); assertEquals('\u1234', zentity.getPrimitiveChar()); assertEquals( Arrays.toString(new char[] { 'a', '\u3030', 'c', 'd' }), Arrays.toString(zentity.getPrimitiveCharArray())); assertEquals(0.0000012329378462346d, zentity.getPrimitiveDouble()); assertEquals(19873743.34442f, zentity.getPrimitiveFloat()); assertEquals(-3333, zentity.getPrimitiveInt()); assertEquals(99999999999999L, zentity.getPrimitiveLong()); assertEquals((short) -42, zentity.getPrimitiveShort()); } public void testWritePrimitiveTypesMethodAccess() throws Exception { final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<MethodAccessedZentity> metaZentity = em.getMetamodel().entity(MethodAccessedZentity.class); final MethodAccessedZentity zentity = new MethodAccessedZentity(); a.set(metaZentity.getSingularAttribute("primitiveBool", boolean.class), zentity, true); a.set(metaZentity.getSingularAttribute("primitiveByte", byte.class), zentity, (byte) 4); a.set(metaZentity.getSingularAttribute("primitiveByteArray", byte[].class), zentity, new byte[] { 1, 2, 3, 4 }); a.set(metaZentity.getSingularAttribute("primitiveChar", char.class), zentity, '\u1234'); a.set(metaZentity.getSingularAttribute("primitiveCharArray", char[].class), zentity, new char[] { 'a', '\u3030', 'c', 'd' }); a.set(metaZentity.getSingularAttribute("primitiveDouble", double.class), zentity, 0.0000012329378462346d); a.set(metaZentity.getSingularAttribute("primitiveFloat", float.class), zentity, 19873743.34442f); a.set(metaZentity.getSingularAttribute("primitiveInt", int.class), zentity, -3333); a.set(metaZentity.getSingularAttribute("primitiveLong", long.class), zentity, 99999999999999L); a.set(metaZentity.getSingularAttribute("primitiveShort", short.class), zentity, (short) -42); assertEquals(true, zentity.isPrimitiveBool()); assertEquals((byte) 4, zentity.getPrimitiveByte()); assertEquals( Arrays.toString(new byte[] { 1, 2, 3, 4 }), Arrays.toString(zentity.getPrimitiveByteArray())); assertEquals('\u1234', zentity.getPrimitiveChar()); assertEquals( Arrays.toString(new char[] { 'a', '\u3030', 'c', 'd' }), Arrays.toString(zentity.getPrimitiveCharArray())); assertEquals(0.0000012329378462346d, zentity.getPrimitiveDouble()); assertEquals(19873743.34442f, zentity.getPrimitiveFloat()); assertEquals(-3333, zentity.getPrimitiveInt()); assertEquals(99999999999999L, zentity.getPrimitiveLong()); assertEquals((short) -42, zentity.getPrimitiveShort()); } public void testReadObjectTypesFieldAccess() throws Exception { final Zentity zentity = new Zentity(); zentity.setBigDecimal(new BigDecimal("1231231223847628347692834.5762305986471348576298346753")); zentity.setBigInteger(new BigInteger("23874502938475023985763457692384756918324572345")); zentity.setDate(new Date(12345678L)); zentity.setEnumeration(PersistenceContextType.EXTENDED); zentity.setString("this is \u3833 a string"); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<Zentity> metaZentity = em.getMetamodel().entity(Zentity.class); assertEquals(new BigDecimal("1231231223847628347692834.5762305986471348576298346753"), a.get(metaZentity.getAttribute("bigDecimal"), zentity)); assertEquals(new BigInteger("23874502938475023985763457692384756918324572345"), a.get(metaZentity.getAttribute("bigInteger"), zentity)); assertEquals(new Date(12345678L), a.get(metaZentity.getAttribute("date"), zentity)); assertEquals(PersistenceContextType.EXTENDED, a.get(metaZentity.getAttribute("enumeration"), zentity)); assertEquals("this is \u3833 a string", a.get(metaZentity.getAttribute("string"), zentity)); } public void testReadObjectTypesMethodAccess() throws Exception { final MethodAccessedZentity zentity = new MethodAccessedZentity(); zentity.setBigDecimal(new BigDecimal("1231231223847628347692834.5762305986471348576298346753")); zentity.setBigInteger(new BigInteger("23874502938475023985763457692384756918324572345")); zentity.setDate(new Date(12345678L)); zentity.setEnumeration(PersistenceContextType.EXTENDED); zentity.setString("this is \u3833 a string"); final JpaAttributeAccessor a = getAttributeAccessor(); final EntityManager em = getEntityManager(); final EntityType<MethodAccessedZentity> metaZentity = em.getMetamodel().entity(MethodAccessedZentity.class); assertEquals(new BigDecimal("1231231223847628347692834.5762305986471348576298346753"), a.get(metaZentity.getAttribute("bigDecimal"), zentity)); assertEquals(new BigInteger("23874502938475023985763457692384756918324572345"), a.get(metaZentity.getAttribute("bigInteger"), zentity)); assertEquals(new Date(12345678L), a.get(metaZentity.getAttribute("date"), zentity)); assertEquals(PersistenceContextType.EXTENDED, a.get(metaZentity.getAttribute("enumeration"), zentity)); assertEquals("this is \u3833 a string", a.get(metaZentity.getAttribute("string"), zentity)); } }