summaryrefslogtreecommitdiff
path: root/Examples/test-suite/d/operator_overload_runme.2.d
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/d/operator_overload_runme.2.d')
-rw-r--r--Examples/test-suite/d/operator_overload_runme.2.d91
1 files changed, 91 insertions, 0 deletions
diff --git a/Examples/test-suite/d/operator_overload_runme.2.d b/Examples/test-suite/d/operator_overload_runme.2.d
new file mode 100644
index 000000000..2ff61cd56
--- /dev/null
+++ b/Examples/test-suite/d/operator_overload_runme.2.d
@@ -0,0 +1,91 @@
+module operator_overload_runme;
+
+import operator_overload.Op;
+
+void main() {
+ // Invoke the C++ sanity check first.
+ Op.sanity_check();
+
+ auto a = new Op();
+ auto b = new Op(5);
+ auto c = b;
+ auto d = new Op(2);
+ auto dd = d;
+
+ // test equality
+ assert(a != b);
+ assert(b == c);
+ assert(a != d);
+ assert(d == dd);
+
+ // test <
+ assert(a < b);
+ assert(a <= b);
+ assert(b <= c);
+ assert(b >= c);
+ assert(b > d);
+ assert(b >= d);
+
+ // test +=
+ auto e = new Op(3);
+ e += d;
+ assert(e == b);
+ e -= c;
+ assert(e == a);
+ e = new Op(1);
+ e *= b;
+ assert(e == c);
+ e /= d;
+ assert(e == d);
+ e %= c;
+ assert(e == d);
+
+ // test +
+ auto f = new Op(1);
+ auto g = new Op(1);
+ assert(f + g == new Op(2));
+ assert(f - g == new Op(0));
+ assert(f * g == new Op(1));
+ assert(f / g == new Op(1));
+ assert(f % g == new Op(0));
+
+ // test unary operators
+ assert(-a == a);
+ assert(-b == new Op(-5));
+
+ // Unfortunaly, there is no way to override conversion to boolean for
+ // classes in D, opCast!("bool") is only used for structs.
+
+ // test []
+ auto h = new Op(3);
+ assert(h[0]==3);
+ assert(h[1]==0);
+ // Generation of opIndexAssign is not supported yet.
+
+ // test ()
+ auto i = new Op(3);
+ assert(i()==3);
+ assert(i(1)==4);
+ assert(i(1,2)==6);
+
+ // test ++ and --
+ auto j = new Op(100);
+ int original = j.i;
+ // The prefix increment/decrement operators are not directly overloadable in
+ // D2, and because the proxy classes are reference types, the lowering
+ // yields the same value as the postfix operators.
+ {
+ Op newOp = ++j;
+ int newInt = ++original;
+ assert(j.i == original);
+ assert(newOp.i == newInt);
+ }
+ {
+ Op newOp = --j;
+ int newInt = --original;
+ assert(j.i == original);
+ assert(newOp.i == newInt);
+ }
+
+ // Implicit casting via alias this is not supported yet.
+} \ No newline at end of file