import TestLib;
StartTest("slice");
int[] x={0,1,2,3,4,5,6,7,8,9};
// Non-cyclic cases.
assert(all(x[:] == x));
assert(!alias(x[:],x));
assert(all(x[0:4] == new int[] {0,1,2,3} ));
assert(all(x[2:4] == new int[] {2,3} ));
assert(all(x[5:] == new int[] {5,6,7,8,9} ));
assert(all(x[:5] == new int[] {0,1,2,3,4} ));
assert(all(x[3:3] == new int[] {} ));
assert(all(x[3:4] == new int[] {3} ));
assert(all(x[98:99] == new int[] {} ));
assert(x[:].cyclic == false);
assert(x[2:].cyclic == false);
assert(x[:7].cyclic == false);
assert(x[3:3].cyclic == false);
assert(x[2:9].cyclic == false);
// Cyclic cases
x.cyclic=true;
assert(all(x[:] == new int[] {0,1,2,3,4,5,6,7,8,9} ));
assert(all(x[0:4] == new int[] {0,1,2,3} ));
assert(all(x[2:4] == new int[] {2,3} ));
assert(all(x[5:] == new int[] {5,6,7,8,9} ));
assert(all(x[-5:] == new int[] {5,6,7,8,9,0,1,2,3,4,5,6,7,8,9} ));
assert(all(x[:5] == new int[] {0,1,2,3,4} ));
assert(all(x[3:3] == new int[] {} ));
assert(all(x[3:4] == new int[] {3} ));
assert(all(x[-1:1] == new int[] {9,0} ));
assert(all(x[9:11] == new int[] {9,0} ));
assert(all(x[9:21] == new int[] {9,0,1,2,3,4,5,6,7,8,9,0} ));
assert(all(x[-15:15] == new int[] {5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4}));
assert(all(x[6728:6729] == new int[] {8} ));
assert(all(x[-6729:-6728] == new int[] {1} ));
assert(x[:].cyclic == false);
assert(x[2:].cyclic == false);
assert(x[:7].cyclic == false);
assert(x[3:3].cyclic == false);
assert(x[2:9].cyclic == false);
assert(x[5:100].cyclic == false);
pair[] z={(1,2), (3,4), (5,6)};
assert(all(z[1:1] == new pair[] {}));
assert(all(z[:1] == new pair[] {(1,2)}));
assert(all(z[1:] == new pair[] {(3,4), (5,6)}));
assert(all(z[:] == z));
assert(all(z[1:2] == new pair[] {(3,4)}));
// Writing tests.
{
int[] y={0,1,2,3,4,5,6,7,8,9};
int[] z={56,67,78};
y[:] = z;
assert(all(y == z));
assert(!alias(y,z));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
int[] z={56,67,78};
z.cyclic=true;
y[:] = z;
assert(all(y == z));
assert(!alias(y,z));
assert(y.cyclic == false);
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y[2:3] = y[5:6] = new int[] {77};
assert(all(y == new int[] {0,1,77,3,4,77,6,7,8,9}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y[:3] = y[7:] = new int[] {};
assert(all(y == new int[] {3,4,5,6}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y[3:5] = new int[] {13,14,15,16,17};
assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
int[] z={56,67,78};
y[:] = z;
assert(all(y == z));
assert(!alias(y,z));
assert(y.cyclic == true);
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
int[] z={56,67,78};
z.cyclic=true;
y[:] = z;
assert(all(y == z));
assert(!alias(y,z));
assert(y.cyclic == true);
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[2:3] = y[5:6] = new int[] {77};
assert(all(y == new int[] {0,1,77,3,4,77,6,7,8,9}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[:3] = y[7:] = new int[] {};
assert(all(y == new int[] {3,4,5,6}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[8:] = new int[] {18,19,20,21,22};
assert(all(y == new int[] {0,1,2,3,4,5,6,7,18,19,20,21,22}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[-2:0] = new int[] {18,19,20,21,22};
assert(all(y == new int[] {0,1,2,3,4,5,6,7,18,19,20,21,22}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[18:20] = new int[] {18,19,20,21,22};
assert(all(y == new int[] {0,1,2,3,4,5,6,7,18,19,20,21,22}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[3:5] = new int[] {13,14,15,16,17};
assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[13:15] = new int[] {13,14,15,16,17};
assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[3-10:5-10] = new int[] {13,14,15,16,17};
assert(all(y == new int[] {0,1,2,13,14,15,16,17,5,6,7,8,9}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[8:12] = new int[] {18,19,20,21};
assert(all(y == new int[] {20,21,2,3,4,5,6,7,18,19}));
}
{
int[] y={0,1,2,3,4,5,6,7,8,9};
y.cyclic=true;
y[-2:2] = new int[] {18,19,20,21};
assert(all(y == new int[] {20,21,2,3,4,5,6,7,18,19}));
}
// Side Effect Test
{
int state=0;
int[] x={0,1,2,3,4,5,6,7,8,9};
int[] a() {
assert(state==0);
++state;
return x;
}
int l() {
assert(state==1);
++state;
return 2;
}
int r() {
assert(state==2);
++state;
return 6;
}
int[] b() {
assert(state==3);
++state;
return new int[] {77,77};
}
assert(state==0);
a()[l():r()]=b();
assert(state==4);
assert(all(x == new int[] {0,1,77,77,6,7,8,9}));
}
EndTest();