public Create ( int col, int row ) : |
||
col | int | |
row | int | |
return |
public void ColumnShouldReturnRowFromCurrentScopeIfNoAddressIsSupplied() { var func = new Column(); var parsingContext = ParsingContext.Create(); var rangeAddressFactory = new RangeAddressFactory(MockRepository.GenerateStub<ExcelDataProvider>()); parsingContext.Scopes.NewScope(rangeAddressFactory.Create("B2")); var result = func.Execute(Enumerable.Empty<FunctionArgument>(), parsingContext); Assert.AreEqual(2, result.Result); }
public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) { ValidateArguments(arguments, 1); var range = ArgToString(arguments, 0); if (Regex.IsMatch(range, RegexConstants.ExcelAddress)) { var factory = new RangeAddressFactory(context.ExcelDataProvider); var address = factory.Create(range); return CreateResult(address.ToRow - address.FromRow + 1, DataType.Integer); } throw new ArgumentException("Invalid range supplied"); }
private CompileResult HandleTwoRanges(IEnumerable<FunctionArgument> arguments, ParsingContext context) { var searchedValue = arguments.ElementAt(0).Value; Require.That(arguments.ElementAt(1).Value).Named("firstAddress").IsNotNull(); Require.That(arguments.ElementAt(2).Value).Named("secondAddress").IsNotNull(); var firstAddress = ArgToString(arguments, 1); var secondAddress = ArgToString(arguments, 2); var rangeAddressFactory = new RangeAddressFactory(context.ExcelDataProvider); var address1 = rangeAddressFactory.Create(firstAddress); var address2 = rangeAddressFactory.Create(secondAddress); var lookupIndex = (address2.FromCol - address1.FromCol) + 1; var lookupOffset = address2.FromRow - address1.FromRow; var lookupDirection = GetLookupDirection(address1); if (lookupDirection == LookupDirection.Horizontal) { lookupIndex = (address2.FromRow - address1.FromRow) + 1; lookupOffset = address2.FromCol - address1.FromCol; } var lookupArgs = new LookupArguments(searchedValue, firstAddress, lookupIndex, lookupOffset, true); var navigator = new LookupNavigator(lookupDirection, lookupArgs, context); return Lookup(navigator, lookupArgs); }
public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) { if (arguments == null || arguments.Count() == 0) { return CreateResult(context.Scopes.Current.Address.FromCol + 1, DataType.Integer); } var rangeAddress = ArgToString(arguments, 0); if (Regex.IsMatch(rangeAddress, RegexConstants.ExcelAddress)) { var factory = new RangeAddressFactory(context.ExcelDataProvider); var address = factory.Create(rangeAddress); return CreateResult(address.FromCol + 1, DataType.Integer); } throw new ArgumentException("An invalid argument was supplied"); }
public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) { ValidateArguments(arguments, 2); var searchedValue = arguments.ElementAt(0).Value; var address = ArgToString(arguments, 1); var rangeAddressFactory = new RangeAddressFactory(context.ExcelDataProvider); var rangeAddress = rangeAddressFactory.Create(address); var matchType = GetMatchType(arguments); var args = new LookupArguments(searchedValue, address, 0, 0, false); var lookupDirection = GetLookupDirection(rangeAddress); var navigator = new LookupNavigator(lookupDirection, args, context); int? lastMatchResult = default(int?); do { var matchResult = IsMatch(navigator.CurrentValue, searchedValue); if (matchType == MatchType.ClosestBelow && matchResult >= 0) { if (!lastMatchResult.HasValue && matchResult > 0) { // TODO: error handling. This happens only if the first item is // below the searched value. } var index = matchResult == 0 ? navigator.Index + 1 : navigator.Index; return CreateResult(index, DataType.Integer); } if (matchType == MatchType.ClosestAbove && matchResult <= 0) { if (!lastMatchResult.HasValue && matchResult < 0) { // TODO: error handling. This happens only if the first item is // above the searched value } var index = matchResult == 0 ? navigator.Index + 1 : navigator.Index; return CreateResult(index, DataType.Integer); } if (matchType == MatchType.ExactMatch && matchResult == 0) { return CreateResult(navigator.Index + 1, DataType.Integer); } lastMatchResult = matchResult; } while (navigator.MoveNext()); return CreateResult(null, DataType.Integer); }
private CompileResult HandleSingleRange(IEnumerable<FunctionArgument> arguments, ParsingContext context) { var searchedValue = arguments.ElementAt(0).Value; Require.That(arguments.ElementAt(1).Value).Named("firstAddress").IsNotNull(); var firstAddress = ArgToString(arguments, 1); var rangeAddressFactory = new RangeAddressFactory(context.ExcelDataProvider); var address = rangeAddressFactory.Create(firstAddress); var nRows = address.ToRow - address.FromRow; var nCols = address.ToCol - address.FromCol; var lookupIndex = nCols + 1; var lookupDirection = LookupDirection.Vertical; if (nCols > nRows) { lookupIndex = nRows + 1; lookupDirection = LookupDirection.Horizontal; } var lookupArgs = new LookupArguments(searchedValue, firstAddress, lookupIndex, 0, true); var navigator = new LookupNavigator(lookupDirection, lookupArgs, context); return Lookup(navigator, lookupArgs); }
private void Initialize() { var factory = new RangeAddressFactory(_parsingContext.ExcelDataProvider); _rangeAddress = factory.Create(_arguments.RangeAddress); _currentCol = _rangeAddress.FromCol; _currentRow = _rangeAddress.FromRow; SetCurrentValue(); }