blob: 18a24b91f769c59da8c041449590a0fbe3819fc6 [file] [log] [blame]
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));
// The unary ! operator is not overloadable in D1.
// 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;
{
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);
}
// Prefix increment/decrement operators are lowered to (foo +=/-= 1) in D1,
// but the test case does not define an integer overload for operator +=
// respectively -=.
// Implicit casting is not overloadable in D1.
}