├── .gitignore ├── README.md ├── StringFormat.Test ├── ExpectedExceptions.cs ├── HappyPathsAnonymousTypes.cs ├── HappyPathsDictionary.cs ├── Properties │ └── AssemblyInfo.cs ├── StringFormat.Test.csproj ├── StringHelper.cs └── packages.config ├── StringFormat.sln ├── StringFormat ├── Properties │ └── AssemblyInfo.cs ├── StringFormat.csproj ├── StringFormat.xml └── TokenStringFormat.cs └── packages ├── NUnit.2.6.0.12054 ├── NUnit.2.6.0.12054.nupkg ├── lib │ ├── nunit.framework.dll │ └── nunit.framework.xml └── license.txt ├── SharpTestsEx.1.1.1 ├── License.txt ├── Read_Me.txt ├── SharpTestsEx.1.1.1.nupkg ├── SharpTestsEx.snk └── lib │ ├── SharpTestsEx.Mvc.XML │ ├── SharpTestsEx.Mvc.dll │ ├── SharpTestsEx.XML │ ├── SharpTestsEx.dll │ └── SharpTestsEx.snk └── repositories.config /.gitignore: -------------------------------------------------------------------------------- 1 | Thumbs.db 2 | *.obj 3 | *.exe 4 | *.pdb 5 | *.user 6 | *.aps 7 | *.pch 8 | *.vspscc 9 | *_i.c 10 | *_p.c 11 | *.ncb 12 | *.suo 13 | *.tlb 14 | *.tlh 15 | *.bak 16 | *.cache 17 | *.ilk 18 | *.log 19 | [Bb]in 20 | [Dd]ebug*/ 21 | *.lib 22 | *.sbr 23 | obj/ 24 | [Rr]elease*/ 25 | _ReSharper*/ 26 | [Tt]est[Rr]esult* 27 | /.vs -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | StringFormat [![Build status](https://ci.appveyor.com/api/projects/status/80cp4snyr72k93jr)](https://ci.appveyor.com/project/cbrianball/string-format) 2 | ============= 3 | 4 | This library extends the functionality of String.Format (and StringBuilder.AppendFormat). It allows you to use named variables instead of ordinal place holders. 5 | 6 | TokenStringFormat.Format("{name} was born on {dob:D}. {name} was {weight} lbs. and {height} inches long.", new {name = "John", dob = DateTime.Today, weight = 11, height = 19}); 7 | 8 | The output would be: 9 | 10 | "John was born on Sunday, May 16 2012. John was 11 lbs. and 19 inches long." 11 | 12 | The package is now available on [NuGet.org](http://nuget.org/packages/StringFormat) 13 | 14 | License 15 | ======= 16 | Copyright (c) 2011 Brian Ball and contributors 17 | 18 | Permission is hereby granted, free of charge, to any person obtaining a copy 19 | of this software and associated documentation files (the "Software"), to deal 20 | in the Software without restriction, including without limitation the rights 21 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 22 | copies of the Software, and to permit persons to whom the Software is 23 | furnished to do so, subject to the following conditions: 24 | 25 | The above copyright notice and this permission notice shall be included in 26 | all copies or substantial portions of the Software. 27 | 28 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 29 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 30 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 31 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 32 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 33 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 34 | THE SOFTWARE. 35 | -------------------------------------------------------------------------------- /StringFormat.Test/ExpectedExceptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text.RegularExpressions; 4 | using NUnit.Framework; 5 | using SharpTestsEx; 6 | 7 | namespace StringFormat.Test 8 | { 9 | [TestFixture] 10 | public class ExpectedExceptions 11 | { 12 | [Test] 13 | public void KeyNotFoundException() 14 | { 15 | Executing.This(() => TokenStringFormat.Format("My name is {name}", new {foo = "Jack"})) 16 | .Should().Throw(); 17 | 18 | } 19 | 20 | [Test] 21 | public void FormatException() 22 | { 23 | Executing.This( 24 | () => TokenStringFormat.Format("I should have escaped this curly brace: {", new {Foo = "bar"})) 25 | .Should().Throw(); 26 | 27 | Executing.This( 28 | () => TokenStringFormat.Format("A token cannot span {\r\nname} multiple lines.", new { Foo = "bar" })) 29 | .Should().Throw(); 30 | } 31 | 32 | [Test] 33 | public void ArgumentNullException() 34 | { 35 | Executing.This(() => TokenStringFormat.Format(null, new {Foo = "bar"})) 36 | .Should("Format parameter").Throw(); 37 | 38 | object test = null; 39 | Executing.This(() => TokenStringFormat.Format("abc", test)) 40 | .Should("Object parameter").NotThrow(); 41 | 42 | IDictionary dictionary = null; 43 | Executing.This(() => TokenStringFormat.Format("abc", dictionary)) 44 | .Should("Dictionary parameter").Throw(); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /StringFormat.Test/HappyPathsAnonymousTypes.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | using NUnit.Framework; 3 | using SharpTestsEx; 4 | 5 | namespace StringFormat.Test 6 | { 7 | [TestFixture] 8 | public class HappyPathsAnonymousTypes 9 | { 10 | private readonly CultureInfo english = CultureInfo.GetCultureInfo("en-US"); 11 | 12 | [Test] 13 | public void SimpleTest() 14 | { 15 | const string test = "The {speed} brown fox jumped over the lazy {animal}."; 16 | const string expected = "The quick brown fox jumped over the lazy dog."; 17 | 18 | TokenStringFormat.Format(test, new {speed = "quick", animal = "dog"}) 19 | .ShouldEqualWithDiff(expected); 20 | } 21 | 22 | [Test] 23 | public void SimpleTestWithFormat() 24 | { 25 | const string test = "Your total of {quantity:N0} items comes to a total of {total:C2}"; 26 | const string expected = "Your total of 4,234 items comes to a total of $12,435.89"; 27 | 28 | TokenStringFormat.Format(english, test, new {quantity = 4234, total = 12435.89}) 29 | .ShouldEqualWithDiff(expected); 30 | } 31 | 32 | [Test] 33 | public void MultilineTest() 34 | { 35 | const string test = "This is a {amount}\r\nline test. It would be nice if {library} worked for multiple lines."; 36 | const string expected = "This is a 2\r\nline test. It would be nice if StringFormat worked for multiple lines."; 37 | 38 | TokenStringFormat.Format(test, new { amount = 2, library = "StringFormat" }) 39 | .ShouldEqualWithDiff(expected); 40 | } 41 | 42 | [Test] 43 | public void TrickyBracesTest() 44 | { 45 | const string test = 46 | "Escaping the characters '{{' and '}}' can be tricky. The following will be even more fun: {{!@#$#:39403229010{zero}}} stacks and queues }}}}zz::&*%&$*#{{*{{{one}00{{98}}"; 47 | const string expected = 48 | "Escaping the characters '{' and '}' can be tricky. The following will be even more fun: {!@#$#:394032290100} stacks and queues }}zz::&*%&$*#{*{100{98}"; 49 | 50 | TokenStringFormat.Format(test, new {zero = 0, one = 1, two = 2}) 51 | .ShouldEqualWithDiff(expected); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /StringFormat.Test/HappyPathsDictionary.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Globalization; 3 | using NUnit.Framework; 4 | 5 | namespace StringFormat.Test 6 | { 7 | [TestFixture] 8 | public class HappyPathsDictionary 9 | { 10 | private CultureInfo english = CultureInfo.GetCultureInfo("en-US"); 11 | 12 | [Test] 13 | public void SimpleTest() 14 | { 15 | const string test = "The {speed} brown fox jumped over the lazy {animal}."; 16 | const string expected = "The quick brown fox jumped over the lazy dog."; 17 | 18 | var values = new Dictionary 19 | { 20 | {"speed", "quick"}, 21 | {"animal", "dog"}, 22 | }; 23 | 24 | TokenStringFormat.Format(test, values) 25 | .ShouldEqualWithDiff(expected); 26 | } 27 | 28 | [Test] 29 | public void SimpleTestWithFormat() 30 | { 31 | const string test = "{name}, your total of {quantity:N0} items comes to a total of {total:C2}"; 32 | const string expected = "John, your total of 4,234 items comes to a total of $12,435.89"; 33 | 34 | var values = new Dictionary 35 | { 36 | {"quantity", 4234}, 37 | {"total", 12435.89}, 38 | {"name", "John"}, 39 | }; 40 | 41 | TokenStringFormat.Format(english, test, values) 42 | .ShouldEqualWithDiff(expected); 43 | } 44 | 45 | [Test] 46 | public void TrickyBracesTest() 47 | { 48 | const string test = 49 | "Escaping the characters '{{' and '}}' can be tricky. The following will be even more fun: {{!@#$#:39403229010{one}}} stacks and queues }}}}zz::&*%&$*#{{*{{{zero}00{{98}}"; 50 | const string expected = 51 | "Escaping the characters '{' and '}' can be tricky. The following will be even more fun: {!@#$#:394032290101} stacks and queues }}zz::&*%&$*#{*{000{98}"; 52 | 53 | var values = new Dictionary 54 | { 55 | {"zero", 0}, 56 | {"one", 1}, 57 | {"two", 2} 58 | }; 59 | 60 | TokenStringFormat.Format(test, values) 61 | .ShouldEqualWithDiff(expected); 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /StringFormat.Test/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyCopyright("Copyright © 2012")] 10 | [assembly: AssemblyTrademark("")] 11 | [assembly: AssemblyCulture("")] -------------------------------------------------------------------------------- /StringFormat.Test/StringFormat.Test.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | net45;netcoreapp2.0 4 | latest 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /StringFormat.Test/StringHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.IO; 4 | using NUnit.Framework; 5 | 6 | namespace StringFormat.Test 7 | { 8 | public static class StringHelper 9 | { 10 | public static void ShouldEqualWithDiff(this string actualValue, string expectedValue) 11 | { 12 | ShouldEqualWithDiff(actualValue, expectedValue, DiffStyle.Full, Console.Out); 13 | } 14 | 15 | public static void ShouldEqualWithDiff(this string actualValue, string expectedValue, DiffStyle diffStyle) 16 | { 17 | ShouldEqualWithDiff(actualValue, expectedValue, diffStyle, Console.Out); 18 | } 19 | 20 | public static void ShouldEqualWithDiff(this string actualValue, string expectedValue, DiffStyle diffStyle, 21 | TextWriter output) 22 | { 23 | if (actualValue == null || expectedValue == null) 24 | { 25 | Assert.AreEqual(expectedValue, actualValue); 26 | return; 27 | } 28 | 29 | if (actualValue.Equals(expectedValue, StringComparison.Ordinal)) return; 30 | 31 | output.WriteLine(" Idx Expected Actual"); 32 | output.WriteLine("-------------------------"); 33 | var maxLen = Math.Max(actualValue.Length, expectedValue.Length); 34 | var minLen = Math.Min(actualValue.Length, expectedValue.Length); 35 | for (var i = 0; i < maxLen; i++) 36 | { 37 | if (diffStyle != DiffStyle.Minimal || i >= minLen || actualValue[i] != expectedValue[i]) 38 | { 39 | output.WriteLine("{0} {1,-3} {2,-4} {3,-3} {4,-4} {5,-3}", 40 | i < minLen && actualValue[i] == expectedValue[i] ? " " : "*", 41 | // put a mark beside a differing row 42 | i, // the index 43 | i < expectedValue.Length ? ((int) expectedValue[i]).ToString() : "", 44 | // character decimal value 45 | i < expectedValue.Length ? expectedValue[i].ToSafeString() : "", 46 | // character safe string 47 | i < actualValue.Length ? ((int) actualValue[i]).ToString() : "", 48 | // character decimal value 49 | i < actualValue.Length ? actualValue[i].ToSafeString() : "" 50 | // character safe string 51 | ); 52 | } 53 | } 54 | output.WriteLine(); 55 | 56 | Assert.AreEqual(expectedValue, actualValue); 57 | } 58 | 59 | private static string ToSafeString(this char c) 60 | { 61 | if (Char.IsControl(c) || Char.IsWhiteSpace(c)) 62 | { 63 | switch (c) 64 | { 65 | case '\r': 66 | return @"\r"; 67 | case '\n': 68 | return @"\n"; 69 | case '\t': 70 | return @"\t"; 71 | case '\a': 72 | return @"\a"; 73 | case '\v': 74 | return @"\v"; 75 | case '\f': 76 | return @"\f"; 77 | default: 78 | return String.Format("\\u{0:X};", (int) c); 79 | } 80 | } 81 | return c.ToString(CultureInfo.InvariantCulture); 82 | } 83 | } 84 | 85 | public enum DiffStyle 86 | { 87 | Full, 88 | Minimal 89 | } 90 | } -------------------------------------------------------------------------------- /StringFormat.Test/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /StringFormat.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.168 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StringFormat", "StringFormat\StringFormat.csproj", "{2FCCB913-E294-427A-BABF-9E458129A7A1}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StringFormat.Test", "StringFormat.Test\StringFormat.Test.csproj", "{1E744933-067B-468C-A0EF-F93A9A614A8A}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Debug|Mixed Platforms = Debug|Mixed Platforms 14 | Debug|x86 = Debug|x86 15 | Release|Any CPU = Release|Any CPU 16 | Release|Mixed Platforms = Release|Mixed Platforms 17 | Release|x86 = Release|x86 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 23 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 24 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Debug|x86.ActiveCfg = Debug|Any CPU 25 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Release|Any CPU.Build.0 = Release|Any CPU 27 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 28 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU 29 | {2FCCB913-E294-427A-BABF-9E458129A7A1}.Release|x86.ActiveCfg = Release|Any CPU 30 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 31 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Debug|Any CPU.Build.0 = Debug|Any CPU 32 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 33 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 34 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Debug|x86.ActiveCfg = Debug|Any CPU 35 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Debug|x86.Build.0 = Debug|Any CPU 36 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Release|Any CPU.ActiveCfg = Release|Any CPU 37 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Release|Any CPU.Build.0 = Release|Any CPU 38 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 39 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Release|Mixed Platforms.Build.0 = Release|Any CPU 40 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Release|x86.ActiveCfg = Release|Any CPU 41 | {1E744933-067B-468C-A0EF-F93A9A614A8A}.Release|x86.Build.0 = Release|Any CPU 42 | EndGlobalSection 43 | GlobalSection(SolutionProperties) = preSolution 44 | HideSolutionNode = FALSE 45 | EndGlobalSection 46 | GlobalSection(ExtensibilityGlobals) = postSolution 47 | SolutionGuid = {F6FD3F66-A1FD-4355-8736-852F496452CB} 48 | EndGlobalSection 49 | EndGlobal 50 | -------------------------------------------------------------------------------- /StringFormat/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyCopyright("Copyright © 2012")] 9 | [assembly: AssemblyTrademark("")] 10 | [assembly: AssemblyCulture("")] -------------------------------------------------------------------------------- /StringFormat/StringFormat.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | net35;netstandard1.3;netstandard2.0 4 | latest 5 | 6 | 7 | true 8 | 1.0.1 9 | Brian Ball 10 | 11 | 12 | true 13 | An enhancement to the String.Format library that allows for named place holders. 14 | 15 | http://littlebits.github.com/string_format/images/SFormat.png 16 | https://github.com/littlebits/string_format 17 | https://github.com/littlebits/string_format 18 | https://github.com/littlebits/string_format 19 | github 20 | littlebits string format 21 | 22 | 23 | 24 | NETSTANDARD_1_3 25 | 26 | -------------------------------------------------------------------------------- /StringFormat/StringFormat.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | StringFormat 5 | 6 | 7 | 8 | 9 | The primary class for accessing the functionality of the StringFormat library. 10 | 11 | 12 | 13 | 14 | Formats the string using the placeholder for the property names. 15 | 16 | The string to format. 17 | The object to pull the values from. Usually an anonymous type. 18 | The formatted string. 19 | 20 | 21 | 22 | Formats the string using the placeholder for the property names. 23 | 24 | The provider to use for formatting dates and numeric values. 25 | The string to format. 26 | The object to pull the values from. Usually an anonymous type. 27 | The formatted string. 28 | 29 | 30 | 31 | Formats the string using the placeholder for the property names. 32 | 33 | The string to format. 34 | The dictionary to pull the values from. 35 | The formatted string. 36 | 37 | 38 | 39 | Formats the string using the placeholder for the property names. 40 | 41 | The provider to use for formatting dates and numeric values. 42 | The string to format. 43 | The dictionary to pull the values from. 44 | The formatted string. 45 | 46 | 47 | 48 | Returns the format string with the tokens replaced as ordinals. Exposed for developer benefit. Most likely used only in debugging. 49 | 50 | The string to format. 51 | A string where the tokens are replaced with ordinal values. 52 | 53 | 54 | 55 | Returns the format string with the tokens replaced as ordinals. Exposed for developer benefit. Most likely used only in debugging. 56 | 57 | The string to format. 58 | The tokens that were extracted from the format string. 59 | A string where the tokens are replaced with ordinal values. 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /StringFormat/TokenStringFormat.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Reflection; 5 | using System.Text; 6 | using System.Text.RegularExpressions; 7 | 8 | namespace StringFormat 9 | { 10 | /// 11 | /// The primary class for accessing the functionality of the StringFormat library. 12 | /// 13 | public static class TokenStringFormat 14 | { 15 | /* 16 | * Explanation: 17 | * (?<=(^|[^\{]|(\{\{)+)) -- This is a lookback, it says that when the next character in the regex is matched, it should 18 | * only be considered a match if it is the start of the line, immediately preceded with a non '{' character, or an even number of '{' characters 19 | * IE: '{one}' and '{{{one}' are both valid (the first two '{' in the second example will result in a single '{' 20 | * but '{{one}' is not a valid because String.Format will combine the first two '{' into a single one 21 | * \{ --Find a '{' character 22 | * (?!\{) --This is a negative look ahead, it says that after you find a the preceding character, 23 | * look to make sure it isn't immediately proceeded with another '{' 24 | *\w --The very next character must be a word character (alpha numeric) 25 | *.* --Continue reading the string for any non-linebreaking character 26 | *?\} --Stop reading at the very first '}' character (don't be greedy) 27 | */ 28 | private const string TokenizeRegex = @"(?<=(^|[^\{]|(\{\{)+))\{(?!\{)\w.*?\}"; 29 | 30 | /// 31 | /// Formats the string using the placeholder for the property names. 32 | /// 33 | /// The string to format. 34 | /// The object to pull the values from. Usually an anonymous type. 35 | /// The formatted string. 36 | public static string Format(string format, object values) 37 | { 38 | return Format(null, format, values); 39 | } 40 | 41 | /// 42 | /// Formats the string using the placeholder for the property names. 43 | /// 44 | /// The provider to use for formatting dates and numeric values. 45 | /// The string to format. 46 | /// The object to pull the values from. Usually an anonymous type. 47 | /// The formatted string. 48 | public static string Format(IFormatProvider provider, string format, object values) 49 | { 50 | return Format(provider, format, AnonymousObjectToDictionary(values)); 51 | } 52 | 53 | /// 54 | /// Formats the string using the placeholder for the property names. 55 | /// 56 | /// The string to format. 57 | /// The dictionary to pull the values from. 58 | /// The formatted string. 59 | public static string Format(string format, IDictionary values) 60 | { 61 | return Format(null, format, values); 62 | } 63 | 64 | /// 65 | /// Formats the string using the placeholder for the property names. 66 | /// 67 | /// The provider to use for formatting dates and numeric values. 68 | /// The string to format. 69 | /// The dictionary to pull the values from. 70 | /// The formatted string. 71 | public static string Format(IFormatProvider provider, string format, IDictionary values) 72 | { 73 | if (values == null) 74 | { 75 | throw new ArgumentNullException("values"); 76 | } 77 | 78 | IEnumerable tokens; 79 | 80 | var tokenizedString = TokenizeString(format, out tokens); 81 | 82 | return String.Format(provider, tokenizedString, tokens.Select(s => values[s]).ToArray()); 83 | } 84 | 85 | /// 86 | /// Returns the format string with the tokens replaced as ordinals. Exposed for developer benefit. Most likely used only in debugging. 87 | /// 88 | /// The string to format. 89 | /// A string where the tokens are replaced with ordinal values. 90 | public static string TokenizeString(string format) 91 | { 92 | IEnumerable junk; 93 | 94 | return TokenizeString(format, out junk); 95 | } 96 | 97 | /// 98 | /// Returns the format string with the tokens replaced as ordinals. Exposed for developer benefit. Most likely used only in debugging. 99 | /// 100 | /// The string to format. 101 | /// The tokens that were extracted from the format string. 102 | /// A string where the tokens are replaced with ordinal values. 103 | public static string TokenizeString(string format, out IEnumerable tokens) 104 | { 105 | if (format == null) 106 | { 107 | throw new ArgumentNullException("format"); 108 | } 109 | 110 | //performance: minimize the number of times the builder will have to "grow", while keeping the initial size reasonable 111 | var sb = new StringBuilder(format.Length); 112 | 113 | var match = Regex.Match(format, TokenizeRegex, RegexOptions.Compiled); 114 | 115 | var tokenList = new List(); 116 | 117 | var currentIndex = 0; 118 | while (match.Success) 119 | { 120 | sb.Append(format.Substring(currentIndex, match.Index - currentIndex)); 121 | 122 | var fullToken = match.ToString(); 123 | 124 | var name = ParseName(fullToken); 125 | 126 | var index = IndexOfName(tokenList, name); 127 | 128 | sb.Append(BuildNewToken(fullToken, name, index)); 129 | 130 | currentIndex = match.Index + match.Length; 131 | 132 | match = match.NextMatch(); 133 | } 134 | 135 | tokens = tokenList; 136 | sb.Append(format.Substring(currentIndex)); 137 | 138 | return sb.ToString(); 139 | } 140 | 141 | #region Private Methods 142 | 143 | private static string ParseName(string fullToken) 144 | { 145 | var token = fullToken.Substring(1, fullToken.Length - 2); 146 | 147 | var colonIndex = token.IndexOf(':'); 148 | 149 | if (colonIndex >= 0) token = token.Substring(0, colonIndex); 150 | 151 | return token.TrimEnd(); 152 | } 153 | 154 | private static int IndexOfName(IList names, string name) 155 | { 156 | var index = names.IndexOf(name); 157 | 158 | if (index < 0) 159 | { 160 | names.Add(name); 161 | index = names.IndexOf(name); 162 | } 163 | 164 | return index; 165 | } 166 | 167 | private static string BuildNewToken(string fullToken, string name, int index) 168 | { 169 | fullToken = fullToken.Remove(1, name.Length); 170 | 171 | return fullToken.Insert(1, index.ToString()); 172 | } 173 | 174 | private static IDictionary AnonymousObjectToDictionary(object values) 175 | { 176 | var valueDictionary = new Dictionary(); 177 | if (values != null) 178 | { 179 | var properties = values.GetType() 180 | #if NETSTANDARD_1_3 181 | .GetTypeInfo().DeclaredProperties; 182 | #else 183 | .GetProperties(); 184 | #endif 185 | 186 | foreach (var property in properties) 187 | { 188 | valueDictionary.Add(property.Name, property.GetValue(values, null)); 189 | } 190 | } 191 | return valueDictionary; 192 | } 193 | 194 | #endregion 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /packages/NUnit.2.6.0.12054/NUnit.2.6.0.12054.nupkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/NUnit.2.6.0.12054/NUnit.2.6.0.12054.nupkg -------------------------------------------------------------------------------- /packages/NUnit.2.6.0.12054/lib/nunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/NUnit.2.6.0.12054/lib/nunit.framework.dll -------------------------------------------------------------------------------- /packages/NUnit.2.6.0.12054/license.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/NUnit.2.6.0.12054/license.txt -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/License.txt: -------------------------------------------------------------------------------- 1 | Microsoft Public License (Ms-PL) 2 | 3 | This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. 4 | 5 | 1. Definitions 6 | 7 | The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. 8 | 9 | A "contribution" is the original software, or any additions or changes to the software. 10 | 11 | A "contributor" is any person that distributes its contribution under this license. 12 | 13 | "Licensed patents" are a contributor's patent claims that read directly on its contribution. 14 | 15 | 2. Grant of Rights 16 | 17 | (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. 18 | 19 | (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. 20 | 21 | 3. Conditions and Limitations 22 | 23 | (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. 24 | 25 | (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. 26 | 27 | (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. 28 | 29 | (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. 30 | 31 | (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/Read_Me.txt: -------------------------------------------------------------------------------- 1 | Sharp Tests Extensions (#TestsEx for friends) 2 | ============================================= 3 | 4 | 5 | How to build: 6 | ------------- 7 | 8 | Run build.bat the result of compilation will be available in 9 | .\Build\Output. 10 | 11 | 12 | Which assembly do I need to use #TestsEx? 13 | ----------------------------------------- 14 | 15 | You need only the assemblies deployed depending on the unit 16 | tests framework you are using. 17 | 18 | For NUnit you need ONLY assemblies contained in NUnit folder 19 | 20 | For xUnit you need ONLY assemblies contained in xUnit folder 21 | 22 | For Silverlight you need ONLY assemblies contained in Silverlight folder 23 | 24 | For MsTest you need ONLY assemblies contained in MsTest folder(read http://sharptestex.codeplex.com/wikipage?title=HowToV1VS2010 ) 25 | 26 | 27 | When do I need the NoSpecificFramework ? 28 | ---------------------------------------- 29 | 30 | If the unit tests framework you are using is not directly supported, 31 | you can use the assemblies contained in NoSpecificFramework folder. 32 | The main difference will be that your runner will not recognize 33 | the exception and its output will look slightly less "pretty" than native assertions. 34 | 35 | -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/SharpTestsEx.1.1.1.nupkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/SharpTestsEx.1.1.1/SharpTestsEx.1.1.1.nupkg -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/SharpTestsEx.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/SharpTestsEx.1.1.1/SharpTestsEx.snk -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.Mvc.XML: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SharpTestsEx.Mvc 5 | 6 | 7 | 8 | 9 | Try to transform a string to a valid 10 | 11 | The url. 12 | The . 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.Mvc.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.Mvc.dll -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.XML: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SharpTestsEx 5 | 6 | 7 | 8 | 9 | Assertion for . 10 | 11 | 12 | 13 | 14 | Verifies that the given throws a specific . 15 | 16 | The specific expected . 17 | The given to execute. 18 | The . 19 | The does not throws the expected . 20 | 21 | 22 | 23 | Verifies that the given throws a specific . 24 | 25 | The specific expected . 26 | The given to execute. 27 | A message to display if the assertion fails. This message can be seen in the unit test results. 28 | The . 29 | The does not throws the expected . 30 | 31 | 32 | 33 | Verifies that the given throws an . 34 | 35 | The given to execute. 36 | The . 37 | The does not throws an . 38 | 39 | 40 | 41 | Verifies that the given throws an . 42 | 43 | The given to execute. 44 | A message to display if the assertion fails. This message can be seen in the unit test results. 45 | The . 46 | The does not throws the expected . 47 | 48 | 49 | 50 | Verifies that the given does not throw any . 51 | 52 | The given to execute. 53 | 54 | 55 | 56 | Verifies that the given does not throw any . 57 | 58 | The given to execute. 59 | A message to display if the assertion fails. This message can be seen in the unit test results. 60 | 61 | 62 | 63 | The intention of is to create a more readable 64 | string representation for the failure message. 65 | 66 | 67 | 68 | 69 | Verifies that the specified object is null. The assertion fails if it is not null. 70 | 71 | Type of the actual value subject of the assertion. 72 | 73 | 74 | 75 | Represent a Assertion template where the real logic is delegated. 76 | 77 | Type of the actual value. 78 | Type of the expected value. 79 | 80 | 81 | 82 | Initializes a new instance of the class. 83 | 84 | 85 | 86 | 87 | Verifies that two specified generic type data are equal. The assertion fails if they are not equal. 88 | 89 | Type of the actual value. 90 | Type of the expected value. 91 | 92 | The comparison is done ny the base . 93 | 94 | 95 | 96 | 97 | Initializes a new instance of the class. 98 | 99 | The value to compare. 100 | 101 | 102 | 103 | Verifies that two specified instances are the same object instance.. 104 | 105 | Type of the actual value. 106 | Type of the expected value. 107 | 108 | 109 | 110 | Initializes a new instance of the class. 111 | 112 | The value to compare. 113 | 114 | 115 | 116 | Extensions for constraint over object instances. 117 | 118 | 119 | 120 | 121 | Verifies that actual is the same instance than . 122 | 123 | The extented. 124 | The expected object instance. 125 | Chainable And constraint 126 | 127 | 128 | 129 | Verifies that actual is an instance of . 130 | 131 | The expected. 132 | The extented. 133 | Chainable And constraint 134 | 135 | 136 | 137 | Verifies that actual instance is assignable from . 138 | 139 | The expected. 140 | The extented. 141 | Chainable And constraint 142 | 143 | 144 | 145 | Verifies that actual instance is assignable to . 146 | 147 | The expected. 148 | The extented. 149 | Chainable And constraint 150 | 151 | 152 | 153 | Useful class to avoid the creation of new Action. 154 | 155 | 156 | This class can be used when the instance of the class under test is no available; 157 | typically to test a constructor. 158 | When you have an instance of the class under test the most appropite way to test an action 159 | is the extension . 160 | 161 | 162 | 163 | Executing.This(() => new AClass(null)).Should().Throw(); 164 | 165 | 166 | Executing.This(() => new AClass(null)).Should().Throw{ArgumentNullException}() 167 | .And.ValueOf 168 | .ParamName.Should().Be("obj"); 169 | 170 | 171 | 172 | 173 | 174 | Basic contract for a generic constraint. 175 | 176 | The type of the 'actual' value subject of the test. 177 | 178 | 179 | 180 | Verifies that the throws a specific . 181 | 182 | The specific subclass expected. 183 | Chainable And constraint 184 | 185 | 186 | 187 | Verifies that the throws an . 188 | 189 | Chainable And constraint 190 | 191 | 192 | 193 | Verifies that the does not throw any . 194 | 195 | 196 | 197 | 198 | Verifies that actual instance is serializable using . 199 | 200 | The extented. 201 | Chainable And constraint 202 | 203 | 204 | 205 | Verifies that actual instance is serializable using . 206 | 207 | The extented. 208 | Chainable And constraint 209 | 210 | 211 | 212 | etensions methods. 213 | 214 | 215 | 216 | 217 | Find the first position where two sequence differ 218 | 219 | The type of the elements of the input sequences. 220 | An to compare to second 221 | An to compare to the first sequence. 222 | The position of the first difference; otherwise -1 where the two sequences has the same sequence. 223 | 224 | 225 | 226 | Useful extensions to test s. 227 | 228 | 229 | 230 | 231 | Returns a sequence of all Inner Exceptions. 232 | 233 | The root 234 | A of all Inner Exceptions 235 | 236 | 237 | 238 | Returns a sequence of including the root and all Inner Exceptions. 239 | 240 | The root 241 | A of including the root and all Inner Exceptions. 242 | 243 | 244 | 245 | Constraints for . 246 | 247 | 248 | 249 | 250 | Verifies that the throws a specific . 251 | 252 | The specific subclass expected. 253 | Chainable And constraint 254 | 255 | 256 | 257 | Verifies that the throws an. 258 | 259 | Chainable And constraint 260 | 261 | 262 | 263 | Verifies that the does not throw any . 264 | 265 | 266 | 267 | 268 | The instance thrown. 269 | 270 | 271 | 272 | 273 | var ex = (new Action(() => new AClass(null))).Should().Throw().Exception; 274 | 275 | 276 | 277 | 278 | 279 | 280 | Chainable constraint for 281 | 282 | The specific subclass expected. 283 | 284 | 285 | 286 | The thrown. 287 | 288 | 289 | Allow an readable chained way to begin a new assertion based on one of the properties 290 | of the expected 291 | 292 | 293 | (new Action(() => new AClass(null))) 294 | .Should().Throw{ArgumentNullException}() 295 | .And.ValueOf.ParamName 296 | .Should().Be.EqualTo("obj"); 297 | 298 | 299 | 300 | 301 | 302 | 303 | The instance thrown. 304 | 305 | 306 | Allow an readable chained way to begin a new assertion based on the itself. 307 | 308 | 309 | (new Action(() => new AClass(null))) 310 | .Should().Throw() 311 | .And.Exception.Should().Be.InstanceOf{ArgumentException}(); 312 | 313 | 314 | 315 | 316 | 317 | 318 | Assertion information. 319 | 320 | The type of the value subject of the assertion. 321 | 322 | 323 | 324 | Subject of the assertion. 325 | 326 | 327 | 328 | 329 | The assertion is negated ? 330 | 331 | 332 | 333 | 334 | The title of the assertion ("message" in MsTests terminology) 335 | 336 | 337 | 338 | 339 | Constraint over boolean values. 340 | 341 | 342 | 343 | 344 | Constraints for boolean "Should Be" 345 | 346 | 347 | 348 | 349 | Verifies that actual is true. 350 | 351 | 352 | 353 | 354 | Verifies that actual is false. 355 | 356 | 357 | 358 | 359 | Negate next constraint. 360 | 361 | 362 | 363 | 364 | Constraint over object instances. 365 | 366 | 367 | 368 | 369 | Constraints for object instance of a specific gine . 370 | 371 | The of the instance. 372 | 373 | 374 | 375 | The actual value 376 | 377 | 378 | 379 | 380 | The actual value 381 | 382 | 383 | 384 | 385 | Constraints for object instance "Should Be" 386 | 387 | 388 | 389 | 390 | Verifies that actual is equal to . 391 | 392 | The expected instance 393 | Chainable And constraint 394 | 395 | 396 | 397 | Verifies that the is null. 398 | 399 | Chainable And constraint 400 | 401 | 402 | 403 | Verifies that the actual is an instance of a specific type. 404 | 405 | The expected . 406 | 407 | A for the instance converted to 408 | the specified type to start a chained assertion. 409 | 410 | 411 | 412 | 413 | Constraint over instances. 414 | 415 | The concrete type of actual value. 416 | 417 | 418 | 419 | Constraints for instance ("Should Be") 420 | 421 | 422 | 423 | 424 | 425 | Verifies that actual is equal to . 426 | 427 | The expected instance 428 | Chainable And constraint 429 | 430 | 431 | 432 | Verifies that actual is greater than . 433 | 434 | The expected instance 435 | Chainable And constraint 436 | 437 | 438 | 439 | Verifies that actual is less than . 440 | 441 | The expected instance 442 | Chainable And constraint 443 | 444 | 445 | 446 | Verifies that actual is greater than or equal to . 447 | 448 | The expected instance 449 | Chainable And constraint 450 | 451 | 452 | 453 | Verifies that actual is less than or equal to . 454 | 455 | The expected instance 456 | Chainable And constraint 457 | 458 | 459 | 460 | Verifies that actual is included in the range -. 461 | 462 | The less aceptable value. 463 | The higher aceptable value. 464 | Chainable And constraint 465 | 466 | 467 | 468 | Verifies that the instance is null. 469 | 470 | Chainable And constraint 471 | 472 | 473 | 474 | Verifies that the is empty. 475 | 476 | Chainable And constraint 477 | 478 | 479 | 480 | Verifies that the is null. 481 | 482 | Chainable And constraint 483 | 484 | 485 | 486 | Verifies that the is empty. 487 | 488 | Chainable And constraint 489 | 490 | 491 | 492 | Verifies that the instance is null. 493 | 494 | Chainable And constraint 495 | 496 | 497 | 498 | Collection information to build the failure message 499 | 500 | Type of the actual value. 501 | Type of the expected value. 502 | 503 | 504 | 505 | The actual value under test. 506 | 507 | 508 | 509 | 510 | The expected value of the test. 511 | 512 | 513 | 514 | 515 | The name of the assertion 516 | 517 | 518 | "be EqualTo" 519 | 520 | 521 | 522 | 523 | The user custom message. 524 | 525 | 526 | 527 | 528 | Extensions for any System.Object. 529 | 530 | 531 | 532 | 533 | Allow access to a private field of a class instance. 534 | 535 | The of the field. 536 | The class instance. 537 | The field name. 538 | The value of the field. 539 | 540 | 541 | 542 | A strongly-typed resource class, for looking up localized strings, etc. 543 | 544 | 545 | 546 | 547 | Returns the cached ResourceManager instance used by this class. 548 | 549 | 550 | 551 | 552 | Overrides the current thread's CurrentUICulture property for all 553 | resource lookups using this strongly typed resource class. 554 | 555 | 556 | 557 | 558 | Looks up a localized string similar to Should. 559 | 560 | 561 | 562 | 563 | Looks up a localized string similar to Be. 564 | 565 | 566 | 567 | 568 | Looks up a localized string similar to <Empty>. 569 | 570 | 571 | 572 | 573 | Looks up a localized string similar to Can't access to a field of a null value.. 574 | 575 | 576 | 577 | 578 | Looks up a localized string similar to The class {0} does not contain a field named {1}.. 579 | 580 | 581 | 582 | 583 | Looks up a localized string similar to The class {0} does contain a field named {1} but its type is {2} and not {3}.. 584 | 585 | 586 | 587 | 588 | Looks up a localized string similar to Can't check serialization for (null) value.. 589 | 590 | 591 | 592 | 593 | Looks up a localized string similar to Expected: {0}. 594 | 595 | 596 | 597 | 598 | Looks up a localized string similar to Differences :. 599 | 600 | 601 | 602 | 603 | Looks up a localized string similar to Values differ at position {0}.. 604 | 605 | 606 | 607 | 608 | Looks up a localized string similar to Not expected exception message:. 609 | 610 | 611 | 612 | 613 | Looks up a localized string similar to Strings differ at position {0}.. 614 | 615 | 616 | 617 | 618 | Looks up a localized string similar to Found : {0}. 619 | 620 | 621 | 622 | 623 | Looks up a localized string similar to Not. 624 | 625 | 626 | 627 | 628 | Looks up a localized string similar to (null). 629 | 630 | 631 | 632 | 633 | Looks up a localized string similar to Be Assignable From. 634 | 635 | 636 | 637 | 638 | Looks up a localized string similar to Be Assignable To. 639 | 640 | 641 | 642 | 643 | Looks up a localized string similar to Be Binary Serializable. 644 | 645 | 646 | 647 | 648 | Looks up a localized string similar to Be Empty. 649 | 650 | 651 | 652 | 653 | Looks up a localized string similar to Be Equal To. 654 | 655 | 656 | 657 | 658 | Looks up a localized string similar to Be Greater Than. 659 | 660 | 661 | 662 | 663 | Looks up a localized string similar to Be Greater than Or Equal to. 664 | 665 | 666 | 667 | 668 | Looks up a localized string similar to Be in Range. 669 | 670 | 671 | 672 | 673 | Looks up a localized string similar to Be Instance Of. 674 | 675 | 676 | 677 | 678 | Looks up a localized string similar to Be Less Than. 679 | 680 | 681 | 682 | 683 | Looks up a localized string similar to Be Less than Or Equal to. 684 | 685 | 686 | 687 | 688 | Looks up a localized string similar to Be Null. 689 | 690 | 691 | 692 | 693 | Looks up a localized string similar to Be Ordered. 694 | 695 | 696 | 697 | 698 | Looks up a localized string similar to Be Ordered ascending. 699 | 700 | 701 | 702 | 703 | Looks up a localized string similar to Be Ordered By ({0}). 704 | 705 | 706 | 707 | 708 | Looks up a localized string similar to Be Same instance As. 709 | 710 | 711 | 712 | 713 | Looks up a localized string similar to Be SubClass Of. 714 | 715 | 716 | 717 | 718 | Looks up a localized string similar to Be Subset Of. 719 | 720 | 721 | 722 | 723 | Looks up a localized string similar to Be Xml Serializable. 724 | 725 | 726 | 727 | 728 | Looks up a localized string similar to Contain. 729 | 730 | 731 | 732 | 733 | Looks up a localized string similar to Not throw. 734 | 735 | 736 | 737 | 738 | Looks up a localized string similar to Have Attribute. 739 | 740 | 741 | 742 | 743 | Looks up a localized string similar to Have Same Sequence As. 744 | 745 | 746 | 747 | 748 | Looks up a localized string similar to Have Same Values As. 749 | 750 | 751 | 752 | 753 | Looks up a localized string similar to Have Unique Values. 754 | 755 | 756 | 757 | 758 | Looks up a localized string similar to Have Value. 759 | 760 | 761 | 762 | 763 | Looks up a localized string similar to Throw. 764 | 765 | 766 | 767 | 768 | Looks up a localized string similar to Throws an exception. 769 | 770 | 771 | 772 | 773 | -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.dll -------------------------------------------------------------------------------- /packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/little-sharps/string_format/e8a3273822165b63736f700b44421986830d183d/packages/SharpTestsEx.1.1.1/lib/SharpTestsEx.snk -------------------------------------------------------------------------------- /packages/repositories.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | --------------------------------------------------------------------------------