package com.codiform.moo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import org.junit.Test;
import com.codiform.moo.annotation.Property;
import com.codiform.moo.curry.Update;
public class NestedUpdateTest {
@Test
public void testUpdateModifiesButDoesNotReplaceClassIfUpdateFlagSet() {
OuterSource source = new OuterSource( new InnerSource( "Source" ) );
InnerDestination dinner = new InnerDestination( "Dest" );
UpdateDestination destination = new UpdateDestination( dinner );
Update.from( source ).to( destination );
assertSame( dinner, destination.getInner() );
assertEquals( "Source", destination.getInner().getName() );
}
@Test
public void testUpdateReplacesPreExistingClassWithTranslatedClassIfUpdateFlagNotSet() {
OuterSource source = new OuterSource( new InnerSource( "Source" ) );
InnerDestination dinner = new InnerDestination( "Dest" );
ReplaceDestination destination = new ReplaceDestination( dinner );
Update.from( source ).to( destination );
assertNotSame( dinner, destination.getInner() );
assertSame( InnerDestination.class, destination.getInner().getClass() );
assertEquals( "Source", destination.getInner().getName() );
}
public static class OuterSource {
private InnerSource inner;
public OuterSource(InnerSource inner) {
this.inner = inner;
}
public InnerSource getInner() {
return inner;
}
}
public static class InnerSource {
private String name;
public InnerSource(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static class UpdateDestination {
@Property(update=true)
private InnerDestination inner;
protected UpdateDestination() {
// just for translation
}
public UpdateDestination(InnerDestination inner) {
this.inner = inner;
}
public InnerDestination getInner() {
return inner;
}
}
public static class ReplaceDestination {
@Property(translate=true)
private InnerDestination inner;
protected ReplaceDestination() {
// just for translation
}
public ReplaceDestination(InnerDestination inner) {
this.inner = inner;
}
public InnerDestination getInner() {
return inner;
}
}
public static class InnerDestination {
private String name;
protected InnerDestination() {
// just for translation
}
public InnerDestination(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}