Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce AbstractNamedEnumTest #8452

Merged
merged 1 commit into from
May 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
}

}