@@ -12,6 +12,9 @@ public class Ogkr测试
1212 public Ogkr测试 ( ITestOutputHelper output ) => _output = output ;
1313
1414 public static IEnumerable < object [ ] > GetTestInputs ( string dataDir ) => OgkrTestUtils . GetTestInputs ( dataDir ) ;
15+
16+ public static IEnumerable < object [ ] > GetTestInputsOnlyLv3 ( string dataDir ) => GetTestInputs ( dataDir )
17+ . Where ( x=> int . TryParse ( ( ( OgkrTestInput ) x [ 0 ] ) . DifficultyId , out var id ) && id == 3 ) ;
1518
1619 [ Theory ( Skip = "ogkr的解析和生成还没实现完,所以暂时跳过" ) ]
1720 [ MemberData ( nameof ( GetTestInputs ) , "官谱" ) ]
@@ -21,18 +24,56 @@ public void 解析Ogkr再生成回去(OgkrTestInput c)
2124
2225 var ( chart , parseAlerts ) = new OgkrParser ( ) . Parse ( ogkrText ) ;
2326 var ( resultText , generateAlerts ) = new OgkrGenerator ( ) . Generate ( chart ) ;
24-
25- // 转出来的IR的基本健全性检查
26- Assert . NotEmpty ( chart . BpmList ) ;
27- Assert . True ( chart . BpmList [ 0 ] . Time == 0 , "BpmList首项必须为0时刻" ) ;
28- Assert . NotEmpty ( chart . Notes ) ;
29- Assert . DoesNotContain ( parseAlerts , a => a . Level == Alert . LEVEL . Error ) ;
27+ AssertOgkChartOk ( chart , parseAlerts . Concat ( generateAlerts ) ) ;
3028
3129 _output . WriteLine ( string . Join ( '\n ' , parseAlerts ) ) ;
3230 _output . WriteLine ( string . Join ( '\n ' , generateAlerts ) ) ;
3331
3432 OgkrTextComparer . AssertOgkrEqual ( ogkrText , resultText ) ;
3533 }
34+
35+ [ Theory ]
36+ [ MemberData ( nameof ( GetTestInputsOnlyLv3 ) , "官谱" ) ]
37+ public void 物量统计测试 ( OgkrTestInput c )
38+ {
39+ var ogkrText = File . ReadAllText ( c . OgkrPath , Encoding . UTF8 ) ;
40+ var ( chart , parseAlerts ) = new OgkrParser ( ) . Parse ( ogkrText ) ;
41+ AssertOgkChartOk ( chart , parseAlerts ) ;
42+
43+ // 从HEADER段直接解析原谱面中标注的T_xxx的期望值
44+ var expected = ParseExpectedTValues ( ogkrText ) ;
45+ var actual = chart . CountNotes ( ) ;
46+
47+ // 收集所有不一致的项,统一报出,便于调试
48+ var diffs = new List < string > ( ) ;
49+ foreach ( var key in expected . Keys . OrderBy ( k => k , StringComparer . Ordinal ) )
50+ {
51+ var a = actual . GetValueOrDefault ( key , - 1 ) ;
52+ if ( a != expected [ key ] ) diffs . Add ( $ " { key } : expected={ expected [ key ] } , actual={ a } ") ;
53+ }
54+ Assert . True ( diffs . Count == 0 , $ "物量统计与原谱不一致:{ Environment . NewLine } { string . Join ( Environment . NewLine , diffs ) } ") ;
55+ }
56+
57+ private static Dictionary < string , int > ParseExpectedTValues ( string text )
58+ {
59+ var result = new Dictionary < string , int > ( ) ;
60+ foreach ( var rawLine in text . Replace ( "\r \n " , "\n " ) . Split ( '\n ' ) )
61+ {
62+ var parts = rawLine . Trim ( ) . Split ( '\t ' ) ;
63+ if ( parts . Length >= 2 && parts [ 0 ] . StartsWith ( "T_" ) && int . TryParse ( parts [ 1 ] , out var v ) )
64+ result [ parts [ 0 ] ] = v ;
65+ }
66+ return result ;
67+ }
68+
69+ private void AssertOgkChartOk ( OgkChart chart , IEnumerable < Alert > alerts )
70+ {
71+ // 转出来的IR的基本健全性检查
72+ Assert . NotEmpty ( chart . BpmList ) ;
73+ Assert . True ( chart . BpmList [ 0 ] . Time == 0 , "BpmList首项必须为0时刻" ) ;
74+ Assert . NotEmpty ( chart . Notes ) ;
75+ Assert . DoesNotContain ( alerts , a => a . Level == Alert . LEVEL . Error ) ;
76+ }
3677}
3778
3879/// <summary>
0 commit comments