From 5617ce056dd1c58e54fef4154ac9350093ec0353 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Fri, 11 Jun 2021 14:15:31 -0500 Subject: [PATCH] Migrating tests --- .../internal/StandardDialectResolverTest.java | 209 ------------ .../engine/query/InformixFunctionTest.java | 193 ----------- .../MySQLSetVariableEscapeColonTest.java | 66 ---- .../hibernate/engine/spi/ExtraStateTest.java | 126 -------- .../spi/NonSortedExecutableListTest.java | 255 --------------- .../engine/spi/SortedExecutableListTest.java | 252 --------------- .../SessionDelegatorBaseImplTest.java | 76 ----- .../SessionDelegatorBaseImplTest.java | 84 +++++ .../TestDelegatingSessionBuilder.java | 10 +- ...stDelegatingSessionBuilderImplementor.java | 10 +- .../TestDelegatingSharedSessionBuilder.java | 10 +- .../orm/test/delegation/package-info.java | 11 + .../resolver/StandardDialectResolverTest.java | 197 +++++++++++ .../action/NonSortedExecutableListTest.java | 305 ++++++++++++++++++ .../action/SortedExecutableListTest.java | 290 +++++++++++++++++ .../orm/test/engine/action/package-info.java | 11 + .../orm/test/engine/spi/ExtraStateTest.java | 131 ++++++++ .../test/jdbc}/JdbcCoordinatorTest.java | 9 +- .../StandardRefCursorSupportTest.java | 8 +- .../test/query/hql/InformixFunctionTest.java | 212 ++++++++++++ .../sql/MySQLSetVariableEscapeColonTest.java | 47 +++ .../test/query/sql}/ParameterParserTest.java | 40 ++- 22 files changed, 1354 insertions(+), 1198 deletions(-) delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/jdbc/dialect/internal/StandardDialectResolverTest.java delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/query/InformixFunctionTest.java delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/query/MySQLSetVariableEscapeColonTest.java delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/spi/ExtraStateTest.java delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/spi/NonSortedExecutableListTest.java delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/spi/SortedExecutableListTest.java delete mode 100644 hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/SessionDelegatorBaseImplTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/delegation/SessionDelegatorBaseImplTest.java rename hibernate-core/src/test/java/org/hibernate/{engine/spi => orm/test}/delegation/TestDelegatingSessionBuilder.java (69%) rename hibernate-core/src/test/java/org/hibernate/{engine/spi => orm/test}/delegation/TestDelegatingSessionBuilderImplementor.java (71%) rename hibernate-core/src/test/java/org/hibernate/{engine/spi => orm/test}/delegation/TestDelegatingSharedSessionBuilder.java (70%) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/delegation/package-info.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/StandardDialectResolverTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/NonSortedExecutableListTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/SortedExecutableListTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/package-info.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/engine/spi/ExtraStateTest.java rename hibernate-core/src/test/java/org/hibernate/{engine/jdbc/internal => orm/test/jdbc}/JdbcCoordinatorTest.java (91%) rename hibernate-core/src/test/java/org/hibernate/{engine/jdbc/cursor/internal => orm/test/jdbc/refcursor}/StandardRefCursorSupportTest.java (82%) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/InformixFunctionTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/MySQLSetVariableEscapeColonTest.java rename hibernate-core/src/test/java/org/hibernate/{engine/query => orm/test/query/sql}/ParameterParserTest.java (85%) diff --git a/hibernate-core/src/test/java/org/hibernate/engine/jdbc/dialect/internal/StandardDialectResolverTest.java b/hibernate-core/src/test/java/org/hibernate/engine/jdbc/dialect/internal/StandardDialectResolverTest.java deleted file mode 100644 index 4d35967c85..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/jdbc/dialect/internal/StandardDialectResolverTest.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.engine.jdbc.dialect.internal; - -import org.hibernate.dialect.*; -import org.hibernate.orm.test.dialect.resolver.TestingDialectResolutionInfo; -import org.hibernate.testing.junit4.BaseUnitTestCase; -import org.junit.Test; - -import java.sql.SQLException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * Unit test of the {@link StandardDialectResolver} class. - * - * @author Bryan Turner - */ -public class StandardDialectResolverTest extends BaseUnitTestCase { - - @Test - public void testResolveDialectInternalForSQLServer2000() - throws SQLException { - runSQLServerDialectTest( 8, SQLServerDialect.class ); - } - - @Test - public void testResolveDialectInternalForSQLServer2005() - throws SQLException { - runSQLServerDialectTest( 9, SQLServer2005Dialect.class ); - } - - @Test - public void testResolveDialectInternalForSQLServer2008() - throws SQLException { - runSQLServerDialectTest( 10, SQLServer2008Dialect.class ); - } - - @Test - public void testResolveDialectInternalForSQLServer2012() - throws SQLException { - runSQLServerDialectTest( 11, SQLServer2012Dialect.class ); - } - - @Test - public void testResolveDialectInternalForSQLServer2014() - throws SQLException { - runSQLServerDialectTest( 12, SQLServer2012Dialect.class ); - } - - @Test - public void testResolveDialectInternalForUnknownSQLServerVersion() - throws SQLException { - runSQLServerDialectTest( 7, SQLServerDialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres81() - throws SQLException { - runPostgresDialectTest( 8, 1, PostgreSQL81Dialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres82() - throws SQLException { - runPostgresDialectTest( 8, 2, PostgreSQL82Dialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres83() throws SQLException { - runPostgresDialectTest( 8, 3, PostgreSQL82Dialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres84() throws SQLException { - runPostgresDialectTest( 8, 4, PostgreSQL82Dialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres9() throws SQLException { - runPostgresDialectTest( 9, 0, PostgreSQL9Dialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres91() throws SQLException { - runPostgresDialectTest( 9, 1, PostgreSQL9Dialect.class ); - } - - @Test - public void testResolveDialectInternalForPostgres92() throws SQLException { - runPostgresDialectTest( 9, 2, PostgreSQL92Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMariaDB103() throws SQLException { - runMariaDBDialectTest( 10, 3, MariaDB103Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMariaDB102() throws SQLException { - runMariaDBDialectTest( 10, 2, MariaDB102Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMariaDB101() throws SQLException { - runMariaDBDialectTest( 10, 1, MariaDB10Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMariaDB100() throws SQLException { - runMariaDBDialectTest( 10, 0, MariaDB10Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMariaDB55() throws SQLException { - runMariaDBDialectTest( 5, 5, MariaDB53Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMariaDB52() throws SQLException { - runMariaDBDialectTest( 5, 2, MariaDBDialect.class ); - } - - @Test - public void testResolveDialectInternalForMySQL57() throws SQLException { - runMySQLDialectTest( 5, 7, MySQL57Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMySQL6() throws SQLException { - runMySQLDialectTest( 6, 0, MySQL57Dialect.class ); - } - - @Test - public void testResolveDialectInternalForMySQL7() throws SQLException { - runMySQLDialectTest( 7, 0, MySQL57Dialect.class ); - } - - - @Test - public void testResolveDialectInternalForMySQL8() throws SQLException { - runMySQLDialectTest( 8, 0, MySQL8Dialect.class ); - } - - private static void runMariaDBDialectTest( - int majorVersion, int minorVersion, Class expectedDialect) - throws SQLException { - runDialectTest( "MariaDB", "MariaDB connector/J", majorVersion, minorVersion, expectedDialect ); - } - - private static void runMySQLDialectTest( - int majorVersion, int minorVersion, Class expectedDialect) - throws SQLException { - runDialectTest( "MySQL", "MySQL connector/J", majorVersion, minorVersion, expectedDialect ); - } - - private static void runSQLServerDialectTest( - int version, Class expectedDialect) - throws SQLException { - runDialectTest( "Microsoft SQL Server", version, 0, - expectedDialect ); - } - - private static void runPostgresDialectTest( - int majorVersion, int minorVersion, - Class expectedDialect) throws SQLException { - runDialectTest( "PostgreSQL", majorVersion, minorVersion, - expectedDialect ); - } - - private static void runDialectTest( - String productName, - int majorVersion, - int minorVersion, - Class expectedDialect) { - runDialectTest( productName, null, majorVersion, minorVersion, expectedDialect ); - } - - private static void runDialectTest( - String productName, - String driverName, - int majorVersion, - int minorVersion, - Class expectedDialect) { - TestingDialectResolutionInfo info = TestingDialectResolutionInfo.forDatabaseInfo( productName, driverName, majorVersion, minorVersion ); - - Dialect dialect = new StandardDialectResolver().resolveDialect( info ); - - StringBuilder builder = new StringBuilder( productName ).append( " " ) - .append( majorVersion ); - if ( minorVersion > 0 ) { - builder.append( "." ).append( minorVersion ); - } - String dbms = builder.toString(); - - assertNotNull( "Dialect for " + dbms + " should not be null", dialect ); - // Make sure to test that the actual dialect class is as expected - // (not just an instance of the expected dialect. - assertEquals( "Dialect for " + dbms + " should be " + expectedDialect.getSimpleName(), - expectedDialect, - dialect.getClass() - ); - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/engine/query/InformixFunctionTest.java b/hibernate-core/src/test/java/org/hibernate/engine/query/InformixFunctionTest.java deleted file mode 100644 index 2f9b68c426..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/query/InformixFunctionTest.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.hibernate.engine.query; - -import java.sql.Timestamp; -import java.util.Calendar; -import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -import org.hibernate.dialect.InformixDialect; - -import org.hibernate.testing.RequiresDialect; -import org.hibernate.testing.TestForIssue; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.junit.Test; - -import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -/** - * @author Vlad Mihalcea - */ -@RequiresDialect(InformixDialect.class) -public class InformixFunctionTest extends BaseCoreFunctionalTestCase { - - private Event event; - - @Override - protected void prepareTest() throws Exception { - doInHibernate( this::sessionFactory, session -> { - event = new Event(); - event.country = "Romania"; - event.city = "Cluj-Napoca"; - session.persist( event ); - } ); - } - - @Test - @TestForIssue( jiraKey = "HHH-10846" ) - public void testConcat() throws Exception { - doInHibernate( this::sessionFactory, session -> { - String location = (String) session.createQuery( - "select concat(e.country, ' - ', e.city) " + - "from Event e " + - "where e.id = :id") - .setParameter( "id", event.id ) - .getSingleResult(); - assertEquals( "Romania - Cluj-Napoca", location); - } ); - } - - @Test - @TestForIssue( jiraKey = "HHH-10846" ) - public void testSubstring() throws Exception { - doInHibernate( this::sessionFactory, session -> { - String location = (String) session.createQuery( - "select substring(e.city, 0, 5) " + - "from Event e " + - "where e.id = :id") - .setParameter( "id", event.id ) - .getSingleResult(); - assertEquals( "Cluj", location); - } ); - } - - @Test - @TestForIssue( jiraKey = "HHH-10846" ) - public void testSubstr() throws Exception { - doInHibernate( this::sessionFactory, session -> { - String location = (String) session.createQuery( - "select substr(e.city, 0, 4) " + - "from Event e " + - "where e.id = :id") - .setParameter( "id", event.id ) - .getSingleResult(); - assertEquals( "Cluj", location); - } ); - } - - @Test - @TestForIssue( jiraKey = "HHH-10846" ) - public void testCoalesceAndNvl() throws Exception { - doInHibernate( this::sessionFactory, session -> { - String location = (String) session.createQuery( - "select coalesce(e.district, 'N/A') " + - "from Event e " + - "where e.id = :id") - .setParameter( "id", event.id ) - .getSingleResult(); - assertEquals( "N/A", location); - - location = (String) session.createQuery( - "select nvl(e.district, 'N/A') " + - "from Event e " + - "where e.id = :id") - .setParameter( "id", event.id ) - .getSingleResult(); - assertEquals( "N/A", location); - } ); - } - - @Test - @TestForIssue( jiraKey = "HHH-10800" ) - public void testCurrentDate() throws Exception { - doInHibernate( this::sessionFactory, session -> { - Date date = (Date) session.createQuery( - "select current_date() " + - "from Event e " + - "where e.id = :id") - .setParameter( "id", event.id ) - .getSingleResult(); - - assertNotNull( date ); - assertTrue( date.getTime() > 0 ); - - Calendar resultCalendar = Calendar.getInstance(); - resultCalendar.setTime(date); - - assertEquals( 0, todayCalendar().compareTo(resultCalendar) ); - } ); - } - - @Test - @TestForIssue( jiraKey = "HHH-10800" ) - public void testCurrentTimestamp() throws Exception { - doInHibernate( this::sessionFactory, session -> { - int tries = 2; - while ( tries-- > 0 ) { - Timestamp timestamp = (Timestamp) session.createQuery( - "select current_timestamp() " + - "from Event e " + - "where e.id = :id" ) - .setParameter( "id", event.id ) - .getSingleResult(); - - assertNotNull( timestamp ); - assertTrue( timestamp != null && timestamp.getTime() > 0 ); - - Calendar resultCalendar = Calendar.getInstance(); - resultCalendar.setTime( timestamp ); - - long millis = resultCalendar.getTime().getTime() - todayCalendar().getTime().getTime(); - - if(millis == 0) { - //What are the odds that ou've run this test exactly at midnight? - try { - Thread.sleep( 1000 ); - } - catch ( InterruptedException ignore ) {} - continue; - } - - assertTrue( millis > 0 ); - } - } ); - } - - private Calendar todayCalendar() { - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - return calendar; - } - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Event.class - }; - } - - @Entity(name = "Event") - public static class Event { - - @Id - @GeneratedValue - private Long id; - - @Column - private String country; - - private String city; - - private String district; - } -} - - diff --git a/hibernate-core/src/test/java/org/hibernate/engine/query/MySQLSetVariableEscapeColonTest.java b/hibernate-core/src/test/java/org/hibernate/engine/query/MySQLSetVariableEscapeColonTest.java deleted file mode 100644 index 4679fc5237..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/query/MySQLSetVariableEscapeColonTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.engine.query; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; - -import org.hibernate.Session; -import org.hibernate.dialect.MySQL5Dialect; -import org.hibernate.jdbc.Work; - -import org.hibernate.testing.RequiresDialect; -import org.hibernate.testing.TestForIssue; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * @author Vlad Mihalcea - */ -@RequiresDialect(MySQL5Dialect.class) -@TestForIssue( jiraKey = "HHH-1237") -public class MySQLSetVariableEscapeColonTest extends BaseCoreFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { }; - } - - @Test - public void testBoundedLongStringAccess() { - - Session s = openSession(); - s.beginTransaction(); - try { - s.doWork( new Work() { - @Override - public void execute(Connection connection) throws SQLException { - Statement statement = connection.createStatement(); - try { - statement.executeUpdate( "SET @a='test'" ); - } - finally { - statement.close(); - } - } - } ); - Object[] result = (Object[]) session.createNativeQuery( "SELECT @a, (@a::=20) FROM dual" ).uniqueResult(); - assertEquals("test", result[0]); - assertEquals(20, ((Number) result[1]).intValue()); - - s.getTransaction().commit(); - } - finally { - s.close(); - } - } - -} - diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/ExtraStateTest.java b/hibernate-core/src/test/java/org/hibernate/engine/spi/ExtraStateTest.java deleted file mode 100644 index 0410345683..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/ExtraStateTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ - -package org.hibernate.engine.spi; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.hibernate.Session; -import org.hibernate.internal.SessionImpl; - -import org.hibernate.testing.DialectChecks; -import org.hibernate.testing.RequiresDialectFeature; -import org.hibernate.testing.TestForIssue; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.junit.Test; - -/** - * Test for making sure that any set entity entry extra state is propagated from temporary to final entity entries. - * - * @author Gunnar Morling - */ -@RequiresDialectFeature( value = DialectChecks.SupportsIdentityColumns.class, jiraKey = "HHH-9918") -public class ExtraStateTest extends BaseCoreFunctionalTestCase { - - /** - * Storing it as a field so it can be accessed from the entity setter. - */ - private Session session; - - @Test - @TestForIssue(jiraKey = "HHH-9451") - public void shouldMaintainExtraStateWhenUsingIdentityIdGenerationStrategy() { - session = openSession(); - session.getTransaction().begin(); - - ChineseTakeawayRestaurant mrKim = new ChineseTakeawayRestaurant(); - mrKim.setGobelinStars( 3 ); - - // As a side-effect, the id setter will populate the test extra state - session.persist( mrKim ); - - session.getTransaction().commit(); - - TestExtraState extraState = getEntityEntry( mrKim ).getExtraState( TestExtraState.class ); - assertNotNull( "Test extra state was not propagated from temporary to final entity entry", extraState ); - assertEquals( 311, extraState.getValue() ); - - session.close(); - } - - private EntityEntry getEntityEntry(Object object) { - return ( (SessionImpl) session ).getPersistenceContext().getEntry( object ); - } - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { ChineseTakeawayRestaurant.class }; - } - - @Entity - @Table(name = "ChineseTakeawayRestaurant") - public class ChineseTakeawayRestaurant { - - private long id; - private int gobelinStars; - - public ChineseTakeawayRestaurant() { - } - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - public long getId() { - return id; - } - - /** - * Sets the test extra state as a side effect - */ - public void setId(long id) { - getEntityEntry( this ).addExtraState( new TestExtraState( 311 ) ); - this.id = id; - } - - public int getGobelinStars() { - return gobelinStars; - } - - public void setGobelinStars(int gobelinStars) { - this.gobelinStars = gobelinStars; - } - } - - private static class TestExtraState implements EntityEntryExtraState { - - private final long value; - - public TestExtraState(long value) { - this.value = value; - } - - public long getValue() { - return value; - } - - @Override - public void addExtraState(EntityEntryExtraState extraState) { - throw new UnsupportedOperationException(); - } - - @Override - public T getExtraState(Class extraStateType) { - throw new UnsupportedOperationException(); - } - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/NonSortedExecutableListTest.java b/hibernate-core/src/test/java/org/hibernate/engine/spi/NonSortedExecutableListTest.java deleted file mode 100644 index a20ff803eb..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/NonSortedExecutableListTest.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.engine.spi; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Iterator; -import java.util.Set; - -import org.hibernate.HibernateException; -import org.hibernate.action.spi.AfterTransactionCompletionProcess; -import org.hibernate.action.spi.BeforeTransactionCompletionProcess; -import org.hibernate.action.spi.Executable; - -import org.hibernate.testing.junit4.BaseUnitTestCase; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author Anton Marsden - * @author Gail Badner - */ -public class NonSortedExecutableListTest extends BaseUnitTestCase { - - // For testing, we need an Executable that is also Comparable and Serializable - private static class AnExecutable implements Executable, Comparable, Serializable { - - private final int n; - private Serializable[] spaces; - private transient boolean afterDeserializeCalled; - - public AnExecutable(int n, String... spaces) { - this.n = n; - this.spaces = spaces; - } - - @Override - public int compareTo(Object o) { - return new Integer(n).compareTo( new Integer(( (AnExecutable) o ).n )); - } - - @Override - public int hashCode() { - return n; - } - - @Override - public boolean equals(Object obj) { - if ( this == obj ) - return true; - if ( obj == null ) - return false; - AnExecutable other = (AnExecutable) obj; - return n == other.n; - } - - @Override - public Serializable[] getPropertySpaces() { - return spaces; - } - - @Override - public void beforeExecutions() throws HibernateException { - } - - @Override - public void execute() throws HibernateException { - } - - @Override - public AfterTransactionCompletionProcess getAfterTransactionCompletionProcess() { - return null; - } - - @Override - public BeforeTransactionCompletionProcess getBeforeTransactionCompletionProcess() { - return null; - } - - @Override - public void afterDeserialize(SharedSessionContractImplementor session) { - this.afterDeserializeCalled = true; - } - - public String toString() { - return String.valueOf(n); - } - - } - - private ExecutableList l; - - private AnExecutable action1 = new AnExecutable( 0, "a" ); - private AnExecutable action2 = new AnExecutable( 1, "b", "c" ); - private AnExecutable action3 = new AnExecutable( 2, "b", "d" ); - private AnExecutable action4 = new AnExecutable( 3 ); - - @Before - public void setUp() { - // false indicates sorting is not required. - l = new ExecutableList( false ); - } - - @After - public void tearDown() { - l = null; - } - - @Test - public void testAdd() { - Assert.assertEquals( 0, l.size() ); - l.add( action1 ); - Assert.assertEquals( action1, l.get( 0 ) ); - Assert.assertEquals( 1, l.size() ); - l.add( action2 ); - Assert.assertEquals( action2, l.get( 1 ) ); - l.add( action3 ); - Assert.assertEquals( action3, l.get( 2 ) ); - Assert.assertEquals( 3, l.size() ); - } - - @Test - public void testClear() { - Assert.assertTrue( l.isEmpty() ); - l.add( action1 ); - Assert.assertFalse( l.isEmpty() ); - l.add( action2 ); - l.clear(); - Assert.assertTrue( l.isEmpty() ); - Assert.assertEquals( 0, l.size() ); - } - - @Test - public void testIterator() { - l.add( action1 ); - l.add( action2 ); - l.add( action3 ); - Iterator iterator = l.iterator(); - Assert.assertEquals(action1, iterator.next()); - Assert.assertEquals(action2, iterator.next()); - Assert.assertEquals(action3, iterator.next()); - Assert.assertFalse(iterator.hasNext()); - } - - @Test - public void testRemoveLastN() { - l.add( action1 ); - l.add( action2 ); - l.add( action3 ); - l.removeLastN( 0 ); - Assert.assertEquals( 3, l.size() ); - l.removeLastN( 2 ); - Assert.assertEquals( 1, l.size() ); - Assert.assertEquals( action1, l.get( 0 ) ); - } - - @Test - public void testGetSpaces() { - l.add( action1 ); - Set ss = l.getQuerySpaces(); - Assert.assertEquals( 1, ss.size() ); - Assert.assertTrue( ss.contains( "a" ) ); - l.add( action2 ); - l.add( action3 ); - l.add( action4 ); - Set ss2 = l.getQuerySpaces(); - Assert.assertEquals( 4, ss2.size() ); - Assert.assertTrue( ss2.contains( "a" ) ); - Assert.assertTrue( ss2.contains( "b" ) ); - Assert.assertTrue( ss2.contains( "c" ) ); - Assert.assertTrue( ss2.contains( "d" ) ); - Assert.assertTrue( ss == ss2 ); // same Set (cached) - // now remove action4 - l.remove( 3 ); - ss2 = l.getQuerySpaces(); - Assert.assertTrue( ss == ss2 ); // same Set (action4 has no spaces) - Assert.assertEquals( 4, ss2.size() ); - l.remove( 2 ); - ss2 = l.getQuerySpaces(); - Assert.assertTrue( ss != ss2 ); // Different Set because it has been rebuilt. This would be incorrect if - // Set.clear() was used - } - - @Test - public void testSort() { - l.add( action4 ); - l.add( action3 ); - l.add( action2 ); - l.add( action1 ); - // sort should have no affect - l.sort(); - Assert.assertEquals( action4, l.get( 0 ) ); - Assert.assertEquals( action3, l.get( 1 ) ); - Assert.assertEquals( action2, l.get( 2 ) ); - Assert.assertEquals( action1, l.get( 3 ) ); - } - - @Test - public void testSerializeDeserialize() throws IOException, ClassNotFoundException { - l.add( action4 ); - l.add( action3 ); - l.add( action2 ); - l.add( action1 ); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream( baos ); - l.writeExternal( oos ); - // this OOS stream needs to be flushed... - oos.flush(); - ByteArrayInputStream bin = new ByteArrayInputStream( baos.toByteArray() ); - ObjectInputStream ois = new ObjectInputStream( bin ); - l = new ExecutableList( false ); - l.readExternal( ois ); - - Assert.assertEquals( 4, l.size() ); - Assert.assertEquals( action4, l.get( 0 ) ); - Assert.assertEquals( action3, l.get( 1 ) ); - Assert.assertEquals( action2, l.get( 2 ) ); - Assert.assertEquals( action1, l.get( 3 ) ); - - Assert.assertFalse( l.get( 0 ).afterDeserializeCalled ); - Assert.assertFalse( l.get( 1 ).afterDeserializeCalled ); - Assert.assertFalse( l.get( 2 ).afterDeserializeCalled ); - Assert.assertFalse( l.get( 3 ).afterDeserializeCalled ); - - l.afterDeserialize( null ); - - Assert.assertTrue( l.get( 0 ).afterDeserializeCalled ); - Assert.assertTrue( l.get( 1 ).afterDeserializeCalled ); - Assert.assertTrue( l.get( 2 ).afterDeserializeCalled ); - Assert.assertTrue( l.get( 3 ).afterDeserializeCalled ); - - Assert.assertEquals( action4, l.get( 0 ) ); - Assert.assertEquals( action3, l.get( 1 ) ); - Assert.assertEquals( action2, l.get( 2 ) ); - Assert.assertEquals( action1, l.get( 3 ) ); - - // sort after deserializing; it should still have no affect - l.sort(); - Assert.assertEquals( action4, l.get( 0 ) ); - Assert.assertEquals( action3, l.get( 1 ) ); - Assert.assertEquals( action2, l.get( 2 ) ); - Assert.assertEquals( action1, l.get( 3 ) ); - } -} - diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/SortedExecutableListTest.java b/hibernate-core/src/test/java/org/hibernate/engine/spi/SortedExecutableListTest.java deleted file mode 100644 index c6cfdfe3ab..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/SortedExecutableListTest.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.engine.spi; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Iterator; -import java.util.Set; - -import org.hibernate.HibernateException; -import org.hibernate.action.spi.AfterTransactionCompletionProcess; -import org.hibernate.action.spi.BeforeTransactionCompletionProcess; -import org.hibernate.action.spi.Executable; - -import org.hibernate.testing.junit4.BaseUnitTestCase; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author Anton Marsden - */ -public class SortedExecutableListTest extends BaseUnitTestCase { - - // For testing, we need an Executable that is also Comparable and Serializable - private static class AnExecutable implements Executable, Comparable, Serializable { - - private final int n; - private Serializable[] spaces; - private transient boolean afterDeserializeCalled; - - public AnExecutable(int n, String... spaces) { - this.n = n; - this.spaces = spaces; - } - - @Override - public int compareTo(Object o) { - return new Integer(n).compareTo( new Integer(( (AnExecutable) o ).n )); - } - - @Override - public int hashCode() { - return n; - } - - @Override - public boolean equals(Object obj) { - if ( this == obj ) - return true; - if ( obj == null ) - return false; - AnExecutable other = (AnExecutable) obj; - return n == other.n; - } - - @Override - public Serializable[] getPropertySpaces() { - return spaces; - } - - @Override - public void beforeExecutions() throws HibernateException { - } - - @Override - public void execute() throws HibernateException { - } - - @Override - public AfterTransactionCompletionProcess getAfterTransactionCompletionProcess() { - return null; - } - - @Override - public BeforeTransactionCompletionProcess getBeforeTransactionCompletionProcess() { - return null; - } - - @Override - public void afterDeserialize(SharedSessionContractImplementor session) { - this.afterDeserializeCalled = true; - } - - public String toString() { - return String.valueOf(n); - } - - } - - private ExecutableList l; - - private AnExecutable action1 = new AnExecutable( 0, "a" ); - private AnExecutable action2 = new AnExecutable( 1, "b", "c" ); - private AnExecutable action3 = new AnExecutable( 2, "b", "d" ); - private AnExecutable action4 = new AnExecutable( 3 ); - - @Before - public void setUp() { - l = new ExecutableList(); - } - - @After - public void tearDown() { - l = null; - } - - @Test - public void testAdd() { - Assert.assertEquals( 0, l.size() ); - l.add( action1 ); - Assert.assertEquals( action1, l.get( 0 ) ); - Assert.assertEquals( 1, l.size() ); - l.add( action2 ); - Assert.assertEquals( action2, l.get( 1 ) ); - l.add( action3 ); - Assert.assertEquals( action3, l.get( 2 ) ); - Assert.assertEquals( 3, l.size() ); - } - - @Test - public void testClear() { - Assert.assertTrue( l.isEmpty() ); - l.add( action1 ); - Assert.assertFalse( l.isEmpty() ); - l.add( action2 ); - l.clear(); - Assert.assertTrue( l.isEmpty() ); - Assert.assertEquals( 0, l.size() ); - } - - @Test - public void testIterator() { - l.add( action1 ); - l.add( action2 ); - l.add( action3 ); - Iterator iterator = l.iterator(); - Assert.assertEquals(action1, iterator.next()); - Assert.assertEquals(action2, iterator.next()); - Assert.assertEquals(action3, iterator.next()); - Assert.assertFalse(iterator.hasNext()); - } - - @Test - public void testRemoveLastN() { - l.add( action1 ); - l.add( action2 ); - l.add( action3 ); - l.removeLastN( 0 ); - Assert.assertEquals( 3, l.size() ); - l.removeLastN( 2 ); - Assert.assertEquals( 1, l.size() ); - Assert.assertEquals( action1, l.get( 0 ) ); - } - - @Test - public void testGetSpaces() { - l.add( action1 ); - Set ss = l.getQuerySpaces(); - Assert.assertEquals( 1, ss.size() ); - Assert.assertTrue( ss.contains( "a" ) ); - l.add( action2 ); - l.add( action3 ); - l.add( action4 ); - Set ss2 = l.getQuerySpaces(); - Assert.assertEquals( 4, ss2.size() ); - Assert.assertTrue( ss2.contains( "a" ) ); - Assert.assertTrue( ss2.contains( "b" ) ); - Assert.assertTrue( ss2.contains( "c" ) ); - Assert.assertTrue( ss2.contains( "d" ) ); - Assert.assertTrue( ss == ss2 ); // same Set (cached) - // now remove action4 - l.remove( 3 ); - ss2 = l.getQuerySpaces(); - Assert.assertTrue( ss == ss2 ); // same Set (action4 has no spaces) - Assert.assertEquals( 4, ss2.size() ); - l.remove( 2 ); - ss2 = l.getQuerySpaces(); - Assert.assertTrue( ss != ss2 ); // Different Set because it has been rebuilt. This would be incorrect if - // Set.clear() was used - } - - @Test - public void testSort() { - l.add( action4 ); - l.add( action3 ); - l.add( action2 ); - l.add( action1 ); - l.sort(); - Assert.assertEquals( action1, l.get( 0 ) ); - Assert.assertEquals( action2, l.get( 1 ) ); - Assert.assertEquals( action3, l.get( 2 ) ); - Assert.assertEquals( action4, l.get( 3 ) ); - } - - @Test - public void testSerializeDeserialize() throws IOException, ClassNotFoundException { - l.add( action4 ); - l.add( action3 ); - l.add( action2 ); - l.add( action1 ); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream( baos ); - l.writeExternal( oos ); - // this OOS stream needs to be flushed... - oos.flush(); - ByteArrayInputStream bin = new ByteArrayInputStream( baos.toByteArray() ); - ObjectInputStream ois = new ObjectInputStream( bin ); - l = new ExecutableList(); - l.readExternal( ois ); - - Assert.assertEquals( 4, l.size() ); - Assert.assertEquals( action4, l.get( 0 ) ); - Assert.assertEquals( action3, l.get( 1 ) ); - Assert.assertEquals( action2, l.get( 2 ) ); - Assert.assertEquals( action1, l.get( 3 ) ); - - Assert.assertFalse(l.get(0).afterDeserializeCalled); - Assert.assertFalse(l.get(1).afterDeserializeCalled); - Assert.assertFalse(l.get(2).afterDeserializeCalled); - Assert.assertFalse( l.get( 3 ).afterDeserializeCalled ); - - l.afterDeserialize( null ); - - Assert.assertTrue( l.get( 0 ).afterDeserializeCalled ); - Assert.assertTrue( l.get( 1 ).afterDeserializeCalled ); - Assert.assertTrue( l.get( 2 ).afterDeserializeCalled ); - Assert.assertTrue( l.get( 3 ).afterDeserializeCalled ); - - Assert.assertEquals( action4, l.get( 0 ) ); - Assert.assertEquals( action3, l.get( 1 ) ); - Assert.assertEquals( action2, l.get( 2 ) ); - Assert.assertEquals( action1, l.get( 3 ) ); - - // sort after deserializing - l.sort(); - Assert.assertEquals( action1, l.get( 0 ) ); - Assert.assertEquals( action2, l.get( 1 ) ); - Assert.assertEquals( action3, l.get( 2 ) ); - Assert.assertEquals( action4, l.get( 3 ) ); - } -} - diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/SessionDelegatorBaseImplTest.java b/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/SessionDelegatorBaseImplTest.java deleted file mode 100644 index 800762a932..0000000000 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/SessionDelegatorBaseImplTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later - * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html - */ -package org.hibernate.engine.spi.delegation; - -import java.sql.SQLException; -import java.sql.Statement; - -import org.hibernate.dialect.H2Dialect; -import org.hibernate.engine.spi.SessionDelegatorBaseImpl; - -import org.hibernate.testing.RequiresDialect; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * @author Andrea Boriero - */ -@RequiresDialect(H2Dialect.class) -public class SessionDelegatorBaseImplTest extends BaseCoreFunctionalTestCase { - - @Before - public void init() { - inTransaction( session -> { - session.doWork( connection -> { - try (Statement statement = connection.createStatement()) { - statement.executeUpdate( "DROP ALIAS findOneUser IF EXISTS" ); - statement.executeUpdate( - "CREATE ALIAS findOneUser AS $$\n" + - "import org.h2.tools.SimpleResultSet;\n" + - "import java.sql.*;\n" + - "@CODE\n" + - "ResultSet findOneUser() {\n" + - " SimpleResultSet rs = new SimpleResultSet();\n" + - " rs.addColumn(\"ID\", Types.INTEGER, 10, 0);\n" + - " rs.addColumn(\"NAME\", Types.VARCHAR, 255, 0);\n" + - " rs.addRow(1, \"Steve\");\n" + - " return rs;\n" + - "}\n" + - "$$" - ); - } - } ); - } ); - } - - @After - public void tearDown() { - inTransaction( session -> { - session.doWork( connection -> { - try (Statement statement = connection.createStatement()) { - statement.executeUpdate( "DROP ALIAS findOneUser IF EXISTS" ); - } - catch (SQLException e) { - //Do not ignore as failure to cleanup might lead to other tests to fail: - throw new RuntimeException( e ); - } - } ); - } ); - } - - @Test - public void testcreateStoredProcedureQuery() { - inTransaction( - session -> { - SessionDelegatorBaseImpl delegator = new SessionDelegatorBaseImpl( session ); - delegator.createStoredProcedureQuery( "findOneUser" ); - } - ); - } -} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/SessionDelegatorBaseImplTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/SessionDelegatorBaseImplTest.java new file mode 100644 index 0000000000..699d3b0e14 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/SessionDelegatorBaseImplTest.java @@ -0,0 +1,84 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.delegation; + +import java.sql.SQLException; +import java.sql.Statement; + +import org.hibernate.dialect.H2Dialect; +import org.hibernate.engine.spi.SessionDelegatorBaseImpl; + +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * @author Andrea Boriero + */ +@RequiresDialect(H2Dialect.class) +@DomainModel +@SessionFactory +public class SessionDelegatorBaseImplTest { + + @BeforeEach + public void init(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> session.doWork( + (connection) -> { + try ( Statement statement = connection.createStatement() ) { + statement.executeUpdate( "DROP ALIAS findOneUser IF EXISTS" ); + statement.executeUpdate( + "CREATE ALIAS findOneUser AS $$\n" + + "import org.h2.tools.SimpleResultSet;\n" + + "import java.sql.*;\n" + + "@CODE\n" + + "ResultSet findOneUser() {\n" + + " SimpleResultSet rs = new SimpleResultSet();\n" + + " rs.addColumn(\"ID\", Types.INTEGER, 10, 0);\n" + + " rs.addColumn(\"NAME\", Types.VARCHAR, 255, 0);\n" + + " rs.addRow(1, \"Steve\");\n" + + " return rs;\n" + + "}\n" + + "$$" + ); + } + } + ) + ); + } + + @AfterEach + public void tearDown(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> session.doWork( + (connection) -> { + try (Statement statement = connection.createStatement()) { + statement.executeUpdate( "DROP ALIAS findOneUser IF EXISTS" ); + } + catch (SQLException e) { + //Do not ignore as failure to cleanup might lead to other tests to fail: + throw new RuntimeException( e ); + } + } + ) + ); + } + + @Test + public void testCreateStoredProcedureQuery(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + SessionDelegatorBaseImpl delegator = new SessionDelegatorBaseImpl( session ); + delegator.createStoredProcedureQuery( "findOneUser" ); + } + ); + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSessionBuilder.java b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSessionBuilder.java similarity index 69% rename from hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSessionBuilder.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSessionBuilder.java index aec61f8ed2..b601c5dbf0 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSessionBuilder.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSessionBuilder.java @@ -1,10 +1,10 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html */ -package org.hibernate.engine.spi.delegation; +package org.hibernate.orm.test.delegation; import org.hibernate.SessionBuilder; import org.hibernate.engine.spi.AbstractDelegatingSessionBuilder; @@ -13,8 +13,12 @@ import org.hibernate.engine.spi.AbstractDelegatingSessionBuilder; * If this class does not compile anymore due to unimplemented methods, you should probably add the corresponding * methods to the parent class. * + * NOTE: Do not remove!!! Used to verify that delegating SessionBuilder impls compile (aka, validates binary + * compatibility against previous versions) + * * @author Guillaume Smet */ +@SuppressWarnings("unused") public class TestDelegatingSessionBuilder extends AbstractDelegatingSessionBuilder { @SuppressWarnings("rawtypes") diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSessionBuilderImplementor.java b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSessionBuilderImplementor.java similarity index 71% rename from hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSessionBuilderImplementor.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSessionBuilderImplementor.java index 93ba8875db..c0e8da3f8b 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSessionBuilderImplementor.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSessionBuilderImplementor.java @@ -1,10 +1,10 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html */ -package org.hibernate.engine.spi.delegation; +package org.hibernate.orm.test.delegation; import org.hibernate.engine.spi.AbstractDelegatingSessionBuilderImplementor; import org.hibernate.engine.spi.SessionBuilderImplementor; @@ -13,8 +13,12 @@ import org.hibernate.engine.spi.SessionBuilderImplementor; * If this class does not compile anymore due to unimplemented methods, you should probably add the corresponding * methods to the parent class. * + * NOTE: Do not remove!!! Used to verify that delegating SessionBuilder impls compile (aka, validates binary + * compatibility against previous versions) + * * @author Guillaume Smet */ +@SuppressWarnings("unused") public class TestDelegatingSessionBuilderImplementor extends AbstractDelegatingSessionBuilderImplementor { public TestDelegatingSessionBuilderImplementor(SessionBuilderImplementor delegate) { diff --git a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSharedSessionBuilder.java b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSharedSessionBuilder.java similarity index 70% rename from hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSharedSessionBuilder.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSharedSessionBuilder.java index f66c1b67b5..c97bed6192 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/spi/delegation/TestDelegatingSharedSessionBuilder.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/TestDelegatingSharedSessionBuilder.java @@ -1,10 +1,10 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html */ -package org.hibernate.engine.spi.delegation; +package org.hibernate.orm.test.delegation; import org.hibernate.SharedSessionBuilder; import org.hibernate.engine.spi.AbstractDelegatingSharedSessionBuilder; @@ -14,8 +14,12 @@ import org.hibernate.engine.spi.AbstractDelegatingSharedSessionBuilder; * If this class does not compile anymore due to unimplemented methods, you should probably add the corresponding * methods to the parent class. * + * NOTE: Do not remove!!! Used to verify that delegating SessionBuilder impls compile (aka, validates binary + * compatibility against previous versions) + * * @author Guillaume Smet */ +@SuppressWarnings("unused") public class TestDelegatingSharedSessionBuilder extends AbstractDelegatingSharedSessionBuilder { @SuppressWarnings("rawtypes") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/package-info.java b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/package-info.java new file mode 100644 index 0000000000..2e74f72531 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/delegation/package-info.java @@ -0,0 +1,11 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ + +/** + * Tests for various delegations used by non-ORM Hibernate projects + */ +package org.hibernate.orm.test.delegation; \ No newline at end of file diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/StandardDialectResolverTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/StandardDialectResolverTest.java new file mode 100644 index 0000000000..812a6a1b01 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/StandardDialectResolverTest.java @@ -0,0 +1,197 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.dialect.resolver; + +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.MariaDBDialect; +import org.hibernate.dialect.MySQLDialect; +import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.SQLServerDialect; +import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; +import org.hibernate.orm.test.dialect.resolver.TestingDialectResolutionInfo; + +import org.hibernate.testing.junit4.BaseUnitTestCase; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Unit test of the {@link StandardDialectResolver} class. + * + * @author Bryan Turner + */ +public class StandardDialectResolverTest extends BaseUnitTestCase { + + @Test + public void testResolveDialectInternalForSQLServer2000() { + runSQLServerDialectTest( 8 ); + } + + @Test + public void testResolveDialectInternalForSQLServer2005() { + runSQLServerDialectTest( 9 ); + } + + @Test + public void testResolveDialectInternalForSQLServer2008() { + runSQLServerDialectTest( 10 ); + } + + @Test + public void testResolveDialectInternalForSQLServer2012() { + runSQLServerDialectTest( 11 ); + } + + @Test + public void testResolveDialectInternalForSQLServer2014() { + runSQLServerDialectTest( 12 ); + } + + @Test + public void testResolveDialectInternalForUnknownSQLServerVersion() { + runSQLServerDialectTest( 7 ); + } + + @Test + public void testResolveDialectInternalForPostgres81() { + runPostgresDialectTest( 8, 1 ); + } + + @Test + public void testResolveDialectInternalForPostgres82() { + runPostgresDialectTest( 8, 2 ); + } + + @Test + public void testResolveDialectInternalForPostgres83() { + runPostgresDialectTest( 8, 3 ); + } + + @Test + public void testResolveDialectInternalForPostgres84() { + runPostgresDialectTest( 8, 4 ); + } + + @Test + public void testResolveDialectInternalForPostgres9() { + runPostgresDialectTest( 9, 0 ); + } + + @Test + public void testResolveDialectInternalForPostgres91() { + runPostgresDialectTest( 9, 1 ); + } + + @Test + public void testResolveDialectInternalForPostgres92() { + runPostgresDialectTest( 9, 2 ); + } + + @Test + public void testResolveDialectInternalForMariaDB103() { + runMariaDBDialectTest( 10, 3 ); + } + + @Test + public void testResolveDialectInternalForMariaDB102() { + runMariaDBDialectTest( 10, 2 ); + } + + @Test + public void testResolveDialectInternalForMariaDB101() { + runMariaDBDialectTest( 10, 1 ); + } + + @Test + public void testResolveDialectInternalForMariaDB100() { + runMariaDBDialectTest( 10, 0 ); + } + + @Test + public void testResolveDialectInternalForMariaDB55() { + runMariaDBDialectTest( 5, 5 ); + } + + @Test + public void testResolveDialectInternalForMariaDB52() { + runMariaDBDialectTest( 5, 2 ); + } + + @Test + public void testResolveDialectInternalForMySQL57() { + runMySQLDialectTest( 5, 7 ); + } + + @Test + public void testResolveDialectInternalForMySQL6() { + runMySQLDialectTest( 6, 0 ); + } + + @Test + public void testResolveDialectInternalForMySQL7() { + runMySQLDialectTest( 7, 0 ); + } + + + @Test + public void testResolveDialectInternalForMySQL8() { + runMySQLDialectTest( 8, 0 ); + } + + private static void runMariaDBDialectTest(int majorVersion, int minorVersion) { + runDialectTest( "MariaDB", "MariaDB connector/J", majorVersion, minorVersion, MariaDBDialect.class ); + } + + private static void runMySQLDialectTest(int majorVersion, int minorVersion) { + runDialectTest( "MySQL", "MySQL connector/J", majorVersion, minorVersion, MySQLDialect.class ); + } + + private static void runSQLServerDialectTest(int version) { + runDialectTest( "Microsoft SQL Server", version, 0, SQLServerDialect.class ); + } + + private static void runPostgresDialectTest( + int majorVersion, + int minorVersion) { + runDialectTest( "PostgreSQL", majorVersion, minorVersion, PostgreSQLDialect.class ); + } + + private static void runDialectTest( + String productName, + int majorVersion, + int minorVersion, + Class expectedDialect) { + runDialectTest( productName, null, majorVersion, minorVersion, expectedDialect ); + } + + private static void runDialectTest( + String productName, + String driverName, + int majorVersion, + int minorVersion, + Class expectedDialect) { + TestingDialectResolutionInfo info = TestingDialectResolutionInfo.forDatabaseInfo( productName, driverName, majorVersion, minorVersion ); + + Dialect dialect = new StandardDialectResolver().resolveDialect( info ); + + StringBuilder builder = new StringBuilder( productName ).append( " " ) + .append( majorVersion ); + if ( minorVersion > 0 ) { + builder.append( "." ).append( minorVersion ); + } + String dbms = builder.toString(); + + assertNotNull( "Dialect for " + dbms + " should not be null", dialect ); + // Make sure to test that the actual dialect class is as expected + // (not just an instance of the expected dialect. + assertEquals( "Dialect for " + dbms + " should be " + expectedDialect.getSimpleName(), + expectedDialect, + dialect.getClass() + ); + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/NonSortedExecutableListTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/NonSortedExecutableListTest.java new file mode 100644 index 0000000000..903f5e0489 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/NonSortedExecutableListTest.java @@ -0,0 +1,305 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.engine.action; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.Iterator; +import java.util.Set; + +import org.hibernate.HibernateException; +import org.hibernate.action.spi.AfterTransactionCompletionProcess; +import org.hibernate.action.spi.BeforeTransactionCompletionProcess; +import org.hibernate.action.spi.Executable; +import org.hibernate.engine.spi.ExecutableList; +import org.hibernate.engine.spi.SharedSessionContractImplementor; + +import org.hibernate.testing.orm.junit.BaseUnitTest; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Anton Marsden + * @author Gail Badner + */ +@BaseUnitTest +public class NonSortedExecutableListTest { + + // For testing, we need an Executable that is also Comparable and Serializable + private static class AnExecutable implements Executable, Comparable, Serializable { + + private final int n; + private final Serializable[] spaces; + + private transient boolean afterDeserializeCalled; + + public AnExecutable(int n, String... spaces) { + this.n = n; + this.spaces = spaces; + } + + public boolean wasAfterDeserializeCalled() { + return afterDeserializeCalled; + } + + @Override + public int compareTo(AnExecutable o) { + return Integer.compare( n, o.n ); + } + + @Override + public int hashCode() { + return n; + } + + @Override + public boolean equals(Object obj) { + if ( this == obj ) + return true; + if ( obj == null ) + return false; + AnExecutable other = (AnExecutable) obj; + return n == other.n; + } + + @Override + public Serializable[] getPropertySpaces() { + return spaces; + } + + @Override + public void beforeExecutions() throws HibernateException { + } + + @Override + public void execute() throws HibernateException { + } + + @Override + public AfterTransactionCompletionProcess getAfterTransactionCompletionProcess() { + return null; + } + + @Override + public BeforeTransactionCompletionProcess getBeforeTransactionCompletionProcess() { + return null; + } + + @Override + public void afterDeserialize(SharedSessionContractImplementor session) { + this.afterDeserializeCalled = true; + } + + public String toString() { + return String.valueOf(n); + } + + } + + private ExecutableList actionList; + + private final AnExecutable action1 = new AnExecutable( 0, "a" ); + private final AnExecutable action2 = new AnExecutable( 1, "b", "c" ); + private final AnExecutable action3 = new AnExecutable( 2, "b", "d" ); + private final AnExecutable action4 = new AnExecutable( 3 ); + + @BeforeEach + public void setUp() { + // false indicates sorting is not required. + actionList = new ExecutableList<>( false ); + } + + @AfterEach + public void tearDown() { + actionList = null; + } + + @Test + public void testAdd() { + assertThat( actionList ).hasSize( 0 ); + + actionList.add( action1 ); + assertThat( actionList ).hasSize( 1 ); + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + + actionList.add( action2 ); + assertThat( actionList ).hasSize( 2 ); + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + assertThat( actionList ).element( 1 ).isSameAs( action2 ); + + actionList.add( action3 ); + assertThat( actionList ).hasSize( 3 ); + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + assertThat( actionList ).element( 1 ).isSameAs( action2 ); + assertThat( actionList ).element( 2 ).isSameAs( action3 ); + } + + @Test + public void testClear() { + assertThat( actionList ).hasSize( 0 ); + + actionList.add( action1 ); + assertThat( actionList ).hasSize( 1 ); + + actionList.add( action2 ); + assertThat( actionList ).hasSize( 2 ); + + actionList.clear(); + assertThat( actionList ).hasSize( 0 ); + } + + @Test + public void testIterator() { + actionList.add( action1 ); + actionList.add( action2 ); + actionList.add( action3 ); + + final Iterator iterator = actionList.iterator(); + assertThat( iterator.next() ).isEqualTo( action1 ); + assertThat( iterator.next() ).isEqualTo( action2 ); + assertThat( iterator.next() ).isEqualTo( action3 ); + assertThat( iterator.hasNext() ).isEqualTo( false ); + } + + @Test + public void testRemoveLastN() { + actionList.add( action1 ); + actionList.add( action2 ); + actionList.add( action3 ); + + actionList.removeLastN( 0 ); + assertThat( actionList ).hasSize( 3 ); + + actionList.removeLastN( 2 ); + assertThat( actionList ).hasSize( 1 ); + assertThat( actionList ).element( 0 ).isEqualTo( action1 ); + } + + @Test + public void testGetSpaces() { + actionList.add( action1 ); + final Set initialSpaces = actionList.getQuerySpaces(); + + { + assertThat( initialSpaces ).hasSize( 1 ); + assertThat( initialSpaces ).containsOnly( "a" ); + } + + actionList.add( action2 ); + actionList.add( action3 ); + actionList.add( action4 ); + + { + final Set spaces = actionList.getQuerySpaces(); + // same Set (cached) + assertThat( spaces ).isSameAs( initialSpaces ); + assertThat( spaces ).hasSize( 4 ); + assertThat( spaces ).containsOnly( "a", "b", "c", "d" ); + } + + // now remove action4 + actionList.remove( 3 ); + + { + final Set spaces = actionList.getQuerySpaces(); + // same Set (cached) + assertThat( spaces ).isSameAs( initialSpaces ); + assertThat( spaces ).hasSize( 4 ); + } + + actionList.remove( 2 ); + + { + final Set spaces = actionList.getQuerySpaces(); + // Different Set because it has been rebuilt. This would be incorrect if + // Set.clear() was used + assertThat( spaces ).isNotSameAs( initialSpaces ); + } + } + + @Test + public void testSort() { + actionList.add( action4 ); + actionList.add( action3 ); + actionList.add( action2 ); + actionList.add( action1 ); + + assertThat( actionList ).element( 0 ).isSameAs( action4 ); + assertThat( actionList ).element( 1 ).isSameAs( action3 ); + assertThat( actionList ).element( 2 ).isSameAs( action2 ); + assertThat( actionList ).element( 3 ).isSameAs( action1 ); + + // sort should have no affect + actionList.sort(); + + assertThat( actionList ).element( 0 ).isSameAs( action4 ); + assertThat( actionList ).element( 1 ).isSameAs( action3 ); + assertThat( actionList ).element( 2 ).isSameAs( action2 ); + assertThat( actionList ).element( 3 ).isSameAs( action1 ); + } + + @Test + public void testSerializeDeserialize() throws IOException, ClassNotFoundException { + actionList.add( action4 ); + actionList.add( action3 ); + actionList.add( action2 ); + actionList.add( action1 ); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream( baos ); + actionList.writeExternal( oos ); + oos.flush(); + + final ByteArrayInputStream bin = new ByteArrayInputStream( baos.toByteArray() ); + final ObjectInputStream ois = new ObjectInputStream( bin ); + + actionList = new ExecutableList<>( false ); + actionList.readExternal( ois ); + + assertThat( actionList ).hasSize( 4 ); + assertThat( actionList ).element( 0 ).isEqualTo( action4 ); + assertThat( actionList ).element( 1 ).isEqualTo( action3 ); + assertThat( actionList ).element( 2 ).isEqualTo( action2 ); + assertThat( actionList ).element( 3 ).isEqualTo( action1 ); + assertThat( actionList ).element( 0 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + assertThat( actionList ).element( 1 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + assertThat( actionList ).element( 2 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + assertThat( actionList ).element( 3 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + + actionList.afterDeserialize( null ); + + assertThat( actionList ).hasSize( 4 ); + assertThat( actionList ).element( 0 ).isEqualTo( action4 ); + assertThat( actionList ).element( 1 ).isEqualTo( action3 ); + assertThat( actionList ).element( 2 ).isEqualTo( action2 ); + assertThat( actionList ).element( 3 ).isEqualTo( action1 ); + assertThat( actionList ).element( 0 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 1 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 2 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 3 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + + // sort after deserializing; it should still have no affect + actionList.sort(); + assertThat( actionList ).hasSize( 4 ); + assertThat( actionList ).element( 0 ).isEqualTo( action4 ); + assertThat( actionList ).element( 1 ).isEqualTo( action3 ); + assertThat( actionList ).element( 2 ).isEqualTo( action2 ); + assertThat( actionList ).element( 3 ).isEqualTo( action1 ); + assertThat( actionList ).element( 0 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 1 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 2 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 3 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + } +} + diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/SortedExecutableListTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/SortedExecutableListTest.java new file mode 100644 index 0000000000..f6105c6684 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/SortedExecutableListTest.java @@ -0,0 +1,290 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.engine.action; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.Iterator; +import java.util.Set; + +import org.hibernate.HibernateException; +import org.hibernate.action.spi.AfterTransactionCompletionProcess; +import org.hibernate.action.spi.BeforeTransactionCompletionProcess; +import org.hibernate.action.spi.Executable; +import org.hibernate.engine.spi.ExecutableList; +import org.hibernate.engine.spi.SharedSessionContractImplementor; + +import org.hibernate.testing.orm.junit.BaseUnitTest; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Anton Marsden + */ +@BaseUnitTest +public class SortedExecutableListTest { + + // For testing, we need an Executable that is also Comparable and Serializable + private static class AnExecutable implements Executable, Comparable, Serializable { + + private final int n; + private Serializable[] spaces; + private transient boolean afterDeserializeCalled; + + public AnExecutable(int n, String... spaces) { + this.n = n; + this.spaces = spaces; + } + + public boolean wasAfterDeserializeCalled() { + return afterDeserializeCalled; + } + + @Override + public int compareTo(AnExecutable o) { + return Integer.compare( n, o.n ); + } + + @Override + public int hashCode() { + return n; + } + + @Override + public boolean equals(Object obj) { + if ( this == obj ) + return true; + if ( obj == null ) + return false; + AnExecutable other = (AnExecutable) obj; + return n == other.n; + } + + @Override + public Serializable[] getPropertySpaces() { + return spaces; + } + + @Override + public void beforeExecutions() throws HibernateException { + } + + @Override + public void execute() throws HibernateException { + } + + @Override + public AfterTransactionCompletionProcess getAfterTransactionCompletionProcess() { + return null; + } + + @Override + public BeforeTransactionCompletionProcess getBeforeTransactionCompletionProcess() { + return null; + } + + @Override + public void afterDeserialize(SharedSessionContractImplementor session) { + this.afterDeserializeCalled = true; + } + + public String toString() { + return String.valueOf(n); + } + + } + + private ExecutableList actionList; + + private final AnExecutable action1 = new AnExecutable( 0, "a" ); + private final AnExecutable action2 = new AnExecutable( 1, "b", "c" ); + private final AnExecutable action3 = new AnExecutable( 2, "b", "d" ); + private final AnExecutable action4 = new AnExecutable( 3 ); + + @BeforeEach + public void setUp() { + actionList = new ExecutableList<>(); + } + + @AfterEach + public void tearDown() { + actionList = null; + } + + @Test + public void testAdd() { + assertThat( actionList ).isEmpty(); + + actionList.add( action1 ); + assertThat( actionList ).hasSize( 1 ); + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + + actionList.add( action3 ); + assertThat( actionList ).hasSize( 2 ); + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + assertThat( actionList ).element( 1 ).isSameAs( action3 ); + } + + @Test + public void testClear() { + assertThat( actionList ).isEmpty(); + + actionList.add( action1 ); + assertThat( actionList ).hasSize( 1 ); + + actionList.add( action2 ); + assertThat( actionList ).hasSize( 2 ); + + actionList.clear(); + + assertThat( actionList ).isEmpty(); + } + + @Test + public void testIterator() { + actionList.add( action1 ); + actionList.add( action2 ); + actionList.add( action3 ); + + final Iterator iterator = actionList.iterator(); + assertThat( iterator.next() ).isEqualTo( action1 ); + assertThat( iterator.next() ).isEqualTo( action2 ); + assertThat( iterator.next() ).isEqualTo( action3 ); + assertThat( iterator.hasNext() ).isEqualTo( false ); + } + + @Test + public void testRemoveLastN() { + actionList.add( action1 ); + actionList.add( action2 ); + actionList.add( action3 ); + + assertThat( actionList ).hasSize( 3 ); + + actionList.removeLastN( 0 ); + assertThat( actionList ).hasSize( 3 ); + + actionList.removeLastN( 2 ); + assertThat( actionList ).hasSize( 1 ); + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + } + + @Test + public void testGetSpaces() { + actionList.add( action1 ); + + final Set initialQuerySpaces = actionList.getQuerySpaces(); + assertThat( initialQuerySpaces ).containsOnly( "a" ); + + actionList.add( action2 ); + actionList.add( action3 ); + actionList.add( action4 ); + + { + final Set spaces = actionList.getQuerySpaces(); + assertThat( spaces ).isSameAs( initialQuerySpaces ); + assertThat( spaces ).hasSize( 4 ); + assertThat( spaces ).containsOnly( "a", "b", "c", "d" ); + } + + // now remove action4 + actionList.remove( 3 ); + + { + final Set spaces = actionList.getQuerySpaces(); + // same Set (action4 has no spaces) + assertThat( spaces ).isSameAs( initialQuerySpaces ); + assertThat( spaces ).containsAll( initialQuerySpaces ); + assertThat( spaces ).hasSize( 4 ); + } + + actionList.remove( 2 ); + + { + final Set spaces = actionList.getQuerySpaces(); + // Different Set because it has been rebuilt. This would be incorrect if Set.clear() was used + assertThat( spaces ).isNotSameAs( initialQuerySpaces ); + assertThat( spaces ).hasSize( 3 ); + } + } + + @Test + public void testSort() { + actionList.add( action4 ); + actionList.add( action3 ); + actionList.add( action2 ); + actionList.add( action1 ); + + assertThat( actionList ).element( 0 ).isSameAs( action4 ); + assertThat( actionList ).element( 1 ).isSameAs( action3 ); + assertThat( actionList ).element( 2 ).isSameAs( action2 ); + assertThat( actionList ).element( 3 ).isSameAs( action1 ); + + actionList.sort(); + + assertThat( actionList ).element( 0 ).isSameAs( action1 ); + assertThat( actionList ).element( 1 ).isSameAs( action2 ); + assertThat( actionList ).element( 2 ).isSameAs( action3 ); + assertThat( actionList ).element( 3 ).isSameAs( action4 ); + } + + @Test + public void testSerializeDeserialize() throws IOException, ClassNotFoundException { + actionList.add( action4 ); + actionList.add( action3 ); + actionList.add( action2 ); + actionList.add( action1 ); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream( baos ); + actionList.writeExternal( oos ); + oos.flush(); + final ByteArrayInputStream bin = new ByteArrayInputStream( baos.toByteArray() ); + final ObjectInputStream ois = new ObjectInputStream( bin ); + actionList = new ExecutableList<>(); + actionList.readExternal( ois ); + + assertThat( actionList ).hasSize( 4 ); + assertThat( actionList ).element( 0 ).isEqualTo( action4 ); + assertThat( actionList ).element( 1 ).isEqualTo( action3 ); + assertThat( actionList ).element( 2 ).isEqualTo( action2 ); + assertThat( actionList ).element( 3 ).isEqualTo( action1 ); + + assertThat( actionList ).element( 0 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + assertThat( actionList ).element( 1 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + assertThat( actionList ).element( 2 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + assertThat( actionList ).element( 3 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( false ); + + actionList.afterDeserialize( null ); + + assertThat( actionList ).hasSize( 4 ); + assertThat( actionList ).element( 0 ).isEqualTo( action4 ); + assertThat( actionList ).element( 1 ).isEqualTo( action3 ); + assertThat( actionList ).element( 2 ).isEqualTo( action2 ); + assertThat( actionList ).element( 3 ).isEqualTo( action1 ); + + assertThat( actionList ).element( 0 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 1 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 2 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + assertThat( actionList ).element( 3 ).extracting( AnExecutable::wasAfterDeserializeCalled ).isEqualTo( true ); + + actionList.sort(); + + assertThat( actionList ).element( 0 ).isEqualTo( action1 ); + assertThat( actionList ).element( 1 ).isEqualTo( action2 ); + assertThat( actionList ).element( 2 ).isEqualTo( action3 ); + assertThat( actionList ).element( 3 ).isEqualTo( action4 ); + } +} + diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/package-info.java b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/package-info.java new file mode 100644 index 0000000000..66207fd43d --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/action/package-info.java @@ -0,0 +1,11 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ + +/** + * Tests related to Hibernate's ActionQueue + */ +package org.hibernate.orm.test.engine.action; \ No newline at end of file diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/engine/spi/ExtraStateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/spi/ExtraStateTest.java new file mode 100644 index 0000000000..2066025a6b --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/engine/spi/ExtraStateTest.java @@ -0,0 +1,131 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ + +package org.hibernate.orm.test.engine.spi; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.engine.spi.EntityEntry; +import org.hibernate.engine.spi.EntityEntryExtraState; +import org.hibernate.engine.spi.SessionImplementor; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.orm.junit.DialectFeatureChecks; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.RequiresDialectFeature; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +/** + * Test for making sure that any set entity entry extra state is propagated from temporary to final entity entries. + * + * @author Gunnar Morling + */ +@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsIdentityColumns.class, jiraKey = "HHH-9918") +@DomainModel( annotatedClasses = ExtraStateTest.ChineseTakeawayRestaurant.class ) +@SessionFactory +public class ExtraStateTest { + private SessionImplementor sessionRef; + + @Test + @TestForIssue(jiraKey = "HHH-9451") + public void shouldMaintainExtraStateWhenUsingIdentityIdGenerationStrategy(SessionFactoryScope scope) { + scope.inSession( + (nonTransactedSession) -> { + sessionRef = nonTransactedSession; + final ChineseTakeawayRestaurant persisted = scope.fromTransaction( + nonTransactedSession, + (session) -> { + ChineseTakeawayRestaurant mrKim = new ChineseTakeawayRestaurant(); + mrKim.setGobelinStars( 3 ); + + // As a side-effect, the id setter will populate the test extra state + session.persist( mrKim ); + + return mrKim; + } + ); + + TestExtraState extraState = getEntityEntry( persisted, nonTransactedSession ).getExtraState( TestExtraState.class ); + assertNotNull( extraState, "Test extra state was not propagated from temporary to final entity entry" ); + assertEquals( 311, extraState.getValue() ); + + sessionRef = null; + } + ); + } + + private EntityEntry getEntityEntry(Object object, SessionImplementor nonTransactedSession) { + return nonTransactedSession.getPersistenceContext().getEntry( object ); + } + + @SuppressWarnings("unused") + @Entity + @Table(name = "ChineseTakeawayRestaurant") + public class ChineseTakeawayRestaurant { + + private long id; + private int gobelinStars; + + public ChineseTakeawayRestaurant() { + } + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public long getId() { + return id; + } + + /** + * Sets the test extra state as a side effect + */ + public void setId(long id) { + getEntityEntry( this, sessionRef ).addExtraState( new TestExtraState( 311 ) ); + this.id = id; + } + + public int getGobelinStars() { + return gobelinStars; + } + + public void setGobelinStars(int gobelinStars) { + this.gobelinStars = gobelinStars; + } + } + + private static class TestExtraState implements EntityEntryExtraState { + + private final long value; + + public TestExtraState(long value) { + this.value = value; + } + + public long getValue() { + return value; + } + + @Override + public void addExtraState(EntityEntryExtraState extraState) { + throw new UnsupportedOperationException(); + } + + @Override + public T getExtraState(Class extraStateType) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/JdbcCoordinatorTest.java similarity index 91% rename from hibernate-core/src/test/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorTest.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/JdbcCoordinatorTest.java index 50a8334265..2bae173919 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/JdbcCoordinatorTest.java @@ -1,4 +1,10 @@ -package org.hibernate.engine.jdbc.internal; +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.jdbc; import java.lang.reflect.Field; import java.sql.Connection; @@ -9,6 +15,7 @@ import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.jdbc.batch.spi.Batch; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; +import org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.jdbc.spi.SqlExceptionHelper; import org.hibernate.resource.jdbc.spi.JdbcObserver; diff --git a/hibernate-core/src/test/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupportTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/refcursor/StandardRefCursorSupportTest.java similarity index 82% rename from hibernate-core/src/test/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupportTest.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/refcursor/StandardRefCursorSupportTest.java index 9bfd2a5731..f8a74f1d6f 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupportTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/refcursor/StandardRefCursorSupportTest.java @@ -1,14 +1,16 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html */ -package org.hibernate.engine.jdbc.cursor.internal; +package org.hibernate.orm.test.jdbc.refcursor; import java.sql.DatabaseMetaData; import java.sql.SQLException; +import org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport; + import org.hibernate.testing.TestForIssue; import org.junit.Test; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/InformixFunctionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/InformixFunctionTest.java new file mode 100644 index 0000000000..46359a86f4 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/InformixFunctionTest.java @@ -0,0 +1,212 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.query.hql; + +import java.sql.Timestamp; +import java.util.Calendar; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.hibernate.dialect.InformixDialect; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +/** + * @author Vlad Mihalcea + */ +@RequiresDialect(InformixDialect.class) +@DomainModel( annotatedClasses = InformixFunctionTest.Event.class ) +@SessionFactory +public class InformixFunctionTest { + + private Event event; + + @BeforeEach + protected void prepareTest(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + event = new Event(); + event.country = "Romania"; + event.city = "Cluj-Napoca"; + session.persist( event ); + } + ); + } + + @Test + @TestForIssue( jiraKey = "HHH-10846" ) + public void testConcat(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + String location = (String) session.createQuery( + "select concat(e.country, ' - ', e.city) " + + "from Event e " + + "where e.id = :id") + .setParameter( "id", event.id ) + .getSingleResult(); + assertEquals( "Romania - Cluj-Napoca", location); + } + ); + } + + @Test + @TestForIssue( jiraKey = "HHH-10846" ) + public void testSubstring(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + String location = (String) session.createQuery( + "select substring(e.city, 0, 5) " + + "from Event e " + + "where e.id = :id") + .setParameter( "id", event.id ) + .getSingleResult(); + assertEquals( "Cluj", location); + } + ); + } + + @Test + @TestForIssue( jiraKey = "HHH-10846" ) + public void testSubstr(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + String location = (String) session.createQuery( + "select substr(e.city, 0, 4) " + + "from Event e " + + "where e.id = :id") + .setParameter( "id", event.id ) + .getSingleResult(); + assertEquals( "Cluj", location); + } + ); + } + + @Test + @TestForIssue( jiraKey = "HHH-10846" ) + public void testCoalesceAndNvl(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + String location = (String) session.createQuery( + "select coalesce(e.district, 'N/A') " + + "from Event e " + + "where e.id = :id") + .setParameter( "id", event.id ) + .getSingleResult(); + assertEquals( "N/A", location); + + location = (String) session.createQuery( + "select nvl(e.district, 'N/A') " + + "from Event e " + + "where e.id = :id") + .setParameter( "id", event.id ) + .getSingleResult(); + assertEquals( "N/A", location); + } + ); + } + + @Test + @TestForIssue( jiraKey = "HHH-10800" ) + public void testCurrentDate(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + Date date = (Date) session.createQuery( + "select current_date() " + + "from Event e " + + "where e.id = :id") + .setParameter( "id", event.id ) + .getSingleResult(); + + assertNotNull( date ); + assertTrue( date.getTime() > 0 ); + + Calendar resultCalendar = Calendar.getInstance(); + resultCalendar.setTime(date); + + assertEquals( 0, todayCalendar().compareTo(resultCalendar) ); + } + ); + } + + @Test + @TestForIssue( jiraKey = "HHH-10800" ) + public void testCurrentTimestamp(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + int tries = 2; + while ( tries-- > 0 ) { + Timestamp timestamp = (Timestamp) session.createQuery( + "select current_timestamp() " + + "from Event e " + + "where e.id = :id" ) + .setParameter( "id", event.id ) + .getSingleResult(); + + assertNotNull( timestamp ); + assertTrue( timestamp.getTime() > 0 ); + + Calendar resultCalendar = Calendar.getInstance(); + resultCalendar.setTime( timestamp ); + + long millis = resultCalendar.getTime().getTime() - todayCalendar().getTime().getTime(); + + if(millis == 0) { + //What are the odds that ou've run this test exactly at midnight? + try { + Thread.sleep( 1000 ); + } + catch ( InterruptedException ignore ) {} + continue; + } + + assertTrue( millis > 0 ); + } + } + ); + } + + private Calendar todayCalendar() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar; + } + + @SuppressWarnings("unused") + @Entity(name = "Event") + public static class Event { + + @Id + @GeneratedValue + private Long id; + + @Column + private String country; + + private String city; + + private String district; + } +} + + diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/MySQLSetVariableEscapeColonTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/MySQLSetVariableEscapeColonTest.java new file mode 100644 index 0000000000..fd8b26d14a --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/MySQLSetVariableEscapeColonTest.java @@ -0,0 +1,47 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.query.sql; + +import java.sql.Statement; + +import org.hibernate.dialect.MySQLDialect; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Vlad Mihalcea + */ +@RequiresDialect(MySQLDialect.class) +@TestForIssue( jiraKey = "HHH-1237") +@SessionFactory +public class MySQLSetVariableEscapeColonTest { + @Test + public void testBoundedLongStringAccess(SessionFactoryScope scope) { + scope.inTransaction( + (session) -> { + session.doWork( + (connection) -> { + try ( final Statement statement = connection.createStatement() ) { + statement.executeUpdate( "SET @a='test'" ); + } + } + ); + Object[] result = (Object[]) session.createNativeQuery( "SELECT @a, (@a::=20) FROM dual" ).uniqueResult(); + assertEquals("test", result[0]); + assertEquals(20, ((Number) result[1]).intValue()); + } + ); + } + +} + diff --git a/hibernate-core/src/test/java/org/hibernate/engine/query/ParameterParserTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/ParameterParserTest.java similarity index 85% rename from hibernate-core/src/test/java/org/hibernate/engine/query/ParameterParserTest.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/ParameterParserTest.java index 30503b8678..e4e6a6266a 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/query/ParameterParserTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/ParameterParserTest.java @@ -1,10 +1,10 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html */ -package org.hibernate.engine.query; +package org.hibernate.orm.test.query.sql; import org.hibernate.engine.query.internal.NativeQueryInterpreterStandardImpl; import org.hibernate.engine.query.spi.ParamLocationRecognizer; @@ -12,11 +12,12 @@ import org.hibernate.query.sql.internal.ParameterParser; import org.hibernate.query.sql.spi.ParameterRecognizer; import org.hibernate.testing.TestForIssue; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; /** * Unit tests of the ParameterParser class @@ -47,6 +48,9 @@ public class ParameterParserTest { recognizer ); + recognizer.complete(); + recognizer.validate(); + assertTrue( recognizer.getNamedParameterDescriptionMap().containsKey("param")); } @@ -59,6 +63,9 @@ public class ParameterParserTest { recognizer ); + recognizer.complete(); + recognizer.validate(); + assertEquals( 1, recognizer.getOrdinalParameterDescriptionMap().size() ); } @@ -71,6 +78,9 @@ public class ParameterParserTest { recognizer ); + recognizer.complete(); + recognizer.validate(); + assertEquals( 1, recognizer.getOrdinalParameterDescriptionMap().size() ); } @@ -83,6 +93,9 @@ public class ParameterParserTest { recognizer ); + recognizer.complete(); + recognizer.validate(); + assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param")); } @@ -91,7 +104,8 @@ public class ParameterParserTest { public void testParseColonCharacterEscaped() { final StringBuilder captured = new StringBuilder(); ParameterRecognizer recognizer = new ParameterRecognizer() { - @Override + @SuppressWarnings("deprecation") + @Override public void outParameter(int position) { fail(); } @@ -121,6 +135,7 @@ public class ParameterParserTest { } }; ParameterParser.parse("SELECT @a,(@a::=20) FROM tbl_name", recognizer); + recognizer.complete(); assertEquals("SELECT @a,(@a:=20) FROM tbl_name", captured.toString()); } @@ -128,6 +143,9 @@ public class ParameterParserTest { public void testParseNamedParameter() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer( 0 ); NativeQueryInterpreterStandardImpl.INSTANCE.recognizeParameters("from Stock s where s.stockCode = :stockCode and s.xyz = :pxyz", recognizer); + recognizer.complete(); + recognizer.validate(); + assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("stockCode")); assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("pxyz")); assertEquals( 2, recognizer.getNamedParameterDescriptionMap().size() ); @@ -137,9 +155,15 @@ public class ParameterParserTest { public void testParseJPAPositionalParameter() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer( 0 ); NativeQueryInterpreterStandardImpl.INSTANCE.recognizeParameters("from Stock s where s.stockCode = ?1 and s.xyz = ?1", recognizer); + recognizer.complete(); + recognizer.validate(); + assertEquals( 1, recognizer.getOrdinalParameterDescriptionMap().size() ); ParameterParser.parse("from Stock s where s.stockCode = ?1 and s.xyz = ?2", recognizer); + recognizer.complete(); + recognizer.validate(); + assertEquals( 2, recognizer.getOrdinalParameterDescriptionMap().size() ); }