| /* |
| * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation from Oracle TopLink |
| package org.eclipse.persistence.testing.tests.types; |
| |
| import java.util.*; |
| import org.eclipse.persistence.descriptors.RelationalDescriptor; |
| import org.eclipse.persistence.sessions.Session; |
| import org.eclipse.persistence.tools.schemaframework.*; |
| import org.eclipse.persistence.testing.framework.*; |
| import org.eclipse.persistence.internal.helper.*; |
| |
| /** |
| * Tests strings. |
| */ |
| public class StringTester extends TypeTester { |
| public String varString; |
| public String fixedString; |
| |
| public StringTester() { |
| super("NULL"); |
| varString = null; |
| fixedString = null; |
| } |
| |
| public StringTester(String nameOfTest, String example) { |
| super(nameOfTest); |
| varString = example; |
| fixedString = example; |
| } |
| |
| public static RelationalDescriptor descriptor() { |
| RelationalDescriptor descriptor = new RelationalDescriptor(); |
| |
| /* First define the class, table and descriptor properties. */ |
| descriptor.setJavaClass(StringTester.class); |
| descriptor.setTableName("STRINGS"); |
| descriptor.setPrimaryKeyFieldName("NAME"); |
| |
| /* Next define the attribute mappings. */ |
| descriptor.addDirectMapping("testName", "getTestName", "setTestName", "NAME"); |
| descriptor.addDirectMapping("varString", "VAR"); |
| descriptor.addDirectMapping("fixedString", "FIXED_STRING"); |
| return descriptor; |
| } |
| |
| public static RelationalDescriptor descriptorWithAccessors() { |
| RelationalDescriptor descriptor = new RelationalDescriptor(); |
| |
| /* First define the class, table and descriptor properties. */ |
| descriptor.setJavaClass(StringTester.class); |
| descriptor.setTableName("STRINGS"); |
| descriptor.setPrimaryKeyFieldName("NAME"); |
| |
| /* Next define the attribute mappings. */ |
| descriptor.addDirectMapping("testName", "getTestName", "setTestName", "NAME"); |
| descriptor.addDirectMapping("varString", "getVarString", "setVarString", "VAR"); |
| descriptor.addDirectMapping("fixedString", "getFixedString", "setFixedString", "FIXED_STRING"); |
| return descriptor; |
| } |
| |
| public boolean equals(StringTester otherTester, Session session) throws TestWarningException { |
| if (!getTestName().equals(otherTester.getTestName())) { |
| return false; |
| } |
| if ((!Helper.rightTrimString(getVarString(stringLength())).equals(otherTester.getVarString())) && !((getVarString().length() == 0) && (otherTester.getVarString() == null))) { |
| return false; |
| } |
| if ((!Helper.rightTrimString(getFixedString(stringLength())).equals(otherTester.getFixedString())) && !((getFixedString().length() == 0) && (otherTester.getFixedString() == null))) { |
| return false; |
| } |
| if ((otherTester.getFixedString() == null) || (otherTester.getVarString() == null)) { |
| throw new TestWarningException("Empty columns can be returned as NULL."); |
| } |
| return true; |
| } |
| |
| public String getFixedString() { |
| return fixedString; |
| } |
| |
| public String getFixedString(int fieldLength) { |
| if (fixedString.length() > stringLength()) { |
| return fixedString.substring(0, stringLength()); |
| } |
| return fixedString; |
| } |
| |
| public String getVarString() { |
| return varString; |
| } |
| |
| public String getVarString(int fieldLength) { |
| if (varString.length() > stringLength()) { |
| return varString.substring(0, stringLength()); |
| } |
| return varString; |
| } |
| |
| public void setFixedString(String aString) { |
| fixedString = aString; |
| } |
| |
| public void setVarString(String aString) { |
| varString = aString; |
| } |
| |
| public static int stringLength() { |
| return 30; |
| } |
| |
| /** |
| *Return a platform independant definition of the database table. |
| */ |
| public static TableDefinition tableDefinition(Session session) { |
| TableDefinition definition = TypeTester.tableDefinition(); |
| |
| definition.setName("STRINGS"); |
| |
| definition.addField("VAR", String.class, StringTester.stringLength()); |
| definition.addField("FIXED_STRING", Character.class, StringTester.stringLength()); |
| return definition; |
| } |
| |
| public static Vector testInstances() { |
| Vector tests = new Vector(); |
| |
| tests.addElement(new StringTester()); |
| tests.addElement(new StringTester("Empty", "")); |
| tests.addElement(new StringTester("Date", new java.util.Date().toString())); |
| tests.addElement(new StringTester("Too Long", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")); |
| tests.addElement(new StringTester("Leading Blanks", " 5 blanks")); |
| tests.addElement(new StringTester("Trailing Blanks", "5 blanks ")); |
| tests.addElement(new StringTester("Quotes", "\"\'`")); |
| return tests; |
| } |
| |
| public String toString() { |
| return "StringTester(" + getTestName() + ")"; |
| } |
| |
| /** |
| * Verify if the objects match completely through allowing the session to use the descriptors. |
| * This will compare the objects and all of their privately owned parts. |
| */ |
| @Override |
| protected void verify(WriteTypeObjectTest testCase) throws TestErrorException, TestWarningException { |
| if ((caughtException != null) && (getVarString().length() > 30)) { |
| throw new TestWarningException("Too long exception: " + caughtException.toString()); |
| } |
| try { |
| super.verify(testCase); |
| } catch (TestErrorException verifyFailedException) { |
| // Char fields always are trimmed (by us) this is an error if they are not |
| if (testCase.getObjectFromDatabase() != null) { |
| String fixed = ((StringTester)testCase.getObjectFromDatabase()).getFixedString(); |
| if ((fixed != null) && (fixed.length() > 0) && (fixed.charAt(fixed.length() - 1) == ' ')) { |
| if (fixed.equals(" ")) {// Stupid drivers make "" -> " " |
| throw new TestWarningException("This driver converts '''' to '' ''."); |
| } |
| throw new TestErrorException("Trailing blanks were not removed from char field."); |
| } |
| } |
| |
| // Databases which return empty strings as null |
| if ((getVarString().length() == 0) && (((StringTester)testCase.getObjectFromDatabase()).getVarString() == null)) { |
| throw new TestWarningException("A null was returned for the empty string"); |
| } |
| |
| // Database returned a " " when an empty string was stored. |
| if ((getVarString().length() == 0) && ((StringTester)testCase.getObjectFromDatabase()).getVarString().equals(" ")) { |
| throw new TestWarningException("A single space string was returned instead of an empty string"); |
| } |
| |
| // Databases which remove trailing blanks |
| if ((getVarString().length() > 0) && (getVarString().charAt(getVarString().length() - 1) == ' ') && getVarString().trim().equals(((StringTester)testCase.getObjectFromDatabase()).getVarString())) { |
| throw new TestWarningException("Trailing blanks were removed"); |
| } |
| |
| // Databases which remove leading blanks |
| if ((getVarString().length() > 0) && (getVarString().charAt(0) == ' ') && getVarString().trim().equals(((StringTester)testCase.getObjectFromDatabase()).getVarString())) { |
| throw new TestWarningException("Leading blanks were removed"); |
| } |
| |
| // Database truncates strings which are too long |
| if ((getVarString().length() > 30) && (((StringTester)testCase.getObjectFromDatabase()).getVarString().length() == 30) && getVarString().startsWith(((StringTester)testCase.getObjectFromDatabase()).getVarString())) { |
| throw new TestWarningException("The string was truncated."); |
| } |
| |
| // Char fields always are trimmed (by us) |
| if ((getFixedString().length() > 0) && (getFixedString().charAt(getFixedString().length() - 1) == ' ') && getFixedString().trim().equals(((StringTester)testCase.getObjectFromDatabase()).getFixedString())) { |
| throw new TestWarningException("Trailing blanks were removed from char field."); |
| } |
| |
| if (caughtException != null) { |
| throw caughtException; |
| } |
| throw verifyFailedException; |
| } |
| } |
| } |