Stefan Bodewig <bode...@apache.org> wrote on 23.08.2016 06:14:32:

> Von: Stefan Bodewig <bode...@apache.org>
> An: "Log4Net Developers List" <log4net-dev@logging.apache.org>
> Datum: 23.08.2016 06:14
> Betreff: Re: String Equality Comparison, Broken Tests and .NET-1.x
> 
> On 2016-08-22, <jonas.ba...@rohde-schwarz.com> wrote:
> 
> > A recent commit [1] changed, among other things, some string equality
> > comparisons from `SomeComparer.Compare(a, "B", IgnoreCase) == 0` to
> > `a.ToUpperInvariant() == "B"`, see also [2].
> >
> > Unfortunately, this doesn't work if `a` is allowed to be null. 
Currently a
> > lot of log4net.Tests are broken because of such a null reference 
exception
> > in `NewLinePatternConverter.ActivateOptions` (apparently "%newline" is
> > quite common in pattern layouts ;-).
> 
> Oh, I'm sorry. I must admit I glanced over the PR and applied it without
> running the tests. My fault.
> 
> > For new code I tend to opt for `String.Equals(Option, "DOS",
> > StringComparison.OrdinalIgnoreCase)` for a fast, case-insensitive
> > comparison with fixed ASCII-only patterns, but static
> > `String.Equals(String, String, StringComparison)` is not awailable 
on
> > .NET-1.x [3].
> 
> This is what the original code before PR #16 looked like, but it doesn't
> seem to be available for .NET Core, see the discussion around
> https://github.com/apache/log4net/pull/16/
> files#diff-51624ab11a9b3d95cc770de1a4e1bdbc

Note quite, it used `string.compare(string, string, bool, CultireInfo) == 
0` which is available on .NET-1.x, while `String.Equals(string, string 
StringComparison)` and `ToUpperInvariant` are not.

> > Should we create some helper in SystemInfo that provides null-aware,
> > ordinal, casing-agnostic string equality comparison, with some #if's
> > .NET-1.x?
> 
> +1

Here you go. The attached patch introduces a `
SystemInfo.EqualsIgnoringCase(string, string)`, some unit tests, and fixes 
`NewLinePatternConverter.ActivateOptions` so that the test suite passes 
again.

Please note that I was only able to test with .NET-4.5.2. I have no 
.NET-1x around, nor .NET Core (maybe we can even drop this #elif). I used 
the code for these platforms from previous revisions of 
NewLinePatternConverter.cs. In addition, I'm not sure if I got all the 
defines for the #if right. Is there some doc for that?

regards,
Jonas


Attachment: SystemInfo_EqualsIgnoringCase.patch
Description: Binary data

Reply via email to