Spiral printing of 2D matrix Please comment about code complexity, and coding style, I'm preparing for a code interview, so any comment would be appreciated.

Example: 

Input

1    2   3   4
5    6   7   8
9   10  11  12
13  14  15  16


Output:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10


Code:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace JobInterviewTests
{

    //Spiral printing of 2D matrix.
    [TestClass]
    public class Spiral2Dmatrixprint
    {
        [TestMethod]
        public void TestSpiralPrint()
        {
            int[,] matrix = new int[3, 3];
            matrix[0, 0] = 1; matrix[0, 1] = 2; matrix[0, 2] = 3;
            matrix[1, 0] = 8; matrix[1, 1] = 9; matrix[1, 2] = 4;
            matrix[2, 0] = 7; matrix[2, 1] = 6; matrix[2, 2] = 5;
            SpiralPrint(matrix);

        }

        private void SpiralPrint(int[,] matrix)
        {
            int colRight = 2;
            int colLeft = 0;
            int rowTop = 0;
            int rowEnd = 2;

            PrintRight(matrix, colLeft, colRight, rowTop, rowEnd);
        }

        private void PrintRight(int[,] matrix, int colLeft, int colRight, int rowTop, int rowEnd)
        {
            if (colRight == colLeft &amp;&amp; rowTop == rowEnd)
            {
                System.Diagnostics.Debug.Write(matrix[colRight,rowTop]);
                return;
            }
            for (int i = colLeft; i &lt;= colRight; i++)
            {
                System.Diagnostics.Debug.Write(matrix[rowTop, i]);
            }
            PrintDown(matrix, colLeft, colRight, ++rowTop, rowEnd);
        }

        private void PrintDown(int[,] matrix, int colLeft, int colRight, int rowTop, int rowEnd)
        {
            if (colRight == colLeft &amp;&amp; rowTop == rowEnd)
            {
                return;
            }
            for (int i = rowTop; i &lt;= rowEnd; i++)
            {
                System.Diagnostics.Debug.Write(matrix[i, colRight]);
            }
            PrintLeft(matrix, colLeft, --colRight, rowTop, rowEnd);
        }

        private void PrintLeft(int[,] matrix, int colLeft, int colRight, int rowTop, int rowEnd)
        {
            if (colRight == colLeft &amp;&amp; rowTop == rowEnd)
            {
                return;
            }
            for (int i = colRight; i &gt;= colLeft; i--)
            {
                System.Diagnostics.Debug.Write(matrix[rowEnd, i]);
            }
            PrintUp(matrix, colLeft, colRight, rowTop, --rowEnd);
        }

        private void PrintUp(int[,] matrix, int colLeft, int colRight, int rowTop, int rowEnd)
        {
            if (colRight == colLeft &amp;&amp; rowTop == rowEnd)
            {
                return;
            }
            for (int i = rowEnd; i &gt;= rowTop; i--)
            {
                System.Diagnostics.Debug.Write(matrix[i, colLeft]);
            }
            PrintRight(matrix, ++colLeft, colRight, rowTop, rowEnd);
        }
    }
}
Hard code col and row counts is not good

int colRight = 2;
int colLeft = 0;
int rowTop = 0;
int rowEnd = 2;


Test method should print out results - not method  

I think this will fail if the matrix is not square  

if (colRight == colLeft &amp;&amp; rowTop == rowEnd)


I think this is cleaner  

public static void TestSpiralPrint()
{
    int[,] matrix = new int[5, 4];
    matrix[0, 0] = 1;  matrix[0, 1] = 2;  matrix[0, 2] = 3;  matrix[0, 3] = 4;
    matrix[1, 0] = 5;  matrix[1, 1] = 6;  matrix[1, 2] = 7;  matrix[1, 3] = 8;
    matrix[2, 0] = 9;  matrix[2, 1] = 10; matrix[2, 2] = 11; matrix[2, 3] = 12;
    matrix[3, 0] = 13; matrix[3, 1] = 14; matrix[3, 2] = 15; matrix[3, 3] = 16;
    matrix[4, 0] = 17; matrix[4, 1] = 18; matrix[4, 2] = 19; matrix[4, 3] = 20;
    List&lt;int&gt; output = SpiralPrint(matrix);
    foreach (int i in output)
        Debug.WriteLine(i);
    Debug.WriteLine("");
}
private static List&lt;int&gt; SpiralPrint(int[,] matrix)
{
    List&lt;int&gt; output = new List&lt;int&gt;();
    if (matrix.Length &gt; 0)
    {
        int top = 0;
        int btm = matrix.GetLength(0);
        int lft = 0;
        int rht = matrix.GetLength(1);

        while (lft &lt; rht &amp;&amp; top &lt; btm)
        {
            for (int i = lft; i &lt; rht; i++)
                output.Add(matrix[top, i]);
            top++;

            for (int i = top; i &lt; btm; i++)
                output.Add(matrix[i, rht - 1]);
            rht--;

            if (lft &lt; rht)
            {
                for (int i = rht - 1; i &gt;= lft; i--)
                    output.Add(matrix[btm - 1, i]);
                btm--;
            }

            if (top &lt; btm)
            {
                for (int i = btm - 1; i &gt;= top; i--)
                    output.Add(matrix[i, lft]);
                lft++;
            }
        }
    }
    return output;
}