# Upper and lower triangles.

printf( "Starting the triangle tests...\n" );

xtriu = function( x; k )
{
  local( n );

  x = matrix( x );
  n = max( shape( x ) );
  if ( k == NULL ) { k = 0; else k = integer( scalar( k ) ); }

  return x @ ( fill( n,2*n-1; -n+1:n )[1:x.nr;n:n+x.nc-1] >= k );
};

xtril = function( x; k )
{
  local( n );

  x = matrix( x );
  n = max( shape( x ) );
  if ( k == NULL ) { k = 0; else k = integer( scalar( k ) ); }

  return x @ ( fill( n,2*n-1; -n+1:n )[1:x.nr;n:n+x.nc-1] <= k );
};

assert = strip (function (t)
{
  if (!test(t))
  {
    message ("...failed.\a");
    exception ();
  }
});

srand (42);

for (i in seq(40))
{
  A = surprise (1:10; 1:10;
		"integer", "real", "complex";
		1;
		"general");
  j = max (shape (A));
  for (k in -j:j)
  {
    assert (equal (triu (A; k); xtriu (A; k)));
    assert (equal (tril (A; k); xtril (A; k)));
  }
}

for (i in seq(40))
{
  A = surprise (1:10; 1:10;
		"integer", "real", "complex";
		1;
		"symmetric");
  j = max (shape (A));
  for (k in -j:j)
  {
    assert (equal (triu (A; k); xtriu (A; k)));
    assert (equal (tril (A; k); xtril (A; k)));
  }
}

for (i in seq(40))
{
  A = surprise (1:10; 1:10;
		"integer", "real", "complex";
		1;
		"hermitian");
  j = max (shape (A));
  for (k in -j:j)
  {
    assert (equal (triu (A; k); xtriu (A; k)));
    assert (equal (tril (A; k); xtril (A; k)));
  }
}

for (i in seq(40))
{
  A = surprise (1:10; 1:10;
		"integer", "real", "complex";
		i/100;
		"general");
  j = max (shape (A));
  for (k in -j:j)
  {
    assert (equal (triu (A; k); xtriu (A; k)));
    assert (equal (tril (A; k); xtril (A; k)));
  }
}

for (i in seq(40))
{
  A = surprise (1:10; 1:10;
		"integer", "real", "complex";
		i/100;
		"symmetric");
  j = max (shape (A));
  for (k in -j:j)
  {
    assert (equal (triu (A; k); xtriu (A; k)));
    assert (equal (tril (A; k); xtril (A; k)));
  }
}

for (i in seq(40))
{
  A = surprise (1:10; 1:10;
		"integer", "real", "complex";
		i/100;
		"hermitian");
  j = max (shape (A));
  for (k in -j:j)
  {
    assert (equal (triu (A; k); xtriu (A; k)));
    assert (equal (tril (A; k); xtril (A; k)));
  }
}

printf ("...passed.\n");


syntax highlighted by Code2HTML, v. 0.9.1