Skip to content

Commit 9a5f09e

Browse files
committed
[WIP]音击Ogkr的基础框架(空的Parser Generator,还有官谱测试)
1 parent e8547e3 commit 9a5f09e

20 files changed

Lines changed: 51549 additions & 2 deletions

File tree

chart/ogk/OgkChart.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using MuConvert.chart;
2+
3+
namespace MuConvert.ogk;
4+
5+
public class OgkChart: BaseChart<OgkNote>
6+
{
7+
8+
}

chart/ogk/OgkNote.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using MuConvert.chart;
2+
3+
namespace MuConvert.ogk;
4+
5+
public class OgkNote: BaseNote
6+
{
7+
8+
}

generator/ogk/OgkrGenerator.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using MuConvert.generator;
2+
using MuConvert.utils;
3+
4+
namespace MuConvert.ogk;
5+
6+
public class OgkrGenerator: IGenerator<OgkChart>
7+
{
8+
public (string, List<Alert>) Generate(OgkChart chart)
9+
{
10+
throw new NotImplementedException();
11+
}
12+
}

parser/ogk/OgkrParser.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using MuConvert.parser;
2+
using MuConvert.utils;
3+
4+
namespace MuConvert.ogk;
5+
6+
public class OgkrParser: IParser<OgkChart>
7+
{
8+
public (OgkChart, List<Alert>) Parse(string text)
9+
{
10+
throw new NotImplementedException();
11+
}
12+
}

tests/mai/MA2转Simai测试.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ private void TestChart(TestInput c)
4343

4444
/// <summary>
4545
/// 按 Simai 文法 <c>chart: (notations ',')*</c> 将谱面切成顶层逗号分段,并在每个分段上复现与
46-
/// <see cref="MuConvert.parser.simai.SimaiParser"/> 一致的 <c>now</c> / <c>step</c> 推进规则,
46+
/// <see cref="MuConvert.mai.SimaiParser"/> 一致的 <c>now</c> / <c>step</c> 推进规则,
4747
/// 得到 (时刻, 原文) 序列;不构造 Note,不把片段再交给 SimaiParser。
4848
/// </summary>
4949
internal static partial class SimaiCommaTimeline

tests/mai/TestUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,5 +197,5 @@ public string MA2
197197
}
198198
}
199199

200-
public override string ToString() => $"{Path.GetFileName(Path.GetDirectoryName(Maidata))}-lv{LevelId}";
200+
public override string ToString() => $"{Path.GetFileName(Dir)}-lv{LevelId}";
201201
}

tests/ogk/OgkrTestUtils.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
namespace MuConvert.Tests.ogk;
2+
3+
internal static class OgkrTestUtils
4+
{
5+
// 查找到测试数据的根目录(tests/ogk/testset)
6+
public static DirectoryInfo FindTestsetRoot()
7+
{
8+
var dir = AppContext.BaseDirectory;
9+
while (dir != null && !File.Exists(Path.Combine(dir, "MuConvert.Tests.csproj")))
10+
dir = Path.GetDirectoryName(dir);
11+
return new DirectoryInfo(Path.Combine(dir ?? throw new DirectoryNotFoundException("Could not locate repo root."), "ogk", "testset"));
12+
}
13+
14+
public static IEnumerable<object[]> GetTestInputs(string dataDir)
15+
{
16+
var testsetRoot = Path.Combine(FindTestsetRoot().FullName, dataDir);
17+
if (!Directory.Exists(testsetRoot))
18+
throw new DirectoryNotFoundException($"Testset root not found: {testsetRoot}");
19+
20+
foreach (var ogkrPath in Directory.EnumerateFiles(testsetRoot, "*.ogkr", SearchOption.AllDirectories)
21+
.OrderBy(p => p, StringComparer.Ordinal))
22+
{
23+
yield return [new OgkrTestInput(ogkrPath)];
24+
}
25+
}
26+
}
27+
28+
public record OgkrTestInput(string OgkrPath)
29+
{
30+
public string Dir => Path.GetDirectoryName(OgkrPath)!;
31+
public string SongName => Path.GetFileName(Dir);
32+
public string DifficultyId => Path.GetFileNameWithoutExtension(OgkrPath).Split('_').LastOrDefault() ?? "";
33+
34+
public override string ToString() => $"{SongName}-{DifficultyId}";
35+
}

tests/ogk/Ogkr测试.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.Text;
2+
using MuConvert.ogk;
3+
using Xunit.Abstractions;
4+
5+
namespace MuConvert.Tests.ogk;
6+
7+
public class Ogkr测试
8+
{
9+
private readonly ITestOutputHelper _output;
10+
11+
public Ogkr测试(ITestOutputHelper output) => _output = output;
12+
13+
public static IEnumerable<object[]> GetTestInputs(string dataDir) => OgkrTestUtils.GetTestInputs(dataDir);
14+
15+
[Theory]
16+
[MemberData(nameof(GetTestInputs), "官谱")]
17+
public void 解析Ogkr再生成回去(OgkrTestInput c)
18+
{
19+
var ogkrText = File.ReadAllText(c.OgkrPath, Encoding.UTF8);
20+
21+
var (chart, parseAlerts) = new OgkrParser().Parse(ogkrText);
22+
var (resultText, generateAlerts) = new OgkrGenerator().Generate(chart);
23+
24+
_output.WriteLine(string.Join('\n', parseAlerts));
25+
_output.WriteLine(string.Join('\n', generateAlerts));
26+
27+
Assert.Equal(ogkrText, resultText);
28+
}
29+
}

0 commit comments

Comments
 (0)