// Tags: JDK1.0
// Copyright (C) 1998, 2003 Red Hat, Inc.
// Copyright (C) 2004 Mark Wielaard (mark@klomp.org)
// This file is part of Mauve.
// Mauve is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
// Mauve is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Mauve; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA. */
package gnu.testlet.java.lang.System;
import gnu.testlet.Testlet;
import gnu.testlet.TestHarness;
public class arraycopy implements Testlet
{
public int getExpectedPass() { return 72; }
public int getExpectedFail() { return 0; }
public int getExpectedKnownFail() { return 0; }
public void fill(int[] a) {
for (int i = 0; i < a.length; ++i) {
a[i] = i;
}
}
public void fill(byte[] a) {
for (int i = 0; i < a.length; ++i) {
a[i] = (byte)i;
}
}
public void fill(char[] a) {
for (int i = 0; i < a.length; ++i) {
a[i] = (char)i;
}
}
public void fill(long[] a) {
for (int i = 0; i < a.length; ++i) {
a[i] = i;
}
}
public void fill(double[] a) {
for (int i = 0; i < a.length; ++i) {
a[i] = i;
}
}
public void check (TestHarness harness, int[] expect, int[] result) {
boolean ok = expect.length == result.length;
for (int i = 0; ok && i < expect.length; ++i) {
if (expect[i] != result[i]) {
ok = false;
}
harness.check (ok);
}
}
public void check (TestHarness harness, byte[] expect, byte[] result) {
boolean ok = expect.length == result.length;
for (int i = 0; ok && i < expect.length; ++i) {
if (expect[i] != result[i]) {
ok = false;
}
harness.check (ok);
}
}
public void check (TestHarness harness, char[] expect, char[] result) {
boolean ok = expect.length == result.length;
for (int i = 0; ok && i < expect.length; ++i) {
if (expect[i] != result[i]) {
ok = false;
}
harness.check (ok);
}
}
public void check (TestHarness harness, long[] expect, long[] result) {
boolean ok = expect.length == result.length;
for (int i = 0; ok && i < expect.length; ++i) {
if (expect[i] != result[i]) {
ok = false;
}
harness.check (ok);
}
}
public void check (TestHarness harness, double[] expect, double[] result) {
boolean ok = expect.length == result.length;
for (int i = 0; ok && i < expect.length; ++i) {
if (expect[i] != result[i]) {
ok = false;
}
harness.check (ok);
}
}
public Object copy (Object from, int a, Object to, int b, int c)
{
try
{
System.arraycopy (from, a, to, b, c);
}
catch (ArrayStoreException xa)
{
return "caught ArrayStoreException";
}
catch (IndexOutOfBoundsException xb)
{
return "caught IndexOutOfBoundsException";
}
catch (NullPointerException xc)
{
return "caught NullPointerException";
}
catch (Throwable xd)
{
return "caught unexpected exception";
}
return null;
}
public void test (TestHarness harness)
{
int[] x, y;
x = new int[5];
y = new int[5];
fill (x);
harness.checkPoint("Copying integer array");
harness.check (copy (x, 0, y, 0, x.length), null);
int[] one = { 0, 1, 2, 3, 4 };
check (harness, y, one);
harness.check (copy (x, 1, y, 0, x.length - 1), null);
harness.check (copy (x, 0, y, x.length - 1, 1), null);
int[] two = { 1, 2, 3, 4, 0 };
check (harness, y, two);
harness.checkPoint("Copying byte array");
byte[] xBytes = new byte[5];
byte[] yBytes = new byte[5];
fill(xBytes);
harness.check(copy(xBytes, 0, yBytes, 0, xBytes.length), null);
byte[] oneBytes = { 0, 1, 2, 3, 4 };
check(harness, yBytes, oneBytes);
harness.checkPoint("Copying char array");
char[] xChars = new char[5];
char[] yChars = new char[5];
fill(xChars);
harness.check(copy(xChars, 0, yChars, 0, xChars.length), null);
char[] oneChars = { 0, 1, 2, 3, 4 };
check(harness, yChars, oneChars);
harness.checkPoint("Copying long array");
long[] xLongs = new long[5];
long[] yLongs = new long[5];
fill(xLongs);
harness.check(copy(xLongs, 0, yLongs, 0, xLongs.length), null);
long[] oneLongs = { 0, 1, 2, 3, 4 };
check(harness, yLongs, oneLongs);
harness.checkPoint("Copying double array");
double[] xDoubles = new double[5];
double[] yDoubles = new double[5];
fill(xDoubles);
harness.check(copy(xDoubles, 0, yDoubles, 0, xDoubles.length), null);
double[] oneDoubles = { 0, 1, 2, 3, 4 };
check(harness, yDoubles, oneDoubles);
harness.checkPoint("Incompatible arrays");
Object[] z = new Object[5];
harness.check (copy (x, 0, z, 0, x.length),
"caught ArrayStoreException");
harness.checkPoint("negative length");
harness.check (copy (x, 0, y, 0, -23),
"caught IndexOutOfBoundsException");
harness.checkPoint("null arrays");
harness.check (copy (null, 0, y, 0, -23),
"caught NullPointerException");
harness.check (copy (x, 0, null, 0, -23),
"caught NullPointerException");
harness.checkPoint("Non arrays");
String q = "metonymy";
harness.check (copy (q, 0, y, 0, 19),
"caught ArrayStoreException");
harness.check (copy (x, 0, q, 0, 19),
"caught ArrayStoreException");
harness.checkPoint("Incompatible arrays 2");
double[] v = new double[5];
harness.check (copy (x, 0, v, 0, 5),
"caught ArrayStoreException");
harness.checkPoint("Bad offset");
harness.check (copy (x, -1, y, 0, 1),
"caught IndexOutOfBoundsException");
harness.checkPoint("Incompatible arrays 3");
harness.check (copy (x, 0, z, 0, x.length),
"caught ArrayStoreException");
harness.checkPoint("Bad offset 2");
harness.check (copy (x, 0, y, -1, 1),
"caught IndexOutOfBoundsException");
harness.check (copy (x, 3, y, 0, 5),
"caught IndexOutOfBoundsException");
harness.check (copy (x, 0, y, 3, 5),
"caught IndexOutOfBoundsException");
// Regression test for missing check in libgcj.
harness.check (copy (x, 4, y, 4, Integer.MAX_VALUE),
"caught IndexOutOfBoundsException");
harness.checkPoint("Object casting");
Object[] w = new Object[5];
String[] ss = new String[5];
for (int i = 0; i < 5; ++i)
{
w[i] = i + "";
ss[i] = (i + 23) + "";
}
w[3] = new Integer (23);
harness.check (copy (w, 0, ss, 0, 5),
"caught ArrayStoreException");
harness.check (ss[0], "0");
harness.check (ss[1], "1");
harness.check (ss[2], "2");
harness.check (ss[3], "26");
harness.check (ss[4], "27");
harness.checkPoint("Different dimensions");
harness.check (copy (new Object[1][1], 0, new Object[1], 0, 1), null);
harness.check (copy (new int[1][1], 0, new Object[1], 0, 1), null);
Object[] objs = new Object[1];
objs[0] = new int[1];
harness.check (copy (objs, 0, new int[1][1], 0, 1), null);
harness.check (copy (new String[1][1], 0, new Object[1], 0, 1), null);
harness.check (copy (new int[1][1], 0, new int[1], 0, 1),
"caught ArrayStoreException");
harness.check (copy (new int[1], 0, new int[1][1], 0, 1),
"caught ArrayStoreException");
String[] strings = {
"str0",
"str1",
"str2",
"str3",
"str4"
};
System.arraycopy(strings, 1, strings, 3, 2);
harness.check(strings[0], "str0");
harness.check(strings[1], "str1");
harness.check(strings[2], "str2");
harness.check(strings[3], "str1");
harness.check(strings[4], "str2");
System.arraycopy(strings, 0, strings, 2, 3);
harness.check(strings[0], "str0");
harness.check(strings[1], "str1");
harness.check(strings[2], "str0");
harness.check(strings[3], "str1");
harness.check(strings[4], "str2");
}
}