blob: 66373c4270dfd8285c99f5eab84dd7ec8b0b43cb [file] [log] [blame]
// RUNNABLE_PHOBOS_TEST
// PERMUTE_ARGS:
import core.stdc.stdio : printf;
import std.string : splitLines;
import std.utf : toUTF16, toUTF32;
/***********************************************/
void test3()
{
char[] str;
str ~= "test"; // segfault
}
/***********************************************/
class A {
private:
int _i;
public:
this(int i) { _i = i; }
int i() { return _i; };
}
class B : A {
private:
char[] s;
public:
this(int i) { super(i); }
}
int main()
{
printf("Testing array of Chars\n");
CHAR();
printf("Testing array of WChars\n");
WCHAR();
printf("Testing array of DChars\n");
DCHAR();
printf("Testing array of Bytes\n");
BYTE();
printf("Testing array of UBytes\n");
UBYTE();
printf("Testing array of Shorts\n");
SHORT();
printf("Testing array of UShorts\n");
USHORT();
printf("Testing array of Ints\n");
INT();
printf("Testing array of UInts\n");
UINT();
printf("Testing array of Longs\n");
LONG();
printf("Testing array of ULongs\n");
ULONG();
printf("Testing array of Floats\n");
FLOAT();
printf("Testing array of Doubles\n");
DOUBLE();
printf("Testing array of Reals\n");
REAL();
printf("Testing multi-dim array of Chars\n");
MDCHAR();
printf("Testing array of Objects\n");
CLASS();
test3();
return 0;
}
void MDCHAR()
{
const int ITERS = 100;
alias char typ;
typ[][] str;
str.length = ITERS;
for(int idx = 0; idx < ITERS; idx++) {
str[idx] = str[idx] ~ "TEST LINE\n";
}
if(str.length != ITERS) printf("Length Error: %zd\n",str.length);
if(str[0].length != 10) printf("Length Error: %zd\n",str[0].length);
if(str[ITERS-1].sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",str[ITERS-1].sizeof);
if(str[ITERS-1][0].sizeof != (typ).sizeof) printf("Size Error: %zd\n",str[ITERS-1][0].sizeof);
foreach(s; str) {
size_t lstart;
foreach(size_t idx, char c; s) {
if(c == '\n') {
typ[] t = s[lstart..idx];
if(t != "TEST LINE") {
printf("Error testing character array\n");
break;
}
lstart = idx + 1;
}
}
}
typ[] tmp;
foreach(char[] s; str) {
tmp = tmp ~ s;
}
foreach(s; splitLines(cast(string)tmp)) {
size_t lstart;
foreach(size_t idx, char c; s) {
if(c == '\n') {
if(s[lstart..idx] != "TEST LINE") {
printf("Error testing character array\n");
break;
}
lstart = idx + 1;
}
}
}
}
void CHAR()
{
const int ITERS = 1000;
alias char typ;
typ[] str;
for(int idx = 0; idx < ITERS; idx++) {
str = str ~ "TEST LINE\n";
}
if(str.length != (ITERS * 10)) printf("Length Error: %zd\n",str.length);
if(str.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",str.sizeof);
size_t lstart;
foreach(size_t idx, char c; str) {
if(c == '\n') {
if(str[lstart..idx] != "TEST LINE") {
printf("Error testing character array\n");
break;
}
lstart = idx + 1;
}
}
}
void WCHAR()
{
const int ITERS = 1000;
alias wchar typ;
typ[] str;
for(int idx = 0; idx < ITERS; idx++) {
str = str ~ toUTF16(cast(char[])"TEST LINE\n");
}
if(str.length != (ITERS * 10)) printf("Length Error: %zd\n",str.length);
if(str.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",str.sizeof);
size_t lstart;
foreach(size_t idx, char c; str) {
if(c == '\n') {
if(str[lstart..idx] != toUTF16(cast(char[])"TEST LINE")) {
printf("Error testing character array\n");
break;
}
lstart = idx + 1;
}
}
}
void DCHAR()
{
const int ITERS = 1000;
alias dchar typ;
typ[] str;
for(int idx = 0; idx < ITERS; idx++) {
str = str ~ toUTF32(cast(char[])"TEST LINE\n");
}
if(str.length != (ITERS * 10)) printf("Length Error: %zd\n",str.length);
if(str.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",str.sizeof);
size_t lstart;
foreach(size_t idx, char c; str) {
if(c == '\n') {
if(str[lstart..idx] != toUTF32(cast(char[])"TEST LINE")) {
printf("Error testing character array\n");
break;
}
lstart = idx + 1;
}
}
}
void BYTE()
{
const int ITERS = 100;
alias byte typ;
typ[] a;
for(typ idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %d\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %d\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %d\n",c[idx]);
break;
}
}
}
void UBYTE()
{
const int ITERS = 100;
alias ubyte typ;
typ[] a;
for(typ idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %d\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %d\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %d\n",c[idx]);
break;
}
}
}
void SHORT()
{
const int ITERS = 10000;
alias short typ;
typ[] a;
for(typ idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %d\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %d\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %d\n",c[idx]);
break;
}
}
}
void USHORT()
{
const int ITERS = 10000;
alias ushort typ;
typ[] a;
for(typ idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %d\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %d\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %d\n",c[idx]);
break;
}
}
}
void INT()
{
const int ITERS = 1000000;
alias int typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %d\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %d\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %d\n",c[idx]);
break;
}
}
}
void UINT()
{
const int ITERS = 1000000;
alias uint typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %d\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %d\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %d\n",c[idx]);
break;
}
}
}
void LONG()
{
const int ITERS = 1000000;
alias long typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %lld\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %lld\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %lld\n",c[idx]);
break;
}
}
}
void ULONG()
{
const int ITERS = 1000000;
alias ulong typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %lld\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %lld\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %lld\n",c[idx]);
break;
}
}
}
void FLOAT()
{
const int ITERS = 1000000;
alias float typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %g\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %g\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %g\n",c[idx]);
break;
}
}
}
void DOUBLE()
{
const int ITERS = 1000000;
alias double typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %g\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %g\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %g\n",c[idx]);
break;
}
}
}
void REAL()
{
const int ITERS = 1000000;
alias real typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
a ~= idx;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx] != idx) {
printf("a Data Error: %Lg\n",a[idx]);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx] != idx) {
printf("b Data Error: %Lg\n",b[idx]);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx] != idx) {
printf("c Data Error: %Lg\n",c[idx]);
break;
}
}
}
void CLASS()
{
const int ITERS = 1000000;
alias B typ;
typ[] a;
for(int idx = 0; idx < ITERS; idx++) {
typ tc = new typ(idx);
a ~= tc;
}
if(a.length != ITERS) printf("Length Error: %zd\n",a.length);
if(a.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",a.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(a[idx].i != idx) {
printf("a Data Error: %d\n",a[idx].i);
break;
}
}
typ[] b = a[];
if(b.length != ITERS) printf("Length Error: %zd\n",b.length);
if(b.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",b.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(b[idx].i != idx) {
printf("b Data Error: %d\n",b[idx].i);
break;
}
}
typ[] c;
c = a[0..ITERS/2] ~ b[ITERS/2..$];
if(c.length != ITERS) printf("Length Error: %zd\n",c.length);
if(c.sizeof != (typ[]).sizeof) printf("Size Error: %zd\n",c.sizeof);
for(int idx = 0; idx < ITERS; idx++) {
if(c[idx].i != idx) {
printf("c Data Error: %d\n",c[idx].i);
break;
}
}
}