public static IEnumerable<Tuple<string, string>> UrlEncode_SharedTestData()
{
// RFC 3986 requires returned hex-encoded chars to be uppercase
yield return Tuple.Create("/\\\"\tHello! \u2665?/\\\"\tWorld! \u2665?\u2665", "%2F%5C%22%09Hello!+%E2%99%A5%3F%2F%5C%22%09World!+%E2%99%A5%3F%E2%99%A5");
yield return Tuple.Create("'", "%27");
yield return Tuple.Create("\uD800\uDFFF", "%F0%90%8F%BF"); // Surrogate pairs should be encoded as 4 bytes together
// No encoding needed
yield return Tuple.Create("abc", "abc");
yield return Tuple.Create("", "");
// Spaces
yield return Tuple.Create("abc def", "abc+def");
yield return Tuple.Create(" ", "++++");
yield return Tuple.Create("++++", "%2B%2B%2B%2B");
// Tests for stray surrogate chars (all should be encoded as U+FFFD)
yield return Tuple.Create("\uD800", "%EF%BF%BD"); // High surrogate
yield return Tuple.Create("\uDC00", "%EF%BF%BD"); // Low surrogate
yield return Tuple.Create("\uDC00\uD800", "%EF%BF%BD%EF%BF%BD"); // Low + high
yield return Tuple.Create("\uD900\uDA00", "%EF%BF%BD%EF%BF%BD"); // High + high
yield return Tuple.Create("\uDE00\uDF00", "%EF%BF%BD%EF%BF%BD"); // Low + low
yield return Tuple.Create("!\uDB00@", "!%EF%BF%BD%40"); // Non-surrogate + high + non-surrogate
yield return Tuple.Create("#\uDD00$", "%23%EF%BF%BD%24"); // Non-surrogate + low + non-surrogate
}