blob: 5844b5b5c8791ff89bfe54029184f2f933ed641a [file] [log] [blame]
/*
* Copyright (c) 2011, 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:
// 05/19/2010-2.1 ailitchev - Bug 244124 - Add Nested FetchGroup
package org.eclipse.persistence.testing.tests.jpa.fetchgroups;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.persistence.internal.core.queries.CoreAttributeConverter;
import org.eclipse.persistence.internal.queries.AttributeItem;
import org.eclipse.persistence.queries.FetchGroup;
import org.junit.Test;
import static org.eclipse.persistence.internal.helper.StringHelper.DOT;
/**
* Simple tests to verify the functionality of FetchGroup API
*
* @author dclarke
* @since EclipseLink 2.1
*/
public class FetchGroupAPITests extends TestCase {
public FetchGroupAPITests() {
super();
}
public FetchGroupAPITests(String name) {
super(name);
}
public static junit.framework.Test suite() {
TestSuite suite = new TestSuite();
suite.setName("FetchGroupAPITests");
suite.addTest(new FetchGroupAPITests("verifyConverterWithValidSingleElements"));
suite.addTest(new FetchGroupAPITests("verifyConverterWithValidComplexElements"));
suite.addTest(new FetchGroupAPITests("verifyConverterWithValidArrays"));
suite.addTest(new FetchGroupAPITests("verifyConverterWithInvalidSingleElements"));
suite.addTest(new FetchGroupAPITests("verifyConverterWithInvalidComplexElements"));
suite.addTest(new FetchGroupAPITests("verifyConverterWithInvalidArrays"));
suite.addTest(new FetchGroupAPITests("verifyDefaultConstructor"));
suite.addTest(new FetchGroupAPITests("verifyNameConstructor"));
suite.addTest(new FetchGroupAPITests("verifyNameConstructor_Null"));
suite.addTest(new FetchGroupAPITests("verifyInvalidAdd_null"));
suite.addTest(new FetchGroupAPITests("verifyInvalidAdd_empty"));
suite.addTest(new FetchGroupAPITests("verifyInvalidAdd_dot"));
suite.addTest(new FetchGroupAPITests("verifyInvalidAdd_startWithDot"));
suite.addTest(new FetchGroupAPITests("verifyInvalidAdd_endWithDot"));
suite.addTest(new FetchGroupAPITests("verifyInvalidAdd_space"));
suite.addTest(new FetchGroupAPITests("verifygetItem_EmptyFG"));
suite.addTest(new FetchGroupAPITests("verifyAddAttribute"));
suite.addTest(new FetchGroupAPITests("verifyAddAttribute_Nested"));
suite.addTest(new FetchGroupAPITests("verifyAdd2AttributesNestedFG"));
suite.addTest(new FetchGroupAPITests("verifyAdd2AttributesNestedFG_parentFirst"));
suite.addTest(new FetchGroupAPITests("verifyAddAttribute_Nested2"));
suite.addTest(new FetchGroupAPITests("verifyAdd"));
suite.addTest(new FetchGroupAPITests("verifyAdd_Nested"));
return suite;
}
/**
* Verify attribute converter with set of simple path elements.
* Every argument is a single {@link String} with valid path element without
* separator.
*/
@Test
public void verifyConverterWithValidSingleElements() {
final String[][] elements = {
{"a"}, {"ab"}, {"abc"}, {"abcd"},
{"a b"}, {"a b c"}, {"ab cd"}};
for (String[] element : elements) {
String[] result = CoreAttributeConverter.convert(element);
assertNotNull("Converter returned null for input: \"" + element[0] + "\"", result);
assertEquals("Size of returned array differs from input: \"" + element[0] + "\"",
element.length, result.length);
assertTrue("Returned String does not match input: \"" + element[0] + "\"",
element[0].equals(result[0]));
}
}
/**
* Verify attribute converter with set of complex path elements.
* Every argument is a single {@link String} with valid path with
* one or more separators.
*/
@Test
public void verifyConverterWithValidComplexElements() {
final String[][] paths = {
{"a", "b"}, {"a", "b", "c"}, {"a", "b", "c", "d"},
{"a b", "c d"}, {"a b", "c d", "e f"}};
for (String[] path : paths) {
int length = 0;
int i;
for (i = 0; i < path.length; i++) {
length += path[i].length() + 1;
}
StringBuilder element = new StringBuilder(length);
for (i = 0; i < path.length; i++) {
if (i > 0)
element.append(DOT);
element.append(path[i]);
}
String elStr = element.toString();
String[] result = CoreAttributeConverter.convert(elStr);
assertNotNull("Converter returned null for input: \"" + elStr + "\"", result);
assertEquals("Size of returned array differs from input: \"" + elStr + "\"",
path.length, result.length);
for (i = 0; i < path.length; i++) {
assertTrue("Returned String array does not match input: \"" + elStr + "\"",
path[i].equals(result[i]));
}
}
}
/**
* Verify attribute converter with set of path elements as arrays.
* Every argument is a {@link String} array with valid path elements.
*/
@Test
public void verifyConverterWithValidArrays() {
final String[][] paths = {
{"a", "b"}, {"a", "b", "c"}, {"a", "b", "c", "d"},
{"a b", "c d"}, {"a b", "c d", "e f"}};
for (String[] path : paths) {
String[] result = CoreAttributeConverter.convert(path);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < path.length; i++) {
if (i > 0) {
sb.append(", ");
}
sb.append('"').append(path[i]).append('"');
}
assertNotNull("Converter returned null for input: " + sb.toString(), result);
assertEquals("Size of returned array differs from input: " + sb.toString(),
path.length, result.length);
for (int i = 0; i < path.length; i++) {
assertTrue("Returned String array does not match input array: " + sb.toString(),
path[i].equals(result[i]));
}
}
}
/**
* Verify attribute converter with set of invalid simple path elements.
* Every argument is a single {@link String} with invalid path element without
* separator.
*/
@Test
public void verifyConverterWithInvalidSingleElements() {
final String[][] elements = {
{null}, {""}, {" "}, {" a"}, {"a "}, {" a "}, {" a b"}, {"a b "}, {" a b "}};
boolean exception = false;
for (String[] element : elements) try {
exception = false;
String[] result = CoreAttributeConverter.convert(element);
} catch (IllegalArgumentException ex) {
exception = true;
} finally {
assertTrue("Converter did not throw IllegalArgumentException on invalid input: \""
+ element[0] + "\"", exception);
}
}
/**
* Verify attribute converter with set of complex path elements.
* Every argument is a single {@link String} with valid path with
* one or more separators.
*/
@Test
public void verifyConverterWithInvalidComplexElements() {
final String[][] paths = {
{"", "b"}, {"a", ""}, {" ", "b"}, {"a", " "}, {"", ""}, {" ", " "},
{" a", "b"}, {"a", " b"}, {"a ", "b"}, {"a", "b "},
{" a ", "b"}, {"a", " b "}};
boolean exception = false;
for (String[] path : paths) {
int length = 0;
int i;
for (i = 0; i < path.length; i++) {
length += path[i].length() + 1;
}
StringBuilder element = new StringBuilder(length);
for (i = 0; i < path.length; i++) {
if (i > 0)
element.append(DOT);
element.append(path[i]);
}
String elStr = element.toString();
try {
exception = false;
String[] result = CoreAttributeConverter.convert(elStr);
} catch (IllegalArgumentException ex) {
exception = true;
} finally {
assertTrue("Converter did not throw IllegalArgumentException on invalid input: \""
+ elStr + "\"", exception);
}
}
}
/**
* Verify attribute converter with set of path elements as arrays.
* Every argument is a {@link String} array with valid path elements.
*/
@Test
public void verifyConverterWithInvalidArrays() {
final String[][] paths = {
{"", "b"}, {"a", ""}, {" ", "b"}, {"a", " "}, {"", ""}, {" ", " "},
{" a", "b"}, {"a", " b"}, {"a ", "b"}, {"a", "b "},
{" a ", "b"}, {"a", " b "}};
boolean exception = false;
for (String[] path : paths) try {
exception = false;
String[] result = CoreAttributeConverter.convert(path);
} catch (IllegalArgumentException ex) {
exception = true;
} finally {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < path.length; i++) {
if (i > 0) {
sb.append(", ");
}
sb.append('"').append(path[i]).append('"');
}
assertTrue("Converter did not throw IllegalArgumentException on invalid input: "
+ sb.toString(), exception);
}
}
@Test
public void verifyDefaultConstructor() {
FetchGroup fg = new FetchGroup();
assertEquals("default FetchGroup name is not an empty string", fg.getName(), "");
assertTrue(fg.getItems().isEmpty());
}
@Test
public void verifyNameConstructor() {
FetchGroup fg = new FetchGroup("Test");
assertEquals("Test name not set", "Test", fg.getName());
assertTrue(fg.getItems().isEmpty());
fg.toString();
}
@Test
public void verifyNameConstructor_Null() {
FetchGroup fg = new FetchGroup(null);
assertNull("Null name not set", fg.getName());
assertTrue(fg.getItems().isEmpty());
fg.toString();
}
private void verifyInvalid(String arg) {
FetchGroup fg = new FetchGroup();
try {
fg.addAttribute(arg);
} catch (IllegalArgumentException iae) {
return;
}
fail("IllegalArgumentException expected but not caught.");
}
@Test
public void verifyInvalidAdd_null() {
verifyInvalid(null);
}
@Test
public void verifyInvalidAdd_empty() {
verifyInvalid("");
}
@Test
public void verifyInvalidAdd_dot() {
verifyInvalid(".");
verifyInvalid("..");
verifyInvalid(". ");
verifyInvalid(" .");
verifyInvalid(" . ");
verifyInvalid(". .");
}
@Test
public void verifyInvalidAdd_startWithDot() {
verifyInvalid(".name");
}
@Test
public void verifyInvalidAdd_endWithDot() {
verifyInvalid("name.");
}
@Test
public void verifyInvalidAdd_space() {
verifyInvalid(" ");
verifyInvalid("\t");
verifyInvalid("\n");
verifyInvalid("\r");
}
/**
* Verify that {@link FetchGroup#getItem(String)} works properly on an
* empty FetchGroup.
*/
@Test
public void verifygetItem_EmptyFG() {
FetchGroup fg = new FetchGroup();
assertTrue(fg.getItems().isEmpty());
assertNull(fg.getItem("test"));
assertNull(fg.getItem("a.b"));
assertTrue(fg.getItems().isEmpty());
}
@Test
public void verifyAddAttribute() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("test");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("test"));
assertNotNull(fg.getItems().get("test"));
AttributeItem item = fg.getItem("test");
assertNotNull(item);
assertEquals("test", item.getAttributeName());
}
@Test
public void verifyAddAttribute_Nested() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("test.test");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("test"));
AttributeItem testFI = fg.getItems().get("test");
assertNotNull(testFI);
assertEquals("test", testFI.getAttributeName());
assertNotNull(testFI.getGroup());
assertEquals("test", testFI.getGroup().getName());
testFI = fg.getItem("test");
assertNotNull(testFI);
assertEquals("test", testFI.getAttributeName());
assertEquals(1, testFI.getGroup().getItems().size());
assertTrue(testFI.getGroup().getItems().containsKey("test"));
assertNotNull(testFI.getGroup().getItem("test"));
}
@Test
public void verifyAdd2AttributesNestedFG() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("a.b");
fg.addAttribute("a.c");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("a"));
AttributeItem aItem = fg.getItem("a");
FetchGroup aFG = (FetchGroup)aItem.getGroup();
assertNotNull(aItem);
assertNotNull(aFG);
// assertFalse(aItem.useDefaultFetchGroup());
assertEquals(2, aFG.getItems().size());
assertEquals("a", aFG.getName());
AttributeItem bItem = aFG.getItem("b");
assertNotNull(bItem);
assertEquals("b", bItem.getAttributeName());
assertNull(bItem.getGroup());
// assertTrue(bItem.useDefaultFetchGroup());
assertSame(bItem, fg.getItem("a.b"));
AttributeItem cItem = aFG.getItem("c");
assertNotNull(cItem);
assertEquals("c", cItem.getAttributeName());
assertNull(cItem.getGroup());
// assertTrue(cItem.useDefaultFetchGroup());
assertSame(cItem, fg.getItem("a.c"));
}
@Test
public void verifyAdd2AttributesNestedFG_parentFirst() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("a");
fg.addAttribute("a.b");
fg.addAttribute("a.c");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("a"));
AttributeItem aItem = fg.getItem("a");
FetchGroup aFG = (FetchGroup)aItem.getGroup();
assertNotNull(aItem);
assertNotNull(aFG);
// assertFalse(aItem.useDefaultFetchGroup());
assertEquals(2, aFG.getItems().size());
assertEquals("a", aFG.getName());
AttributeItem bItem = aFG.getItem("b");
assertNotNull(bItem);
assertEquals("b", bItem.getAttributeName());
assertNull(bItem.getGroup());
// assertTrue(bItem.useDefaultFetchGroup());
assertSame(bItem, fg.getItem("a.b"));
AttributeItem cItem = aFG.getItem("c");
assertNotNull(cItem);
assertEquals("c", cItem.getAttributeName());
assertNull(cItem.getGroup());
// assertTrue(cItem.useDefaultFetchGroup());
assertSame(cItem, fg.getItem("a.c"));
}
@Test
public void verifyAddAttribute_Nested2() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("test.test.test");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("test"));
AttributeItem testFI = fg.getItems().get("test");
assertNotNull(testFI);
assertEquals("test", testFI.getAttributeName());
testFI = fg.getItem("test");
assertNotNull(testFI);
assertEquals("test", testFI.getAttributeName());
assertNotNull(testFI.getGroup());
AttributeItem testFI2 = testFI.getGroup().getItems().get("test");
assertNotNull(testFI2);
assertEquals("test", testFI2.getAttributeName());
assertNotNull(testFI2.getGroup());
// as of bug 397772 we no longer cascade the name. The functionality was not used anywhere and
//was problematic to maintain for EntityGraph support
assertEquals("test", testFI2.getGroup().getName());
assertFalse(testFI2.getGroup().getItems().isEmpty());
testFI2 = testFI.getGroup().getItem("test");
assertNotNull(testFI2);
assertEquals("test", testFI2.getAttributeName());
assertFalse(testFI2.getGroup().getItems().isEmpty());
assertEquals(1, testFI2.getGroup().getItems().size());
assertTrue(testFI2.getGroup().getItems().containsKey("test"));
assertNotNull(testFI2.getGroup().getItems().get("test"));
testFI2 = fg.getItem("test.test");
assertNotNull(testFI2);
assertEquals("test", testFI2.getGroup().getName());
}
@Test
public void verifyAdd() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("test");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("test"));
assertNotNull(fg.getItems().get("test"));
assertNotNull(fg.getItem("test"));
}
@Test
public void verifyAdd_Nested() {
FetchGroup fg = new FetchGroup();
fg.addAttribute("test.test");
assertEquals(1, fg.getItems().size());
assertTrue(fg.getItems().containsKey("test"));
AttributeItem testFI = fg.getItems().get("test");
assertNotNull(testFI);
assertEquals("test", testFI.getAttributeName());
testFI = fg.getItem("test");
assertNotNull(testFI);
assertEquals("test", testFI.getAttributeName());
assertEquals(1, testFI.getGroup().getItems().size());
assertTrue(testFI.getGroup().getItems().containsKey("test"));
assertNotNull(testFI.getGroup().getItem("test"));
}
}