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

 *******************************************************************************
 * 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;
    }
}