/*
 * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.ejte.ccl.reporter;

/**
    @Class: TestCase
    @Description: Class holding One TestCase info.
    @Author : Ramesh Mandava
    @Last Modified :Initial creation By Ramesh on 10/24/2001
 */


import java.util.Hashtable;

public class TestCase
{
    private String id;
    private String name;
    private String description;

    private String status;
    private String statusDescription;

    private String expected;
    private String actual;


    public TestCase( String id, String name, String description )
    {
        this.id = id;
        this.name= name;
        this.description = description;
        this.status = ReporterConstants.DID_NOT_RUN;
        this.statusDescription=ReporterConstants.NA;
        this.expected = null;
        this.actual= null;

    }
    public TestCase( String id, String name )
    {
        this.id = id;
        this.name= name;
        this.description =ReporterConstants.NA ;
        this.status = ReporterConstants.DID_NOT_RUN;
        this.statusDescription=ReporterConstants.NA;
        this.expected = null;
        this.actual= null;

    }

    public TestCase( String id )
    {
        this.id = id;
        this.name= ReporterConstants.NA;
        this.description =ReporterConstants.NA ;
        this.status = ReporterConstants.DID_NOT_RUN;
        this.statusDescription=ReporterConstants.NA;
        this.expected = null;
        this.actual= null;

    }

    public void setStatus ( String status )
    {
        this.status = status;
    }
    public void setStatusDescription ( String statusDescription )
    {
        this.statusDescription = statusDescription;
        this.expected = null;
        this.actual= null;

    }


    public void setExpected( String expected )
    {
        this.expected = expected;
    }

    public void setActual( String actual )
    {
        this.actual = actual;
    }


    public String getId( )
    {
        return id;
    }

    public String getName( )
    {
        return name;
    }

    public String getDescription( )
    {
        return description;
    }

    public String getStatus( )
    {
        return status;
    }
    public String getStatusDescription( )
    {
        return statusDescription;
    }

    public String getExpected( )
    {
        return expected;
    }

    public String getActual( )
    {
        return actual;
    }



}
