/*******************************************************************************
 * Copyright (C) 2010, Matthias Sohn <matthias.sohn@sap.com>
 * Copyright (C) 2010, Stefan Lay <stefan.lay@sap.com>
 *
 * 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.example.calc.internal;

import static org.junit.Assert.assertEquals;

import org.eclipse.example.calc.Operations;
import org.junit.After;
import org.junit.Test;

public class CalculatorTest {

	@After
	public void tearDown() throws Exception {
		Operations.INSTANCE.reset();
	}

	@Test
	public void testPlus() {
		TestTextProvider textProvider = new TestTextProvider();
		Calculator calculator = new Calculator(textProvider);

		calculator.handleButtonClick("1");
		calculator.handleButtonClick("+");
		calculator.handleButtonClick("2");
		calculator.handleButtonClick("=");

		assertEquals("3.0", textProvider.getDisplayText());
	}

	@Test
	public void testTwoTimesPlus() {
		TestTextProvider textProvider = new TestTextProvider();
		Calculator calculator = new Calculator(textProvider);

		calculator.handleButtonClick("1");
		calculator.handleButtonClick("+");
		calculator.handleButtonClick("2");
		calculator.handleButtonClick("+");
		calculator.handleButtonClick("3");
		calculator.handleButtonClick("=");

		assertEquals("6.0", textProvider.getDisplayText());
	}

	@Test
	public void testPlusWithFraction() {
		TestTextProvider textProvider = new TestTextProvider();
		Calculator calculator = new Calculator(textProvider);

		calculator.handleButtonClick("1");
		calculator.handleButtonClick("+");
		calculator.handleButtonClick("2");
		calculator.handleButtonClick(".");
		calculator.handleButtonClick("1");
		calculator.handleButtonClick("=");

		assertEquals("3.1", textProvider.getDisplayText());
	}

	@Test
	public void testSquare() {
		TestTextProvider textProvider = new TestTextProvider();
		Calculator calculator = new Calculator(textProvider);

		calculator.handleButtonClick("2");
		calculator.handleButtonClick("x²");

		assertEquals("4.0", textProvider.getDisplayText());
	}

	private static final class TestTextProvider implements TextProvider {

		private String text = "0";

		public void setDisplayText(String text) {
			this.text = text;

		}

		public String getDisplayText() {
			return text;
		}

	}
}
