package org.bindgen.processor;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.bindgen.Binding;
import org.junit.Test;
public class BasicPropertiesTest extends AbstractBindgenTestCase {
private static final String NAME = "John Doe";
private static final String CITY = "Beverly Hills";
private static final String PACKAGE = "org.bindgen.processor.basic.";
private static String path(String className) {
return PACKAGE.replace(".", "/") + className + ".java";
}
private static String name(String className) {
return PACKAGE + className;
}
@Test
public void shouldCreateDirectBindings() throws Exception {
ClassLoader loader = this.compile(path("Address"));
Class<?> addressClass = loader.loadClass(name("Address"));
Class<?> addressBindingClass = loader.loadClass(name("AddressBinding"));
Object address = addressClass.newInstance();
addressClass.getField("city").set(address, CITY);
//test new AddressBinding(address).city().get()
Object binding = addressBindingClass.getConstructor(addressClass).newInstance(address);
Object cityBinding = addressBindingClass.getMethod("city").invoke(binding);
String city = (String) Binding.class.getMethod("get").invoke(cityBinding);
assertThat(CITY, is(city));
}
@Test
public void shouldCreateRecursiveBindings() throws Exception {
ClassLoader loader = this.compile(path("Address"), path("Person"));
Class<?> addressClass = loader.loadClass(name("Address"));
Class<?> addressBindingPathClass = loader.loadClass(name("AddressBindingPath"));
@SuppressWarnings("unused")
Class<?> addressBindingClass = loader.loadClass(name("AddressBinding"));
Class<?> personClass = loader.loadClass(name("Person"));
Class<?> personBindingClass = loader.loadClass(name("PersonBinding"));
Object address = addressClass.newInstance();
addressClass.getField("city").set(address, CITY);
Object person = personClass.newInstance();
personClass.getField("name").set(person, NAME);
personClass.getField("address").set(person, address);
// test new PersonBinding(person).address().city().get()
Object binding = personBindingClass.getConstructor(personClass).newInstance(person);
Object addressBinding = personBindingClass.getMethod("address").invoke(binding);
Object cityBinding = addressBindingPathClass.getMethod("city").invoke(addressBinding);
String city = (String) Binding.class.getMethod("get").invoke(cityBinding);
assertThat(CITY, is(city));
}
@Test
public void shouldCreateBindingsForSingleLetterGetters() throws Exception {
ClassLoader loader = this.compile(path("Point"));
Class<?> actualClass = loader.loadClass(name("Point"));
assertNotNull(actualClass);
Class<?> bindingClass = loader.loadClass(name("PointBindingPath"));
assertNotNull(bindingClass);
assertMethodDeclared(bindingClass, "x");
assertMethodDeclared(bindingClass, "y");
assertMethodDeclared(bindingClass, "z");
assertMethodDeclared(bindingClass, "zero");
assertMethodDeclared(bindingClass, "origin");
}
}