/*******************************************************************************
 * 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
 *******************************************************************************/
package org.eclipse.wst.xml.ui.internal.validation;

import junit.framework.TestCase;

import org.eclipse.jface.text.Region;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.ui.internal.reconcile.validator.IncrementalReporter;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;

/**
 * Tests MarkupValidator
 */
public class TestMarkupValidator extends TestCase {
	private MarkupValidator fValidator;
	private IReporter fReporter;
	private IStructuredDocument fDocument;

	/**
	 * Validates document
	 * 
	 * @param contents
	 *            contents to set in document
	 * @return true if there was a validation error false otherwise
	 */
	private boolean validateError(String contents) {
		fDocument.set(contents);
		fValidator.validate(new Region(0, fDocument.getLength()), null, fReporter);
		return fReporter.getMessages().isEmpty();
	}

	protected void setUp() throws Exception {
		// just create once
		if (fValidator == null)
			fValidator = new MarkupValidator();
		if (fReporter == null)
			fReporter = new IncrementalReporter(null);
		if (fDocument == null)
			fDocument = StructuredModelManager.getModelManager().createStructuredDocumentFor("onfire.xml", "", null);

		fValidator.connect(fDocument);
	}

	protected void tearDown() throws Exception {
		fValidator.disconnect(fDocument);
	}

	public void testAttributesInEndTag() {
		// test for error
		assertTrue("Should get attributes in end tag error", !validateError("<stop></stop drop=\"roll\">"));

		// test for no error
		assertTrue("Should not get attributes in end tag error", validateError("<stop></stop>"));
	}

	public void testClosingBracket() {
		// test for error
		assertTrue("Should get closing bracket error", !validateError("<stop </stop>"));

		// test for no error
		assertTrue("Should not get closing bracket error", validateError("<stop></stop>"));
	}

	public void testEmptyTag() {
		// test for error
		assertTrue("Should get empty tag error", !validateError("<>"));

		// test for no error
		assertTrue("Should not get empty tag error", validateError("<stop></stop>"));
	}

	public void testAttributeValue() {
		// test for error
		assertTrue("Should get attribute has no value error", !validateError("<stop drop></stop>"));
		assertTrue("Should get attribute missing value error", !validateError("<stop drop=></stop>"));

		// test for no error
		assertTrue("Should not get attribute missing value error", validateError("<stop drop=\"roll\"></stop>"));
	}

	public void testSpaceBeforeName() {
		// test for error
		assertTrue("Should get tag has space before name error", !validateError("<    stop></stop>"));

		// test for no error
		assertTrue("Should not get tag has space before name error", validateError("<stop></stop>"));
	}

	public void testQuotesForAttributeValues() {
		// test for error
		assertTrue("Should get missing end quote error", !validateError("<stop drop=\"></stop>"));
		assertTrue("Should get missing end quote error", !validateError("<stop drop=\"roll></stop>"));
		assertTrue("Should get missing end quote error", !validateError("<stop drop=\'></stop>"));
		assertTrue("Should get missing quotes error", !validateError("<stop drop=roll></stop>"));

		// test for no error
		assertTrue("Should not get missing end quote error", validateError("<stop drop=\"\"></stop>"));
		assertTrue("Should not get missing end quote error", validateError("<stop drop=\"roll\"></stop>"));
		assertTrue("Should not get missing end quote error", validateError("<stop drop=\'\'></stop>"));
		assertTrue("Should not get missing quotes error", validateError("<stop drop=\'roll\'></stop>"));
	}
}
