1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-05-13 17:34:08 +02:00

Add StringUtils with unit tests and use it

This commit is contained in:
chylex 2017-07-07 15:52:13 +02:00
parent 424c0e596c
commit 5a21d2cb10
10 changed files with 68 additions and 29 deletions

View File

@ -5,6 +5,7 @@
using TweetDuck.Core;
using TweetDuck.Core.Controls;
using TweetDuck.Core.Notification;
using TweetDuck.Core.Utils;
using TweetDuck.Data;
using TweetDuck.Data.Serialization;
@ -18,7 +19,7 @@ static UserConfig(){
Serializer.RegisterTypeConverter(typeof(Point), new SingleTypeConverter<Point>{
ConvertToString = value => $"{value.X} {value.Y}",
ConvertToObject = value => {
int[] elements = value.Split(' ').Select(int.Parse).ToArray();
int[] elements = StringUtils.ParseInts(value, ' ');
return new Point(elements[0], elements[1]);
}
});
@ -26,7 +27,7 @@ static UserConfig(){
Serializer.RegisterTypeConverter(typeof(Size), new SingleTypeConverter<Size>{
ConvertToString = value => $"{value.Width} {value.Height}",
ConvertToObject = value => {
int[] elements = value.Split(' ').Select(int.Parse).ToArray();
int[] elements = StringUtils.ParseInts(value, ' ');
return new Size(elements[0], elements[1]);
}
});

View File

@ -134,11 +134,7 @@ private static string GetImageFileName(string url){
int dot = url.LastIndexOf('.');
if (dot != -1){
int colon = url.IndexOf(':', dot);
if (colon != -1){
url = url.Substring(0, colon);
}
url = StringUtils.ExtractBefore(url, ':', dot);
}
// return file name

View File

@ -5,7 +5,6 @@
using System.Globalization;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace TweetDuck.Core.Utils{
@ -63,12 +62,8 @@ public static string GetFileNameFromUrl(string url){
return string.IsNullOrEmpty(file) ? null : file;
}
public static string ConvertPascalCaseToScreamingSnakeCase(string str){
return Regex.Replace(str, @"(\p{Ll})(\P{Ll})|(\P{Ll})(\P{Ll}\p{Ll})", "$1$3_$2$4").ToUpperInvariant();
}
public static string GetErrorName(CefErrorCode code){
return ConvertPascalCaseToScreamingSnakeCase(Enum.GetName(typeof(CefErrorCode), code) ?? string.Empty);
return StringUtils.ConvertPascalCaseToScreamingSnakeCase(Enum.GetName(typeof(CefErrorCode), code) ?? string.Empty);
}
public static WebClient DownloadFileAsync(string url, string target, Action onSuccess, Action<Exception> onFailure){

20
Core/Utils/StringUtils.cs Normal file
View File

@ -0,0 +1,20 @@
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace TweetDuck.Core.Utils{
static class StringUtils{
public static string ExtractBefore(string str, char search, int startIndex = 0){
int index = str.IndexOf(search, startIndex);
return index == -1 ? str : str.Substring(0, index);
}
public static int[] ParseInts(string str, char separator){
return str.Split(new char[]{ separator }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
}
public static string ConvertPascalCaseToScreamingSnakeCase(string str){
return Regex.Replace(str, @"(\p{Ll})(\P{Ll})|(\P{Ll})(\P{Ll}\p{Ll})", "$1$3_$2$4").ToUpperInvariant();
}
}
}

View File

@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Text;
using TweetDuck.Core.Utils;
namespace TweetDuck.Data{
class CombinedFileStream : IDisposable{
@ -79,8 +80,7 @@ public string SkipFile(){
stream.Position += BitConverter.ToInt32(contentLength, 0);
string keyName = Encoding.UTF8.GetString(name);
int separatorIndex = keyName.IndexOf(KeySeparator);
return separatorIndex == -1 ? keyName : keyName.Substring(0, separatorIndex);
return StringUtils.ExtractBefore(keyName, KeySeparator);
}
public void Flush(){
@ -96,8 +96,7 @@ public class Entry{
public string KeyName{
get{
int index = Identifier.IndexOf(KeySeparator);
return index == -1 ? Identifier : Identifier.Substring(0, index);
return StringUtils.ExtractBefore(Identifier, KeySeparator);
}
}

View File

@ -1,8 +1,8 @@
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using TweetDuck.Core.Controls;
using TweetDuck.Core.Utils;
using TweetDuck.Data.Serialization;
namespace TweetDuck.Data{
@ -32,7 +32,7 @@ public void Restore(Form form, bool firstTimeFullscreen){
public static readonly SingleTypeConverter<WindowState> Converter = new SingleTypeConverter<WindowState>{
ConvertToString = value => $"{(value.isMaximized ? 'M' : '_')}{value.rect.X} {value.rect.Y} {value.rect.Width} {value.rect.Height}",
ConvertToObject = value => {
int[] elements = value.Substring(1).Split(' ').Select(int.Parse).ToArray();
int[] elements = StringUtils.ParseInts(value.Substring(1), ' ');
return new WindowState{
rect = new Rectangle(elements[0], elements[1], elements[2], elements[3]),

View File

@ -165,6 +165,7 @@
<Compile Include="Core\Other\Settings\Dialogs\DialogSettingsRestart.Designer.cs">
<DependentUpon>DialogSettingsRestart.cs</DependentUpon>
</Compile>
<Compile Include="Core\Utils\StringUtils.cs" />
<Compile Include="Data\CombinedFileStream.cs" />
<Compile Include="Core\Other\Settings\Export\ExportFileFlags.cs" />
<Compile Include="Core\Other\Settings\Export\ExportManager.cs" />

View File

@ -46,15 +46,5 @@ public void TestGetFileNameFromUrl(){
Assert.IsNull(BrowserUtils.GetFileNameFromUrl("http://test.com/"));
}
[TestMethod]
public void TestConvertPascalCaseToScreamingSnakeCase(){
Assert.AreEqual("HELP", BrowserUtils.ConvertPascalCaseToScreamingSnakeCase("Help"));
Assert.AreEqual("HELP_ME", BrowserUtils.ConvertPascalCaseToScreamingSnakeCase("HelpMe"));
Assert.AreEqual("HELP_ME_PLEASE", BrowserUtils.ConvertPascalCaseToScreamingSnakeCase("HelpMePlease"));
Assert.AreEqual("HTML_CODE", BrowserUtils.ConvertPascalCaseToScreamingSnakeCase("HTMLCode"));
Assert.AreEqual("CHECK_OUT_MY_HTML_CODE", BrowserUtils.ConvertPascalCaseToScreamingSnakeCase("CheckOutMyHTMLCode"));
}
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TweetDuck.Core.Utils;
namespace UnitTests.Core{
[TestClass]
public class TestStringUtils{
[TestMethod]
public void TestExtractBefore(){
Assert.AreEqual("missing", StringUtils.ExtractBefore("missing", '_'));
Assert.AreEqual("", StringUtils.ExtractBefore("_empty", '_'));
Assert.AreEqual("some", StringUtils.ExtractBefore("some_text", '_'));
Assert.AreEqual("first", StringUtils.ExtractBefore("first_separator_only", '_'));
Assert.AreEqual("start_index", StringUtils.ExtractBefore("start_index_test", '_', 8));
}
[TestMethod]
public void TestParseInts(){
CollectionAssert.AreEqual(new int[0], StringUtils.ParseInts("", ','));
CollectionAssert.AreEqual(new int[]{ 1 }, StringUtils.ParseInts("1", ','));
CollectionAssert.AreEqual(new int[]{ 1, 2, 3 }, StringUtils.ParseInts("1,2,3", ','));
CollectionAssert.AreEqual(new int[]{ 1, 2, 3 }, StringUtils.ParseInts("1,2,3,", ','));
CollectionAssert.AreEqual(new int[]{ 1, 2, 3 }, StringUtils.ParseInts(",1,2,,3,", ','));
CollectionAssert.AreEqual(new int[]{ -50, 50 }, StringUtils.ParseInts("-50,50", ','));
}
[TestMethod]
public void TestConvertPascalCaseToScreamingSnakeCase(){
Assert.AreEqual("HELP", StringUtils.ConvertPascalCaseToScreamingSnakeCase("Help"));
Assert.AreEqual("HELP_ME", StringUtils.ConvertPascalCaseToScreamingSnakeCase("HelpMe"));
Assert.AreEqual("HELP_ME_PLEASE", StringUtils.ConvertPascalCaseToScreamingSnakeCase("HelpMePlease"));
Assert.AreEqual("HTML_CODE", StringUtils.ConvertPascalCaseToScreamingSnakeCase("HTMLCode"));
Assert.AreEqual("CHECK_OUT_MY_HTML_CODE", StringUtils.ConvertPascalCaseToScreamingSnakeCase("CheckOutMyHTMLCode"));
}
}
}

View File

@ -47,6 +47,7 @@
</Otherwise>
</Choose>
<ItemGroup>
<Compile Include="Core\TestStringUtils.cs" />
<Compile Include="Data\TestCombinedFileStream.cs" />
<Compile Include="Core\TestBrowserUtils.cs" />
<Compile Include="Data\TestCommandLineArgs.cs" />