示例#1
0
        public void multipleRangeExtraction()
        {
            var mwb = new MockWorkbook("C:\\FOOBAR", "workbook.xls", new[] { "sheet1", "Calculations", "Status" });
            var f   = "=IF(Status!G11=\"stand-alone hub\",SUMIF(Calculations!B7:P7,\"include\",Calculations!B163:P163),IF(Status!G11=\"remote\",SUMIF(Calculations!B7:P7,\"include\",Calculations!B184:P184),SUMIF(Calculations!B7:P7,\"include\",Calculations!B205:P205)))";

            var calc_env = mwb.envForSheet(2);

            var rng1 = new AST.Range(Utility.makeAddressForA1("B", 7, calc_env), Utility.makeAddressForA1("P", 7, calc_env));
            var rng2 = new AST.Range(Utility.makeAddressForA1("B", 163, calc_env), Utility.makeAddressForA1("P", 163, calc_env));
            var rng3 = new AST.Range(Utility.makeAddressForA1("B", 184, calc_env), Utility.makeAddressForA1("P", 184, calc_env));
            var rng4 = new AST.Range(Utility.makeAddressForA1("B", 205, calc_env), Utility.makeAddressForA1("P", 205, calc_env));

            // extract
            try
            {
                var rngs = Parcel.rangeReferencesFromFormula(f, mwb.Path, mwb.WorkbookName, mwb.worksheetName(1), false);
                Assert.IsTrue(rngs.Contains(rng1));
                Assert.IsTrue(rngs.Contains(rng2));
                Assert.IsTrue(rngs.Contains(rng3));
                Assert.IsTrue(rngs.Contains(rng4));
                Assert.IsTrue(rngs.Length == 6);
            }
            catch (AST.ParseException e)
            {
                Assert.Fail(e.Message);
            }
        }
示例#2
0
文件: DAG.cs 项目: sjas/DataDebug
        public void markPerturbability(AST.Range vector_rng)
        {
            // get inputs
            var inputs = _v2i[vector_rng];

            // count inputs that are formulas
            int fcnt = inputs.Count(iaddr => _formulas.ContainsKey(iaddr));

            // If there is at least one input that is not a formula
            // mark the whole vector as perturbable.
            // Note: all vectors marked as non-perturbable by default.
            if (fcnt != inputs.Count)
            {
                _do_not_perturb[vector_rng] = false;
            }
        }
示例#3
0
文件: DAG.cs 项目: sjas/DataDebug
 public void linkInputVector(AST.Address formula_addr, AST.Range vector_rng)
 {
     // add range to range-lookup-by-formula_addr dictionary
     // (initialized in DAG constructor)
     _f2v[formula_addr].Add(vector_rng);
     // add formula_addr to faddr-lookup-by-range dictionary,
     // initializing bucket if necessary
     if (!_v2f.ContainsKey(vector_rng))
     {
         _v2f.Add(vector_rng, new HashSet <AST.Address>());
     }
     if (!_v2f[vector_rng].Contains(formula_addr))
     {
         _v2f[vector_rng].Add(formula_addr);
     }
 }
示例#4
0
        public void mixedRangeTest2()
        {
            var mwb = MockWorkbook.standardMockWorkbook();
            var e = mwb.envForSheet(1);

            String s = "A$1:B$1";

            AST.Range range = new AST.Range(
                AST.Address.fromA1withMode(1, "A", AST.AddressMode.Absolute, AST.AddressMode.Relative, e.WorkbookName, e.WorkbookName, e.Path),
                AST.Address.fromA1withMode(1, "B", AST.AddressMode.Absolute, AST.AddressMode.Relative, e.WorkbookName, e.WorkbookName, e.Path)
                );

            AST.Reference r = Parcel.simpleReferenceParser(s, e);
            AST.Reference correct = new AST.ReferenceRange(e, range);
            Assert.AreEqual(r, correct);
        }
