package org.eclipse.e4.languages.javascript.test;

import org.eclipse.e4.internal.languages.javascript.JSImportPackage;
import org.eclipse.e4.internal.languages.javascript.JSVersionRange;

import junit.framework.TestCase;

public class JSImportTest extends TestCase {

	public JSImportTest(String name) {
		super(name);
	}

	protected void setUp() throws Exception {
		//
	}

	protected void tearDown() throws Exception {
		//
	}

	public void testNullHeader() {

		try {
			new JSImportPackage(null);
		} catch (IllegalArgumentException e) {
			return;
		}
		fail();
	}

	public void testNameAndEmptyVersionRange() {
		JSImportPackage jsImport = new JSImportPackage("a.a");
		assertEquals("a.a", jsImport.getName());
		assertEquals(JSVersionRange.emptyRange, jsImport.getVersionRange());
		assertEquals(null, jsImport.getBundleSymbolicName());
		assertEquals(JSVersionRange.emptyRange, jsImport.getBundleVersionRange());
		assertEquals(0, jsImport.getAttributes().size());
		assertEquals(0, jsImport.getDirectives().size());
		assertEquals(false, jsImport.isOptional());
	}

	public void testNameAndVersion() {
		JSImportPackage jsImport = new JSImportPackage("a.a;version=1.2.1");
		assertEquals("a.a", jsImport.getName());
		assertEquals(new JSVersionRange("1.2.1"), jsImport.getVersionRange());
		assertEquals(null, jsImport.getBundleSymbolicName());
		assertEquals(JSVersionRange.emptyRange, jsImport.getBundleVersionRange());
		assertEquals(1, jsImport.getAttributes().size());
		assertEquals(0, jsImport.getDirectives().size());
		assertEquals(false, jsImport.isOptional());
	}

	public void testBundleNameAndVersion() {
		JSImportPackage jsImport = new JSImportPackage("a.a;version=1.2.1;bundle-symbolic-name=test1;bundle-version=1.8");
		assertEquals("a.a", jsImport.getName());
		assertEquals(new JSVersionRange("1.2.1"), jsImport.getVersionRange());
		assertEquals("test1", jsImport.getBundleSymbolicName());
		assertEquals(new JSVersionRange("1.8"), jsImport.getBundleVersionRange());
		assertEquals(3, jsImport.getAttributes().size());
		assertEquals(0, jsImport.getDirectives().size());
		assertEquals(false, jsImport.isOptional());
	}

	public void testIsOptional() {
		JSImportPackage jsImport = new JSImportPackage("a.a;version=1.2.1;bundle-symbolic-name=test1;bundle-version=1.8;resolution:=optional");
		assertEquals("a.a", jsImport.getName());
		assertEquals(new JSVersionRange("1.2.1"), jsImport.getVersionRange());
		assertEquals("test1", jsImport.getBundleSymbolicName());
		assertEquals(new JSVersionRange("1.8"), jsImport.getBundleVersionRange());
		assertEquals(3, jsImport.getAttributes().size());
		assertEquals(1, jsImport.getDirectives().size());
		assertEquals(true, jsImport.isOptional());
	}
}
