/*
* 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.jena.reasoner.test;
import java.util.Iterator ;
import org.apache.jena.rdf.model.Resource ;
import org.apache.jena.rdf.model.Statement ;
import org.junit.Assert ;
import junit.framework.TestCase ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
/**
* Collection of utilities to assist with unit testing.
*/
public class TestUtil {
/**
* Helper method to test an iterator against a list of objects - order independent
* @param testCase The JUnit test case that is invoking this helper
* @param it The iterator to test
* @param vals The expected values of the iterator
*/
public static void assertIteratorValues(TestCase testCase, Iterator<?> it, Object[] vals) {
assertIteratorValues( testCase, it, vals, 0 );
}
/**
* Helper method to test an iterator against a list of objects - order independent, and
* can optionally check the count of anonymous resources. This allows us to test a
* iterator of resource values which includes both URI nodes and bNodes.
* @param testCase The JUnit test case that is invoking this helper
* @param it The iterator to test
* @param vals The expected values of the iterator
* @param countAnon If non zero, count the number of anonymous resources returned by <code>it</code>,
* and don't check these resources against the expected <code>vals</code>.
*/
public static void assertIteratorValues(TestCase testCase, Iterator<?> it, Object[] vals, int countAnon ) {
Logger logger = LoggerFactory.getLogger( testCase.getClass() );
boolean[] found = new boolean[vals.length];
int anonFound = 0;
for (int i = 0; i < vals.length; i++) found[i] = false;
while (it.hasNext()) {
Object n = it.next();
boolean gotit = false;
// do bNodes separately
if (countAnon > 0 && isAnonValue( n )) {
anonFound++;
continue;
}
for (int i = 0; i < vals.length; i++) {
if (n.equals(vals[i])) {
gotit = true;
found[i] = true;
}
}
if (!gotit) {
logger.debug( testCase.getName() + " found unexpected iterator value: " + n);
}
Assert.assertTrue( testCase.getName() + " found unexpected iterator value: " + n, gotit);
}
// check that no expected values were unfound
for (int i = 0; i < vals.length; i++) {
if (!found[i]) {
// for (int j = 0; j < vals.length; j += 1) System.err.println( "#" + j + ": " + vals[j] );
logger.debug( testCase.getName() + " failed to find expected iterator value: " + vals[i]);
}
Assert.assertTrue(testCase.getName() + " failed to find expected iterator value: " + vals[i], found[i]);
}
// check we got the right no. of anons
Assert.assertEquals( testCase.getName() + " iterator test did not find the right number of anon. nodes", countAnon, anonFound );
}
/**
* Replace all blocks of white space by a single space character, just
* used for creating test cases.
*
* @param src the original string
* @return normalized version of src
*/
public static String normalizeWhiteSpace(String src) {
StringBuilder result = new StringBuilder(src.length());
boolean inWhitespaceBlock = false;
for (int i = 0; i < src.length(); i++) {
char c = src.charAt(i);
if (Character.isWhitespace(c)) {
if (!inWhitespaceBlock) {
result.append(" ");
inWhitespaceBlock = true;
}
} else {
inWhitespaceBlock = false;
result.append(c);
}
}
return result.toString();
}
/**
* Check the length of an iterator.
*/
public static void assertIteratorLength(Iterator<?> it, int expectedLength) {
int length = 0;
while (it.hasNext()) {
it.next();
length++;
}
Assert.assertEquals(expectedLength, length);
}
/**
* For the purposes of counting, a value is anonymous if (a) it is an anonymous resource,
* or (b) it is a statement with a bNode subject or (c) it is a statement with a bNode
* object. This is because we cannot check bNode identity against fixed expected data values.
* @param n A value
* @return True if n is anonymous
*/
protected static boolean isAnonValue( Object n ) {
return ((n instanceof Resource) && ((Resource) n).isAnon()) ||
((n instanceof Statement) && ((Statement) n).getSubject().isAnon()) ||
((n instanceof Statement) && isAnonValue( ((Statement) n).getObject() ));
}
}