// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/Association.java
// public enum AssociationType {
// 
//     LINK("-"),
//     DIRECTION("-->"),
//     BI_DIRECTION("<->"),
//     INHERITANCE("<|--");
// 
//     private String symbol;
// 
//     AssociationType(String symbol) {
//         this.symbol = symbol;
//     }
// 
//     @Override
//     public String toString() {
//         return symbol;
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/Cardinality.java
// public enum Cardinality {
// 
//     NONE(""),
//     MANY("*"),
//     ONE("1");
// 
//     private String symbol;
// 
//     Cardinality(String symbol) {
//         this.symbol = symbol;
//     }
// 
//     @Override
//     public String toString() {
//         return symbol;
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/attribute/SimpleAttribute.java
// public class SimpleAttribute implements Attribute {
// 
//     private String type;
//     private String name;
// 
//     public SimpleAttribute(String name, String type) {
//         this.type = type;
//         this.name = name;
//     }
// 
//     @Override
//     public Optional<String> getTypeName() {
//         return Optional.ofNullable(type);
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/clazz/Clazz.java
// public interface Clazz extends Comparable<Clazz> {
// 
//     public String getName();
// 
//     public Type getType();
// 
//     default public Optional<Link> getLink() {
//         return Optional.empty();
//     }
// 
//     public List<? extends Attribute> getAttributes();
// 
//     default public List<? extends Method> getMethods() {
//         return new ArrayList<>();
//     }
// 
//     default public Optional<List<String>> getStereotypes() {
//         return Optional.empty();
//     }
// 
//     default public Optional<String> getBackgroundColor() {
//         return Optional.empty();
//     }
// 
//     default public Optional<String> getBorderColor() {
//         return Optional.empty();
//     }
// 
//     default public void validate() {
//         Validate.notNull(getName(), "Class name must be defined !");
//         Validate.notNull(getType(), String.format("Class '%s' type must be defined !", getName()));
//     }
// 
//     @Override
//     default int compareTo(Clazz clazz) {
//         return getName().compareTo(clazz.getName());
//     }
// 
//     default boolean hasContent() {
//         return !getAttributes().isEmpty() || !getMethods().isEmpty();
//     }
// 
//     enum Type {
//         INTERFACE("interface"),
//         ENUM("enum"),
//         CLASS("class"),
//         ABSTRACT("abstract class");
// 
//         private String name;
// 
//         Type(String name) {
//             this.name = name;
//         }
// 
//         @Override
//         public String toString() {
//             return name;
//         }
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/clazz/SimpleClazz.java
// public class SimpleClazz implements Clazz {
// 
//     private String name;
//     private Type type;
//     private List<Attribute> attributes = new ArrayList<>();
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public Type getType() {
//         return type;
//     }
// 
//     @Override
//     public List<Attribute> getAttributes() {
//         return attributes;
//     }
// 
//     public static SimpleClazz create(String name, Type type, Attribute... attributes) {
//         SimpleClazz c = new SimpleClazz();
//         c.name = name;
//         c.type = type;
//         Stream.of(attributes).forEach(c.attributes::add);
//         return c;
//     }
// }


import ch.ifocusit.plantuml.classdiagram.model.Association.AssociationType;
import ch.ifocusit.plantuml.classdiagram.model.Cardinality;
import ch.ifocusit.plantuml.classdiagram.model.attribute.SimpleAttribute;
import ch.ifocusit.plantuml.classdiagram.model.clazz.Clazz;
import ch.ifocusit.plantuml.classdiagram.model.clazz.SimpleClazz;
import org.junit.Test;
import static org.fest.assertions.Assertions.*;
                        new SimpleAttribute("wheels", "Collection<Wheel>")))
                .build();

        assertThat(diagram).isEqualTo("class \"Car\" {" + CR +
                "  brand : String" + CR +
                "  wheels : Collection<Wheel>" + CR +
                "}" + CR + CR);
    }

    @Test
    public void buildEnum() {
        final String diagram = new PlantUmlBuilder()
                .addType(SimpleClazz.create("Devise", Clazz.Type.ENUM,
                        new SimpleAttribute("CHF", null),
                        new SimpleAttribute("EUR", null),
                        new SimpleAttribute("USD", null)))
                .build();

        assertThat(diagram).isEqualTo("enum \"Devise\" {" + CR +
                "  CHF" + CR +
                "  EUR" + CR +
                "  USD" + CR +
                "}" + CR + CR);
    }

    @Test
    public void buildAssociations() throws Exception {
        String diagram = new PlantUmlBuilder()
                .addAssociation("Vehicule", "Car", AssociationType.INHERITANCE)
                .addAssociation("Car", "Price", AssociationType.DIRECTION, "price")
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/Association.java
// public enum AssociationType {
// 
//     LINK("-"),
//     DIRECTION("-->"),
//     BI_DIRECTION("<->"),
//     INHERITANCE("<|--");
// 
//     private String symbol;
// 
//     AssociationType(String symbol) {
//         this.symbol = symbol;
//     }
// 
//     @Override
//     public String toString() {
//         return symbol;
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/Cardinality.java
// public enum Cardinality {
// 
//     NONE(""),
//     MANY("*"),
//     ONE("1");
// 
//     private String symbol;
// 
//     Cardinality(String symbol) {
//         this.symbol = symbol;
//     }
// 
//     @Override
//     public String toString() {
//         return symbol;
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/attribute/SimpleAttribute.java
// public class SimpleAttribute implements Attribute {
// 
//     private String type;
//     private String name;
// 
//     public SimpleAttribute(String name, String type) {
//         this.type = type;
//         this.name = name;
//     }
// 
//     @Override
//     public Optional<String> getTypeName() {
//         return Optional.ofNullable(type);
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/clazz/Clazz.java
// public interface Clazz extends Comparable<Clazz> {
// 
//     public String getName();
// 
//     public Type getType();
// 
//     default public Optional<Link> getLink() {
//         return Optional.empty();
//     }
// 
//     public List<? extends Attribute> getAttributes();
// 
//     default public List<? extends Method> getMethods() {
//         return new ArrayList<>();
//     }
// 
//     default public Optional<List<String>> getStereotypes() {
//         return Optional.empty();
//     }
// 
//     default public Optional<String> getBackgroundColor() {
//         return Optional.empty();
//     }
// 
//     default public Optional<String> getBorderColor() {
//         return Optional.empty();
//     }
// 
//     default public void validate() {
//         Validate.notNull(getName(), "Class name must be defined !");
//         Validate.notNull(getType(), String.format("Class '%s' type must be defined !", getName()));
//     }
// 
//     @Override
//     default int compareTo(Clazz clazz) {
//         return getName().compareTo(clazz.getName());
//     }
// 
//     default boolean hasContent() {
//         return !getAttributes().isEmpty() || !getMethods().isEmpty();
//     }
// 
//     enum Type {
//         INTERFACE("interface"),
//         ENUM("enum"),
//         CLASS("class"),
//         ABSTRACT("abstract class");
// 
//         private String name;
// 
//         Type(String name) {
//             this.name = name;
//         }
// 
//         @Override
//         public String toString() {
//             return name;
//         }
//     }
// }
// 
// Path: src/main/java/ch/ifocusit/plantuml/classdiagram/model/clazz/SimpleClazz.java
// public class SimpleClazz implements Clazz {
// 
//     private String name;
//     private Type type;
//     private List<Attribute> attributes = new ArrayList<>();
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public Type getType() {
//         return type;
//     }
// 
//     @Override
//     public List<Attribute> getAttributes() {
//         return attributes;
//     }
// 
//     public static SimpleClazz create(String name, Type type, Attribute... attributes) {
//         SimpleClazz c = new SimpleClazz();
//         c.name = name;
//         c.type = type;
//         Stream.of(attributes).forEach(c.attributes::add);
//         return c;
//     }
// }


// Path: src/test/java/ch/ifocusit/plantuml/PlantUmlBuilderTest.java
import ch.ifocusit.plantuml.classdiagram.model.Association.AssociationType;
import ch.ifocusit.plantuml.classdiagram.model.Cardinality;
import ch.ifocusit.plantuml.classdiagram.model.attribute.SimpleAttribute;
import ch.ifocusit.plantuml.classdiagram.model.clazz.Clazz;
import ch.ifocusit.plantuml.classdiagram.model.clazz.SimpleClazz;
import org.junit.Test;
import static org.fest.assertions.Assertions.*;

                        new SimpleAttribute("wheels", "Collection<Wheel>")))
                .build();

        assertThat(diagram).isEqualTo("class \"Car\" {" + CR +
                "  brand : String" + CR +
                "  wheels : Collection<Wheel>" + CR +
                "}" + CR + CR);
    }

    @Test
    public void buildEnum() {
        final String diagram = new PlantUmlBuilder()
                .addType(SimpleClazz.create("Devise", Clazz.Type.ENUM,
                        new SimpleAttribute("CHF", null),
                        new SimpleAttribute("EUR", null),
                        new SimpleAttribute("USD", null)))
                .build();

        assertThat(diagram).isEqualTo("enum \"Devise\" {" + CR +
                "  CHF" + CR +
                "  EUR" + CR +
                "  USD" + CR +
                "}" + CR + CR);
    }

    @Test
    public void buildAssociations() throws Exception {
        String diagram = new PlantUmlBuilder()
                .addAssociation("Vehicule", "Car", AssociationType.INHERITANCE)
                .addAssociation("Car", "Price", AssociationType.DIRECTION, "price")
                .addAssociation("Car", "Wheel", AssociationType.DIRECTION, "wheels", Cardinality.NONE, Cardinality.MANY)