From 6a04a81c3f41fdbd40cd308573459cc4b26daf35 Mon Sep 17 00:00:00 2001 From: jacek-ratzinger Date: Sat, 23 Nov 2013 19:59:14 +0100 Subject: [PATCH 01/11] add basic implementation for new boolean matching --- Concordion/Concordion.csproj | 3 + .../Internal/BooleanExpectationChecker.cs | 22 +++++++ .../Internal/DefaultExpectationChecker.cs | 63 +++++++++++++++++++ Concordion/Internal/IExpectationChecker.cs | 12 ++++ 4 files changed, 100 insertions(+) create mode 100644 Concordion/Internal/BooleanExpectationChecker.cs create mode 100644 Concordion/Internal/DefaultExpectationChecker.cs create mode 100644 Concordion/Internal/IExpectationChecker.cs diff --git a/Concordion/Concordion.csproj b/Concordion/Concordion.csproj index 525ccb7..006d3d0 100644 --- a/Concordion/Concordion.csproj +++ b/Concordion/Concordion.csproj @@ -109,6 +109,7 @@ + @@ -146,8 +147,10 @@ + + diff --git a/Concordion/Internal/BooleanExpectationChecker.cs b/Concordion/Internal/BooleanExpectationChecker.cs new file mode 100644 index 0000000..3b55d22 --- /dev/null +++ b/Concordion/Internal/BooleanExpectationChecker.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace Concordion.Internal +{ + class BooleanExpectationChecker : DefaultExpectationChecker + { + + public override bool IsAcceptable(string expected, object actual) + { + if (!(actual is bool)) return false; + + var boolActual = (bool) actual; + var normalizedExpected = this.Normalize(expected).ToLower(); + return (boolActual && Regex.IsMatch(normalizedExpected, "true|yes|y")) || + (!boolActual && Regex.IsMatch(normalizedExpected, "false|no|n|-")); + } + } +} diff --git a/Concordion/Internal/DefaultExpectationChecker.cs b/Concordion/Internal/DefaultExpectationChecker.cs new file mode 100644 index 0000000..4a0aeb7 --- /dev/null +++ b/Concordion/Internal/DefaultExpectationChecker.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace Concordion.Internal +{ + class DefaultExpectationChecker : IExpectationChecker + { + #region IExpectationChecker Members + + public virtual bool IsAcceptable(string expected, object actual) + { + return Normalize(expected).Equals(Normalize(actual)); + } + + #endregion + + #region Methods + + public string Normalize(object obj) + { + string s = ConvertObjectToString(obj); + s = ProcessLineContinuations(s); + s = StripNewlines(s); + s = ReplaceMultipleWhitespaceWithOneSpace(s); + return s.Trim(); + } + + private string ReplaceMultipleWhitespaceWithOneSpace(string s) + { + var lineContinuationRegex = new Regex(@"[\s]+"); + var processedString = lineContinuationRegex.Replace(s, " "); + + return processedString; + } + + private string ProcessLineContinuations(string s) + { + var lineContinuationRegex = new Regex(@" _"); + var processedString = lineContinuationRegex.Replace(s, String.Empty); + + return processedString; + } + + private string StripNewlines(string s) + { + var newlineRegex = new Regex(@"\r?\n"); + var processedString = newlineRegex.Replace(s, String.Empty); + + return processedString; + } + + private string ConvertObjectToString(object obj) + { + if (obj == null) return "(null)"; + else return obj.ToString(); + } + + #endregion + } +} diff --git a/Concordion/Internal/IExpectationChecker.cs b/Concordion/Internal/IExpectationChecker.cs new file mode 100644 index 0000000..8a0aaa3 --- /dev/null +++ b/Concordion/Internal/IExpectationChecker.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Concordion.Internal +{ + interface IExpectationChecker + { + bool IsAcceptable(string expected, object actual); + } +} From 6515f7d3090faf5b724cd0b2202565d9ee877716 Mon Sep 17 00:00:00 2001 From: jacek-ratzinger Date: Sat, 23 Nov 2013 20:36:01 +0100 Subject: [PATCH 02/11] make tests pass with new Checker infrastructure --- .../AssertEquals/Whitespace/WhitespaceTest.cs | 2 +- Concordion/Concordion.csproj | 2 + Concordion/Internal/AbstractCheckerBase.cs | 49 +++++++++++++++++ .../Internal/BooleanExpectationChecker.cs | 2 +- .../BrowserStyleWhitespaceComparer.cs | 50 ++++------------- .../Internal/ChainOfExpectationCheckers.cs | 23 ++++++++ .../Internal/DefaultExpectationChecker.cs | 53 ++----------------- Concordion/Internal/IExpectationChecker.cs | 2 +- 8 files changed, 90 insertions(+), 93 deletions(-) create mode 100644 Concordion/Internal/AbstractCheckerBase.cs create mode 100644 Concordion/Internal/ChainOfExpectationCheckers.cs diff --git a/Concordion.Spec/Concordion/Command/AssertEquals/Whitespace/WhitespaceTest.cs b/Concordion.Spec/Concordion/Command/AssertEquals/Whitespace/WhitespaceTest.cs index c2c6b12..55a62da 100644 --- a/Concordion.Spec/Concordion/Command/AssertEquals/Whitespace/WhitespaceTest.cs +++ b/Concordion.Spec/Concordion/Command/AssertEquals/Whitespace/WhitespaceTest.cs @@ -50,7 +50,7 @@ public string normalize(string s) { // Bit naughty calling internal method normalize() directly return replaceRealWhitespaceCharactersWithNames( - BrowserStyleWhitespaceComparer.Normalize(replaceNamedWhitespaceWithRealWhitespaceCharacters(s))); + new DefaultExpectationChecker().Normalize(replaceNamedWhitespaceWithRealWhitespaceCharacters(s))); } private static string replaceNamedWhitespaceWithRealWhitespaceCharacters(string s) diff --git a/Concordion/Concordion.csproj b/Concordion/Concordion.csproj index 006d3d0..509b878 100644 --- a/Concordion/Concordion.csproj +++ b/Concordion/Concordion.csproj @@ -108,9 +108,11 @@ + + diff --git a/Concordion/Internal/AbstractCheckerBase.cs b/Concordion/Internal/AbstractCheckerBase.cs new file mode 100644 index 0000000..e1cd72f --- /dev/null +++ b/Concordion/Internal/AbstractCheckerBase.cs @@ -0,0 +1,49 @@ +using System; +using System.Text.RegularExpressions; + +namespace Concordion.Internal +{ + public abstract class AbstractCheckerBase : IExpectationChecker + { + public abstract bool IsAcceptable(string expected, object actual); + + public string Normalize(object obj) + { + string s = this.ConvertObjectToString(obj); + s = this.ProcessLineContinuations(s); + s = this.StripNewlines(s); + s = this.ReplaceMultipleWhitespaceWithOneSpace(s); + return s.Trim(); + } + + private string ReplaceMultipleWhitespaceWithOneSpace(string s) + { + var lineContinuationRegex = new Regex(@"[\s]+"); + var processedString = lineContinuationRegex.Replace(s, " "); + + return processedString; + } + + private string ProcessLineContinuations(string s) + { + var lineContinuationRegex = new Regex(@" _"); + var processedString = lineContinuationRegex.Replace(s, String.Empty); + + return processedString; + } + + private string StripNewlines(string s) + { + var newlineRegex = new Regex(@"\r?\n"); + var processedString = newlineRegex.Replace(s, String.Empty); + + return processedString; + } + + private string ConvertObjectToString(object obj) + { + if (obj == null) return "(null)"; + else return obj.ToString(); + } + } +} \ No newline at end of file diff --git a/Concordion/Internal/BooleanExpectationChecker.cs b/Concordion/Internal/BooleanExpectationChecker.cs index 3b55d22..a685735 100644 --- a/Concordion/Internal/BooleanExpectationChecker.cs +++ b/Concordion/Internal/BooleanExpectationChecker.cs @@ -6,7 +6,7 @@ namespace Concordion.Internal { - class BooleanExpectationChecker : DefaultExpectationChecker + public class BooleanExpectationChecker : AbstractCheckerBase { public override bool IsAcceptable(string expected, object actual) diff --git a/Concordion/Internal/BrowserStyleWhitespaceComparer.cs b/Concordion/Internal/BrowserStyleWhitespaceComparer.cs index f596b0a..34a7c87 100644 --- a/Concordion/Internal/BrowserStyleWhitespaceComparer.cs +++ b/Concordion/Internal/BrowserStyleWhitespaceComparer.cs @@ -17,59 +17,29 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; +using Concordion.Internal.Util; namespace Concordion.Internal { public class BrowserStyleWhitespaceComparer : IComparer { - #region Methods + private readonly ChainOfExpectationCheckers m_ChainOfCheckers = new ChainOfExpectationCheckers(); - public static string Normalize(object obj) + public BrowserStyleWhitespaceComparer() { - string s = ConvertObjectToString(obj); - s = ProcessLineContinuations(s); - s = StripNewlines(s); - s = ReplaceMultipleWhitespaceWithOneSpace(s); - return s.Trim(); + this.m_ChainOfCheckers.Add(new DefaultExpectationChecker()); } - private static string ReplaceMultipleWhitespaceWithOneSpace(string s) - { - var lineContinuationRegex = new Regex(@"[\s]+"); - var processedString = lineContinuationRegex.Replace(s, " "); - - return processedString; - } - - private static string ProcessLineContinuations(string s) - { - var lineContinuationRegex = new Regex(@" _"); - var processedString = lineContinuationRegex.Replace(s, String.Empty); - - return processedString; - } - - private static string StripNewlines(string s) - { - var newlineRegex = new Regex(@"\r?\n"); - var processedString = newlineRegex.Replace(s, String.Empty); - - return processedString; - } - - private static string ConvertObjectToString(object obj) - { - if (obj == null) return "(null)"; - else return obj.ToString(); - } - - #endregion - #region IComparer Members public int Compare(object x, object y) { - return Normalize(x).CompareTo(Normalize(y)); + Check.IsTrue(y is string, "This comparator only supports comparisons with String objects"); + if (m_ChainOfCheckers.IsAcceptable((string) y, x)) + { + return 0; + } + return -1; } #endregion diff --git a/Concordion/Internal/ChainOfExpectationCheckers.cs b/Concordion/Internal/ChainOfExpectationCheckers.cs new file mode 100644 index 0000000..b3db97d --- /dev/null +++ b/Concordion/Internal/ChainOfExpectationCheckers.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Concordion.Internal +{ + public class ChainOfExpectationCheckers : IExpectationChecker + { + private List checkers = new List(); + + public ChainOfExpectationCheckers Add(IExpectationChecker checker) + { + checkers.Add(checker); + return this; + } + + public bool IsAcceptable(string expected, object actual) + { + return this.checkers.Any(checker => checker.IsAcceptable(expected, actual)); + } + } +} diff --git a/Concordion/Internal/DefaultExpectationChecker.cs b/Concordion/Internal/DefaultExpectationChecker.cs index 4a0aeb7..d43734a 100644 --- a/Concordion/Internal/DefaultExpectationChecker.cs +++ b/Concordion/Internal/DefaultExpectationChecker.cs @@ -6,58 +6,11 @@ namespace Concordion.Internal { - class DefaultExpectationChecker : IExpectationChecker + public class DefaultExpectationChecker : AbstractCheckerBase { - #region IExpectationChecker Members - - public virtual bool IsAcceptable(string expected, object actual) - { - return Normalize(expected).Equals(Normalize(actual)); - } - - #endregion - - #region Methods - - public string Normalize(object obj) - { - string s = ConvertObjectToString(obj); - s = ProcessLineContinuations(s); - s = StripNewlines(s); - s = ReplaceMultipleWhitespaceWithOneSpace(s); - return s.Trim(); - } - - private string ReplaceMultipleWhitespaceWithOneSpace(string s) - { - var lineContinuationRegex = new Regex(@"[\s]+"); - var processedString = lineContinuationRegex.Replace(s, " "); - - return processedString; - } - - private string ProcessLineContinuations(string s) + public override bool IsAcceptable(string expected, object actual) { - var lineContinuationRegex = new Regex(@" _"); - var processedString = lineContinuationRegex.Replace(s, String.Empty); - - return processedString; + return this.Normalize(expected).Equals(this.Normalize(actual)); } - - private string StripNewlines(string s) - { - var newlineRegex = new Regex(@"\r?\n"); - var processedString = newlineRegex.Replace(s, String.Empty); - - return processedString; - } - - private string ConvertObjectToString(object obj) - { - if (obj == null) return "(null)"; - else return obj.ToString(); - } - - #endregion } } diff --git a/Concordion/Internal/IExpectationChecker.cs b/Concordion/Internal/IExpectationChecker.cs index 8a0aaa3..2a68fdd 100644 --- a/Concordion/Internal/IExpectationChecker.cs +++ b/Concordion/Internal/IExpectationChecker.cs @@ -5,7 +5,7 @@ namespace Concordion.Internal { - interface IExpectationChecker + public interface IExpectationChecker { bool IsAcceptable(string expected, object actual); } From 98382181e606753e376027087f057ae9fc5bd02e Mon Sep 17 00:00:00 2001 From: jacek-ratzinger Date: Sun, 24 Nov 2013 21:03:50 +0100 Subject: [PATCH 03/11] add specification with examples: for new bool string handling --- Concordion.Spec/Concordion.Spec.csproj | 6 + .../Command/AssertEquals/AssertEquals.html | 1 + .../AssertEquals/NonString/Boolean.html | 133 ++++++++++++++++++ .../AssertEquals/NonString/BooleanTest.cs | 22 +++ 4 files changed, 162 insertions(+) create mode 100644 Concordion.Spec/Concordion/Command/AssertEquals/NonString/Boolean.html create mode 100644 Concordion.Spec/Concordion/Command/AssertEquals/NonString/BooleanTest.cs diff --git a/Concordion.Spec/Concordion.Spec.csproj b/Concordion.Spec/Concordion.Spec.csproj index bc380e2..92fcd87 100644 --- a/Concordion.Spec/Concordion.Spec.csproj +++ b/Concordion.Spec/Concordion.Spec.csproj @@ -69,6 +69,7 @@ + @@ -325,6 +326,11 @@ true + + + Always + +