summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/tests/types/resolve.asy
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/tests/types/resolve.asy')
-rw-r--r--Build/source/utils/asymptote/tests/types/resolve.asy157
1 files changed, 157 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/tests/types/resolve.asy b/Build/source/utils/asymptote/tests/types/resolve.asy
new file mode 100644
index 00000000000..b668b15490f
--- /dev/null
+++ b/Build/source/utils/asymptote/tests/types/resolve.asy
@@ -0,0 +1,157 @@
+import TestLib;
+StartTest("resolve");
+struct A {} struct B {} struct C {}
+
+int f(B, real) { return 1; }
+int f(C, int) { return 2; }
+B operator cast(A) { return new B; }
+
+assert(f(new A, 3) == 1);
+C operator cast(A) { return new C; }
+assert(f(new A, 3) == 2);
+
+int givex(int x, int y) { return x; }
+assert(givex(2002,3) == 2002);
+assert(givex(2002,2002) == 2002);
+assert(givex(-2005,2005) == -2005);
+assert(givex(x=-77,205) == -77);
+assert(givex(-77,y=205) == -77);
+assert(givex(-77,x=205) == 205);
+assert(givex(x=-77,y=205) == -77);
+assert(givex(y=-77,x=205) == 205);
+
+int g(real x, real y) { return 7; }
+int g(int x, real y) { return 8; }
+
+assert(g(4, 4) == 8);
+assert(g(4, 4.4) == 8);
+assert(g(4.4, 4) == 7);
+assert(g(4.4, 4.4) == 7);
+
+assert(g(x=4, y=4) == 8);
+assert(g(x=4, y=4.4) == 8);
+assert(g(x=4.4, y=4) == 7);
+assert(g(x=4.4, y=4.4) == 7);
+
+assert(g(x=4, 4) == 8);
+assert(g(x=4, 4.4) == 8);
+assert(g(x=4.4, 4) == 7);
+assert(g(x=4.4, 4.4) == 7);
+
+assert(g(4, y=4) == 8);
+assert(g(4, y=4.4) == 8);
+assert(g(4.4, y=4) == 7);
+assert(g(4.4, y=4.4) == 7);
+
+assert(g(y=4, x=4) == 8);
+assert(g(y=4, x=4.4) == 7);
+assert(g(y=4.4, x=4) == 8);
+assert(g(y=4.4, x=4.4) == 7);
+
+assert(g(4, x=4) == 8);
+assert(g(4, x=4.4) == 7);
+assert(g(4.4, x=4) == 8);
+assert(g(4.4, x=4.4) == 7);
+
+assert(g(y=4, 4) == 8);
+assert(g(y=4, 4.4) == 7);
+assert(g(y=4.4, 4) == 8);
+assert(g(y=4.4, 4.4) == 7);
+
+// Test exact matching over casting.
+{
+ void f(int x, real y=0.0, int z=0) {
+ assert(x==1);
+ assert(y==2.0);
+ assert(z==0);
+ }
+ f(1,2);
+}
+{
+ void f() {
+ assert(false);
+ }
+ void f(int x, real y=0.0, int z=0) {
+ assert(x==1);
+ assert(y==2.0);
+ assert(z==0);
+ }
+ f(1,2);
+}
+{
+ void f() {
+ assert(false);
+ }
+ void f(int x, int y) {
+ assert(x==1);
+ assert(y==2);
+ }
+ void f(int x, real y=0.0, int z=0) {
+ assert(false);
+ }
+ f(1,2);
+}
+{
+ struct A {}
+ struct B {}
+ struct C {}
+
+ void f(B);
+ void g(B);
+
+ // Should resolve to void (B).
+ assert(f == g);
+ assert(g == f);
+ assert(!(f != g));
+ assert(!(g != f));
+}
+{
+ struct A {}
+ struct B {}
+ struct C {}
+
+ void f(A), f(B);
+ void g(B), g(C);
+
+ // Should resolve to void (B).
+ assert(f == g);
+ assert(g == f);
+ assert(!(f != g));
+ assert(!(g != f));
+}
+{
+ struct A {}
+ struct B {}
+ struct C {}
+
+ void f(B);
+ void g(B), g(C);
+
+ // Should resolve to void (B).
+ assert(f == g);
+ assert(g == f);
+ assert(!(f != g));
+ assert(!(g != f));
+}
+{
+ struct A {}
+ struct B {}
+ struct C {}
+
+ void f(B);
+ void g(B), g(C);
+
+ // Should resolve to void (B).
+ assert(f == g);
+ assert(g == f);
+ assert(!(f != g));
+ assert(!(g != f));
+}
+{
+void foo() {}
+assert((foo == null ? 5 : 8) == 8);
+}
+
+// TODO: Add packing vs. casting tests.
+
+EndTest();