/*****************************************************************
* 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.tools;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class CayenneGeneratorIntegrationTest {
private File testDir;
private void startTest(String testName) {
testDir = new File("target/generated-tests", testName);
assertTrue(testDir.isDirectory());
}
/**
* Test single classes with a non-standard template.
*/
@Test
public void testSingleClassesCustTemplate() throws Exception {
startTest("single-classes-cust-template");
assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
"CayenneDataObject");
assertExists("org/apache/cayenne/testdo/testmap/_Artist.java");
}
/** Test single classes generation including full package path. */
@Test
public void testSingleClasses1() throws Exception {
startTest("single-classes1");
assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
"CayenneDataObject");
assertExists("org/apache/cayenne/testdo/testmap/_Artist.java");
}
/** Test single classes generation ignoring package path. */
@Test
public void testSingleClasses2() throws Exception {
startTest("single-classes2");
assertContents("Artist.java", "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
assertExists("_Artist.java");
assertExists("org/apache/cayenne/testdo/testmap/Artist.java");
}
/** Test pairs generation including full package path. */
@Test
public void testPairs1() throws Exception {
startTest("pairs1");
assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
"_Artist");
assertContents("org/apache/cayenne/testdo/testmap/auto/_Artist.java", "_Artist",
"org.apache.cayenne.testdo.testmap.auto", "CayenneDataObject");
}
/** Test pairs generation in the same directory. */
@Test
public void testPairs2() throws Exception {
startTest("pairs2");
assertContents("Artist.java", "Artist", "org.apache.cayenne.testdo.testmap", "_Artist");
assertContents("_Artist.java", "_Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
assertExists("org/apache/cayenne/testdo/testmap/Artist.java");
}
/**
* Test pairs generation including full package path with superclass and
* subclass in different packages.
*/
@Test
public void testPairs3() throws Exception {
startTest("pairs3");
assertContents("org/apache/cayenne/testdo/testmap/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap",
"_Artist");
assertContents("org/apache/cayenne/testdo/testmap/superart/_Artist.java", "_Artist",
"org.apache.cayenne.testdo.testmap.superart", "CayenneDataObject");
}
@Test
public void testPairs1_client() throws Exception {
startTest("pairs1-client");
assertContents("org/apache/cayenne/testdo/testmap/client/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap.client",
"_Artist");
assertContents("org/apache/cayenne/testdo/testmap/client/superart/_Artist.java", "_Artist",
"org.apache.cayenne.testdo.testmap.client.superart", "PersistentObject");
}
@Test
public void testPairsEmbeddable3() throws Exception {
startTest("pairs-embeddables3");
assertContents("org/apache/cayenne/testdo/embeddable/EmbedEntity1.java", "EmbedEntity1",
"org.apache.cayenne.testdo.embeddable", "_EmbedEntity1");
assertContents("org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java", "_EmbedEntity1",
"org.apache.cayenne.testdo.embeddable.auto", "CayenneDataObject");
assertContents("org/apache/cayenne/testdo/embeddable/Embeddable1.java", "Embeddable1",
"org.apache.cayenne.testdo.embeddable", "_Embeddable1");
assertContents("org/apache/cayenne/testdo/embeddable/auto/_Embeddable1.java", "_Embeddable1",
"org.apache.cayenne.testdo.embeddable.auto", "Object");
}
private String convertPath(String unixPath) {
return unixPath.replace('/', File.separatorChar);
}
private void assertContents(String filePath, String className, String packageName, String extendsName)
throws Exception {
File f = new File(testDir, convertPath(filePath));
assertTrue("Not a file: " + f.getAbsolutePath(), f.isFile());
assertContents(f, className, packageName, extendsName);
}
private void assertExists(String filePath) {
File f = new File(testDir, convertPath(filePath));
assertFalse(f.exists());
}
private void assertContents(File f, String className, String packageName, String extendsName) throws Exception {
try(BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f)))) {
assertPackage(in, packageName);
assertClass(in, className, extendsName);
}
}
private void assertPackage(BufferedReader in, String packageName) throws Exception {
String s = null;
while ((s = in.readLine()) != null) {
if (Pattern.matches("^package\\s+([^\\s;]+);", s)) {
assertTrue(s.indexOf(packageName) > 0);
return;
}
}
fail("No package declaration found.");
}
private void assertClass(BufferedReader in, String className, String extendsName) throws Exception {
Pattern classPattern = Pattern.compile("^public\\s+");
String s = null;
while ((s = in.readLine()) != null) {
if (classPattern.matcher(s).find()) {
assertTrue(s.indexOf(className) > 0);
assertTrue(s.indexOf(extendsName) > 0);
assertTrue(s.indexOf(className) < s.indexOf(extendsName));
return;
}
}
fail("No class declaration found.");
}
}