package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Jar;
import aQute.bnd.osgi.Resource;
import aQute.lib.io.IO;
import junit.framework.TestCase;

@SuppressWarnings("resource")
public class MergeTest extends TestCase {

	public static void testFirst() throws Exception {
		testMerge("first", new String[] {
				"A", "C"
		}, new String[] {
				"B"
		}, "first", 0, 0);
	}

	public static void testMergeFirst() throws Exception {
		testMerge("merge-first", new String[] {
				"A", "B", "C"
		}, new String[] {
				""
		}, "first", 0, 0);
	}

	public static void testDefault() throws Exception {
		testMerge(null, new String[] {
				"A", "B", "C"
		}, new String[] {}, "first", 0, 1);
	}

	public static void testMergeLast() throws Exception {
		testMerge("merge-last", new String[] {
				"A", "B", "C"
		}, new String[] {
				""
		}, "last", 0, 0);
	}

	public static void testError() throws Exception {
		testMerge("error", null, null, null, 1, 1);
	}

	static void testMerge(String type, String[] in, String[] out, String c, int errors, int warnings) throws Exception {
		Builder b = new Builder();
		try {
			b.setClasspath(new File[] {
					IO.getFile("src/test/split/split-a.jar"), IO.getFile("src/test/split/split-b.jar")
			});
			Properties p = new Properties();
			if (type != null)
				p.put("Export-Package", "test.split;-split-package:=" + type);
			else
				p.put("Export-Package", "test.split");
			p.put("Import-Package", "");
			b.setProperties(p);
			Jar jar = b.build();

			System.err.println("Errors     :" + b.getErrors());
			System.err.println("Warnings   :" + b.getWarnings());
			assertEquals(errors, b.getErrors().size());
			assertEquals(warnings, b.getWarnings().size());
			if (errors != 0)
				return;

			for (int i = 0; in != null && i < in.length; i++)
				assertNotNull("Contains " + in[i], jar.getResource("test/split/" + in[i]));
			for (int i = 0; out != null && i < out.length; i++)
				assertNull("Does not contain " + out[i], jar.getResource("test/split/" + out[i]));

			Resource r = jar.getResource("test/split/C");
			InputStream is = r.openInputStream();
			BufferedReader dis = new BufferedReader(new InputStreamReader(is));
			String s = dis.readLine();
			assertEquals(s, c);
		} finally {
			b.close();
		}
	}

}