示例#5
0
        public void mixedRangeTest2()
        {
            var mwb = MockWorkbook.standardMockWorkbook();
            var e   = mwb.envForSheet(1);

            String s = "A$1:B$1";

            AST.Range range = new AST.Range(
                AST.Address.fromA1withMode(1, "A", AST.AddressMode.Absolute, AST.AddressMode.Relative, e.WorkbookName, e.WorkbookName, e.Path),
                AST.Address.fromA1withMode(1, "B", AST.AddressMode.Absolute, AST.AddressMode.Relative, e.WorkbookName, e.WorkbookName, e.Path)
                );

            AST.Reference r       = Parcel.simpleReferenceParser(s, e);
            AST.Reference correct = new AST.ReferenceRange(e, range);
            Assert.AreEqual(r, correct);
        }
示例#6
0
        public void crossWorksheetRangeExtraction()
        {
            var mwb = new MockWorkbook("C:\\FOOBAR", "workbook.xls", new[] { "sheet1", "One Country Charts", "One Country Data" });
            var f   = "=IF('One Country Charts'!F17=\"\",VLOOKUP('One Country Charts'!F11,'One Country Data'!M5:O187,3,FALSE),VLOOKUP('One Country Charts'!F17,'One Country Data'!M5:O187,3,FALSE))";

            var data_env = mwb.envForSheet(3);

            var rng = new AST.Range(Utility.makeAddressForA1("M", 5, data_env), Utility.makeAddressForA1("O", 187, data_env));

            // extract
            try
            {
                var rngs = Parcel.rangeReferencesFromFormula(f, mwb.Path, mwb.WorkbookName, mwb.worksheetName(1), false);
                Assert.IsTrue(rngs.Contains(rng));
                Assert.IsTrue(rngs.Length == 2);
            }
            catch (AST.ParseException e)
            {
                Assert.Fail(e.Message);
            }
        }
示例#7
0
文件: DAG.cs 项目: sjas/DataDebug
        public AST.COMRef makeInputVectorCOMRef(AST.Range rng)
        {
            // check for the range in the dictionary
            AST.COMRef c;
            if (!_all_vectors.TryGetValue(rng, out c))
            {
                // otherwise, create and cache it
                Excel.Range     com    = rng.GetCOMObject(_app);
                Excel.Worksheet ws     = com.Worksheet;
                Excel.Workbook  wb     = ws.Parent;
                string          wsname = ws.Name;
                string          wbname = wb.Name;
                var             path   = new Microsoft.FSharp.Core.FSharpOption <string>(wb.Path);
                int             width  = com.Columns.Count;
                int             height = com.Rows.Count;

                c = new AST.COMRef(rng.getUniqueID(), wb, ws, com, path, wbname, wsname, Microsoft.FSharp.Core.FSharpOption <string> .None, width, height);
                _all_vectors.Add(rng, c);
                _do_not_perturb.Add(rng, true);    // initially mark as not perturbable
            }
            return(c);
        }
示例#8
0
文件: DAG.cs 项目: sjas/DataDebug
 public void linkComponentInputCell(AST.Range input_range, AST.Address input_addr)
 {
     // add input_addr to iaddr-lookup-by-input_range dictionary,
     // initializing bucket if necessary
     if (!_v2i.ContainsKey(input_range))
     {
         _v2i.Add(input_range, new HashSet <AST.Address>());
     }
     if (!_v2i[input_range].Contains(input_addr))
     {
         _v2i[input_range].Add(input_addr);
     }
     // add input_range to irng-lookup-by-iaddr dictionary,
     // initializing bucket if necessary
     if (!_i2v.ContainsKey(input_addr))
     {
         _i2v.Add(input_addr, new HashSet <AST.Range>());
     }
     if (!_i2v[input_addr].Contains(input_range))
     {
         _i2v[input_addr].Add(input_range);
     }
 }
