package com.flickr4java.flickr.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import com.flickr4java.flickr.FlickrException; import com.flickr4java.flickr.reflection.ReflectionInterface; import com.flickr4java.flickr.util.IOUtilities; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Iterator; import java.util.Properties; /** * Tests the basic completeness of the api. * * @author till (Till Krech) flickr:extranoise * */ public class CompletenessTest extends Flickr4JavaTest { Properties replacements; @Override @Before public void setUp() throws FlickrException { super.setUp(); InputStream in = null; try { in = getClass().getResourceAsStream("/completenesstest.properties"); replacements = new Properties(); replacements.load(in); } catch (IOException e) { fail(e.getMessage()); } finally { IOUtilities.close(in); } } // Test disabled in normal circumstances - just enable when you want to test completeness @Ignore @Test public void testIfComplete() throws FlickrException { ReflectionInterface ri = flickr.getReflectionInterface(); Iterator<String> mit = ri.getMethods().iterator(); int notFound = 0; while (mit.hasNext()) { String method = mit.next(); if (!checkMethod(method)) { notFound++; } } assertEquals(0, notFound); } private boolean checkMethod(String fullMethodName) { String repl = getReplacement(fullMethodName); String methodName; String fqClassName; if (repl != null) { if ("skip".equals(repl)) { return true; } fqClassName = repl.substring(0, repl.lastIndexOf('.')); methodName = repl.substring(repl.lastIndexOf('.') + 1); } else { int dotIdx = fullMethodName.lastIndexOf('.'); String pack = fullMethodName.substring(0, dotIdx); methodName = fullMethodName.substring(dotIdx + 1); dotIdx = pack.lastIndexOf('.'); String candidate = pack.substring(dotIdx + 1); String javaPack = "com.flickr4java." + pack; String className = Character.toUpperCase(candidate.charAt(0)) + candidate.substring(1) + "Interface"; fqClassName = javaPack + "." + className; } boolean found = false; try { Class<?> cl = Class.forName(fqClassName); Method[] javaMethods = cl.getMethods(); for (Method javaMethod : javaMethods) { if (javaMethod.getName().equals(methodName)) { found = true; break; } } if (!found) { System.out.println("ATTENTION: Method not implemented in Flickr4Java: " + fqClassName + "." + methodName); } } catch (ClassNotFoundException e) { System.out.println("ATTENTION: Class not implemented in Flickr4Java: [" + fqClassName + "] (Method: " + methodName + ")"); } return found; } private String getReplacement(String fullMethodName) { String repl = replacements.getProperty(fullMethodName); if (repl == null) { String meth = fullMethodName.substring(fullMethodName.lastIndexOf('.') + 1); @SuppressWarnings("rawtypes") Iterator keys = replacements.keySet().iterator(); while (keys.hasNext()) { String key = (String) keys.next(); if (key.endsWith(".*")) { String keyPack = key.substring(0, key.length() - 2); String methPack = fullMethodName.substring(0, fullMethodName.lastIndexOf('.')); if (keyPack.equals(methPack)) { String cls = replacements.getProperty(key); if (cls.endsWith(".*")) { cls = cls.substring(0, cls.length() - 2); } repl = cls + "." + meth; break; } } } } return repl; } }