package com.codiform.moo;
import org.junit.Assert;
import org.junit.Test;
import com.codiform.moo.annotation.Property;
public class TranslationCycleTest {
@Test
public void testRecursiveTranslationAvoidsDuplication() {
SourceLoopItem source = new SourceLoopItem();
source.close();
Assert.assertSame(source, source.getSibling());
DestinationLoopItem destination = new Moo().translate(
source, DestinationLoopItem.class);
Assert.assertSame(destination, destination.getSibling());
}
@Test
public void testTranslationCycleAvoidsDuplication() {
SourceLoopItem source = new SourceLoopItem(new SourceLoopItem());
source.close();
Assert.assertNotSame(source, source.getSibling());
Assert.assertSame(source, source.getSibling().getSibling());
DestinationLoopItem destination = new Moo().translate(
source, DestinationLoopItem.class);
Assert.assertNotNull( destination.getSibling() );
Assert.assertNotSame(destination, destination.getSibling());
Assert.assertSame(destination, destination.getSibling().getSibling());
}
private static class SourceLoopItem {
private SourceLoopItem sibling;
public SourceLoopItem() {
// tail node
}
public SourceLoopItem(SourceLoopItem sibling) {
this.sibling = sibling;
}
public void close() {
SourceLoopItem current = this;
while (current.sibling != null)
current = current.sibling;
current.sibling = this;
}
public SourceLoopItem getSibling() {
return sibling;
}
}
public static class DestinationLoopItem {
@Property(translate=true)
private DestinationLoopItem sibling;
public DestinationLoopItem() {
// tail node
}
public DestinationLoopItem getSibling() {
return sibling;
}
}
}