Adding unit tests for pure JavaScript implementation
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.classpath b/tests/org.eclipse.e4.languages.javascript.framework.test/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.project b/tests/org.eclipse.e4.languages.javascript.framework.test/.project
new file mode 100644
index 0000000..88494eb
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.e4.languages.javascript.framework.test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..72be161
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Fri May 14 16:54:18 EDT 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.pde.core.prefs b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..5a20dbd
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Fri May 14 16:54:18 EDT 2010
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/META-INF/MANIFEST.MF b/tests/org.eclipse.e4.languages.javascript.framework.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..82d215b
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test
+Bundle-SymbolicName: org.eclipse.e4.languages.javascript.framework.test
+Bundle-Version: 1.0.0.qualifier
+Require-Bundle: org.junit,
+ org.eclipse.e4.languages.javascript.junit;bundle-version="1.0.0",
+ org.eclipse.e4.languages.javascript.framework;bundle-version="1.0.0",
+ org.eclipse.equinox.common;bundle-version="3.6.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.osgi.framework;version="1.5.0",
+ org.osgi.service.packageadmin,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.e4.languages.javascript.framework.test
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.e4.languages.javascript.framework.test.Activator
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/build.properties b/tests/org.eclipse.e4.languages.javascript.framework.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/BundleTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/BundleTest.js
new file mode 100644
index 0000000..464c75d
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/BundleTest.js
@@ -0,0 +1,84 @@
+var BundleTest = TestCase.create("BundleTest");
+
+BundleTest.prototype.testGetName = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz"});
+	assertEquals("xyz", b.getName());
+};
+
+BundleTest.prototype.testEmptyVersion = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz"});
+	assertEquals(Version.EMPTY_VERSION, b.getVersion());
+};
+
+BundleTest.prototype.testBasicVersion = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals(Version.parseVersion("1.2.3.test"), b.getVersion());
+};
+
+BundleTest.prototype.testBasicVersion = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals(Version.parseVersion("1.2.3.test"), b.getVersion());
+};
+
+BundleTest.prototype.testGetBundleId = function() {
+	var framework = new Framework();
+	var b1 = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals(0, b1.getBundleId());
+	var b2 = framework.installBundle("xyz_2", {name:"xyz", version:"2.2.3.test"});
+	assertEquals(1, b2.getBundleId());
+};
+
+BundleTest.prototype.testGetLocation = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals("xyz_1", b.getLocation());
+};
+
+BundleTest.prototype.testGetHeaders = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	assertEquals("xyz", b.getHeaders().name);
+	assertEquals("1.2.3.test", b.getHeaders().version);
+	assertEquals("random", b.getHeaders().randomHeader);
+	assertUndefined(b.getHeaders().randomHeader2);
+};
+
+BundleTest.prototype.testGetState = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertEquals(Bundle.RESOLVED, b.getState());
+	b.start();
+	assertEquals(Bundle.ACTIVE, b.getState());
+	b.stop();
+	assertEquals(Bundle.RESOLVED, b.getState());
+	b.uninstall();
+	assertEquals(Bundle.UNINSTALLED, b.getState());
+};
+
+BundleTest.prototype.testEquals = function() {
+	var framework = new Framework();
+	var b1 = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	var b2 = framework.installBundle("xyz_2", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	var b3 = framework.installBundle("xyz_3", {name:"xyz", version:"1.2.4.test", randomHeader: "random"});
+	assertTrue(b1.equals(b2));
+	assertFalse(b1.equals(b3));
+};
+
+BundleTest.prototype.testGetResource = function() {
+	var framework = new Framework();
+	var b1 = framework.installBundle("xyz", {name:"xyz", version:"1.2.3.test", exports: "/abc", resources: "/abc/def.jpg"});
+	var b2 = framework.installBundle("qrs", {name:"qrs", version:"1.2.3.test", imports: "/abc"});
+	assertNull(b1.getResource("mno"));
+	assertNotNull(b1.getResource("/abc/def.jpg"));
+	assertNull(b2.getResource("/abc/def.jpg"));
+	framework.resolve();
+	assertNotNull(b2.getResource("/abc/def.jpg"));
+	
+};
+
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/FrameworkTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/FrameworkTest.js
new file mode 100644
index 0000000..252015c
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/FrameworkTest.js
@@ -0,0 +1,286 @@
+var FrameworkTest = TestCase.create("FrameworkTest");
+
+FrameworkTest.prototype.testEmptyGetBundles = function() {
+	var framework = new Framework();
+	assertEquals(0, framework.getBundles().length);
+};
+
+FrameworkTest.prototype.getSetProperty = function() {
+	var framework = new Framework();
+	assertUndefined(framework.getProperty("test"));
+	framework.setProperty("test", "value");
+	assertEquals("test", framework.getProperty("test"));
+	framework.setProperty("test");
+	assertUndefined(framework.getProperty("test"));
+};
+
+FrameworkTest.prototype.testNullLocationInstallBundle = function() {
+	var framework = new Framework();
+	try {
+		framework.installBundle(null);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
+
+FrameworkTest.prototype.testSimpleInstallBundle = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+};
+
+
+FrameworkTest.prototype.testEmptyRefresh = function() {
+	var framework = new Framework();
+	framework.refresh();
+};
+
+FrameworkTest.prototype.testSimpleRefresh = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	b.uninstall();
+	assertEquals(Bundle.UNINSTALLED, b.getState());
+	assertEquals(1, framework.getBundles().length);	
+	framework.refresh();
+	assertEquals(0, framework.getBundles().length);	
+};
+
+
+FrameworkTest.prototype.testEmptyResolve = function() {
+	var framework = new Framework();
+	framework.resolve();
+};
+
+FrameworkTest.prototype.testSimpleResolve = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertEquals(Bundle.RESOLVED, b.getState());
+};
+
+FrameworkTest.prototype.testResolveNonSingleton = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", version:"1"});
+	var b = framework.installBundle("cde2", {name:"cde", version:"2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveSingletonFail = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde;singleton:=true", version:"1"});
+	var b = framework.installBundle("cde2", {name:"cde;singleton:=true", version:"2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveImportsFail = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveOptionalImports = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc;resolution:=optional"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveImportsSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedImportsSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc;version=1.2", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc;version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedImportsFail = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc;version=1.1", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc;version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveResourceImportsSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"/abc/def"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"/abc/def"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveImportsFailAfterUninstall = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	a.uninstall();
+	framework.refresh();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveLikeFunction = function() {
+	var load = new Function("", "var abc = {hi:7};\n\n return {abc:abc};");
+	var x= load.apply({}, []);
+	assertEquals(7, x.abc.hi);
+};
+	
+FrameworkTest.prototype.testResolveImportsLoad = function() {	
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc", script:"var abc = {hi:7};"});
+	framework.resolve();
+	assertEquals(7, a._scope.abc.hi);
+	assertEquals(7, a.load("abc").hi);
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc", exports:"def", script:"var def = abc;"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	assertEquals(7, b.load("def").hi);
+};
+
+FrameworkTest.prototype.testResolveMultipleImportsLoad = function() {	
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc,xyz", script:"var abc = {hi:7};\nvar xyz = {bye:9};"});
+	framework.resolve();
+	assertEquals(7, a._scope.abc.hi);
+	assertEquals(7, a.load("abc").hi);
+	assertEquals(9, a.load("xyz").bye);
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc,xyz", exports:"def,ghi", script:"var def = abc;\nvar ghi = xyz;"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	assertEquals(7, b.load("def").hi);
+	assertEquals(9, b.load("ghi").bye);
+};
+
+FrameworkTest.prototype.testResolveRequiresFail = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveOptionalRequires = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc;resolution:=optional"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveRequiresFailAfterUninstall = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	a.uninstall();
+	framework.refresh();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveRequiresSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedRequiresSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc", version:"1.2"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc;bundle-version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedRequiresFail = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc", version:"1.1"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc;bundle-version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testEmptyShutdown = function() {
+	var framework = new Framework();
+	framework.shutdown();
+};
+FrameworkTest.prototype.testEmptyShutdown = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.shutdown();
+	assertEquals(0, framework.getBundles().length);	
+};
+
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionRangeTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionRangeTest.js
new file mode 100644
index 0000000..1f18a6a
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionRangeTest.js
@@ -0,0 +1,53 @@
+var VersionRangeTest = TestCase.create("VersionRangeTest");
+
+VersionRangeTest.prototype.testBasicVersionRange = function() {
+	var versionRange = new VersionRange(Version.EMPTY_VERSION, true, Version.MAX_VERSION, true);
+	assertEquals(Version.EMPTY_VERSION, versionRange.getMinimum());
+	assertTrue(versionRange.getIncludeMinimum());
+	assertEquals(Version.MAX_VERSION, versionRange.getMaximum());
+	assertTrue(versionRange.getIncludeMaximum());
+};
+
+VersionRangeTest.prototype.testEmptyVersionRange = function() {
+	var versionRange = new VersionRange(null, true, null, true);
+	assertEquals(VersionRange.EMPTY_RANGE, versionRange);
+};
+
+VersionRangeTest.prototype.testParseBasicVersionRange = function() {
+	var versionRange = VersionRange.parseVersionRange("0.0.0");
+	assertEquals(Version.EMPTY_VERSION, versionRange.getMinimum());
+	assertTrue(versionRange.getIncludeMinimum());
+	assertEquals(Version.MAX_VERSION, versionRange.getMaximum());
+	assertTrue(versionRange.getIncludeMaximum());
+};
+
+VersionRangeTest.prototype.testIncludeMinMax = function() {
+	var versionRange1 = new VersionRange(null, true, null, false);
+	assertTrue(versionRange1.getIncludeMinimum());
+	assertFalse(versionRange1.getIncludeMaximum());
+	
+	var versionRange2 = new VersionRange(null, false, null, true);
+	assertFalse(versionRange2.getIncludeMinimum());
+	assertTrue(versionRange2.getIncludeMaximum());
+};
+
+VersionRangeTest.prototype.testIsIncluded = function() {
+	var versionRange1 = new VersionRange(null, true, null, false);
+	assertTrue(versionRange1.isIncluded(Version.EMPTY_VERSION));
+	assertFalse(versionRange1.isIncluded(Version.MAX_VERSION));
+	
+	var versionRange2 = new VersionRange(null, false, null, true);
+	assertFalse(versionRange2.isIncluded(Version.EMPTY_VERSION));
+	assertTrue(versionRange2.isIncluded(Version.MAX_VERSION));
+};
+
+VersionRangeTest.prototype.testToString = function() {
+	var versionRange1 = new VersionRange(new Version(1,0,0), true, null, true);
+	assertEquals("1.0.0", versionRange1.toString());
+
+	var versionRange2 = new VersionRange(new Version(1,0,0), true, null, false);
+	assertEquals("[1.0.0," + Version.MAX_VERSION.toString() + ")", versionRange2.toString());
+	
+	var versionRange2 = new VersionRange(new Version(1,0,0), false, null, true);
+	assertEquals("(1.0.0," + Version.MAX_VERSION.toString() + "]", versionRange2.toString());
+};
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionTest.js
new file mode 100644
index 0000000..77a0971
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionTest.js
@@ -0,0 +1,86 @@
+var VersionTest = TestCase.create("VersionTest");
+
+VersionTest.prototype.testBasicVersion = function() {
+	var version = new Version(1, 0, 0);
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("", version.getQualifier());
+	assertEquals("1.0.0", version.toString());
+};
+VersionTest.prototype.testQualifiedBasicVersion = function() {
+	var version = new Version(1, 0, 0, "qualifier");
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("qualifier", version.getQualifier());
+	assertEquals("1.0.0.qualifier", version.toString());
+};
+VersionTest.prototype.testEmptyVersion = function() {
+	var version = new Version(0, 0, 0);
+	assertEquals(Version.EMPTY_VERSION, version);
+	assertEquals("0.0.0", version.toString());
+};
+VersionTest.prototype.testMaxVersion = function() {
+	var version = new Version(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, "extra");
+	assertEquals(Version.MAX_VERSION, version);
+};
+
+VersionTest.prototype.testParseEmptyVersion = function() {
+	var version = Version.parseVersion("");
+	assertEquals(Version.EMPTY_VERSION, version);
+};
+VersionTest.prototype.testParseBasicVersion = function() {
+	var version = Version.parseVersion("1.0.0");
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("", version.getQualifier());
+	assertEquals("1.0.0", version.toString());
+};
+VersionTest.prototype.testParseQualifiedBasicVersion = function() {
+	var version = Version.parseVersion("1.0.0.qualifier");
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("qualifier", version.getQualifier());
+	assertEquals("1.0.0.qualifier", version.toString());
+};
+VersionTest.prototype.testCompareVersion = function() {
+	var version = Version.parseVersion("1.0.0");
+	assertTrue(0 === version.compareTo(version));
+	assertTrue(0 < version.compareTo(Version.EMPTY_VERSION));
+	assertTrue(0 > Version.EMPTY_VERSION.compareTo(version));
+};
+VersionTest.prototype.testBadMajor = function() {
+	try {
+		var version = new Version("x", 0, 0);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
+VersionTest.prototype.testBadMinor = function() {
+	try {
+		var version = new Version(0, "x", 0);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
+VersionTest.prototype.testBadMicro = function() {
+	try {
+		var version = new Version(0, 0, "x");
+	} catch (e) {
+		return;
+	}
+	fail();
+}
+VersionTest.prototype.testBadQualifier = function() {
+	try {
+		var version = new Version(0, 0, 0, 7);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/Activator.java b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/Activator.java
new file mode 100644
index 0000000..6e9229a
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/Activator.java
@@ -0,0 +1,56 @@
+package org.eclipse.e4.languages.javascript.framework.test;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+public class Activator implements BundleActivator {
+
+	private static BundleContext context;
+	private static PackageAdmin packageAdmin;
+	
+	static BundleContext getContext() {
+		return context;
+	}
+
+
+
+	public void start(BundleContext bundleContext) throws Exception {
+		context = bundleContext;
+		packageAdmin = (PackageAdmin) context.getService(context.getServiceReference(PackageAdmin.class.getName()));
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception {
+		packageAdmin = null;
+		context = null;
+	}
+
+	public static synchronized Bundle getBundle(String symbolicName) {
+		if (packageAdmin == null)
+			throw new IllegalStateException("Not started"); //$NON-NLS-1$
+
+		Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
+		if (bundles == null)
+			return null;
+		//Return the first bundle that is not installed or uninstalled
+		for (int i = 0; i < bundles.length; i++) {
+			if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
+				return bundles[i];
+			}
+		}
+		return null;
+	}
+
+
+
+	public static Collection getFrameworkScripts() {
+		Bundle frameworkBundle = Activator.getBundle("org.eclipse.e4.languages.javascript.framework");
+		return Collections.list(frameworkBundle.findEntries("/scripts", "*.js", false));
+	}
+
+
+}
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/AllTests.java b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/AllTests.java
new file mode 100644
index 0000000..ec6ca5d
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/AllTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.e4.languages.javascript.framework.test;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.ListIterator;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.e4.languages.javascript.junit.JavaScriptTestSuite;
+
+public class AllTests extends TestSuite {
+
+	public static Test suite() throws IOException {
+		return new AllTests();
+	}
+
+	public AllTests() throws IOException {
+		super(AllTests.class.getName());
+		addTest(createFrameworkTest("BundleTest"));
+		addTest(createFrameworkTest("FrameworkTest"));
+		addTest(createFrameworkTest("VersionTest"));
+		addTest(createFrameworkTest("VersionRangeTest"));
+	}
+	
+	private Test createFrameworkTest(String testCaseName) throws IOException {
+		return createFrameworkTest(testCaseName, Activator.getContext().getBundle().getEntry("/scripts/"+testCaseName+".js"));
+	}
+
+	private Test createFrameworkTest(String testCaseName, URL entry) throws IOException {
+		ArrayList scripts = new ArrayList(Activator.getFrameworkScripts());
+		scripts.add(entry);
+		for (ListIterator iterator = scripts.listIterator(); iterator.hasNext();) {
+			iterator.set(FileLocator.toFileURL((URL) iterator.next()));
+		}
+		return new JavaScriptTestSuite(testCaseName, scripts);
+	}
+}