Skip to content

Commit

Permalink
Merge pull request #1 from sakapon/v1.0
Browse files Browse the repository at this point in the history
v1.0.1
  • Loading branch information
sakapon committed Sep 17, 2018
2 parents 8ec882b + aec2fb3 commit 95affd1
Show file tree
Hide file tree
Showing 15 changed files with 489 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .gitignore
Expand Up @@ -178,7 +178,7 @@ publish/
PublishScripts/

# NuGet Packages
*.nupkg
# *.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
Expand Down
69 changes: 69 additions & 0 deletions Zipangu/NetUnitTest/AsciiConversionTest.cs
@@ -0,0 +1,69 @@
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Zipangu;

namespace NetUnitTest
{
[TestClass]
public class AsciiConversionTest
{
[TestMethod]
public void ToWideAscii()
{
var Test = TestHelper.CreateAssertion<string, string>(AsciiConversion.ToWideAscii);

Test(null, null);
Test("", "");
Test(AsciiConversion.Asciis, AsciiConversion.WideAsciis);

var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Replace(AsciiConversion.Asciis, "");
foreach (var c in chars)
Test(c.ToString(), c.ToString());
}

[TestMethod]
public void ToWideAscii_VB()
{
void Test(string value) => Assert.AreEqual(value.ToWide_VB(), value.ToWideAscii());
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToWide_VB);

Test("");
Test(AsciiConversion.Asciis.Replace(@"\", ""));

Test_VB(null, "");
// "\" は変換されません。
Test_VB(@"\", @"\");
}

[TestMethod]
public void ToNarrowAscii()
{
var Test = TestHelper.CreateAssertion<string, string>(AsciiConversion.ToNarrowAscii);

Test(null, null);
Test("", "");
Test(AsciiConversion.WideAsciis, AsciiConversion.Asciis);

var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Where(c => !AsciiConversion.WideAsciis.Contains(c));
foreach (var c in chars)
Test(c.ToString(), c.ToString());
}

[TestMethod]
public void ToNarrowAscii_VB()
{
void Test(string value) => Assert.AreEqual(value.ToNarrow_VB(), value.ToNarrowAscii());
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToNarrow_VB);

Test("");
Test(AsciiConversion.WideAsciis.Replace("", ""));

Test_VB(null, "");
// "\" は変換されません。
Test_VB("", "");
}
}
}
92 changes: 92 additions & 0 deletions Zipangu/NetUnitTest/KanaConversionTest.cs
@@ -0,0 +1,92 @@
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Zipangu;

namespace NetUnitTest
{
[TestClass]
public class KanaConversionTest
{
[TestMethod]
public void HalfKatakanaToHiragana()
{
var Test = TestHelper.CreateAssertion<string, string>(KanaConversion.HalfKatakanaToHiragana);

Test(null, null);
Test("", "");
Test(KanaConversion.HalfKatakanas, KanaConversion.HiraganasByHalfKatakana);
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Select(c => $"{c}")), KanaConversion.VoicedHiraganas);
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}")), KanaConversion.SemiVoicedHiraganas);

Test("ベートーヴェン、「ピアノ・ソナタ」。", "べーとーゔぇん、「ぴあの・そなた」。");

var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Replace(KanaConversion.HalfKatakanas, "");
foreach (var c in chars)
Test(c.ToString(), c.ToString());
}

[TestMethod]
public void HalfKatakanaToHiragana_VB()
{
void Test(string value) => Assert.AreEqual(value.ToWideHiragana_VB(), value.HalfKatakanaToHiragana());
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToWideHiragana_VB);

Test("");
Test(KanaConversion.HalfKatakanas);
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Replace("", "").Select(c => $"{c}")));
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}")));

Test_VB(null, "");
// カタカナの "ヴ" に変換されます。
Test_VB("ヴ", "");
}

[TestMethod]
public void HalfKatakanaToKatakana()
{
var Test = TestHelper.CreateAssertion<string, string>(KanaConversion.HalfKatakanaToKatakana);

Test(null, null);
Test("", "");
Test(KanaConversion.HalfKatakanas, KanaConversion.KatakanasByHalfKatakana);
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Select(c => $"{c}")), KanaConversion.VoicedKatakanas);
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}")), KanaConversion.SemiVoicedKatakanas);

Test("ベートーヴェン、「ピアノ・ソナタ」。", "ベートーヴェン、「ピアノ・ソナタ」。");

var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Replace(KanaConversion.HalfKatakanas, "");
foreach (var c in chars)
Test(c.ToString(), c.ToString());
}

[TestMethod]
public void HalfKatakanaToKatakana_VB()
{
void Test(string value) => Assert.AreEqual(value.ToWideKatakana_VB(), value.HalfKatakanaToKatakana());
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToWideKatakana_VB);

Test("");
Test(KanaConversion.HalfKatakanas);
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Select(c => $"{c}")));
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}")));

Test_VB(null, "");
}

