package de.tla2b.util;

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

import de.tla2b.util.PolySuite.Configuration;


public abstract class AbstractParseModuleTest {
	private static final String[] SUFFIX = { ".tla" };
	
	private static final class ModuleFilenameFilter implements FilenameFilter {
	

		public boolean accept(final File dir, final String name) {
			for (int i = 0; i < SUFFIX.length; i++) {
				if (name.endsWith(SUFFIX[i])) {
					return true;
				}
			}
			return false;
		}
	}

	protected static File[] getModules(String path) {
		final File dir = new File(path);
		return dir.listFiles(new ModuleFilenameFilter());
	}

	protected static File[] getModulesRecursively(String path) {
		return walk(path).toArray(new File[0]);
	}

	private static ArrayList<File> walk(String path) {
		File root = new File(path);
		File[] list = root.listFiles();
		
		ArrayList<File> files = new ArrayList<File>();
		if (list == null)
			return files;

		for (File f : list) {
			if (f.isDirectory()) {
				files.addAll(walk(f.getAbsolutePath()));
				
			} else {
				String name =f.getName();
					for (int i = 0; i < SUFFIX.length; i++) {
						if (name.endsWith(SUFFIX[i])) {
							files.add(f);
						}
					}
			}
		}
		return files;
	}

	protected static Configuration getConfiguration2(ArrayList<String> list) {
		final ArrayList<File> allModules = new ArrayList<File>();

		final ArrayList<Object> expectedValues = new ArrayList<Object>();
		for (String path : list) {
			File[] modules = getModulesRecursively(path);
			allModules.addAll(Arrays.asList(modules));
			for (int i = 0; i < modules.length; i++) {
				expectedValues.add(1);
			}
		}

		return new Configuration() {
			public int size() {
				return allModules.size();
			}

			public File getTestValue(int index) {
				return allModules.get(index);
			}

			public String getTestName(int index) {
				return allModules.get(index).getName();
			}

			public Object getExpectedValue(int index) {
				return expectedValues.get(index);
			}
		};
	}


}