// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*

 *******************************************************************************
 * Copyright (C) 2005, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

package com.ibm.icu.dev.test.stringprep;

import org.junit.Ignore;
import org.junit.Test;

/**
 * @author limaoyu
 */
public class TestInputDataStructure {
    
    // TODO(junit): not running before - added empty test to keep failures away
    @Ignore
    @Test
    public void dummyTest() {}
    
    private String desc = null;

    private String namebase = null;

    private String nameutf8 = null;

    private String namezone = null;

    private String failzone1 = null;

    private String failzone2 = null;

    private String token = null;

    private String passfail = null;

    private String type = null;
    /**
     * @return Returns the desc.
     */
    public String getDesc() {
        return desc;
    }
    /**
     * @param desc The desc to set.
     */
    public void setDesc(String desc) {
        this.desc = desc;
    }
    /**
     * @return Returns the failzone1.
     */
    public String getFailzone1() {
        return failzone1;
    }
    /**
     * @param failzone1 The failzone1 to set.
     */
    public void setFailzone1(String failzone1) {
        this.failzone1 = failzone1;
    }
    /**
     * @return Returns the failzone2.
     */
    public String getFailzone2() {
        return failzone2;
    }
    /**
     * @param failzone2 The failzone2 to set.
     */
    public void setFailzone2(String failzone2) {
        this.failzone2 = failzone2;
    }
    /**
     * @return Returns the namebase.
     */
    public String getNamebase() {
        return namebase;
    }
    /**
     * @param namebase The namebase to set.
     */
    public void setNamebase(String namebase) {
        this.namebase = namebase;
    }
    /**
     * @return Returns the nameutf8.
     */
    public String getNameutf8() {
        return nameutf8;
    }
    /**
     * @param nameutf8 The nameutf8 to set.
     */
    public void setNameutf8(String nameutf8) {
        this.nameutf8 = nameutf8;
    }
    /**
     * @return Returns the namezone.
     */
    public String getNamezone() {
        return namezone;
    }
    /**
     * @param namezone The namezone to set.
     */
    public void setNamezone(String namezone) {
        this.namezone = namezone;
    }
    /**
     * @return Returns the passfail.
     */
    public String getPassfail() {
        return passfail;
    }
    /**
     * @param passfail The passfail to set.
     */
    public void setPassfail(String passfail) {
        this.passfail = passfail;
    }
    /**
     * @return Returns the token.
     */
    public String getToken() {
        return token;
    }
    /**
     * @param token The token to set.
     */
    public void setToken(String token) {
        this.token = token;
    }
    /**
     * @return Returns the type.
     */
    public String getType() {
        return type;
    }
    /**
     * @param type The type to set.
     */
    public void setType(String type) {
        this.type = type;
    }
}
