Skip to content

Commit

Permalink
Introduce AbstractNamedEnumTest
Browse files Browse the repository at this point in the history
  • Loading branch information
quaff authored and beikov committed May 27, 2024
1 parent 0705ffd commit 11da1ec
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,33 @@
*/
package org.hibernate.orm.test.type;

import java.sql.ResultSet;

import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.Test;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.dialect.OracleDialect;
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.hibernate.type.SqlTypes;
import org.junit.jupiter.api.Test;

import java.sql.ResultSet;
import java.sql.Statement;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

/**
* @author Yanming Zhou
*/
@SessionFactory
@DomainModel(annotatedClasses = {OracleEnumTest.Timeslot.class, OracleEnumTest.Activity.class, OracleEnumTest.Weather.class, OracleEnumTest.Sky.class})
@RequiresDialect(value = OracleDialect.class, majorVersion = 23)
public class OracleEnumTest {
@DomainModel(annotatedClasses = { AbstractNamedEnumTest.Timeslot.class, AbstractNamedEnumTest.Activity.class, AbstractNamedEnumTest.Weather.class, AbstractNamedEnumTest.Sky.class})
public abstract class AbstractNamedEnumTest {

@Test public void testNamedEnum(SessionFactoryScope scope) {
Timeslot timeslot = new Timeslot();
Expand Down Expand Up @@ -60,49 +61,17 @@ public class OracleEnumTest {
boolean namedEnumFound = false;
boolean namedOrdinalEnumFound = false;

try(Statement stmt = c.createStatement()) {
try(ResultSet typeInfo = stmt.executeQuery("select name, decode(instr(data_display,'WHEN '''),0,'NUMBER','VARCHAR2') from user_domains where type='ENUMERATED'")) {
while (typeInfo.next()) {
String name = typeInfo.getString(1);
String baseType = typeInfo.getString(2);
if (name.equalsIgnoreCase("ActivityType") && baseType.equals("VARCHAR2")) {
namedEnumFound = true;
continue;
}
if (name.equalsIgnoreCase("SkyType") && baseType.equals("NUMBER")) {
namedOrdinalEnumFound = true;
continue;
}
}
}
}

if (!namedEnumFound) {
fail("named enum type not exported");
}
if (!namedOrdinalEnumFound) {
fail("named ordinal enum type not exported");
}
}
);
});
scope.inSession( s -> {
s.doWork(
c -> {
boolean namedEnumFound = false;
boolean namedOrdinalEnumFound = false;

ResultSet tableInfo = c.getMetaData().getColumns(null, null, "ACTIVITY", "ACTIVITYTYPE" );
ResultSet tableInfo = c.getMetaData().getColumns(null, null, normalizeNameForQueryingMetadata("Activity"), normalizeNameForQueryingMetadata("ActivityType"));
while ( tableInfo.next() ) {
String type = tableInfo.getString(6);
assertEquals( "VARCHAR2", type );
assertEquals( getDataTypeForNamedEnum( "ActivityType"), type );
namedEnumFound = true;
break;
}
tableInfo = c.getMetaData().getColumns(null, null, "SKY", "SKYTYPE" );
tableInfo = c.getMetaData().getColumns(null, null, normalizeNameForQueryingMetadata("Sky"), normalizeNameForQueryingMetadata("SkyType"));
while ( tableInfo.next() ) {
String type = tableInfo.getString(6);
assertEquals( "NUMBER", type );
assertEquals( getDataTypeForNamedOrdinalEnum("SkyType"), type );
namedOrdinalEnumFound = true;
break;
}
Expand All @@ -118,6 +87,12 @@ public class OracleEnumTest {
});
}

protected abstract String normalizeNameForQueryingMetadata(String name);

protected abstract String getDataTypeForNamedEnum(String namedEnum);

protected abstract String getDataTypeForNamedOrdinalEnum(String namedEnum);

public enum ActivityType {Work, Play, Sleep }

@Entity(name = "Activity")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* 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.type;

import org.hibernate.dialect.OracleDialect;
import org.hibernate.testing.orm.junit.RequiresDialect;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.Test;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Locale;

import static org.junit.jupiter.api.Assertions.fail;

@RequiresDialect(value = OracleDialect.class, majorVersion = 23)
public class OracleNamedEnumTest extends AbstractNamedEnumTest {

@Override
protected String normalizeNameForQueryingMetadata(String name) {
return name.toUpperCase(Locale.ROOT);
}

@Override
protected String getDataTypeForNamedEnum(String namedEnum) {
return "VARCHAR2";
}

@Override
protected String getDataTypeForNamedOrdinalEnum(String namedEnum) {
return "NUMBER";
}

@Test public void testUserDomains(SessionFactoryScope scope) {
scope.inSession( s -> {
s.doWork(
c -> {
boolean namedEnumFound = false;
boolean namedOrdinalEnumFound = false;

try(Statement stmt = c.createStatement()) {
try(ResultSet typeInfo = stmt.executeQuery("select name, decode(instr(data_display,'WHEN '''),0,'NUMBER','VARCHAR2') from user_domains where type='ENUMERATED'")) {
while (typeInfo.next()) {
String name = typeInfo.getString(1);
String baseType = typeInfo.getString(2);
if (name.equalsIgnoreCase("ActivityType") && baseType.equals(
getDataTypeForNamedEnum("ActivityType"))) {
namedEnumFound = true;
continue;
}
if (name.equalsIgnoreCase("SkyType") && baseType.equals(
getDataTypeForNamedOrdinalEnum("SkyType"))) {
namedOrdinalEnumFound = true;
}
}
}
}

if (!namedEnumFound) {
fail("named enum type not exported");
}
if (!namedOrdinalEnumFound) {
fail("named ordinal enum type not exported");
}
}
);
});
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.hibernate.orm.test.type;

import java.util.Locale;

import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.testing.orm.junit.RequiresDialect;

@RequiresDialect(PostgreSQLDialect.class)
public class PostgresNamedEnumTest extends AbstractNamedEnumTest {

@Override
protected String normalizeNameForQueryingMetadata(String name) {
return name.toLowerCase(Locale.ROOT);
}

@Override
protected String getDataTypeForNamedEnum(String namedEnum) {
return namedEnum.toLowerCase(Locale.ROOT);
}

@Override
protected String getDataTypeForNamedOrdinalEnum(String namedEnum) {
return namedEnum.toLowerCase(Locale.ROOT);
}

}

0 comments on commit 11da1ec

Please sign in to comment.