/*******************************************************************************
 * Copyright (c) 2012 NumberFour AG
 *
 * 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
 *
 * Contributors:
 *     NumberFour AG - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.javascript.core.tests.rewrite;

import static java.lang.Integer.parseInt;

import java.util.Iterator;
import java.util.concurrent.atomic.AtomicInteger;

import org.eclipse.dltk.core.tests.util.StringList;
import org.eclipse.dltk.javascript.core.dom.NumericLiteral;
import org.eclipse.dltk.javascript.core.dom.Source;
import org.eclipse.dltk.javascript.core.dom.StringLiteral;
import org.eclipse.dltk.javascript.core.dom.VariableDeclaration;
import org.eclipse.emf.ecore.EObject;

public class RewriteTest extends AbstractRewriteTest {

	public void testStringLiteral() {
		final StringList code = new StringList();
		code.add("var lang = 'Java'");
		final AtomicInteger counter = new AtomicInteger();
		final String changed = rewrite(code.toString(), new Operation() {
			@Override
			public void execute(Source source) {
				for (Iterator<EObject> i = source.eAllContents(); i.hasNext();) {
					final EObject child = i.next();
					if (child instanceof StringLiteral) {
						((StringLiteral) child).setText("'JavaScript'");
						counter.incrementAndGet();
					}
				}
			}
		});
		assertEquals(1, counter.intValue());
		final StringList expected = new StringList();
		expected.add("var lang = 'JavaScript'");
		assertEquals(expected.toString(), changed);
	}

	public void testVariable() {
		final AtomicInteger counter = new AtomicInteger();
		final String changed = rewrite("var year = 2012", new Operation() {
			@Override
			public void execute(Source source) {
				for (Iterator<EObject> i = source.eAllContents(); i.hasNext();) {
					final EObject child = i.next();
					if (child instanceof VariableDeclaration) {
						final VariableDeclaration var = (VariableDeclaration) child;
						var.getIdentifier().setName("YEAR");
						counter.incrementAndGet();
					}
				}
			}
		});
		assertEquals(1, counter.intValue());
		assertEquals("var YEAR = 2012", changed);
	}

	public void testNumericLiteral() {
		final AtomicInteger counter = new AtomicInteger();
		final String changed = rewrite("var year = 2012", new Operation() {
			@Override
			public void execute(Source source) {
				for (Iterator<EObject> i = source.eAllContents(); i.hasNext();) {
					final EObject child = i.next();
					if (child instanceof NumericLiteral) {
						final NumericLiteral num = (NumericLiteral) child;
						num.setText(Integer.toString(parseInt(num.getText()) + 1));
						counter.incrementAndGet();
					}
				}
			}
		});
		assertEquals(1, counter.intValue());
		assertEquals("var year = 2013", changed);
	}

}
