// Path: src/test/java/org/fuin/ddd4j/test/AId.java
// public class AId implements ImplRootId {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public static final EntityType TYPE = new StringBasedEntityType("A");
// 
//     private final long id;
// 
//     public AId(final long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public EntityType getType() {
//         return TYPE;
//     }
// 
//     @Override
//     public String asString() {
//         return "" + id;
//     }
// 
//     @Override
//     public String asTypedString() {
//         return getType() + " " + asString();
//     }
// 
//     @Override
//     public String toString() {
//         return "AId [id=" + id + "]";
//     }
// 
// }
// 
// Path: src/test/java/org/fuin/ddd4j/test/BId.java
// public class BId implements EntityId {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public static final EntityType TYPE = new StringBasedEntityType("B");
// 
//     private final long id;
// 
//     public BId(final long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public EntityType getType() {
//         return TYPE;
//     }
// 
//     @Override
//     public String asString() {
//         return "" + id;
//     }
// 
//     @Override
//     public String asTypedString() {
//         return getType() + " " + asString();
//     }
// 
//     @Override
//     public String toString() {
//         return "BId [id=" + id + "]";
//     }
// 
// }
// 
// Path: src/test/java/org/fuin/ddd4j/test/CId.java
// public class CId implements EntityId {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public static final EntityType TYPE = new StringBasedEntityType("C");
// 
//     private final long id;
// 
//     public CId(final long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public EntityType getType() {
//         return TYPE;
//     }
// 
//     @Override
//     public String asString() {
//         return "" + id;
//     }
// 
//     @Override
//     public String asTypedString() {
//         return getType() + " " + asString();
//     }
// 
//     @Override
//     public String toString() {
//         return "CId [id=" + id + "]";
//     }
// 
// }


import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.util.Iterator;
import org.fuin.ddd4j.test.AId;
import org.fuin.ddd4j.test.BId;
import org.fuin.ddd4j.test.CId;
import org.fuin.objects4j.common.ConstraintViolationException;
import org.junit.Test;

        path = testee.toVO("A 1/B 2/C 3");
        first = path.first();
        last = path.last();
        assertValues(first, AId.class, "A", 1L);
        assertValues(last, CId.class, "C", 3L);
        it = path.iterator();
        assertValues(it.next(), AId.class, "A", 1L);
        assertValues(it.next(), BId.class, "B", 2L);
        assertValues(it.next(), CId.class, "C", 3L);
        assertThat(it.hasNext()).isFalse();

    }

    private void assertValues(EntityId entityId, Class<?> typeClass, String type, long id) {
        assertThat(entityId).isInstanceOf(typeClass);
        assertThat(entityId.getType().asString()).isEqualTo(type);
        assertThat(entityId.asString()).isEqualTo("" + id);
    }

    private static final class MyIdFactory implements EntityIdFactory {

        @Override
        public EntityId createEntityId(final String type, final String id) {
            if (type.equals("A")) {
                return new AId(Long.valueOf(id));
            }
            if (type.equals("B")) {
                return new BId(Long.valueOf(id));
            }
            if (type.equals("C")) {

// Path: src/test/java/org/fuin/ddd4j/test/AId.java
// public class AId implements ImplRootId {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public static final EntityType TYPE = new StringBasedEntityType("A");
// 
//     private final long id;
// 
//     public AId(final long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public EntityType getType() {
//         return TYPE;
//     }
// 
//     @Override
//     public String asString() {
//         return "" + id;
//     }
// 
//     @Override
//     public String asTypedString() {
//         return getType() + " " + asString();
//     }
// 
//     @Override
//     public String toString() {
//         return "AId [id=" + id + "]";
//     }
// 
// }
// 
// Path: src/test/java/org/fuin/ddd4j/test/BId.java
// public class BId implements EntityId {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public static final EntityType TYPE = new StringBasedEntityType("B");
// 
//     private final long id;
// 
//     public BId(final long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public EntityType getType() {
//         return TYPE;
//     }
// 
//     @Override
//     public String asString() {
//         return "" + id;
//     }
// 
//     @Override
//     public String asTypedString() {
//         return getType() + " " + asString();
//     }
// 
//     @Override
//     public String toString() {
//         return "BId [id=" + id + "]";
//     }
// 
// }
// 
// Path: src/test/java/org/fuin/ddd4j/test/CId.java
// public class CId implements EntityId {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public static final EntityType TYPE = new StringBasedEntityType("C");
// 
//     private final long id;
// 
//     public CId(final long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public EntityType getType() {
//         return TYPE;
//     }
// 
//     @Override
//     public String asString() {
//         return "" + id;
//     }
// 
//     @Override
//     public String asTypedString() {
//         return getType() + " " + asString();
//     }
// 
//     @Override
//     public String toString() {
//         return "CId [id=" + id + "]";
//     }
// 
// }


// Path: src/test/java/org/fuin/ddd4j/ddd/EntityIdPathConverterTest.java
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.util.Iterator;
import org.fuin.ddd4j.test.AId;
import org.fuin.ddd4j.test.BId;
import org.fuin.ddd4j.test.CId;
import org.fuin.objects4j.common.ConstraintViolationException;
import org.junit.Test;

        path = testee.toVO("A 1/B 2/C 3");
        first = path.first();
        last = path.last();
        assertValues(first, AId.class, "A", 1L);
        assertValues(last, CId.class, "C", 3L);
        it = path.iterator();
        assertValues(it.next(), AId.class, "A", 1L);
        assertValues(it.next(), BId.class, "B", 2L);
        assertValues(it.next(), CId.class, "C", 3L);
        assertThat(it.hasNext()).isFalse();

    }

    private void assertValues(EntityId entityId, Class<?> typeClass, String type, long id) {
        assertThat(entityId).isInstanceOf(typeClass);
        assertThat(entityId.getType().asString()).isEqualTo(type);
        assertThat(entityId.asString()).isEqualTo("" + id);
    }

    private static final class MyIdFactory implements EntityIdFactory {

        @Override
        public EntityId createEntityId(final String type, final String id) {
            if (type.equals("A")) {
                return new AId(Long.valueOf(id));
            }
            if (type.equals("B")) {
                return new BId(Long.valueOf(id));
            }
            if (type.equals("C")) {

                return new CId(Long.valueOf(id));
