/***************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. ****************************************************************/ package org.apache.cayenne.dba; import org.apache.cayenne.MockSerializable; import org.apache.cayenne.di.Inject; import org.apache.cayenne.unit.di.server.CayenneProjects; import org.apache.cayenne.unit.di.server.ServerCase; import org.apache.cayenne.unit.di.server.ServerCaseDataSourceFactory; import org.apache.cayenne.unit.di.server.UseServerRuntime; import org.junit.Test; import java.math.BigInteger; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.Types; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @UseServerRuntime(CayenneProjects.EMPTY_PROJECT) public class TypesMappingIT extends ServerCase { @Inject private ServerCaseDataSourceFactory dataSourceFactory; @Test public void testGetSqlTypeByJava() throws Exception { assertEquals(Types.VARCHAR, TypesMapping.getSqlTypeByJava(String.class)); // make sure we can handle arrays... assertEquals(Types.BINARY, TypesMapping.getSqlTypeByJava(byte[].class)); assertEquals(Types.TIMESTAMP, TypesMapping.getSqlTypeByJava(Calendar.class)); assertEquals( Types.TIMESTAMP, TypesMapping.getSqlTypeByJava(GregorianCalendar.class)); assertEquals(Types.BIGINT, TypesMapping.getSqlTypeByJava(BigInteger.class)); assertEquals( Types.VARBINARY, TypesMapping.getSqlTypeByJava(MockSerializable.class)); assertEquals(Types.VARCHAR, TypesMapping.getSqlTypeByJava(char[].class)); assertEquals(Types.VARCHAR, TypesMapping.getSqlTypeByJava(Character[].class)); assertEquals(Types.VARBINARY, TypesMapping.getSqlTypeByJava(Byte[].class)); } @Test public void testGetSqlTypeByJavaString() throws Exception { assertEquals(Types.VARCHAR, TypesMapping.getSqlTypeByJava(String.class.getName())); // make sure we can handle arrays... assertEquals(Types.BINARY, TypesMapping.getSqlTypeByJava("byte[]")); assertEquals( Types.TIMESTAMP, TypesMapping.getSqlTypeByJava(Calendar.class.getName())); assertEquals( Types.TIMESTAMP, TypesMapping.getSqlTypeByJava(GregorianCalendar.class.getName())); assertEquals( Types.BIGINT, TypesMapping.getSqlTypeByJava(BigInteger.class.getName())); assertEquals( Types.VARBINARY, TypesMapping.getSqlTypeByJava(MockSerializable.class.getName())); assertEquals(Types.VARCHAR, TypesMapping.getSqlTypeByJava("char[]")); assertEquals( Types.VARCHAR, TypesMapping.getSqlTypeByJava("java.lang.Character[]")); assertEquals(Types.VARBINARY, TypesMapping.getSqlTypeByJava("java.lang.Byte[]")); } @Test public void testGetSqlTypeByJavaPrimitive() throws Exception { assertEquals(Types.INTEGER, TypesMapping.getSqlTypeByJava(Integer.TYPE)); assertEquals(Types.BIGINT, TypesMapping.getSqlTypeByJava(Long.TYPE)); } @Test public void testTypeInfoCompleteness() throws Exception { // check counts // since more then 1 database type can map to a single JDBC type int len = 0; try (Connection conn = dataSourceFactory.getSharedDataSource().getConnection()) { DatabaseMetaData md = conn.getMetaData(); try (ResultSet rs = md.getTypeInfo()) { while (rs.next()) { len++; } } } int actualLen = 0; TypesMapping map = createTypesMapping(); for (List<TypesMapping.TypeInfo> entry : map.databaseTypes.values()) { actualLen += entry.size(); } // this is bad assertion, since due to some hacks // the same database types may map more then once, // so we have to use <= assertTrue(len <= actualLen); } private TypesMapping createTypesMapping() throws Exception { try (Connection conn = dataSourceFactory.getSharedDataSource().getConnection()) { DatabaseMetaData md = conn.getMetaData(); return new TypesMapping(md); } } }