// Path: drm-core/src/main/java/com/nitorcreations/domain/DomainObject.java
// public class DomainObject {
// 
//     public final String packageName;
//     public final String className;
//     public final String description;
// 
//     public DomainObject(String packageName, String className, String description) {
//         this.packageName = packageName;
//         this.className = className;
//         this.description = description;
//     }
// 
//     public DomainObject(Class<?> clazz, String description) {
//         this(clazz.getPackage().getName(), clazz.getSimpleName(), description);
//     }
// 
//     public DomainObject(Class<?> clazz) {
//         this(clazz, null);
//     }
// 
//     public String getPackageName() {
//         return packageName;
//     }
// 
//     @Override
//     public int hashCode() {
//         return HashCodeBuilder.reflectionHashCode(this);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         return EqualsBuilder.reflectionEquals(this, obj);
//     }
// 
//     @Override
//     public String toString() {
//         return ReflectionToStringBuilder.toString(this);
//     }
// }
// 
// Path: drm-core/src/main/java/com/nitorcreations/domain/Edge.java
// public class Edge {
// 
//     public final DomainObject source;
//     public final DomainObject target;
//     public final EdgeType type;
//     public final Direction direction;
// 
//     public Edge(DomainObject source, DomainObject target, EdgeType type, Direction direction) {
//         this.source = source;
//         this.target = target;
//         this.type = type;
//         this.direction = direction;
//     }
// 
//     public Edge(DomainObject source, DomainObject target, EdgeType type) {
//         this(source, target, type, null);
//     }
// 
//     @Override
//     public final int hashCode() {
//         return HashCodeBuilder.reflectionHashCode(this);
//     }
// 
//     @Override
//     public final boolean equals(Object obj) {
//         return EqualsBuilder.reflectionEquals(this, obj);
//     }
// 
//     @Override
//     public String toString() {
//         return ReflectionToStringBuilder.toString(this);
//     }
// }
// 
// Path: drm-core/src/main/java/com/nitorcreations/domain/EdgeType.java
// public enum EdgeType {
// 
//     ONE_TO_ONE, MANY_TO_ONE, MANY_TO_MANY, ONE_TO_MANY, EXTENDS, INNER_CLASS;
// 
//     public static EdgeType resolveEdgeType(EdgeType source, EdgeType target) {
//         if (source.equals(target)) {
//             switch (source) {
//                 case ONE_TO_ONE:
//                 case MANY_TO_MANY:
//                     return source;
//                 case MANY_TO_ONE:
//                 case ONE_TO_MANY:
//                     return MANY_TO_MANY;
//                 case EXTENDS:
//                 case INNER_CLASS:
//                     throw new RuntimeException("impossible");
//             }
//         }
//         if (source.equals(ONE_TO_ONE)) {
//             return target;
//         } else if (target.equals(ONE_TO_ONE)) {
//             return source;
//         }
//         throw new RuntimeException("impossible");
//     }
// 
// }


import com.google.common.collect.Lists;
import com.nitorcreations.domain.DomainObject;
import com.nitorcreations.domain.Edge;
import com.nitorcreations.domain.EdgeType;
import org.junit.Test;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
package com.nitorcreations.scanners;




public class HierarchyScannerTest {

    private Edge parentToChild = new Edge(new DomainObject(Child.class),
            new DomainObject(Parent.class), EdgeType.EXTENDS);
// Path: drm-core/src/main/java/com/nitorcreations/domain/DomainObject.java
// public class DomainObject {
// 
//     public final String packageName;
//     public final String className;
//     public final String description;
// 
//     public DomainObject(String packageName, String className, String description) {
//         this.packageName = packageName;
//         this.className = className;
//         this.description = description;
//     }
// 
//     public DomainObject(Class<?> clazz, String description) {
//         this(clazz.getPackage().getName(), clazz.getSimpleName(), description);
//     }
// 
//     public DomainObject(Class<?> clazz) {
//         this(clazz, null);
//     }
// 
//     public String getPackageName() {
//         return packageName;
//     }
// 
//     @Override
//     public int hashCode() {
//         return HashCodeBuilder.reflectionHashCode(this);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         return EqualsBuilder.reflectionEquals(this, obj);
//     }
// 
//     @Override
//     public String toString() {
//         return ReflectionToStringBuilder.toString(this);
//     }
// }
// 
// Path: drm-core/src/main/java/com/nitorcreations/domain/Edge.java
// public class Edge {
// 
//     public final DomainObject source;
//     public final DomainObject target;
//     public final EdgeType type;
//     public final Direction direction;
// 
//     public Edge(DomainObject source, DomainObject target, EdgeType type, Direction direction) {
//         this.source = source;
//         this.target = target;
//         this.type = type;
//         this.direction = direction;
//     }
// 
//     public Edge(DomainObject source, DomainObject target, EdgeType type) {
//         this(source, target, type, null);
//     }
// 
//     @Override
//     public final int hashCode() {
//         return HashCodeBuilder.reflectionHashCode(this);
//     }
// 
//     @Override
//     public final boolean equals(Object obj) {
//         return EqualsBuilder.reflectionEquals(this, obj);
//     }
// 
//     @Override
//     public String toString() {
//         return ReflectionToStringBuilder.toString(this);
//     }
// }
// 
// Path: drm-core/src/main/java/com/nitorcreations/domain/EdgeType.java
// public enum EdgeType {
// 
//     ONE_TO_ONE, MANY_TO_ONE, MANY_TO_MANY, ONE_TO_MANY, EXTENDS, INNER_CLASS;
// 
//     public static EdgeType resolveEdgeType(EdgeType source, EdgeType target) {
//         if (source.equals(target)) {
//             switch (source) {
//                 case ONE_TO_ONE:
//                 case MANY_TO_MANY:
//                     return source;
//                 case MANY_TO_ONE:
//                 case ONE_TO_MANY:
//                     return MANY_TO_MANY;
//                 case EXTENDS:
//                 case INNER_CLASS:
//                     throw new RuntimeException("impossible");
//             }
//         }
//         if (source.equals(ONE_TO_ONE)) {
//             return target;
//         } else if (target.equals(ONE_TO_ONE)) {
//             return source;
//         }
//         throw new RuntimeException("impossible");
//     }
// 
// }


// Path: drm-core/src/test/java/com/nitorcreations/scanners/HierarchyScannerTest.java
import com.google.common.collect.Lists;
import com.nitorcreations.domain.DomainObject;
import com.nitorcreations.domain.Edge;
import com.nitorcreations.domain.EdgeType;
import org.junit.Test;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;

package com.nitorcreations.scanners;




public class HierarchyScannerTest {

    private Edge parentToChild = new Edge(new DomainObject(Child.class),
            new DomainObject(Parent.class), EdgeType.EXTENDS);
    private Edge childToGrandChild = new Edge(new DomainObject(GrandChild.class),