import engine.*;
import junit.framework.*;

function void onedim()
{
  int[] tab = new int[] {1, 2, 3};
  Assert.assertEquals("onedim: Wrong array length", 3, tab.length);
  /*  for(int i=0; i<tab.length; i++)
      out.println("tab["+i+"] = " + tab[i]);*/
}

function void multidims1()
{
  int[][] tab = new int[][] { {1, 2, 3}, {1, 4, 7, 0, -1, -9}, {4, 5, 9} };
  Assert.assertEquals("multidims1: Wrong array length", 3, tab.length);
  Assert.assertEquals("multidims1: Wrong array length at index 0", 3,
		      tab[0].length);
  Assert.assertEquals("multidims1: Wrong array length at index 1", 6,
		      tab[1].length);
  Assert.assertEquals("multidims1: Wrong array length at index 2", 3,
		      tab[2].length);
  /*  for(int i=0; i<tab.length; i++)
    {
      for(int j=0; j<tab[i].length; j++)
	out.println("tab["+i+"]["+j+"] = " + tab[i][j]);
	}*/
}

function void multidims2()
{
  int[][][] tab = new int[][][] { {{1, 2}, {3}}, {{1, 4, 7}, {0, -1, -9}}, {{4}, {5, 9}} };
  Assert.assertEquals("multidims2: Wrong array length", 3, tab.length);
  Assert.assertEquals("multidims2: Wrong array length at index 0", 2,
		      tab[0].length);
  Assert.assertEquals("multidims2: Wrong array length at index 1", 2,
		      tab[1].length);
  Assert.assertEquals("multidims2: Wrong array length at index 2", 2,
		      tab[1].length);

  Assert.assertEquals("multidims2: Wrong array length at index 0,0", 2,
		      tab[0][0].length);
  Assert.assertEquals("multidims2: Wrong array length at index 0,1", 1,
		      tab[0][1].length);

  Assert.assertEquals("multidims2: Wrong array length at index 1,0", 3,
		      tab[1][0].length);
  Assert.assertEquals("multidims2: Wrong array length at index 1,1", 3,
		      tab[1][1].length);

  Assert.assertEquals("multidims2: Wrong array length at index 2,0", 1,
		      tab[2][0].length);
  Assert.assertEquals("multidims2: Wrong array length at index 2,1", 2,
		      tab[2][1].length);

  
  Assert.assertEquals("multidims2: Wrong value for element tab[1][1][1]", -1,
		      tab[1][1][1]);
  

  /*
    out.println("tab.length = " + tab.length);
  for(int i=0; i<tab.length; i++)
    {
      out.println("tab["+i+"].length = " + tab[i].length);
      for(int j=0; j<tab[i].length; j++)
	{
	  out.println("tab["+i+"]["+j+"].length = " + tab[i][j].length);
	  for(int k=0; k<tab[i][j].length; k++)
	    out.println("tab["+i+"]["+j+"]["+k+"] = " + tab[i][j][k]);
	}
	}*/
}

function void multidims3()
{
  A a = new A(2);
  A[] tab = new A[] {new A(1), a};
  Assert.assertEquals("multidims3: Wrong array length", 2,
		      tab.length);
  Assert.assertEquals("multidims3: Wrong element value at index 0", "A(1)",
		      tab[0].toString());

  /*  for(int i=0; i<tab.length; i++)
      out.println("tab["+i+"] = " + tab[i]);    */
}

function void multidims4()
{
  B b = new B(-1, 2);
  A[] tab = new A[] {new A(1), b, new B(10, 20)};
  Assert.assertEquals("multidims4: Wrong array length", 3,
		      tab.length);
  Assert.assertEquals("multidims4: Wrong element value at index 2",
		      "B(10, 20)", tab[2].toString());

  /*  for(int i=0; i<tab.length; i++)
      out.println("tab["+i+"] = " + tab[i]);    */
}

function void multidims5()
{
  A a = new A(2);
  B b = new B(-1, 2);
  A[][] tab = new A[][] {{new A(1), b, new B(10, 20)}, {b, b, a}};
  Assert.assertEquals("multidims5: Wrong array length", 2, tab.length);
  Assert.assertEquals("multidims5: Wrong array length at index 0", 3,
		      tab[0].length);
  Assert.assertEquals("multidims5: Wrong array length at index 1", 3,
		      tab[1].length);
  Assert.assertEquals("multidims5: Wrong element value at index 1, 1",
		      b, tab[0][1]);
  Assert.assertEquals("multidims5: Wrong element value at index 1, 1",
		      "B(-1, 2)", tab[1][1].toString());

  /*  for(int i=0; i<tab.length; i++)
    for(int j=0; j<tab[i].length; j++)
    out.println("tab["+i+"]["+j+"] = " + tab[i][j]);*/
}

function void multidims6()
{
  A a = new A(2);
  B b = new B(-1, 2);
  A[][] tab = {{new A(1), b, new B(10, 20)}, {b, b, b}};
  Assert.assertEquals("multidims6: Wrong array length", 2, tab.length);
  Assert.assertEquals("multidims6: Wrong array length at index 0", 3,
		      tab[0].length);
  Assert.assertEquals("multidims6: Wrong array length at index 1", 3,
		      tab[1].length);
  Assert.assertEquals("multidims6: Wrong element value at index 1, 0",
		      b, tab[1][0]);
  Assert.assertEquals("multidims6: Wrong element value at index 1, 1",
		      b, tab[1][1]);

  /*  for(int i=0; i<tab.length; i++)
    for(int j=0; j<tab[i].length; j++)
    out.println("tab["+i+"]["+j+"] = " + tab[i][j]);*/
}


function void multidims7()
{
  A a = new A(2);
  B b = new B(-1, 2);
  A[][] tab = {{new B(1, 1), b, new B(10, 20)}, {b, b, b}};
  Assert.assertEquals("multidims7: Wrong array length", 2, tab.length);
  Assert.assertEquals("multidims7: Wrong array length at index 0", 3,
		      tab[0].length);
  Assert.assertEquals("multidims7: Wrong array length at index 1", 3,
		      tab[1].length);
  Assert.assertEquals("multidims7: Wrong element value at index 1, 0",
		      "B(1, 1)", tab[0][0].toString());
  Assert.assertEquals("multidims7: Wrong element value at index 1, 1",
		      b, tab[1][1]);

  /*  for(int i=0; i<tab.length; i++)
    for(int j=0; j<tab[i].length; j++)
    out.println("tab["+i+"]["+j+"] = " + tab[i][j]);*/
}


/*function void error1()
{
  int[][][] tab = new int[][][] { {1, 2, 3}, {{1, 4, 7}, {0, -1, -9}}, {{4}, {5, 9}} };
  out.println("tab.length = " + tab.length);
  for(int i=0; i<tab.length; i++)
    {
      out.println("tab["+i+"].length = " + tab[i].length);
      for(int j=0; j<tab[i].length; j++)
	{
	  out.println("tab["+i+"]["+j+"].length = " + tab[i][j].length);
	  for(int k=0; k<tab[i][j].length; k++)
	    out.println("tab["+i+"]["+j+"]["+k+"] = " + tab[i][j][k]);
	}
    }
    }*/

function void test(int[] tab)
{
  Assert.assertEquals("test: Wrong array length", 2, tab.length);
  tab[0]++;
  Assert.assertEquals("ilrmain: Wrong element value at index 0", 2, tab[0]);
}

function void ilrmain(Object o)
{
  test(new int[] { 1, 2});
  
  onedim();
  multidims1();
  multidims2();
  multidims3();
  multidims4();
  multidims5();
  multidims6();
  multidims7();
}
