// Path: src/main/java/eu/mrico/creole/Creole.java
// public class Creole {
// 
//     public static Document parse(String s) {
//         try {
//             CreoleParser parser = CreoleParserFactory.newInstance().newParser();
//             return parser.parse(new StringReader(s));
// 
//         } catch (CreoleException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public static Document parse(InputStream in) {
//         try {
//             CreoleParser parser = CreoleParserFactory.newInstance().newParser();
//             return parser.parse(new InputStreamReader(in));
// 
//         } catch (CreoleException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public static void main(String args[]) throws CreoleException {
//         Document document = Creole.parse(System.in);
//         new XHtmlWriter().write(document, System.out);
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Document.java
// public class Document extends BaseElement {
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public String toString() {
//         return "Document{ " + children + " }";
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Heading.java
// public class Heading extends Text {
// 
//     private int level;
// 
//     public int getLevel() {
//         return level;
//     }
// 
//     public Heading(int level, String text) {
//         super(text);
//         this.level = level;
//     }
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = super.hashCode();
//         result = prime * result + level;
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (!super.equals(obj)) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         Heading other = (Heading) obj;
//         if (level != other.level) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "Heading" + level + "[" + getValue() + "]";
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Paragraph.java
// public class Paragraph extends BaseElement {
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public boolean canClean() {
//         return children.isEmpty();
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Text.java
// public class Text extends BaseElement {
// 
//     private String value;
// 
//     public Text(Character c) {
//         this.value = c.toString();
//     }
// 
//     public Text(String value) {
//         this.value = value;
//     }
// 
//     public String getValue() {
//         return value;
//     }
// 
//     public static Text[] asArray(String s) {
//         char[] cs = s.toCharArray();
//         Text[] arr = new Text[cs.length];
//         for (int i = 0; i < cs.length; i++) {
//             arr[i] = new Text(cs[i]);
//         }
// 
//         return arr;
//     }
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = super.hashCode();
//         result = prime * result + ((value == null) ? 0 : value.hashCode());
//         return result;
// 
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (!super.equals(obj)) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         Text other = (Text) obj;
//         if (value == null) {
//             if (other.value != null) {
//                 return false;
//             }
//         } else if (!value.equals(other.value)) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "Text[" + value + "]";
//     }
// }


import org.junit.Test;
import static org.junit.Assert.*;
import eu.mrico.creole.Creole;
import eu.mrico.creole.ast.Document;
import eu.mrico.creole.ast.Heading;
import eu.mrico.creole.ast.Paragraph;
import eu.mrico.creole.ast.Text;

package eu.mrico.creole.test;




/**
 * @see http://www.wikicreole.org/wiki/Creole1.0#section-Creole1.0-Headings
 */
public class HeadingsTest {
    
    @Test   
    public void level1WithClosing() {
        Document is = Creole.parse("= Level 1 (largest) =");
        
        Document expected = (Document) new Document()
            .add(new Heading(1, "Level 1 (largest)"));
        
        assertEquals(expected, is);
    }
    
    @Test
    public void level2WithoutClosing() {
        Document is = Creole.parse("== Level 2\n" +

// Path: src/main/java/eu/mrico/creole/Creole.java
// public class Creole {
// 
//     public static Document parse(String s) {
//         try {
//             CreoleParser parser = CreoleParserFactory.newInstance().newParser();
//             return parser.parse(new StringReader(s));
// 
//         } catch (CreoleException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public static Document parse(InputStream in) {
//         try {
//             CreoleParser parser = CreoleParserFactory.newInstance().newParser();
//             return parser.parse(new InputStreamReader(in));
// 
//         } catch (CreoleException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public static void main(String args[]) throws CreoleException {
//         Document document = Creole.parse(System.in);
//         new XHtmlWriter().write(document, System.out);
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Document.java
// public class Document extends BaseElement {
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public String toString() {
//         return "Document{ " + children + " }";
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Heading.java
// public class Heading extends Text {
// 
//     private int level;
// 
//     public int getLevel() {
//         return level;
//     }
// 
//     public Heading(int level, String text) {
//         super(text);
//         this.level = level;
//     }
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = super.hashCode();
//         result = prime * result + level;
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (!super.equals(obj)) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         Heading other = (Heading) obj;
//         if (level != other.level) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "Heading" + level + "[" + getValue() + "]";
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Paragraph.java
// public class Paragraph extends BaseElement {
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public boolean canClean() {
//         return children.isEmpty();
//     }
// }
// 
// Path: src/main/java/eu/mrico/creole/ast/Text.java
// public class Text extends BaseElement {
// 
//     private String value;
// 
//     public Text(Character c) {
//         this.value = c.toString();
//     }
// 
//     public Text(String value) {
//         this.value = value;
//     }
// 
//     public String getValue() {
//         return value;
//     }
// 
//     public static Text[] asArray(String s) {
//         char[] cs = s.toCharArray();
//         Text[] arr = new Text[cs.length];
//         for (int i = 0; i < cs.length; i++) {
//             arr[i] = new Text(cs[i]);
//         }
// 
//         return arr;
//     }
// 
//     @Override
//     public void accept(Visitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = super.hashCode();
//         result = prime * result + ((value == null) ? 0 : value.hashCode());
//         return result;
// 
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (!super.equals(obj)) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         Text other = (Text) obj;
//         if (value == null) {
//             if (other.value != null) {
//                 return false;
//             }
//         } else if (!value.equals(other.value)) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "Text[" + value + "]";
//     }
// }


// Path: src/test/java/eu/mrico/creole/test/HeadingsTest.java
import org.junit.Test;
import static org.junit.Assert.*;
import eu.mrico.creole.Creole;
import eu.mrico.creole.ast.Document;
import eu.mrico.creole.ast.Heading;
import eu.mrico.creole.ast.Paragraph;
import eu.mrico.creole.ast.Text;

package eu.mrico.creole.test;




/**
 * @see http://www.wikicreole.org/wiki/Creole1.0#section-Creole1.0-Headings
 */
public class HeadingsTest {
    
    @Test   
    public void level1WithClosing() {
        Document is = Creole.parse("= Level 1 (largest) =");
        
        Document expected = (Document) new Document()
            .add(new Heading(1, "Level 1 (largest)"));
        
        assertEquals(expected, is);
    }
    
    @Test
    public void level2WithoutClosing() {
        Document is = Creole.parse("== Level 2\n" +

                "Test.");
