/* SingleTestHarness.java -- Runs one test given on the command line
   Copyright (C) 2005 Mark J. Wielaard
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, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/

package gnu.testlet;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class SingleTestHarness extends TestHarness
{  
  private int count;
  private String className;
  private String last_check;

  public SingleTestHarness(Testlet t)
  {
    className = t.getClass().getName();
  }

  public void check(boolean result)
  {
    String message = (result ? "PASS" : "FAIL") + ": " + className
                      + ((last_check == null) ? "" : (": " + last_check))
                      + " (number " + count++ + ")";
    System.out.println(message);
  }

  public Reader getResourceReader(String name) throws ResourceNotFoundException
  {
    return new BufferedReader(new InputStreamReader(getResourceStream(name)));
  }

  public InputStream getResourceStream(String name)
      throws ResourceNotFoundException
  {
    // The following code assumes File.separator is a single character.
    if (File.separator.length() > 1)
      throw new Error("File.separator length is greater than 1");
    String realName = name.replace('#', File.separator.charAt(0));
    try
      {
        return new FileInputStream(getSourceDirectory() + File.separator
                                   + realName);
      }
    catch (FileNotFoundException ex)
      {
        throw new ResourceNotFoundException(ex.getLocalizedMessage() + ": "
                                            + getSourceDirectory()
                                            + File.separator + realName);
      }
  }

  public File getResourceFile(String name) throws ResourceNotFoundException
  {
    // The following code assumes File.separator is a single character.
    if (File.separator.length() > 1)
      throw new Error("File.separator length is greater than 1");
    String realName = name.replace('#', File.separator.charAt(0));
    File f = new File(getSourceDirectory() + File.separator + realName);
    if (!f.exists())
      {
        throw new ResourceNotFoundException("cannot find mauve resource file"
                                            + ": " + getSourceDirectory()
                                            + File.separator + realName);
      }
    return f;
  }

  public void checkPoint (String name)
  {
    last_check = name;
    count = 0;
  }
  
  public void verbose (String message)
  {
    System.out.println(message);
  }
  
  public void debug (String message)
  {
    debug(message, true);
  }
  
  public void debug (String message, boolean newline)
  {
    if (newline)
      System.out.println(message);
    else
      System.out.print(message);
  }
  
  public void debug (Throwable ex)
  {
    ex.printStackTrace(System.out);
  }
  
  public void debug (Object[] o, String desc)
  {
    debug("Dumping Object Array: " + desc);
    if (o == null)
      {
        debug("null");
        return;
      }

    for (int i = 0; i < o.length; i++) {
      if (o[i] instanceof Object[])
        debug((Object[]) o[i], desc + " element " + i);
      else
        debug("  Element " + i + ": " + o[i]);
    }
  }

  public static void main(String[] args) throws Exception
  {
    String name = args[0];
    Class k = Class.forName(name);    
    Testlet t = (Testlet) k.newInstance();
    TestHarness h = new SingleTestHarness(t);
    t.test(h);
  }
}