[TestMethod]
public void ToWideHiragana_Original()
{
var changed = Enumerable.Range(0, char.MaxValue + 1)
.Select(i => new { i, before = (char)i, after = ((char)i).ToString().ToWideHiragana_VB().Single() })
.Where(_ => _.before != _.after)
.Where(_ => _.after != '?' || _.before == '?')
.ToArray();

foreach (var _ in changed)
Console.WriteLine($"{_.i:D5}-{_.i:X4}: {_.before} > {_.after}");
}
}
}
78 changes: 78 additions & 0 deletions Zipangu/NetUnitTest/NetUnitTest.csproj
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{46A0E652-37BA-4B8C-9831-79C4AC5838AE}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NetUnitTest</RootNamespace>
<AssemblyName>NetUnitTest</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualBasic" />
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="KanaConversionTest.cs" />
<Compile Include="AsciiConversionTest.cs" />
<Compile Include="TestHelper.cs" />
<Compile Include="VBStringsHelper.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Zipangu\Zipangu.csproj">
<Project>{eb4c703b-3056-4303-aead-137ea8c1df85}</Project>
<Name>Zipangu</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets'))" />
</Target>
<Import Project="..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets')" />
</Project>
20 changes: 20 additions & 0 deletions Zipangu/NetUnitTest/Properties/AssemblyInfo.cs
@@ -0,0 +1,20 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("NetUnitTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NetUnitTest")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: ComVisible(false)]

[assembly: Guid("46a0e652-37ba-4b8c-9831-79c4ac5838ae")]

// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
17 changes: 17 additions & 0 deletions Zipangu/NetUnitTest/TestHelper.cs
@@ -0,0 +1,17 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace NetUnitTest
{
public static class TestHelper
{
public static Action<T, TResult> CreateAssertion<T, TResult>(Func<T, TResult> target) =>
(arg, expected) => Assert.AreEqual(expected, target(arg));

public static Action<T1, T2, TResult> CreateAssertion<T1, T2, TResult>(Func<T1, T2, TResult> target) =>
(arg1, arg2, expected) => Assert.AreEqual(expected, target(arg1, arg2));

public static Action<T, TResult[]> CreateCollectionAssertion<T, TResult>(Func<T, TResult[]> target) =>
(arg, expected) => CollectionAssert.AreEqual(expected, target(arg));
}
}
16 changes: 16 additions & 0 deletions Zipangu/NetUnitTest/VBStringsHelper.cs
@@ -0,0 +1,16 @@
using System;
using Microsoft.VisualBasic;

namespace NetUnitTest
{
public static class VBStringsHelper
{
public static string ToWide_VB(this string value) => Strings.StrConv(value, VbStrConv.Wide);
public static string ToNarrow_VB(this string value) => Strings.StrConv(value, VbStrConv.Narrow);
public static string ToKatakana_VB(this string value) => Strings.StrConv(value, VbStrConv.Katakana);
public static string ToHiragana_VB(this string value) => Strings.StrConv(value, VbStrConv.Hiragana);

public static string ToWideKatakana_VB(this string value) => Strings.StrConv(value, VbStrConv.Wide | VbStrConv.Katakana);
public static string ToWideHiragana_VB(this string value) => Strings.StrConv(value, VbStrConv.Wide | VbStrConv.Hiragana);
}
}
5 changes: 5 additions & 0 deletions Zipangu/NetUnitTest/packages.config
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MSTest.TestAdapter" version="1.3.2" targetFramework="net45" />
<package id="MSTest.TestFramework" version="1.3.2" targetFramework="net45" />
</packages>
31 changes: 31 additions & 0 deletions Zipangu/Zipangu.sln
@@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2016
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zipangu", "Zipangu\Zipangu.csproj", "{EB4C703B-3056-4303-AEAD-137EA8C1DF85}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetUnitTest", "NetUnitTest\NetUnitTest.csproj", "{46A0E652-37BA-4B8C-9831-79C4AC5838AE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Release|Any CPU.Build.0 = Release|Any CPU
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F981BC6E-8158-4505-B3EF-889B9814307E}
EndGlobalSection
EndGlobal
37 changes: 37 additions & 0 deletions Zipangu/Zipangu/AsciiConversion.cs
@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;

namespace Zipangu
{
/// <summary>
/// ASCII 文字を変換するためのメソッドを提供します。
/// </summary>
public static class AsciiConversion
{
/// <summary>半角英数字記号 (ASCII 文字)。</summary>
internal static readonly string Asciis = EnumerableHelper.RangeChars(' ', '~');
/// <summary>全角英数字記号。</summary>
internal static readonly string WideAsciis = " " + EnumerableHelper.RangeChars('!', '~');

static readonly IDictionary<char, char> WideMap = Asciis.ZipToDictionary(WideAsciis);
static readonly IDictionary<char, char> NarrowMap = WideAsciis.ZipToDictionary(Asciis);

internal static char ToWideAscii(char c) => WideMap.ContainsKey(c) ? WideMap[c] : c;
internal static char ToNarrowAscii(char c) => NarrowMap.ContainsKey(c) ? NarrowMap[c] : c;

/// <summary>
/// 半角英数字記号 (ASCII 文字) を全角に変換します。
/// </summary>
/// <param name="value">変換対象の文字列。</param>
/// <returns>変換後の文字列。</returns>
public static string ToWideAscii(this string value) => value == null ? null : string.Concat(value.Select(ToWideAscii));

/// <summary>
/// 全角英数字記号 (ASCII 文字) を半角に変換します。
/// </summary>
/// <param name="value">変換対象の文字列。</param>
/// <returns>変換後の文字列。</returns>
public static string ToNarrowAscii(this string value) => value == null ? null : string.Concat(value.Select(ToNarrowAscii));
}
}
3 changes: 3 additions & 0 deletions Zipangu/Zipangu/AssemblyInfo.cs
@@ -0,0 +1,3 @@
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("NetUnitTest")]

0 comments on commit 95affd1

Please sign in to comment.