/**
* 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.cxf.tools.corba.idlpreprocessor;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.HashMap;
import java.util.regex.Pattern;
import junit.framework.TestCase;
public class IdlPreprocessorReaderTest extends TestCase {
private URL findTestResource(String spec) {
String location = "/idlpreprocessor/" + spec;
return getClass().getResource(location);
}
private class ClassPathIncludeResolver implements IncludeResolver {
public URL findSystemInclude(String spec) {
return findUserInclude(spec);
}
public URL findUserInclude(String spec) {
return findTestResource(spec);
}
}
public void testResolvedInA() throws Exception {
final String location = "A.idl";
final IdlPreprocessorReader includeReader = createPreprocessorReader(location);
final String expectedResultLocation = "A-resolved.idl";
assertExpectedPreprocessingResult(expectedResultLocation, includeReader);
}
public void testMultiFileResolve() throws Exception {
final String location = "B.idl";
final IdlPreprocessorReader includeReader = createPreprocessorReader(location);
final String expectedResultLocation = "B-resolved.idl";
assertExpectedPreprocessingResult(expectedResultLocation, includeReader);
}
public void testIfElseHandling() throws Exception {
final String location = "C.idl";
final IdlPreprocessorReader includeReader = createPreprocessorReader(location);
final String expectedResultLocation = "C-resolved.idl";
assertExpectedPreprocessingResult(expectedResultLocation, includeReader);
}
public void testMaximumIncludeDepthIsDetected() throws IOException {
final String location = "MaximumIncludeDepthExceeded.idl";
try {
final IdlPreprocessorReader preprocessor = createPreprocessorReader(location);
consumeReader(preprocessor);
fail("exeeding maximum include depth is not detected");
} catch (PreprocessingException ex) {
String msg = ex.getMessage();
assertTrue(Pattern.matches(".*more than .* nested #includes.*", msg));
}
}
public void testUnresolvableInclude() throws IOException {
final String location = "UnresolvableInclude.idl";
try {
final IdlPreprocessorReader preprocessor = createPreprocessorReader(location);
consumeReader(preprocessor);
fail("unresolvable include not detected");
} catch (PreprocessingException ex) {
assertTrue(ex.getMessage().indexOf("nirvana.idl") >= 0);
assertEquals(1, ex.getLine());
assertTrue(ex.getUrl().getPath().endsWith("/UnresolvableInclude.idl"));
}
}
public void testDefaultIncludeResolver() throws Exception {
final String location = "B.idl";
// uses <> notation for include
final URL orig = findTestResource(location);
final File origFile = new File(orig.toURI());
final File dir = new File(origFile.getAbsolutePath()
.substring(0, origFile.getAbsolutePath().indexOf(location)));
final DefaultIncludeResolver includeResolver = new DefaultIncludeResolver(dir);
final DefineState defineState = new DefineState(new HashMap<String, String>());
final IdlPreprocessorReader includeReader = new IdlPreprocessorReader(orig,
location,
includeResolver,
defineState);
final String expectedResultLocation = "B-resolved.idl";
assertExpectedPreprocessingResult(expectedResultLocation, includeReader);
}
private IdlPreprocessorReader createPreprocessorReader(final String location) throws IOException {
final URL orig = findTestResource(location);
final ClassPathIncludeResolver includeResolver = new ClassPathIncludeResolver();
final DefineState defineState = new DefineState(new HashMap<String, String>());
return new IdlPreprocessorReader(orig, location, includeResolver, defineState);
}
private void assertExpectedPreprocessingResult(final String expectedResultLocation,
final IdlPreprocessorReader includeReader)
throws UnsupportedEncodingException, IOException {
LineNumberReader oReader = new LineNumberReader(includeReader);
InputStream resolved = findTestResource(expectedResultLocation).openStream();
LineNumberReader rReader = new LineNumberReader(new InputStreamReader(resolved, "ISO-8859-1"));
try {
boolean eof = false;
do {
int line = rReader.getLineNumber() + 1;
String actualLine = oReader.readLine();
String expectedLine = rReader.readLine();
assertEquals("difference in line " + line, expectedLine, actualLine);
eof = actualLine == null || expectedLine == null;
} while (!eof);
} finally {
rReader.close();
}
}
private void consumeReader(final Reader includeReader) throws IOException {
LineNumberReader oReader = new LineNumberReader(includeReader);
String line = null;
do {
line = oReader.readLine();
} while (line != null);
}
}