/*******************************************************************************
 * Copyright (c) 2005, 2007 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
 *
 
 *******************************************************************************/
package org.eclipse.dltk.ruby.ui.tests.text.indenting;

import org.eclipse.core.runtime.Assert;
import org.eclipse.dltk.core.tests.model.SuiteOfTestCases;
import org.eclipse.dltk.ruby.internal.ui.RubyPreferenceConstants;
import org.eclipse.dltk.ruby.internal.ui.text.RubyAutoEditStrategy;
import org.eclipse.dltk.ruby.internal.ui.text.RubyPartitions;
import org.eclipse.dltk.ruby.ui.tests.internal.TestUtils;
import org.eclipse.dltk.ui.CodeFormatterConstants;
import org.eclipse.jface.preference.PreferenceStore;
import org.eclipse.jface.text.DocCmd;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.TextUtilities;

public class IndentingTest extends SuiteOfTestCases {

    public IndentingTest(String name) {
		super(name);
	}

	private static final String PATH = "resources/indenting/";
	private RubyAutoEditStrategy tabStrategy, spaceStrategy;

	protected void setUp() throws Exception {
		tabStrategy = createStrategy(true);
		spaceStrategy = createStrategy(false);
        super.setUp();
    }

	private RubyAutoEditStrategy createStrategy(boolean useTabs) {
		PreferenceStore store = new PreferenceStore();
    	store.setValue(CodeFormatterConstants.FORMATTER_TAB_CHAR, 
    			(useTabs ? CodeFormatterConstants.TAB : CodeFormatterConstants.SPACE));
    	RubyPreferenceConstants.initializeDefaultValues(store);
		String partitioning = RubyPartitions.RUBY_PARTITIONING;
    	RubyAutoEditStrategy result = new RubyAutoEditStrategy(store, partitioning);
		return result;
	}

	public void doTest(String data, RubyAutoEditStrategy strategy)
			throws Exception {
		data = data.replaceAll("π", "≤\n≥");
		
		int startPos = data.indexOf("≤");
		Assert.isLegal(startPos >= 0);
		data = data.substring(0, startPos) + data.substring(startPos + 1);
		
		int replacePos = data.indexOf("±");
		int insertionStartPos = startPos;
		if (replacePos >= 0) {
			Assert.isLegal(replacePos >= startPos);
			data = data.substring(0, replacePos) + data.substring(replacePos + 1);
			insertionStartPos = replacePos;
		}
		
		int endPos = data.indexOf("≥");
		Assert.isLegal(endPos >= 0);
		Assert.isLegal(replacePos < 0 || endPos >= replacePos);
		String insertion = data.substring(insertionStartPos, endPos);
		data = data.substring(0, insertionStartPos) + data.substring(endPos + 1);
		
		int expectedPos = data.indexOf("§§");
		Assert.isLegal(expectedPos >= 0);
		String expected = data.substring(expectedPos + 2);
		data = data.substring(0, expectedPos);
		
		Document doc = new Document(data);
		TestUtils.installStuff(doc);
		
		// remove the leading line break from expected
		String[] legalLineDelimiters = doc.getLegalLineDelimiters();
		int index = TextUtilities.startsWith(legalLineDelimiters, expected);
		Assert.isLegal(index >= 0);
		expected = expected.substring(legalLineDelimiters[index].length());
		
		int replaceLength = (replacePos < 0 ? 0 : replacePos - startPos);
		DocCmd cmd = new DocCmd(startPos, replaceLength, insertion);
		
		strategy.customizeDocumentCommand(doc, cmd);
		if (cmd.doit) {
//			for (Iterator iter = cmd.getCommandIterator(); iter.hasNext(); ) {
//				Object command = iter.next();
//				Method method = command.getClass().getMethod("execute", new Class[] {IDocument.class});
//				method.invoke(command, new Object[] {doc});
//			}
			doc.replace(cmd.offset, cmd.length, cmd.text);
		}
		
		assertEquals(expected, doc.get());
	}
	
	private void magic() throws Exception {
		String name = getName();
		String fileName = name.substring(4, 5).toLowerCase() + name.substring(5) + ".rb";
		String data = TestUtils.getData(PATH + fileName);
		String moreData = data.replaceAll("\t", "    ");
		if (!moreData.equals(data))
			doTest(moreData, spaceStrategy);
		doTest(data, tabStrategy);
	}
	
	public void testNewLineInDef() throws Exception {
		magic();
	}
	
	public void testEnterBeforeClass() throws Exception {
		magic();
	}
	
	public void testEnterOpensClass() throws Exception {
		magic();
	}
	
	public void testIfStatement() throws Exception {
		magic();
	}
	
	public void testIfModifier() throws Exception {
		magic();
	}
	
	public void testMovingEndToNewLine() throws Exception {
		magic();
	}
	
	public void testMovingEndWithWhitespaceToNewLine() throws Exception {
		magic();
	}
	
	public void testDeindentingEnd() throws Exception {
		magic();
	}
	
	public void testClassNotKeyword() throws Exception {
		magic();
	}
	
	public void testNewLineAfterEmptyIndentedLine() throws Exception {
		magic();
	}
	
	public void testNewLineInRegularFunction() throws Exception {
		magic();
	}
	
	public void testIndentAfterNewLineBeforeParen() throws Exception {
		magic();
	}
	
	public void testIndentOnUnclosedParen() throws Exception {
		magic();
	}
	
	public void testIndentOnFirstExplicitContinuation() throws Exception {
		magic();
	}
	
	public void testIndentOnFirstImplicitContinuation() throws Exception {
		magic();
	}
	
	public void testNoIndentOnSubsequentExplicitContinuation() throws Exception {
		magic();
	}
	
	public void testNoIndentOnSubsequentImplicitContinuationAfterExplicitOne() throws Exception {
		magic();
	}
	
	public void testNoIndentOnSubsequentImplicitContinuationAfterImplicitOne() throws Exception {
		magic();
	}

}
