https://github.com/ExceLint/ExceLint
Raw File
Tip revision: eb4a7d27514cd8fa0d788359fe275a34a9ca3f90 authored by Daniel W. Barowy on 03 March 2019, 22:31:42 UTC
Gradient fixes. Ready to go.
Tip revision: eb4a7d2
BasicTests.cs
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using COMWrapper;
using System.Linq;
using ExceLint;
using FastDependenceAnalysis;

namespace ExceLintTests
{
    [TestClass]
    public class BasicTests
    {
        private Graphs _addressModeDAG;

        public BasicTests()
        {
            _addressModeDAG = AddressModeDAG();
        }

        // gets the set of shallow intransitive mixed input vectors pointed to by the formula
        private static Tuple<int,int,int>[] getSIMIVs(AST.Address formula, Graph dag)
        {
            var vs = ExceLint.Vector.getRebasedVectors(formula, dag, isMixed: true, isTransitive: false, isFormula: true, isOffSheetInsensitive: true, isRelative: true, includeConstant: false);
            return vs.Select(v =>
            {
                if (v.IsConstant)
                {
                    var c = (ExceLint.Vector.RelativeVector.Constant)v;
                    return new Tuple<int, int, int>(c.Item1, c.Item2, c.Item3);
                }
                else
                {
                    var c = (ExceLint.Vector.RelativeVector.NoConstant)v;
                    return new Tuple<int, int, int>(c.Item1, c.Item2, c.Item3);
                }
            }).ToArray();
        }

        private Graphs AddressModeDAG()
        {
            var app = new Application();
            var wb = app.OpenWorkbook(@"..\..\TestData\AddressModes.xlsx");
            var graph = wb.buildDependenceGraph();
            return graph;
        }

        [TestMethod]
        public void absoluteSingleVectorSIMIV()
        {
            // tests that $A$2 in cell B2 on the same sheet returns the vector (1,2,0)
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(2, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 1);
            var foo = vectors[0];
            var bar = new Tuple<int, int, int>(1, 2, 0);
            Assert.IsTrue(foo.Equals(bar));
        }

        [TestMethod]
        public void relativeRowAbsoluteColumnSingleVectorSIMIV()
        {
            // tests that A$3 in cell B3 on the same sheet returns the vector (-1,3,0)
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(3, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 1);
            var foo = vectors[0];
            var bar = new Tuple<int, int, int>(-1, 3, 0);
            Assert.IsTrue(foo.Equals(bar));
        }

        [TestMethod]
        public void absoluteRowRelativeColumnSingleVectorSIMIV()
        {
            // tests that $A4 in cell B4 on the same sheet returns the vector (1,0,0)
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(4, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 1);
            var foo = vectors[0];
            var bar = new Tuple<int, int, int>(1, 0, 0);
            Assert.IsTrue(foo.Equals(bar));
        }

        [TestMethod]
        public void relativeSingleVectorSIMIV()
        {
            // tests that A5 in cell B5 on the same sheet returns the vector (-1,0,0)
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(5, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 1);
            var foo = vectors[0];
            var bar = new Tuple<int, int, int>(-1, 0, 0);
            Assert.IsTrue(foo.Equals(bar));
        }

