Browse Source

[tests] add some tests for dotpath resolution (#9173)

* [tests] add some tests for dotpath resolution

* [ci] fix path?

* add tests for imported things
Dan Korostelev 5 years ago
parent
commit
36d6563bc1

+ 1 - 0
tests/misc/resolution/projects/spec/.gitignore

@@ -0,0 +1 @@
+/test.js

+ 11 - 0
tests/misc/resolution/projects/spec/Imported.hx

@@ -0,0 +1,11 @@
+import RootModWithStatic;
+import pack.ModWithStatic;
+import utest.Assert;
+
+class Imported extends utest.Test {
+    function test() {
+        Assert.equals("pack.ModWithStatic.TheStatic function", ModWithStatic.TheStatic());
+        Assert.equals("RootModWithStatic.TheStatic function", RootModWithStatic.TheStatic());
+        Assert.equals("pack.TheStatic", Type.getClassName(TheStatic));
+    }
+}

+ 7 - 0
tests/misc/resolution/projects/spec/Issue9150.hx

@@ -0,0 +1,7 @@
+import pack.Mod;
+
+class Issue9150 extends utest.Test {
+    function test() {
+        Macro.assert("pack.ModSubType");
+    }
+}

+ 36 - 0
tests/misc/resolution/projects/spec/Macro.hx

@@ -0,0 +1,36 @@
+#if macro
+import haxe.macro.Expr;
+import haxe.macro.Context;
+using haxe.macro.Tools;
+#end
+
+class Macro {
+    #if macro
+    static function build():Array<Field> {
+        var dotPath = Context.getLocalClass().toString();
+        return (macro class {
+            public final f = $v{dotPath};
+            public function new() {}
+            public static function UpperCase() return $v{dotPath + ".UpperCase"};
+            public static function lowerCase() return $v{dotPath + ".lowerCase"};
+        }).fields;
+    }
+    #end
+
+    public static macro function assert(path:String) {
+        var pos = Context.currentPos();
+        var nameExpr = Context.parse("new " + path + "().f", pos);
+        var uCallExpr = Context.parse(path + ".UpperCase()", pos);
+        var lCallExpr = Context.parse(path + ".lowerCase()", pos);
+        var fullPath = Context.getType(path).toString();
+        return macro @:pos(pos) {
+            utest.Assert.equals($v{fullPath}, $nameExpr);
+            utest.Assert.equals($v{fullPath + ".UpperCase"}, $uCallExpr);
+            utest.Assert.equals($v{fullPath + ".lowerCase"}, $lCallExpr);
+        };
+    }
+
+    public static macro function resolves(path:String) {
+        return try { Context.getType(path); macro true; } catch (_:Any) macro false;
+    }
+}

+ 39 - 0
tests/misc/resolution/projects/spec/Main.hx

@@ -0,0 +1,39 @@
+class Main extends utest.Test {
+	function testQualified() {
+        Macro.assert("pack.Mod");
+        Macro.assert("pack.Mod.Mod");
+        Macro.assert("pack.Mod.ModSubType");
+        Macro.assert("pack.ModNoMain.ModNoMainSubType");
+        Macro.assert("pack.ModNoValue.ModNoValueSubType");
+        Macro.assert("pack.ModWithStatic.TheStatic");
+    }
+    
+	function testQualifiedStd() {
+        Macro.assert("std.pack.Mod");
+        Macro.assert("std.pack.Mod.Mod");
+        Macro.assert("std.pack.Mod.ModSubType");
+        Macro.assert("std.pack.ModNoMain.ModNoMainSubType");
+        Macro.assert("std.pack.ModNoValue.ModNoValueSubType");
+        Macro.assert("std.pack.ModWithStatic.TheStatic");
+    }
+    
+	function testQualifiedStdShadowed() {
+        var pack = 1;
+        Macro.assert("std.pack.Mod");
+        Macro.assert("std.pack.Mod.Mod");
+        Macro.assert("std.pack.Mod.ModSubType");
+        Macro.assert("std.pack.ModNoMain.ModNoMainSubType");
+        Macro.assert("std.pack.ModNoValue.ModNoValueSubType");
+        Macro.assert("std.pack.ModWithStatic.TheStatic");
+    }
+
+	static function main() {
+		utest.UTest.run([
+            new Main(),
+            new pack.inner.Test(),
+            new Issue9150(),
+            new Wildcard(),
+            new Imported(),
+        ]);
+	}
+}

+ 2 - 0
tests/misc/resolution/projects/spec/RootMod.hx

@@ -0,0 +1,2 @@
+@:build(Macro.build()) class RootMod {}
+@:build(Macro.build()) class RootModSubType {}

+ 1 - 0
tests/misc/resolution/projects/spec/RootModNoMain.hx

@@ -0,0 +1 @@
+@:build(Macro.build()) class RootModNoMainSubType {}

+ 3 - 0
tests/misc/resolution/projects/spec/RootModNoValue.hx

@@ -0,0 +1,3 @@
+typedef RootModNoValue = {}
+
+@:build(Macro.build()) class RootModNoValueSubType {}

+ 5 - 0
tests/misc/resolution/projects/spec/RootModWithStatic.hx

@@ -0,0 +1,5 @@
+class RootModWithStatic {
+    public static function TheStatic() return "RootModWithStatic.TheStatic function";
+}
+
+@:build(Macro.build()) class TheStatic {}

+ 15 - 0
tests/misc/resolution/projects/spec/Wildcard.hx

@@ -0,0 +1,15 @@
+import pack.inner.*;
+import pack.shadow.*;
+
+import utest.Assert;
+
+class Wildcard extends utest.Test {
+    function test() {
+        Macro.assert("InnerMod");
+        Assert.isFalse(Macro.resolves("InnerModSubType"));
+        Assert.isFalse(Macro.resolves("InnerModNoMainSubType"));
+        Assert.isTrue(Macro.resolves("InnerModNoValue"));
+        Assert.isFalse(Macro.resolves("InnerModNoValueSubType"));
+        Assert.equals(42, Test.f());
+    }
+}

+ 4 - 0
tests/misc/resolution/projects/spec/compile.hxml

@@ -0,0 +1,4 @@
+-main Main
+-lib utest
+-js test.js
+-cmd node test.js

+ 4 - 0
tests/misc/resolution/projects/spec/pack/Mod.hx

@@ -0,0 +1,4 @@
+package pack;
+
+@:build(Macro.build()) class Mod {}
+@:build(Macro.build()) class ModSubType {}

+ 3 - 0
tests/misc/resolution/projects/spec/pack/ModNoMain.hx

@@ -0,0 +1,3 @@
+package pack;
+
+@:build(Macro.build()) class ModNoMainSubType {}

+ 5 - 0
tests/misc/resolution/projects/spec/pack/ModNoValue.hx

@@ -0,0 +1,5 @@
+package pack;
+
+typedef ModNoValue = {}
+
+@:build(Macro.build()) class ModNoValueSubType {}

+ 8 - 0
tests/misc/resolution/projects/spec/pack/ModWithStatic.hx

@@ -0,0 +1,8 @@
+package pack;
+
+class ModWithStatic {
+    public static function TheStatic() return "pack.ModWithStatic.TheStatic function";
+}
+
+@:build(Macro.build())
+class TheStatic {}

+ 4 - 0
tests/misc/resolution/projects/spec/pack/inner/InnerMod.hx

@@ -0,0 +1,4 @@
+package pack.inner;
+
+@:build(Macro.build()) class InnerMod {}
+@:build(Macro.build()) class InnerModSubType {}

+ 3 - 0
tests/misc/resolution/projects/spec/pack/inner/InnerModNoMain.hx

@@ -0,0 +1,3 @@
+package pack.inner;
+
+@:build(Macro.build()) class InnerModNoMainSubType {}

+ 5 - 0
tests/misc/resolution/projects/spec/pack/inner/InnerModNoValue.hx

@@ -0,0 +1,5 @@
+package pack.inner;
+
+typedef InnerModNoValue = {}
+
+@:build(Macro.build()) class InnerModNoValueSubType {}

+ 48 - 0
tests/misc/resolution/projects/spec/pack/inner/Test.hx

@@ -0,0 +1,48 @@
+package pack.inner;
+
+class Test extends utest.Test {
+    function testUnqualifiedThisPack() {
+        Macro.assert("InnerMod");
+        Macro.assert("InnerMod.InnerMod");
+        Macro.assert("InnerMod.InnerModSubType");
+        Macro.assert("InnerModNoMain.InnerModNoMainSubType");
+        Macro.assert("InnerModNoValue.InnerModNoValueSubType");
+    }
+    
+    function testUnqualifiedUpperPack() {
+        Macro.assert("Mod");
+        Macro.assert("Mod.Mod");
+        Macro.assert("Mod.ModSubType");
+        Macro.assert("ModNoMain.ModNoMainSubType");
+        Macro.assert("ModNoValue.ModNoValueSubType");
+        Macro.assert("ModWithStatic.TheStatic");
+    }
+    
+    function testUnqualifiedRootPack() {
+        Macro.assert("RootMod");
+        Macro.assert("RootMod.RootMod");
+        Macro.assert("RootMod.RootModSubType");
+        Macro.assert("RootModNoMain.RootModNoMainSubType");
+        Macro.assert("RootModNoValue.RootModNoValueSubType");
+        Macro.assert("RootModWithStatic.TheStatic");
+    }
+    
+    function testUnqualifiedRootPackStd() {
+        Macro.assert("std.RootMod");
+        Macro.assert("std.RootMod.RootMod");
+        Macro.assert("std.RootMod.RootModSubType");
+        Macro.assert("std.RootModNoMain.RootModNoMainSubType");
+        Macro.assert("std.RootModNoValue.RootModNoValueSubType");
+        Macro.assert("std.RootModWithStatic.TheStatic");
+    }
+    
+    function testUnqualifiedRootPackStdShadowed() {
+        var RootMod = 1;
+        Macro.assert("std.RootMod");
+        Macro.assert("std.RootMod.RootMod");
+        Macro.assert("std.RootMod.RootModSubType");
+        Macro.assert("std.RootModNoMain.RootModNoMainSubType");
+        Macro.assert("std.RootModNoValue.RootModNoValueSubType");
+        Macro.assert("std.RootModWithStatic.TheStatic");
+    }
+}

+ 5 - 0
tests/misc/resolution/projects/spec/pack/shadow/Test.hx

@@ -0,0 +1,5 @@
+package pack.shadow;
+
+class Test {
+    public static function f() return 42;
+}

+ 2 - 0
tests/misc/resolution/run.hxml

@@ -0,0 +1,2 @@
+-cp ../src
+--run Main

+ 3 - 0
tests/runci/targets/Macro.hx

@@ -24,6 +24,9 @@ class Macro {
 		changeDirectory(miscDir);
 		runCommand("haxe", ["compile.hxml"]);
 
+		changeDirectory(miscDir + "resolution");
+		runCommand("haxe", ["run.hxml"]);
+
 		changeDirectory(sysDir);
 		runCommand("haxe", ["compile-macro.hxml"].concat(args));