/// <summary>
 /// Tests if a string ends with an expected value
 /// </summary>
 /// <param name="end">Continuation to operate on</param>
 /// <param name="expected">String that is expected at the start of the Actual</param>
 /// <param name="customMessage">Custom message to add to failure messages</param>
 public static IStringMore With(
     this IStringEnd end,
     string expected,
     Func <string> customMessage
     )
 {
     end.AddMatcher(
         actual =>
     {
         var passed = actual?.EndsWith(expected) ?? false;
         return(new MatcherResult(
                    passed,
                    FinalMessageFor(
                        () => new[]
         {
             "Expected",
             actual.Stringify(),
             $"{passed.AsNot()}to end with",
             expected.Stringify()
         },
                        customMessage
                        )
                    ));
     });
     return(end.More());
 }
 /// <summary>
 /// Tests if a string ends with an expected value
 /// </summary>
 /// <param name="end">Continuation to operate on</param>
 /// <param name="expected">String that is expected at the end of the Actual</param>
 public static IStringMore With(
     this IStringEnd end,
     string expected
     )
 {
     return(end.With(expected, NULL_STRING));
 }
 /// <summary>
 /// Tests if a string ends with an expected value
 /// </summary>
 /// <param name="end">Continuation to operate on</param>
 /// <param name="expected">String that is expected at the start of the Actual</param>
 /// <param name="customMessage">Custom message to add to failure messages</param>
 public static IStringMore With(
     this IStringEnd end,
     string expected,
     string customMessage
     )
 {
     return(end.With(expected, () => customMessage));
 }