// Path: code/api/src/main/java/ar/edu/itba/tpf/chatterbot/model/LeafNode.java
// @Entity
// public class LeafNode extends TreeNode {
//     private static final long serialVersionUID = 0L;
// 
//     LeafNode() {
//     }
// 
//     /**
//      * Construye un <code>LeafNode</code> completando únicamente la información del <code>Node</code> del que hereda.
//      * 
//      * @param action Acción a realizar cuando el chatterbot está en el nodo.
//      * @param keywords Palabras clave que hacen que el chatterbot llegue a este nodo.
//      * @param description Descripción del nodo.
//      * @param answer Respuesta que el chatterbot emite cuando estando el el nodo.
//      * @param errorTransition Transición de error.
//      */
//     public LeafNode(Action action, String keywords, String description, String answer, TreeNode errorTransition) {
//         super(action, keywords, description, answer, errorTransition);
//     }
// 
//     @Override
//     public boolean hasTransitions() {
//         return false;
//     }
// }
// 
// Path: code/api/src/main/java/ar/edu/itba/tpf/chatterbot/model/TreeNode.java
// @Entity
// public abstract class TreeNode extends AbstractNode {
// 
//     private static final long serialVersionUID = 1L;
// 
//     @ManyToOne()
//     protected InternalNode parent;
// 
//     @ManyToOne()
//     private TreeNode errorTransition;
// 
//     /* Quienes me tienen en sus transiciones de error */
//     @OneToMany(mappedBy = "errorTransition", cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
//     private Collection<TreeNode> references = new ArrayList<TreeNode>();
// 
//     TreeNode() {
//     }
// 
//     /**
//      * Construye un <code>TreeNode</code> completando únicamente la información del <code>Node</code> del que hereda.
//      * 
//      * @param action Acción a realizar cuando el chatterbot está en el nodo.
//      * @param keywords Palabras clave que hacen que el chatterbot llegue a este nodo.
//      * @param description Descripción del nodo.
//      * @param answer Respuesta que el chatterbot emite cuando estando el el nodo.
//      * @param errorTransition Transición de error a la que se pasa si ocurre un error durante la ejecución de una
//      *            acción.
//      */
//     public TreeNode(Action action, String keywords, String description, String answer, TreeNode errorTransition) {
//         super(action, keywords, description, answer);
//         setErrorTransition(errorTransition);
//     }
// 
//     /**
//      * @see ar.edu.itba.tpf.chatterbot.model.GlobalNode#hasTransitions()
//      */
//     public abstract boolean hasTransitions();
// 
//     /**
//      * @return Nodo padre del nodo.
//      */
//     public InternalNode getParent() {
//         return parent;
//     }
// 
//     /**
//      * @return Transición de error.
//      */
//     public TreeNode getErrorTransition() {
//         return errorTransition;
//     }
// 
//     /**
//      * @param errorTransition Transición de error.
//      */
//     public void setErrorTransition(TreeNode errorTransition) {
//         if ((this.errorTransition == null && errorTransition == null)
//                 || (this.errorTransition != null && errorTransition != null && this.errorTransition
//                         .equals(errorTransition))) {
//             return;
//         }
//         if (this.errorTransition != null) {
//             // System.out.println("setErrorTransition: sacandome de mi padre anterior");
//             this.errorTransition.getReferences().remove(this);
//         }
// 
//         this.errorTransition = errorTransition;
//         if (this.errorTransition != null) {
//             // System.out.println("setErrorTransition: poniendome en mi nuevo padre");
//             this.errorTransition.getReferences().add(this);
//         }
//     }
// 
//     public Collection<TreeNode> getReferences() {
//         return references;
//     }
// 
// }


import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import ar.edu.itba.tpf.chatterbot.model.InternalNode;
import ar.edu.itba.tpf.chatterbot.model.LeafNode;
import ar.edu.itba.tpf.chatterbot.model.TreeNode;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
package ar.edu.itba.tpf.chatterbot.dao;




public class TreeNodeDAOTest extends GenericDAOTest<TreeNode> {

    @Autowired
    private TreeNodeDAO treeNodeDAO;
    
    @Override
    protected GenericDAO<TreeNode, Long> getDao() {
        return treeNodeDAO;
    }
    @Override
    protected TreeNode getSample() {
        return new InternalNode(null, "test", "test", "test", null);
    }
    @Override
    protected void updateSample(TreeNode sample) {
        sample.setDescription("test2");
    }
    
