package plugindevelopment;

import static org.junit.Assert.*;

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

import org.junit.Test;

import junit.framework.TestCase;
import mycompiler.MyCompiler;
import mycompiler.MyCompilerAPI;
import mycompiler.myparser.JavaParser.yyException;
import mycompiler.mytype.Pair;
import mycompiler.mytype.Pair.PairOperator;
import mycompiler.mytype.RefType;
import mycompiler.mytype.Type;
import mycompiler.mytype.TypePlaceholder;
import mycompiler.mytypereconstruction.TypeinferenceResultSet;
import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent;
import typinferenz.ResultSet;
import typinferenz.TypeInsertable;
import typinferenz.typedeployment.TypeInsertPoint;
import typinferenz.typedeployment.TypeInsertSet;

public class TRMEqualTest {
	Vector<TypeInsertSet> replaceSet  = new Vector<TypeInsertSet>();
	TestNode node;
	TypePlaceholder tph;
	
	
	public void initTRMEqualTest(){
		node = new TestNode();
		tph = TypePlaceholder.fresh(node);
		node.setType(tph);
	}
	
	@Test
	public void test(){
		initTRMEqualTest();
		assertTrue("Zu Beginn ist das Set leer",replaceSet.size()==0);
		addTestNode("Typ1");
		assertTrue("Nach  dem Anf�gen eines Type muss das Set 1 Element enthalten",replaceSet.size()==1);
		addTestNode("Typ2");
		assertTrue("Nach  dem Anf�gen eines weiteren Typs muss das Set 2 Elemente enthalten und nicht "+replaceSet.size(),replaceSet.size()==2);
		addTestNode("Typ1");
		assertTrue("Nach  dem Anf�gen des selben Typs wie zuvor muss das Set immer noch 2 Element enthalten. Und nicht "+replaceSet.size(),replaceSet.size()==2);
	}
	
	private void addTestNode(String type){
		Vector<Pair> resultContent = new Vector<Pair>();
		Pair pair = new Pair(tph,new RefType(type,0));
		pair.SetOperator(PairOperator.Equal);
		resultContent.add(pair);
		ResultSet resultSet = new ResultSet(resultContent);
		Vector<TypeInsertPoint> tphs = tph.getTypeInsertPoints(resultSet);
		TypeInsertSet toAdd = new TypeInsertSet(resultSet);
		for(TypeInsertPoint tip : tphs){
			toAdd.add(tip);
		}
		System.out.println("F�ge hinzu: "+toAdd);
		if(!replaceSet.contains(toAdd))replaceSet.add(toAdd);
	}
}
	
class TestNode implements TypeInsertable{

	@Override
	public void replaceType(CReplaceTypeEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int getTypeLineNumber() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void setType(Type typ) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Type getType() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int getOffset() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void setOffset(int offset) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public String getIdentifier() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public TypeInsertPoint createTypeInsertPoint(TypePlaceholder tph,
			ResultSet resultSet) {
		return new TypeInsertPoint( this, resultSet.getTypeEqualTo(tph), resultSet);
	}

	@Override
	public int getVariableLength() {
		// TODO Auto-generated method stub
		return 0;
	}
	
}