// -----------
// Arrays.java
// -----------

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

final class ArraysApplication {
    public static long f (long... a) {
        long s = 0;
        for (final long v : a)
            s += v;
        return s;}

    public static long g (long[] a) {
        long s = 0;
        for (final long v : a)
            s += v;
        return s;}

    public static void main (String[] args) {
        System.out.println("Arrays.java");

        {
        final long[] a = {2, 3, 4};
        assert a.length == 3;
        assert a[1]     == 3;
        try {
            assert a[3] == 0;
            assert false;}
        catch (ArrayIndexOutOfBoundsException e)
            {}
        }

        {
        final long[] a = new long[]{2, 3, 4};
        assert a.length == 3;
        assert a[1]     == 3;
        }

        {
        final int    s = 10;
        final long   v =  2;
        final long[] a = new long[s];
        Arrays.fill(a, v);
        assert a.length == s;
        assert a[1]     == v;
        }

        {
        final long[] a = {2, 3, 4};
        final long   i = 1;
//      assert a[i]       == 3;                  // doesn't compile
        assert a[(int) i] == 3;
        }

        {
        final long[] a = {2, 3, 4};
        final long[] b = a;
        ++b[1];
        assert a[1] == 4;
        assert b[1] == 4;
        }

        {
        final long[] a = {2, 3, 4};
        final long[] b = (long[]) a.clone();
        ++b[1];
        assert a[1] == 3;
        assert b[1] == 4;
        }

        {
        final long[] a = {2, 3, 4};
        final long[] b = {2, 3, 4};
        assert a != b;
        assert !a.equals(b);
        assert Arrays.equals(a, b);
        }

        {
        final String[] a = {"abc", "def", "ghi"};
        final String[] b = {"abc", "def", "ghi"};
        assert a != b;
        assert !a.equals(b);
        assert Arrays.equals(a, b);
        }

        {
        final String[] a = {new String("abc"), new String("def"), new String("ghi")};
        final String[] b = {new String("abc"), new String("def"), new String("ghi")};
        assert a != b;
        assert !a.equals(b);
        assert Arrays.equals(a, b);
        }

        {
        final StringBuilder[] a = {new StringBuilder("abc"), new StringBuilder("def"), new StringBuilder("ghi")};
        final StringBuilder[] b = {new StringBuilder("abc"), new StringBuilder("def"), new StringBuilder("ghi")};
        assert a != b;
        assert !a.equals(b);
        assert !Arrays.equals(a, b);
        }

        {
        final long[] a = {2, 3, 4};
        System.arraycopy(a, 0, a, 1, 2);
        assert Arrays.equals(a, new long[]{2, 2, 3});
        }

        {
        final long[] a = {2, 3, 4};
        System.arraycopy(a, 1, a, 0, 2);
        assert Arrays.equals(a, new long[]{3, 4, 4});
        }

        {
        final long[] a = {2, 3, 4};
        final long   v = 5;
        Arrays.fill(a, v);
        assert a[1] == v;
        assert Arrays.equals(a, new long[]{v, v, v});
        }

        {
        final StringBuilder[] a = {new StringBuilder("abc"), new StringBuilder("def"), new StringBuilder("ghi")};
        final StringBuilder   v = new StringBuilder("xyz");
        Arrays.fill(a, v);
        assert a[1] == v;
        assert Arrays.equals(a, new StringBuilder[]{v, v, v});
        }

        {
//      final long[]   a = (long  []) new double[3]; // doesn't compile
//      final double[] a = (double[]) new long[3];   // doesn't compile
//      final String[] a = (String[]) new Object[3]; // ClassCastException
        final Object[] a = new String[3];
        }

        {
        final Object[] a = new String[] {"abc", "def", "ghi"};
        assert a.length == 3;
        assert a[1] == "def";
        a[1] = "xyz";
        assert a[1] == "xyz";
        try {
            a[1] = new StringBuilder("uvw");
            assert false;}
        catch (ArrayStoreException e)
            {}
        }

        {
        final Object[]     a = new String[] {"abc", "def", "ghi"};
        final List<Object> x = Arrays.asList(a);
        assert x.size() == 3;
        assert x.get(1) == "def";
        x.set(1, "xyz");
        assert x.get(1) == "xyz";
        assert a[1]     == "xyz";
        try {
            x.set(1, new StringBuilder("uvw"));
            assert false;}
        catch (ArrayStoreException e)
            {}
        final Object[] b = x.toArray();
        assert b.length == 3;
        assert b[1] == "xyz";
        b[1] = "def";
        assert b[1]     == "def";
        assert x.get(1) == "xyz";
        assert a[1]     == "xyz";
        try {
            b[1] = new StringBuilder("uvw");
            assert false;}
        catch (ArrayStoreException e)
            {}
        }

        {
        final List<Integer> x = Arrays.asList(2, 3, 4);
              int           s = 0;
        for (int v : x) {
            s += v;
            ++v;}
        assert s == 9;
        assert x.get(0) == 2;
        assert x.get(1) == 3;
        assert x.get(2) == 4;
        }

        {
        final ArrayList<String> x = new ArrayList<String>(10);
//      final ArrayList<Object> x = new ArrayList<String>(10); // doesn't compile
        final ArrayList<?>      y = new ArrayList<String>(10);
        x.add("abc");
//      y.add("abc");                                          // doesn't compile
        }

        {
        assert f()                       ==  0;
        assert f(2)                      ==  2;
        assert f(2, 3)                   ==  5;
        assert f(2, 3, 4)                ==  9;
        assert f(2, 3, 4, 5)             == 14;
        assert f(new long[]{2, 3, 4, 5}) == 14;
        }

        {
//      assert g()                       ==  0;                // doesn't compile
//      assert g(2)                      ==  2;                // doesn't compile
//      assert g(2, 3)                   ==  5;                // doesn't compile
//      assert g(2, 3, 4)                ==  9;                // doesn't compile
//      assert g(2, 3, 4, 5)             == 14;                // doesn't compile
        assert g(new long[]{2, 3, 4, 5}) == 14;
        }

        System.out.println("Done.");}}


syntax highlighted by Code2HTML, v. 0.9.1