Merge pull request #327 from kasperdaff/decodeparm-fix

DecodeParameterResolver looks in the wrong array when retrieving filter parameters
This commit is contained in:
Eliot Jones 2021-05-30 12:24:56 -04:00 committed by GitHub
commit 3869bbb786
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 121 additions and 14 deletions

View File

@ -31,5 +31,106 @@
Assert.Empty(result.Data);
}
}
[Fact]
public void SingleFilter_ReturnsParameterDictionary()
{
var filter = NameToken.CcittfaxDecode;
var filterParameters = new DictionaryToken(new Dictionary<NameToken, IToken>
{
{ NameToken.K, new NumericToken(-1) },
{ NameToken.Columns, new NumericToken(1800) },
{ NameToken.Rows, new NumericToken(3113) },
{ NameToken.BlackIs1, BooleanToken.True }
});
var dictionary = new Dictionary<NameToken, IToken>
{
{ NameToken.F, filter },
{ NameToken.DecodeParms, filterParameters }
};
var result = DecodeParameterResolver.GetFilterParameters(new DictionaryToken(dictionary), 0);
Assert.Equal(filterParameters, result);
}
[Fact]
public void SingleFilter_SpecifiedInArray_ReturnsParameterDictionary()
{
var filter = NameToken.CcittfaxDecode;
var filterParameters = new DictionaryToken(new Dictionary<NameToken, IToken>
{
{ NameToken.K, new NumericToken(-1) },
{ NameToken.Columns, new NumericToken(1800) },
{ NameToken.Rows, new NumericToken(3113) },
{ NameToken.BlackIs1, BooleanToken.True }
});
var dictionary = new Dictionary<NameToken, IToken>
{
{ NameToken.F, new ArrayToken(new [] { filter }) },
{ NameToken.DecodeParms, new ArrayToken(new [] { filterParameters }) }
};
var result = DecodeParameterResolver.GetFilterParameters(new DictionaryToken(dictionary), 0);
Assert.Equal(filterParameters, result);
}
[Fact]
public void MultipleFilters_WhenParameterIsNull_ReturnsEmptyDictionary()
{
var filter1 = NameToken.FlateDecode;
var filter1Parameters = NullToken.Instance;
var filter2 = NameToken.CcittfaxDecode;
var filter2Parameters = new DictionaryToken(new Dictionary<NameToken, IToken>
{
{ NameToken.K, new NumericToken(-1) },
{ NameToken.Columns, new NumericToken(1800) },
{ NameToken.Rows, new NumericToken(3113) },
{ NameToken.BlackIs1, BooleanToken.True }
});
var dictionary = new Dictionary<NameToken, IToken>
{
{ NameToken.F, new ArrayToken(new [] { filter1, filter2 }) },
{ NameToken.DecodeParms, new ArrayToken(new IToken[] { filter1Parameters, filter2Parameters }) }
};
var result = DecodeParameterResolver.GetFilterParameters(new DictionaryToken(dictionary), 0);
Assert.Equal(new DictionaryToken(new Dictionary<NameToken, IToken>()), result);
}
[Fact]
public void MultipleFilters_ReturnsParameterDictionary()
{
var filter1 = NameToken.FlateDecode;
var filter1Parameters = NullToken.Instance;
var filter2 = NameToken.CcittfaxDecode;
var filter2Parameters = new DictionaryToken(new Dictionary<NameToken, IToken>
{
{ NameToken.K, new NumericToken(-1) },
{ NameToken.Columns, new NumericToken(1800) },
{ NameToken.Rows, new NumericToken(3113) },
{ NameToken.BlackIs1, BooleanToken.True }
});
var dictionary = new Dictionary<NameToken, IToken>
{
{ NameToken.F, new ArrayToken(new [] { filter1, filter2 }) },
{ NameToken.DecodeParms, new ArrayToken(new IToken[] { filter1Parameters, filter2Parameters }) }
};
var result = DecodeParameterResolver.GetFilterParameters(new DictionaryToken(dictionary), 1);
Assert.Equal(filter2Parameters, result);
}
}
}

View File

@ -8,7 +8,7 @@
/// A dictionary object is an associative table containing pairs of objects, known as the dictionary's entries.
/// The key must be a <see cref="NameToken"/> and the value may be an kind of <see cref="IToken"/>.
/// </summary>
public class DictionaryToken : IDataToken<IReadOnlyDictionary<string, IToken>>
public class DictionaryToken : IDataToken<IReadOnlyDictionary<string, IToken>>, IEquatable<DictionaryToken>
{
/// <summary>
/// The key value pairs in this dictionary.
@ -123,20 +123,25 @@
return new DictionaryToken(data ?? throw new ArgumentNullException(nameof(data)));
}
/// <inheritdoc />
public bool Equals(IToken obj)
{
if (ReferenceEquals(this, obj))
return Equals(obj as DictionaryToken);
}
/// <inheritdoc />
public bool Equals(DictionaryToken other)
{
if (other == null)
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
if (!(obj is DictionaryToken other))
{
return false;
}
}
if (Data.Count != other.Data.Count)
{
return false;
@ -150,13 +155,14 @@
}
}
return true;
return true;
}
/// <inheritdoc />
public override string ToString()
{
return string.Join(", ", Data.Select(x => $"<{x.Key}, {x.Value}>"));
}
}
}
}

View File

@ -34,7 +34,7 @@
case ArrayToken array:
if (parameters is ArrayToken arr)
{
if (index < arr.Data.Count && array.Data[index] is DictionaryToken dictionary)
if (index < arr.Data.Count && arr.Data[index] is DictionaryToken dictionary)
{
return dictionary;
}