示例#9
0
文件: DAG.cs 项目: sjas/DataDebug
 private IEnumerable <AST.Address> getVectorChildCellsRec(AST.Range vector_addr)
 {
     // get single-cell inputs (vectors only consist of single cells)
     return(_v2i[vector_addr].SelectMany(rng => getChildCellsRec(rng)));
 }
示例#10
0
文件: DAG.cs 项目: sjas/DataDebug
 public AST.COMRef getCOMRefForRange(AST.Range rng)
 {
     return(_all_vectors[rng]);
 }
示例#11
0
        public void multipleRangeExtraction()
        {
            var mwb = new MockWorkbook("C:\\FOOBAR", "workbook.xls", new[] { "sheet1", "Calculations", "Status" });
            var f = "=IF(Status!G11=\"stand-alone hub\",SUMIF(Calculations!B7:P7,\"include\",Calculations!B163:P163),IF(Status!G11=\"remote\",SUMIF(Calculations!B7:P7,\"include\",Calculations!B184:P184),SUMIF(Calculations!B7:P7,\"include\",Calculations!B205:P205)))";

            var calc_env = mwb.envForSheet(2);

            var rng1 = new AST.Range(Utility.makeAddressForA1("B", 7, calc_env), Utility.makeAddressForA1("P", 7, calc_env));
            var rng2 = new AST.Range(Utility.makeAddressForA1("B", 163, calc_env), Utility.makeAddressForA1("P", 163, calc_env));
            var rng3 = new AST.Range(Utility.makeAddressForA1("B", 184, calc_env), Utility.makeAddressForA1("P", 184, calc_env));
            var rng4 = new AST.Range(Utility.makeAddressForA1("B", 205, calc_env), Utility.makeAddressForA1("P", 205, calc_env));

            // extract
            try
            {
                var rngs = Parcel.rangeReferencesFromFormula(f, mwb.Path, mwb.WorkbookName, mwb.worksheetName(1), false);
                Assert.IsTrue(rngs.Contains(rng1));
                Assert.IsTrue(rngs.Contains(rng2));
                Assert.IsTrue(rngs.Contains(rng3));
                Assert.IsTrue(rngs.Contains(rng4));
                Assert.IsTrue(rngs.Length == 4);
            }
            catch (AST.ParseException e)
            {
                Assert.Fail(e.Message);
            }
        }
示例#12
0
        public void crossWorksheetRangeExtraction()
        {
            var mwb = new MockWorkbook("C:\\FOOBAR", "workbook.xls", new[] { "sheet1", "One Country Charts", "One Country Data" });
            var f = "=IF('One Country Charts'!F17=\"\",VLOOKUP('One Country Charts'!F11,'One Country Data'!M5:O187,3,FALSE),VLOOKUP('One Country Charts'!F17,'One Country Data'!M5:O187,3,FALSE))";

            var data_env = mwb.envForSheet(3);

            var rng = new AST.Range(Utility.makeAddressForA1("M", 5, data_env), Utility.makeAddressForA1("O", 187, data_env));

            // extract
            try
            {
                var rngs = Parcel.rangeReferencesFromFormula(f, mwb.Path, mwb.WorkbookName, mwb.worksheetName(1), false);
                Assert.IsTrue(rngs.Contains(rng));
                Assert.IsTrue(rngs.Length == 1);
            }
            catch (AST.ParseException e)
            {
                Assert.Fail(e.Message);
            }
        }
示例#13
0
        public void rangeCase8Test()
        {
            var mwb = MockWorkbook.standardMockWorkbook();
            var e = mwb.envForSheet(1);

            String s = "A1:B1";

            AST.Range range = new AST.Range(
                AST.Address.fromA1(1, "A", e.WorkbookName, e.WorkbookName, e.Path),
                AST.Address.fromA1(1, "B", e.WorkbookName, e.WorkbookName, e.Path)
                );

            AST.Reference r = Parcel.simpleReferenceParser(s, e);
            AST.Reference correct = new AST.ReferenceRange(e, range);
            Assert.AreEqual(r, correct);
              
        }