/*******************************************************************************
 * Copyright (c) 2009 Mat Booth and others.
 * 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.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
package org.eclipse.dltk.sh.internal.ui.text.tests;

import org.eclipse.dltk.sh.internal.ui.text.DollarBraceCountingRule;
import org.eclipse.dltk.sh.internal.ui.text.IShellPartitions;
import org.eclipse.jface.text.rules.Token;
import org.junit.Assert;
import org.junit.Test;

/**
 * Tests the dollar-prefixed brace-counting single-line rule. Basically we're
 * testing to make sure syntax highlighting is correct for ${} and $() blocks.
 */
public class DollarBraceCountingRuleTest {

	// Mock objects
	private MockScanner fScanner;

	// Objects under test
	private static DollarBraceCountingRule fRule = new DollarBraceCountingRule(
			'{', '}', new Token(IShellPartitions.PARAM_CONTENT_TYPE), '\\');

	/**
	 * Highlight a simple pair of dollar-prefixed braces.
	 */
	@Test
	public void testSimpleMatch() {
		fScanner = new MockScanner("${basic}test}");
		Assert.assertFalse(fRule.evaluate(fScanner).isUndefined());
		Assert.assertEquals("${basic}", fScanner.getBuffer().substring(0,
				fScanner.getOffset()));
	}

	/**
	 * Highlight a pair of braces enclosing escaped braces.
	 */
	@Test
	public void testEscapedBraceMatch() {
		fScanner = new MockScanner("${basic\\}\\}}test}");
		Assert.assertFalse(fRule.evaluate(fScanner).isUndefined());
		Assert.assertEquals("${basic\\}\\}}", fScanner.getBuffer().substring(0,
				fScanner.getOffset()));
	}

	/**
	 * Highlight the correct amount of nested braces.
	 */
	@Test
	public void testNestedBraceMatch() {
		fScanner = new MockScanner("${a{b{cd}e}f}g}");
		Assert.assertFalse(fRule.evaluate(fScanner).isUndefined());
		Assert.assertEquals("${a{b{cd}e}f}", fScanner.getBuffer().substring(0,
				fScanner.getOffset()));
	}

	/**
	 * Highlight everything up to the end of the line, if that occurs before the
	 * final closing brace.
	 */
	@Test
	public void testEndOfLineMatch() {
		fScanner = new MockScanner("${a{b}c\nd}");
		Assert.assertFalse(fRule.evaluate(fScanner).isUndefined());
		Assert.assertEquals("${a{b}c\n", fScanner.getBuffer().substring(0,
				fScanner.getOffset()));
	}

	/**
	 * Do not highlight if EOF interrupts the pattern.
	 */
	@Test
	public void testEndOfFileMatch() {
		fScanner = new MockScanner("${end of file is here:");
		Assert.assertTrue(fRule.evaluate(fScanner).isUndefined());
		Assert.assertEquals("", fScanner.getBuffer().substring(0,
				fScanner.getOffset()));
	}
}
