﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml.FormulaParsing;
using Rhino.Mocks;

namespace EPPlusTest.FormulaParsing.IntegrationTests
{
    [TestClass]
    public class PrecedenceTests : FormulaParserTestBase
    {

        [TestInitialize]
        public void Setup()
        {
            var excelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
            _parser = new FormulaParser(excelDataProvider);
        }

        [TestMethod]
        public void ShouldCaluclateUsingPrecedenceMultiplyBeforeAdd()
        {
            var result = _parser.Parse("4 + 6 * 2");
            Assert.AreEqual(16d, result);
        }

        [TestMethod]
        public void ShouldCaluclateUsingPrecedenceDivideBeforeAdd()
        {
            var result = _parser.Parse("4 + 6 / 2");
            Assert.AreEqual(7d, result);
        }

        [TestMethod]
        public void ShouldCalculateTwoGroupsUsingDivideAndMultiplyBeforeSubtract()
        {
            var result = _parser.Parse("4/2 + 3 * 3");
            Assert.AreEqual(11d, result);
        }

        [TestMethod]
        public void ShouldCalculateExpressionWithinParenthesisBeforeMultiply()
        {
            var result = _parser.Parse("(2+4) * 2");
            Assert.AreEqual(12d, result);
        }

        [TestMethod]
        public void ShouldConcatAfterAdd()
        {
            var result = _parser.Parse("2 + 4 & \"abc\"");
            Assert.AreEqual("6abc", result);
        }

        [TestMethod]
        public void Bugfixtest()
        {
            var result = _parser.Parse("(1+2)+3^2");
        }
    }
}
