package syntaxTree;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

import de.dhbwstuttgart.core.MyCompiler;
import de.dhbwstuttgart.core.MyCompilerAPI;
import de.dhbwstuttgart.logger.LoggerConfiguration;
import de.dhbwstuttgart.logger.Section;
import de.dhbwstuttgart.parser.JavaParser.yyException;
import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import junit.framework.TestCase;

public class NodeEqualTest extends TestCase{
	private static final String rootDirectory = System.getProperty("user.dir")+"/test/syntaxTree/";
	private static final String testFile = "NodeEqualTest.jav";
	
	@Test
	public void test(){
		LoggerConfiguration logConfig = new LoggerConfiguration();
		logConfig.setOutput(Section.TYPEINFERENCE, System.out);
		MyCompilerAPI compiler = MyCompiler.getAPI(logConfig);
		MyCompilerAPI compiler2 = MyCompiler.getAPI(logConfig);
		SourceFile tree = null;
		SourceFile tree2 = null;
		try {
			tree = compiler.parse(new File(rootDirectory + testFile));
			tree2 = compiler2.parse(new File(rootDirectory + testFile));
		} catch (IOException | yyException e) {
			e.printStackTrace();
			fail();
		}
		recursivlyCheckEqual(tree, tree2);
	}
	
	private void recursivlyCheckEqual(SyntaxTreeNode node1, SyntaxTreeNode node2){
		for(SyntaxTreeNode n1 : node1.getChildren()){
			int matches = 0;
			for(SyntaxTreeNode n2 : node2.getChildren()){
				if(n2.equals(n1)){
					System.out.println(n2 + " == "+n1);
					matches++;
					this.recursivlyCheckEqual(n1, n2);
				}else{
					System.out.println(n2 + " != "+ n1);
				}
			}
			System.out.println("");
			assertTrue("Nur eines der Children darf gleich sein, nicht "+matches, matches == 1 && node2.getChildren().size()>0);
		}
	}

	
	
}