Browse Source

add tests for toplevel display (closes #3923)

Simon Krajewski 9 years ago
parent
commit
e11311a1ff

+ 1 - 1
tests/display/src/DisplayTestCase.hx

@@ -17,7 +17,7 @@ class DisplayTestCase {
 
 	function assert(v:Bool) if (!v) throw "assertion failed";
 
-	function eq(expected:String, actual:String, ?pos:haxe.PosInfos) {
+	function eq<T>(expected:T, actual:T, ?pos:haxe.PosInfos) {
 		numTests++;
 		if (expected != actual) {
 			numFailures++;

+ 16 - 2
tests/display/src/DisplayTestContext.hx

@@ -1,4 +1,5 @@
 using StringTools;
+import Types;
 
 class HaxeInvocationException {
 
@@ -40,8 +41,8 @@ class DisplayTestContext {
 		return callHaxe('$pos');
 	}
 
-	public function toplevel(pos:Int):String {
-		return callHaxe('$pos');
+	public function toplevel(pos:Int):Array<ToplevelElement> {
+		return extractToplevel(callHaxe('$pos@toplevel'));
 	}
 
 	public function type(pos:Int):String {
@@ -104,6 +105,19 @@ class DisplayTestContext {
 		return ret;
 	}
 
+	static function extractToplevel(result:String) {
+		var xml = Xml.parse(result);
+		xml = xml.firstElement();
+		if (xml.nodeName != "il") {
+			return null;
+		}
+		var ret = [];
+		for (xml in xml.elementsNamed("i")) {
+			ret.push({kind: xml.get("k"), name: xml.firstChild().nodeValue});
+		}
+		return ret;
+	}
+
 	static function normalizePath(p:String):String {
 		if (!haxe.io.Path.isAbsolute(p)) {
 			p = Sys.getCwd() + p;

+ 3 - 0
tests/display/src/Macro.hx

@@ -10,6 +10,9 @@ class Macro {
 		for (field in fields) {
 			var markers = [];
 			var posAcc = 0;
+			if (field.doc == null) {
+				continue;
+			}
 			var doc = (c.pack.length > 0 ? "package " + c.pack.join(".") + ";\n" : "") + field.doc;
 			var src = markerRe.map(doc, function(r) {
 				var p = r.matchedPos();

+ 4 - 0
tests/display/src/Types.hx

@@ -0,0 +1,4 @@
+typedef ToplevelElement = {
+	kind: String,
+	name: String
+}

+ 38 - 0
tests/display/src/cases/Toplevel.hx

@@ -0,0 +1,38 @@
+package cases;
+
+import Types;
+using Lambda;
+
+class Toplevel extends DisplayTestCase {
+	/**
+	class Main {
+		static var myField;
+		static function main() {{-1-}
+			{-2-}
+	**/
+	function testToplevelResuming() {
+		eq(true, hasToplevel(toplevel(pos(1)), "static", "myField"));
+		eq(true, hasToplevel(toplevel(pos(2)), "static", "myField"));
+	}
+
+	/**
+	class Main {
+		static var myField;
+		static function main() {
+			{-1-}
+			var a = "foo";
+			{-2-}
+	**/
+	function testToplevelScoping() {
+		var toplevel1 = toplevel(pos(1));
+		var toplevel2 = toplevel(pos(2));
+		eq(true, hasToplevel(toplevel1, "static", "myField"));
+		eq(true, hasToplevel(toplevel2, "static", "myField"));
+		eq(false, hasToplevel(toplevel1, "local", "a"));
+		eq(true, hasToplevel(toplevel2, "local", "a"));
+	}
+
+	static function hasToplevel(a:Array<ToplevelElement>, kind:String, name:String):Bool {
+		return a.exists(function(t) return t.kind == kind && t.name == name);
+	}
+}