        [TestMethod]
        public void AbsAbsRangeVectorsSIMIV()
        {
            // tests that $A$2:$A$5 in cell C2 on the same sheet returns a set of absolute vectors
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(2, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 4);
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int,int,int>(1, 2, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1, 3, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1, 4, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1, 5, 0))));
        }

        [TestMethod]
        public void RelAbsRangeVectorsSIMIV()
        {
            // tests that A$2:A$5 in cell C3 on the same sheet returns a set of mixed vectors
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(3, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 4);
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, 2, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, 3, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, 4, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, 5, 0))));
        }

        [TestMethod]
        public void AbsRelRangeVectorsSIMIV()
        {
            // tests that $A2:$A5 in cell C4 on the same sheet returns a set of mixed vectors
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(4, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 4);
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1, -2, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1, -1, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1,  0, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(1,  1, 0))));
        }

        [TestMethod]
        public void RelRelRangeVectorsSIMIV()
        {
            // tests that A2:A5 in cell C5 on the same sheet returns a set of mixed vectors
            var graph = _addressModeDAG.Worksheets[0];
            var wbname = graph.Workbook;
            var wsname = graph.Worksheet;
            var path = graph.Path;
            var formula = AST.Address.fromA1withMode(5, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);
            var vectors = getSIMIVs(formula, graph);
            Assert.IsTrue(vectors.Length == 4);
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, -3, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, -2, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2, -1, 0))));
            Assert.IsTrue(Array.Exists(vectors, e => e.Equals(new Tuple<int, int, int>(-2,  0, 0))));
        }

        [TestMethod]
        public void IsFormulaTest()
        {
            using (var app = new Application())
            {
                using (var wb = app.OpenWorkbook(@"..\..\TestData\DataTest.xlsx"))
                {
                    var p = Progress.NOPProgress();
                    var graph = wb.buildDependenceGraph().Worksheets[0];
                    var conf = (new FeatureConf()).enableShallowInputVectorMixedFullCVectorResultantOSI(true);
                    var m = ModelBuilder.initEntropyModel(app.XLApplication(), conf, graph, p);
                    var ih = m.InvertedHistogram;

                    var wbname = graph.Workbook;
                    var wsname = graph.Worksheet;
                    var path = graph.Path;

                    // A1
                    var a1_addr = AST.Address.fromA1withMode(1, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B1
                    var b1_addr = AST.Address.fromA1withMode(1, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C1
                    var c1_addr = AST.Address.fromA1withMode(1, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A2
                    var a2_addr = AST.Address.fromA1withMode(2, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B2
                    var b2_addr = AST.Address.fromA1withMode(2, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C2
                    var c2_addr = AST.Address.fromA1withMode(2, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A3
                    var a3_addr = AST.Address.fromA1withMode(3, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    Assert.IsFalse(EntropyModelBuilder2.AddressIsFormulaValued(a1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsFormulaValued(b1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsFormulaValued(c1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsFormulaValued(a2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsFormulaValued(b2_addr, ih, graph));
                    Assert.IsTrue(EntropyModelBuilder2.AddressIsFormulaValued(c2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsFormulaValued(a3_addr, ih, graph));
                }
            }
        }

        [TestMethod]
        public void IsNumericTest()
        {
            using (var app = new Application())
            {
                using (var wb = app.OpenWorkbook(@"..\..\TestData\DataTest.xlsx"))
                {
                    var p = Progress.NOPProgress();
                    var graph = wb.buildDependenceGraph().Worksheets[0];
                    var conf = (new FeatureConf()).enableShallowInputVectorMixedFullCVectorResultantOSI(true);
                    var m = ModelBuilder.initEntropyModel(app.XLApplication(), conf, graph, p);
                    var ih = m.InvertedHistogram;

                    var wbname = graph.Workbook;
                    var wsname = graph.Worksheet;
                    var path = graph.Path;

                    // A1
                    var a1_addr = AST.Address.fromA1withMode(1, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B1
                    var b1_addr = AST.Address.fromA1withMode(1, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C1
                    var c1_addr = AST.Address.fromA1withMode(1, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A2
                    var a2_addr = AST.Address.fromA1withMode(2, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B2
                    var b2_addr = AST.Address.fromA1withMode(2, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C2
                    var c2_addr = AST.Address.fromA1withMode(2, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A3
                    var a3_addr = AST.Address.fromA1withMode(3, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    Assert.IsFalse(EntropyModelBuilder2.AddressIsNumericValued(a1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsNumericValued(b1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsNumericValued(c1_addr, ih, graph));
                    Assert.IsTrue(EntropyModelBuilder2.AddressIsNumericValued(a2_addr, ih, graph));
                    Assert.IsTrue(EntropyModelBuilder2.AddressIsNumericValued(b2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsNumericValued(c2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsNumericValued(a3_addr, ih, graph));
                }
            }
        }

        [TestMethod]
        public void IsStringTest()
        {
            using (var app = new Application())
            {
                using (var wb = app.OpenWorkbook(@"..\..\TestData\DataTest.xlsx"))
                {
                    var p = Progress.NOPProgress();
                    var graph = wb.buildDependenceGraph().Worksheets[0];
                    var conf = (new FeatureConf()).enableShallowInputVectorMixedFullCVectorResultantOSI(true);
                    var m = ModelBuilder.initEntropyModel(app.XLApplication(), conf, graph, p);
                    var ih = m.InvertedHistogram;

                    var wbname = graph.Workbook;
                    var wsname = graph.Worksheet;
                    var path = graph.Path;

                    // A1
                    var a1_addr = AST.Address.fromA1withMode(1, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B1
                    var b1_addr = AST.Address.fromA1withMode(1, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C1
                    var c1_addr = AST.Address.fromA1withMode(1, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A2
                    var a2_addr = AST.Address.fromA1withMode(2, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B2
                    var b2_addr = AST.Address.fromA1withMode(2, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C2
                    var c2_addr = AST.Address.fromA1withMode(2, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A3
                    var a3_addr = AST.Address.fromA1withMode(3, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    Assert.IsTrue(EntropyModelBuilder2.AddressIsStringValued(a1_addr, ih, graph));
                    Assert.IsTrue(EntropyModelBuilder2.AddressIsStringValued(b1_addr, ih, graph));
                    Assert.IsTrue(EntropyModelBuilder2.AddressIsStringValued(c1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsStringValued(a2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsStringValued(b2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsStringValued(c2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsStringValued(a3_addr, ih, graph));
                }
            }
        }

        [TestMethod]
        public void IsWhitespaceTest()
        {
            using (var app = new Application())
            {
                using (var wb = app.OpenWorkbook(@"..\..\TestData\DataTest.xlsx"))
                {
                    var p = Progress.NOPProgress();
                    var graph = wb.buildDependenceGraph().Worksheets[0];
                    var conf = (new FeatureConf()).enableShallowInputVectorMixedFullCVectorResultantOSI(true);
                    var m = ModelBuilder.initEntropyModel(app.XLApplication(), conf, graph, p);
                    var ih = m.InvertedHistogram;

                    var wbname = graph.Workbook;
                    var wsname = graph.Worksheet;
                    var path = graph.Path;

                    // A1
                    var a1_addr = AST.Address.fromA1withMode(1, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B1
                    var b1_addr = AST.Address.fromA1withMode(1, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C1
                    var c1_addr = AST.Address.fromA1withMode(1, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A2
                    var a2_addr = AST.Address.fromA1withMode(2, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // B2
                    var b2_addr = AST.Address.fromA1withMode(2, "B", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // C2
                    var c2_addr = AST.Address.fromA1withMode(2, "C", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    // A3
                    var a3_addr = AST.Address.fromA1withMode(3, "A", AST.AddressMode.Absolute, AST.AddressMode.Absolute, wsname, wbname, path);

                    Assert.IsFalse(EntropyModelBuilder2.AddressIsWhitespaceValued(a1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsWhitespaceValued(b1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsWhitespaceValued(c1_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsWhitespaceValued(a2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsWhitespaceValued(b2_addr, ih, graph));
                    Assert.IsFalse(EntropyModelBuilder2.AddressIsWhitespaceValued(c2_addr, ih, graph));
                    Assert.IsTrue(EntropyModelBuilder2.AddressIsWhitespaceValued(a3_addr, ih, graph));
                }
            }
        }
    }
}
back to top