/*******************************************************************************
 * 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";

		@Override
		public void setDisplayText(String text) {
			this.text = text;

		}

		@Override
		public String getDisplayText() {
			return text;
		}

	}
}