    @Test
    public void testFindRootNode() {
        InternalNode rootNode = new InternalNode(null, "keywords", "root", "answer", null);
// Path: code/api/src/main/java/ar/edu/itba/tpf/chatterbot/model/LeafNode.java
// @Entity
// public class LeafNode extends TreeNode {
//     private static final long serialVersionUID = 0L;
// 
//     LeafNode() {
//     }
// 
//     /**
//      * Construye un <code>LeafNode</code> completando únicamente la información del <code>Node</code> del que hereda.
//      * 
//      * @param action Acción a realizar cuando el chatterbot está en el nodo.
//      * @param keywords Palabras clave que hacen que el chatterbot llegue a este nodo.
//      * @param description Descripción del nodo.
//      * @param answer Respuesta que el chatterbot emite cuando estando el el nodo.
//      * @param errorTransition Transición de error.
//      */
//     public LeafNode(Action action, String keywords, String description, String answer, TreeNode errorTransition) {
//         super(action, keywords, description, answer, errorTransition);
//     }
// 
//     @Override
//     public boolean hasTransitions() {
//         return false;
//     }
// }
// 
// Path: code/api/src/main/java/ar/edu/itba/tpf/chatterbot/model/TreeNode.java
// @Entity
// public abstract class TreeNode extends AbstractNode {
// 
//     private static final long serialVersionUID = 1L;
// 
//     @ManyToOne()
//     protected InternalNode parent;
// 
//     @ManyToOne()
//     private TreeNode errorTransition;
// 
//     /* Quienes me tienen en sus transiciones de error */
//     @OneToMany(mappedBy = "errorTransition", cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
//     private Collection<TreeNode> references = new ArrayList<TreeNode>();
// 
//     TreeNode() {
//     }
// 
//     /**
//      * Construye un <code>TreeNode</code> completando únicamente la información del <code>Node</code> del que hereda.
//      * 
//      * @param action Acción a realizar cuando el chatterbot está en el nodo.
//      * @param keywords Palabras clave que hacen que el chatterbot llegue a este nodo.
//      * @param description Descripción del nodo.
//      * @param answer Respuesta que el chatterbot emite cuando estando el el nodo.
//      * @param errorTransition Transición de error a la que se pasa si ocurre un error durante la ejecución de una
//      *            acción.
//      */
//     public TreeNode(Action action, String keywords, String description, String answer, TreeNode errorTransition) {
//         super(action, keywords, description, answer);
//         setErrorTransition(errorTransition);
//     }
// 
//     /**
//      * @see ar.edu.itba.tpf.chatterbot.model.GlobalNode#hasTransitions()
//      */
//     public abstract boolean hasTransitions();
// 
//     /**
//      * @return Nodo padre del nodo.
//      */
//     public InternalNode getParent() {
//         return parent;
//     }
// 
//     /**
//      * @return Transición de error.
//      */
//     public TreeNode getErrorTransition() {
//         return errorTransition;
//     }
// 
//     /**
//      * @param errorTransition Transición de error.
//      */
//     public void setErrorTransition(TreeNode errorTransition) {
//         if ((this.errorTransition == null && errorTransition == null)
//                 || (this.errorTransition != null && errorTransition != null && this.errorTransition
//                         .equals(errorTransition))) {
//             return;
//         }
//         if (this.errorTransition != null) {
//             // System.out.println("setErrorTransition: sacandome de mi padre anterior");
//             this.errorTransition.getReferences().remove(this);
//         }
// 
//         this.errorTransition = errorTransition;
//         if (this.errorTransition != null) {
//             // System.out.println("setErrorTransition: poniendome en mi nuevo padre");
//             this.errorTransition.getReferences().add(this);
//         }
//     }
// 
//     public Collection<TreeNode> getReferences() {
//         return references;
//     }
// 
// }


// Path: code/impl/src/test/java/ar/edu/itba/tpf/chatterbot/dao/TreeNodeDAOTest.java
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import ar.edu.itba.tpf.chatterbot.model.InternalNode;
import ar.edu.itba.tpf.chatterbot.model.LeafNode;
import ar.edu.itba.tpf.chatterbot.model.TreeNode;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

package ar.edu.itba.tpf.chatterbot.dao;




public class TreeNodeDAOTest extends GenericDAOTest<TreeNode> {

    @Autowired
    private TreeNodeDAO treeNodeDAO;
    
    @Override
    protected GenericDAO<TreeNode, Long> getDao() {
        return treeNodeDAO;
    }
    @Override
    protected TreeNode getSample() {
        return new InternalNode(null, "test", "test", "test", null);
    }
    @Override
    protected void updateSample(TreeNode sample) {
        sample.setDescription("test2");
    }
    
    @Test
    public void testFindRootNode() {
        InternalNode rootNode = new InternalNode(null, "keywords", "root", "answer", null);
        LeafNode leftSon = new LeafNode(null, "leftkeywords", "left", "answer", null);