Skip to content

Commit 95affd1

Browse files
authored
Merge pull request #1 from sakapon/v1.0
v1.0.1
2 parents 8ec882b + aec2fb3 commit 95affd1

15 files changed

Lines changed: 489 additions & 1 deletion

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ publish/
178178
PublishScripts/
179179

180180
# NuGet Packages
181-
*.nupkg
181+
# *.nupkg
182182
# The packages folder can be ignored because of Package Restore
183183
**/[Pp]ackages/*
184184
# except build/, which is used as an MSBuild target.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System;
2+
using System.Linq;
3+
using Microsoft.VisualStudio.TestTools.UnitTesting;
4+
using Zipangu;
5+
6+
namespace NetUnitTest
7+
{
8+
[TestClass]
9+
public class AsciiConversionTest
10+
{
11+
[TestMethod]
12+
public void ToWideAscii()
13+
{
14+
var Test = TestHelper.CreateAssertion<string, string>(AsciiConversion.ToWideAscii);
15+
16+
Test(null, null);
17+
Test("", "");
18+
Test(AsciiConversion.Asciis, AsciiConversion.WideAsciis);
19+
20+
var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
21+
.Replace(AsciiConversion.Asciis, "");
22+
foreach (var c in chars)
23+
Test(c.ToString(), c.ToString());
24+
}
25+
26+
[TestMethod]
27+
public void ToWideAscii_VB()
28+
{
29+
void Test(string value) => Assert.AreEqual(value.ToWide_VB(), value.ToWideAscii());
30+
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToWide_VB);
31+
32+
Test("");
33+
Test(AsciiConversion.Asciis.Replace(@"\", ""));
34+
35+
Test_VB(null, "");
36+
// "\" は変換されません。
37+
Test_VB(@"\", @"\");
38+
}
39+
40+
[TestMethod]
41+
public void ToNarrowAscii()
42+
{
43+
var Test = TestHelper.CreateAssertion<string, string>(AsciiConversion.ToNarrowAscii);
44+
45+
Test(null, null);
46+
Test("", "");
47+
Test(AsciiConversion.WideAsciis, AsciiConversion.Asciis);
48+
49+
var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
50+
.Where(c => !AsciiConversion.WideAsciis.Contains(c));
51+
foreach (var c in chars)
52+
Test(c.ToString(), c.ToString());
53+
}
54+
55+
[TestMethod]
56+
public void ToNarrowAscii_VB()
57+
{
58+
void Test(string value) => Assert.AreEqual(value.ToNarrow_VB(), value.ToNarrowAscii());
59+
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToNarrow_VB);
60+
61+
Test("");
62+
Test(AsciiConversion.WideAsciis.Replace("\", ""));
63+
64+
Test_VB(null, "");
65+
// "\" は変換されません。
66+
Test_VB("\", "\");
67+
}
68+
}
69+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System;
2+
using System.Linq;
3+
using Microsoft.VisualStudio.TestTools.UnitTesting;
4+
using Zipangu;
5+
6+
namespace NetUnitTest
7+
{
8+
[TestClass]
9+
public class KanaConversionTest
10+
{
11+
[TestMethod]
12+
public void HalfKatakanaToHiragana()
13+
{
14+
var Test = TestHelper.CreateAssertion<string, string>(KanaConversion.HalfKatakanaToHiragana);
15+
16+
Test(null, null);
17+
Test("", "");
18+
Test(KanaConversion.HalfKatakanas, KanaConversion.HiraganasByHalfKatakana);
19+
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Select(c => $"{c}゙")), KanaConversion.VoicedHiraganas);
20+
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}゚")), KanaConversion.SemiVoicedHiraganas);
21+
22+
Test("ベートーヴェン、「ピアノ・ソナタ」。", "べーとーゔぇん、「ぴあの・そなた」。");
23+
24+
var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
25+
.Replace(KanaConversion.HalfKatakanas, "");
26+
foreach (var c in chars)
27+
Test(c.ToString(), c.ToString());
28+
}
29+
30+
[TestMethod]
31+
public void HalfKatakanaToHiragana_VB()
32+
{
33+
void Test(string value) => Assert.AreEqual(value.ToWideHiragana_VB(), value.HalfKatakanaToHiragana());
34+
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToWideHiragana_VB);
35+
36+
Test("");
37+
Test(KanaConversion.HalfKatakanas);
38+
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Replace("ウ", "").Select(c => $"{c}゙")));
39+
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}゚")));
40+
41+
Test_VB(null, "");
42+
// カタカナの "ヴ" に変換されます。
43+
Test_VB("ヴ", "ヴ");
44+
}
45+
46+
[TestMethod]
47+
public void HalfKatakanaToKatakana()
48+
{
49+
var Test = TestHelper.CreateAssertion<string, string>(KanaConversion.HalfKatakanaToKatakana);
50+
51+
Test(null, null);
52+
Test("", "");
53+
Test(KanaConversion.HalfKatakanas, KanaConversion.KatakanasByHalfKatakana);
54+
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Select(c => $"{c}゙")), KanaConversion.VoicedKatakanas);
55+
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}゚")), KanaConversion.SemiVoicedKatakanas);
56+
57+
Test("ベートーヴェン、「ピアノ・ソナタ」。", "ベートーヴェン、「ピアノ・ソナタ」。");
58+
59+
var chars = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
60+
.Replace(KanaConversion.HalfKatakanas, "");
61+
foreach (var c in chars)
62+
Test(c.ToString(), c.ToString());
63+
}
64+
65+
[TestMethod]
66+
public void HalfKatakanaToKatakana_VB()
67+
{
68+
void Test(string value) => Assert.AreEqual(value.ToWideKatakana_VB(), value.HalfKatakanaToKatakana());
69+
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToWideKatakana_VB);
70+
71+
Test("");
72+
Test(KanaConversion.HalfKatakanas);
73+
Test(string.Concat(KanaConversion.VoiceableHalfKatakanas.Select(c => $"{c}゙")));
74+
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}゚")));
75+
76+
Test_VB(null, "");
77+
}
78+
79+
[TestMethod]
80+
public void ToWideHiragana_Original()
81+
{
82+
var changed = Enumerable.Range(0, char.MaxValue + 1)
83+
.Select(i => new { i, before = (char)i, after = ((char)i).ToString().ToWideHiragana_VB().Single() })
84+
.Where(_ => _.before != _.after)
85+
.Where(_ => _.after != '?' || _.before == '?')
86+
.ToArray();
87+
88+
foreach (var _ in changed)
89+
Console.WriteLine($"{_.i:D5}-{_.i:X4}: {_.before} > {_.after}");
90+
}
91+
}
92+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<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')" />
4+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
5+
<PropertyGroup>
6+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
7+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
8+
<ProjectGuid>{46A0E652-37BA-4B8C-9831-79C4AC5838AE}</ProjectGuid>
9+
<OutputType>Library</OutputType>
10+
<AppDesignerFolder>Properties</AppDesignerFolder>
11+
<RootNamespace>NetUnitTest</RootNamespace>
12+
<AssemblyName>NetUnitTest</AssemblyName>
13+
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
14+
<FileAlignment>512</FileAlignment>
15+
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
16+
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
17+
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
18+
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
19+
<IsCodedUITest>False</IsCodedUITest>
20+
<TestProjectType>UnitTest</TestProjectType>
21+
<NuGetPackageImportStamp>
22+
</NuGetPackageImportStamp>
23+
</PropertyGroup>
24+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
25+
<DebugSymbols>true</DebugSymbols>
26+
<DebugType>full</DebugType>
27+
<Optimize>false</Optimize>
28+
<OutputPath>bin\Debug\</OutputPath>
29+
<DefineConstants>DEBUG;TRACE</DefineConstants>
30+
<ErrorReport>prompt</ErrorReport>
31+
<WarningLevel>4</WarningLevel>
32+
</PropertyGroup>
33+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
34+
<DebugType>pdbonly</DebugType>
35+
<Optimize>true</Optimize>
36+
<OutputPath>bin\Release\</OutputPath>
37+
<DefineConstants>TRACE</DefineConstants>
38+
<ErrorReport>prompt</ErrorReport>
39+
<WarningLevel>4</WarningLevel>
40+
</PropertyGroup>
41+
<ItemGroup>
42+
<Reference Include="Microsoft.VisualBasic" />
43+
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
44+
<HintPath>..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
45+
</Reference>
46+
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
47+
<HintPath>..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
48+
</Reference>
49+
<Reference Include="System" />
50+
<Reference Include="System.Core" />
51+
</ItemGroup>
52+
<ItemGroup>
53+
<Compile Include="Properties\AssemblyInfo.cs" />
54+
<Compile Include="KanaConversionTest.cs" />
55+
<Compile Include="AsciiConversionTest.cs" />
56+
<Compile Include="TestHelper.cs" />
57+
<Compile Include="VBStringsHelper.cs" />
58+
</ItemGroup>
59+
<ItemGroup>
60+
<None Include="packages.config" />
61+
</ItemGroup>
62+
<ItemGroup>
63+
<ProjectReference Include="..\Zipangu\Zipangu.csproj">
64+
<Project>{eb4c703b-3056-4303-aead-137ea8c1df85}</Project>
65+
<Name>Zipangu</Name>
66+
</ProjectReference>
67+
</ItemGroup>
68+
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
69+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
70+
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
71+
<PropertyGroup>
72+
<ErrorText>このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。</ErrorText>
73+
</PropertyGroup>
74+
<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'))" />
75+
<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'))" />
76+
</Target>
77+
<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')" />
78+
</Project>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
[assembly: AssemblyTitle("NetUnitTest")]
6+
[assembly: AssemblyDescription("")]
7+
[assembly: AssemblyConfiguration("")]
8+
[assembly: AssemblyCompany("")]
9+
[assembly: AssemblyProduct("NetUnitTest")]
10+
[assembly: AssemblyCopyright("Copyright © 2018")]
11+
[assembly: AssemblyTrademark("")]
12+
[assembly: AssemblyCulture("")]
13+
14+
[assembly: ComVisible(false)]
15+
16+
[assembly: Guid("46a0e652-37ba-4b8c-9831-79c4ac5838ae")]
17+
18+
// [assembly: AssemblyVersion("1.0.*")]
19+
[assembly: AssemblyVersion("1.0.0.0")]
20+
[assembly: AssemblyFileVersion("1.0.0.0")]

Zipangu/NetUnitTest/TestHelper.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
4+
namespace NetUnitTest
5+
{
6+
public static class TestHelper
7+
{
8+
public static Action<T, TResult> CreateAssertion<T, TResult>(Func<T, TResult> target) =>
9+
(arg, expected) => Assert.AreEqual(expected, target(arg));
10+
11+
public static Action<T1, T2, TResult> CreateAssertion<T1, T2, TResult>(Func<T1, T2, TResult> target) =>
12+
(arg1, arg2, expected) => Assert.AreEqual(expected, target(arg1, arg2));
13+
14+
public static Action<T, TResult[]> CreateCollectionAssertion<T, TResult>(Func<T, TResult[]> target) =>
15+
(arg, expected) => CollectionAssert.AreEqual(expected, target(arg));
16+
}
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using Microsoft.VisualBasic;
3+
4+
namespace NetUnitTest
5+
{
6+
public static class VBStringsHelper
7+
{
8+
public static string ToWide_VB(this string value) => Strings.StrConv(value, VbStrConv.Wide);
9+
public static string ToNarrow_VB(this string value) => Strings.StrConv(value, VbStrConv.Narrow);
10+
public static string ToKatakana_VB(this string value) => Strings.StrConv(value, VbStrConv.Katakana);
11+
public static string ToHiragana_VB(this string value) => Strings.StrConv(value, VbStrConv.Hiragana);
12+
13+
public static string ToWideKatakana_VB(this string value) => Strings.StrConv(value, VbStrConv.Wide | VbStrConv.Katakana);
14+
public static string ToWideHiragana_VB(this string value) => Strings.StrConv(value, VbStrConv.Wide | VbStrConv.Hiragana);
15+
}
16+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<packages>
3+
<package id="MSTest.TestAdapter" version="1.3.2" targetFramework="net45" />
4+
<package id="MSTest.TestFramework" version="1.3.2" targetFramework="net45" />
5+
</packages>

Zipangu/Zipangu.sln

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio 15
4+
VisualStudioVersion = 15.0.28010.2016
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zipangu", "Zipangu\Zipangu.csproj", "{EB4C703B-3056-4303-AEAD-137EA8C1DF85}"
7+
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetUnitTest", "NetUnitTest\NetUnitTest.csproj", "{46A0E652-37BA-4B8C-9831-79C4AC5838AE}"
9+
EndProject
10+
Global
11+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
12+
Debug|Any CPU = Debug|Any CPU
13+
Release|Any CPU = Release|Any CPU
14+
EndGlobalSection
15+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
16+
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17+
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Debug|Any CPU.Build.0 = Debug|Any CPU
18+
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Release|Any CPU.ActiveCfg = Release|Any CPU
19+
{EB4C703B-3056-4303-AEAD-137EA8C1DF85}.Release|Any CPU.Build.0 = Release|Any CPU
20+
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21+
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
22+
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
23+
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Release|Any CPU.Build.0 = Release|Any CPU
24+
EndGlobalSection
25+
GlobalSection(SolutionProperties) = preSolution
26+
HideSolutionNode = FALSE
27+
EndGlobalSection
28+
GlobalSection(ExtensibilityGlobals) = postSolution
29+
SolutionGuid = {F981BC6E-8158-4505-B3EF-889B9814307E}
30+
EndGlobalSection
31+
EndGlobal

Zipangu/Zipangu/AsciiConversion.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace Zipangu
6+
{
7+
/// <summary>
8+
/// ASCII 文字を変換するためのメソッドを提供します。
9+
/// </summary>
10+
public static class AsciiConversion
11+
{
12+
/// <summary>半角英数字記号 (ASCII 文字)。</summary>
13+
internal static readonly string Asciis = EnumerableHelper.RangeChars(' ', '~');
14+
/// <summary>全角英数字記号。</summary>
15+
internal static readonly string WideAsciis = " " + EnumerableHelper.RangeChars('!', '~');
16+
17+
static readonly IDictionary<char, char> WideMap = Asciis.ZipToDictionary(WideAsciis);
18+
static readonly IDictionary<char, char> NarrowMap = WideAsciis.ZipToDictionary(Asciis);
19+
20+
internal static char ToWideAscii(char c) => WideMap.ContainsKey(c) ? WideMap[c] : c;
21+
internal static char ToNarrowAscii(char c) => NarrowMap.ContainsKey(c) ? NarrowMap[c] : c;
22+
23+
/// <summary>
24+
/// 半角英数字記号 (ASCII 文字) を全角に変換します。
25+
/// </summary>
26+
/// <param name="value">変換対象の文字列。</param>
27+
/// <returns>変換後の文字列。</returns>
28+
public static string ToWideAscii(this string value) => value == null ? null : string.Concat(value.Select(ToWideAscii));
29+
30+
/// <summary>
31+
/// 全角英数字記号 (ASCII 文字) を半角に変換します。
32+
/// </summary>
33+
/// <param name="value">変換対象の文字列。</param>
34+
/// <returns>変換後の文字列。</returns>
35+
public static string ToNarrowAscii(this string value) => value == null ? null : string.Concat(value.Select(ToNarrowAscii));
36+
}
37+
}

0 commit comments

Comments
 (0)