package testing;

import java.io.File;
import java.util.ArrayList;

import org.junit.Test;
import org.junit.runner.RunWith;

import de.be4.classicalb.core.parser.BParser;
import de.be4.classicalb.core.parser.node.Start;
import de.tla2b.output.ASTPrettyPrinter;
import de.tla2b.util.AbstractParseModuleTest;
import de.tla2b.util.FileUtils;
import de.tla2b.util.PolySuite;
import de.tla2b.util.TestUtil;
import de.tla2b.util.PolySuite.Config;
import de.tla2b.util.PolySuite.Configuration;
import de.tla2bAst.Translator;
import static org.junit.Assert.assertEquals;

@RunWith(PolySuite.class)
public class ExampleFilesTest extends AbstractParseModuleTest {

	private final File moduleFile;

	public ExampleFilesTest(File machine, Object result) {
		this.moduleFile = machine;
	}

	@Test
	public void testRunTLC() throws Exception {
		// String[] a = new String[] { moduleFile.getPath() };
		// runModule(moduleFile.getPath());
		Translator t = new Translator(moduleFile.getPath());
		Start start = t.translate();
		String resultTree = TestUtil.getTreeAsString(start);
		
		ASTPrettyPrinter aP = new ASTPrettyPrinter(start);
		start.apply(aP);

		// parse pretty print result
		final BParser parser = new BParser("testcase");
		final Start ppStart = parser.parse(aP.getResultString(), false);
		String ppTree = TestUtil.getTreeAsString(ppStart);
		
		// comparing result with pretty print
		//assertEquals(resultTree, ppTree);
		
		
		// machine file
		String machinePath = FileUtils.removeExtention(moduleFile.getPath())
				+ ".mch";
		File expectedMachine = new File(machinePath);

		final BParser expectedParser = new BParser("testcase");
		final Start expectedStart = expectedParser.parseFile(expectedMachine,
				false);

		String expectedTree = TestUtil.getTreeAsString(expectedStart);

		//assertEquals(expectedTree, resultTree);
	}

	@Config
	public static Configuration getConfig() {
		final ArrayList<String> list = new ArrayList<String>();
		final ArrayList<String> ignoreList = new ArrayList<String>();

		list.add("./src/test/resources/prettyprint/OperationsTest/");
		// ignoreList.add("./src/test/resources/testing/");
		return getConfiguration2(list, ignoreList);
	}
}