package org.eclipse.stem.core.graph.tests;

/*******************************************************************************
 * Copyright (c) 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

import junit.framework.TestCase;

import org.eclipse.stem.core.graph.LabelValue;

/**
 * <!-- begin-user-doc -->
 * A test case for the model object '<em><b>Label Value</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following operations are tested:
 * <ul>
 *   <li>{@link org.eclipse.stem.core.graph.LabelValue#reset() <em>Reset</em>}</li>
 *   <li>{@link org.eclipse.stem.core.graph.LabelValue#sameValue(org.eclipse.stem.core.graph.LabelValue) <em>Same Value</em>}</li>
 *   <li>{@link org.eclipse.stem.core.common.SanityChecker#sane() <em>Sane</em>}</li>
 * </ul>
 * </p>
 * @generated
 */
public abstract class LabelValueTest extends TestCase {
	/**
	 * The fixture for this Label Value test case.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected LabelValue fixture = null;

	/**
	 * Constructs a new Label Value test case with the given name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LabelValueTest(String name) {
		super(name);
	}

	/**
	 * Sets the fixture for this Label Value test case.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void setFixture(LabelValue fixture) {
		this.fixture = fixture;
	}

	/**
	 * Returns the fixture for this Label Value test case.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected LabelValue getFixture() {
		return fixture;
	}

	/**
	 * Abstract since subclasses should implement
	 * this test.
	 * 
	 * 
	 * Tests the '{@link org.eclipse.stem.core.graph.LabelValue#reset() <em>Reset</em>}' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.core.graph.LabelValue#reset()
	 * @generated NOT
	 */
	public abstract void testReset();

	/**
	 * Tests the '{@link org.eclipse.stem.core.graph.LabelValue#sameValue(org.eclipse.stem.core.graph.LabelValue) <em>Same Value</em>}' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.core.graph.LabelValue#sameValue(org.eclipse.stem.core.graph.LabelValue)
	 * @generated
	 */
	public void testSameValue__LabelValue() {
		// TODO: implement this operation test method
		// Ensure that you remove @generated or mark it @generated NOT
		fail();
	}

	/**
	 * Tests the '{@link org.eclipse.stem.core.common.SanityChecker#sane() <em>Sane</em>}' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.core.common.SanityChecker#sane()
	 * @generated
	 */
	public void testSane() {
		// TODO: implement this operation test method
		// Ensure that you remove @generated or mark it @generated NOT
		fail();
	}

} //LabelValueTest
