blob: a6719ba546e05a8162ad610b6caa416abd600e0e [file] [log] [blame]
// https://github.com/dlang/druntime/pull/1781
struct S
{
int i;
static int comparisons;
int opCmp(const S s) const { comparisons++; return i - s.i; }
}
void testStructs()
{
auto s1 = S(1);
auto s2 = S(2);
auto s3 = S(3);
auto s4 = S(4);
// Test lexicographical order
assert(s1 < s2 && s2 < s3);
assert([s1, s2, s3] < [s1, s3]);
assert([s1, s2] < [s1, s2, s3]);
// Test number of comparisons for nested types
S.comparisons = 0;
assert(s1 < s2);
assert(S.comparisons == 1);
S.comparisons = 0;
assert([s1, s2] < [s3, s4]);
assert(S.comparisons == 1);
S.comparisons = 0;
assert([[s1, s2]] < [[s3, s4]]);
assert(S.comparisons == 1);
}
class C
{
this(int i) { this.i = i; }
int i;
static int comparisons;
override int opCmp(Object c) const { comparisons++; return i - (cast(C)c).i; }
}
void testClasses()
{
auto c1 = new C(1);
auto c2 = new C(2);
auto c3 = new C(3);
auto c4 = new C(4);
// Test lexicographical order
assert(c1 < c2 && c2 < c3);
assert([c1, c2, c3] < [c1, c3]);
assert([c1, c2] < [c1, c2, c3]);
// Test number of comparisons for nested types
C.comparisons = 0;
assert(c1 < c2);
assert(C.comparisons == 1);
C.comparisons = 0;
assert([c1, c2] < [c3, c4]);
assert(C.comparisons == 1);
C.comparisons = 0;
assert([[c1, c2]] < [[c3, c4]]);
assert(C.comparisons == 1);
}
void main()
{
testStructs();
testClasses();
}