1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . IO ;
4
+ using System . Linq ;
4
5
using System . Threading . Tasks ;
6
+ using AlphaTab . Core ;
5
7
using AlphaTab . Core . EcmaScript ;
6
8
using AlphaTab . Importer ;
7
9
using AlphaTab . Io ;
@@ -15,140 +17,113 @@ namespace AlphaTab.VisualTests
15
17
{
16
18
partial class VisualTestHelper
17
19
{
18
- public static async Task RunVisualTest ( string inputFile , Settings ? settings = null ,
19
- IList < double > ? tracks = null , string ? message = null , double tolerancePercent = 1 , bool triggerResize = false )
20
+ private static async Task RunVisualTestScoreWithResize ( Score score , IList < double > widths ,
21
+ IList < string ? > referenceImages , Settings ? settings , IList < double > ? tracks , string ? message ,
22
+ double tolerancePercent )
20
23
{
21
- try
22
- {
23
- inputFile = $ "test-data/visual-tests/{ inputFile } ";
24
- var inputFileData =
25
- await TestPlatform . LoadFile ( inputFile ) ;
26
- var referenceFileName = TestPlatform . ChangeExtension ( inputFile , ".png" ) ;
27
- var score = ScoreLoader . LoadScoreFromBytes ( inputFileData , settings ) ;
28
-
29
- await RunVisualTestScore ( score , referenceFileName , settings ,
30
- tracks , message , tolerancePercent , triggerResize ) ;
31
- }
32
- catch ( Exception e )
33
- {
34
- Assert . Fail ( $ "Failed to run visual test { e } ") ;
35
- }
36
- }
37
-
38
- public static async Task RunVisualTestTex ( string tex , string referenceFileName ,
39
- Settings ? settings = null ,
40
- IList < double > ? tracks = null , string ? message = null )
41
- {
42
- try
43
- {
44
- settings ??= new Settings ( ) ;
45
-
46
- var importer = new AlphaTexImporter ( ) ;
47
- importer . Init ( ByteBuffer . FromString ( tex ) , settings ) ;
48
- var score = importer . ReadScore ( ) ;
49
-
50
- await RunVisualTestScore ( score , referenceFileName , settings ,
51
- tracks , message ) ;
52
- }
53
- catch ( Exception e )
54
- {
55
- Assert . Fail ( $ "Failed to run visual test { e } ") ;
56
- }
57
- }
58
-
59
- public static async Task RunVisualTestScore ( Score score , string referenceFileName ,
60
- Settings ? settings = null ,
61
- IList < double > ? tracks = null , string ? message = null , double tolerancePercent = 1 , bool triggerResize = false )
62
- {
63
- settings ??= new Settings ( ) ;
64
- tracks ??= new AlphaTab . Collections . List < double > { 0 } ;
65
-
66
- settings . Core . Engine = "skia" ;
67
- settings . Core . EnableLazyLoading = false ;
68
- settings . Core . UseWorkers = false ;
69
-
70
- settings . Display . Resources . CopyrightFont . Family = "Roboto" ;
71
- settings . Display . Resources . TitleFont . Family = "PT Serif" ;
72
- settings . Display . Resources . SubTitleFont . Family = "PT Serif" ;
73
- settings . Display . Resources . WordsFont . Family = "PT Serif" ;
74
- settings . Display . Resources . EffectFont . Family = "PT Serif" ;
75
- settings . Display . Resources . FretboardNumberFont . Family = "Roboto" ;
76
- settings . Display . Resources . TablatureFont . Family = "Roboto" ;
77
- settings . Display . Resources . GraceFont . Family = "Roboto" ;
78
- settings . Display . Resources . BarNumberFont . Family = "Roboto" ;
79
- settings . Display . Resources . FingeringFont . Family = "PT Serif" ;
80
- settings . Display . Resources . MarkerFont . Family = "PT Serif" ;
81
-
82
- LoadFonts ( ) ;
24
+ tracks ??= new List < double > { 0 } ;
25
+ PrepareSettingsForTest ( ref settings ) ;
83
26
84
- if ( ! referenceFileName . StartsWith ( "test-data/" ) )
27
+ var referenceFileData = new List < Uint8Array ? > ( ) ;
28
+ foreach ( var referenceFileName in referenceImages )
85
29
{
86
- referenceFileName = $ "test-data/visual-tests/{ referenceFileName } ";
30
+ if ( referenceFileName == null )
31
+ {
32
+ referenceFileData . Add ( null ) ;
33
+ }
34
+ else
35
+ {
36
+ referenceFileData . Add ( await TestPlatform . LoadFile ( Path . Combine ( "test-data" , "visual-tests" , referenceFileName ) ) ) ;
37
+ }
87
38
}
88
39
89
- var referenceFileData =
90
- await TestPlatform . LoadFile ( referenceFileName ) ;
91
-
92
- var result = new AlphaTab . Collections . List < RenderFinishedEventArgs > ( ) ;
93
- var totalWidth = 0.0 ;
94
- var totalHeight = 0.0 ;
95
- var isResizeRender = false ;
40
+ var results = new AlphaTab . Collections . List < AlphaTab . Collections . List < RenderFinishedEventArgs > > ( ) ;
41
+ var totalWidths = new AlphaTab . Collections . List < double > ( ) ;
42
+ var totalHeights = new AlphaTab . Collections . List < double > ( ) ;
96
43
97
44
var task = new TaskCompletionSource < object ? > ( ) ;
98
45
var renderer = new ScoreRenderer ( settings )
99
46
{
100
- Width = 1300
47
+ Width = widths . Shift ( )
101
48
} ;
102
49
renderer . PreRender . On ( isResize =>
103
50
{
104
- result = new AlphaTab . Collections . List < RenderFinishedEventArgs > ( ) ;
105
- totalWidth = 0.0 ;
106
- totalHeight = 0.0 ;
51
+ results . Add ( new AlphaTab . Collections . List < RenderFinishedEventArgs > ( ) ) ;
52
+ totalWidths . Add ( 0 ) ;
53
+ totalHeights . Add ( 0 ) ;
107
54
} ) ;
108
55
renderer . PartialRenderFinished . On ( e =>
109
56
{
110
57
if ( e != null )
111
58
{
112
- result . Add ( e ) ;
59
+ results [ ^ 1 ] . Add ( e ) ;
113
60
}
114
61
} ) ;
115
62
renderer . RenderFinished . On ( e =>
116
63
{
117
- totalWidth = e . TotalWidth ;
118
- totalHeight = e . TotalHeight ;
119
- result . Add ( e ) ;
120
- if ( ! triggerResize || isResizeRender )
64
+ totalWidths [ ^ 1 ] = e . TotalWidth ;
65
+ totalHeights [ ^ 1 ] = e . TotalHeight ;
66
+ results [ ^ 1 ] . Add ( e ) ;
67
+ if ( widths . Count > 0 )
121
68
{
122
- task . SetResult ( null ) ;
69
+ renderer . Width = widths . Shift ( ) ;
70
+ renderer . ResizeRender ( ) ;
123
71
}
124
- else if ( triggerResize )
72
+ else
125
73
{
126
- isResizeRender = true ;
127
- renderer . ResizeRender ( ) ;
74
+ task . SetResult ( null ) ;
128
75
}
129
76
} ) ;
130
77
renderer . Error . On ( ( e ) => { task . SetException ( e ) ; } ) ;
131
78
132
79
renderer . RenderScore ( score , tracks ) ;
133
80
134
- if ( await Task . WhenAny ( task . Task , Task . Delay ( 2000 ) ) == task . Task )
81
+ if ( await Task . WhenAny ( task . Task , Task . Delay ( 2000 * referenceImages . Count ) ) == task . Task )
135
82
{
136
- CompareVisualResult (
137
- totalWidth ,
138
- totalHeight ,
139
- result ,
140
- referenceFileName ,
141
- referenceFileData ,
142
- message ,
143
- tolerancePercent
144
- ) ;
83
+ for ( var i = 0 ; i < results . Count ; i ++ )
84
+ {
85
+ if ( referenceImages [ i ] != null )
86
+ {
87
+ CompareVisualResult (
88
+ totalWidths [ i ] ,
89
+ totalHeights [ i ] ,
90
+ results [ i ] ,
91
+ referenceImages [ i ] ! ,
92
+ referenceFileData [ i ] ! ,
93
+ message ,
94
+ tolerancePercent
95
+ ) ;
96
+ }
97
+ }
145
98
}
146
99
else
147
100
{
148
101
Assert . Fail ( "Rendering did not complete within timeout" ) ;
149
102
}
150
103
}
151
104
105
+ private static void PrepareSettingsForTest ( ref Settings ? settings )
106
+ {
107
+ settings ??= new Settings ( ) ;
108
+ settings . Core . Engine = "skia" ;
109
+ settings . Core . EnableLazyLoading = false ;
110
+ settings . Core . UseWorkers = false ;
111
+
112
+ settings . Display . Resources . CopyrightFont . Family = "Roboto" ;
113
+ settings . Display . Resources . TitleFont . Family = "PT Serif" ;
114
+ settings . Display . Resources . SubTitleFont . Family = "PT Serif" ;
115
+ settings . Display . Resources . WordsFont . Family = "PT Serif" ;
116
+ settings . Display . Resources . EffectFont . Family = "PT Serif" ;
117
+ settings . Display . Resources . FretboardNumberFont . Family = "Roboto" ;
118
+ settings . Display . Resources . TablatureFont . Family = "Roboto" ;
119
+ settings . Display . Resources . GraceFont . Family = "Roboto" ;
120
+ settings . Display . Resources . BarNumberFont . Family = "Roboto" ;
121
+ settings . Display . Resources . FingeringFont . Family = "PT Serif" ;
122
+ settings . Display . Resources . MarkerFont . Family = "PT Serif" ;
123
+
124
+ LoadFonts ( ) ;
125
+ }
126
+
152
127
private static bool _fontsLoaded ;
153
128
private static void LoadFonts ( )
154
129
{
@@ -220,6 +195,10 @@ private static void CompareVisualResult(double totalWidth, double totalHeight,
220
195
{
221
196
try
222
197
{
198
+ Assert . AreEqual ( totalWidth , referenceBitmap . Width ,
199
+ "Width of images does not match" ) ;
200
+ Assert . AreEqual ( totalHeight , referenceBitmap . Height ,
201
+ "Height of images does not match" ) ;
223
202
var diffData = new Uint8Array ( finalBitmap . Bytes . Length ) ;
224
203
var match = PixelMatch . Match (
225
204
new Uint8Array ( referenceBitmap . Bytes ) ,
@@ -267,6 +246,10 @@ private static void CompareVisualResult(double totalWidth, double totalHeight,
267
246
Assert . Fail ( msg ) ;
268
247
}
269
248
}
249
+ catch ( AssertFailedException )
250
+ {
251
+ throw ;
252
+ }
270
253
catch ( Exception e )
271
254
{
272
255
Assert . Fail ( $ "Error comparing images: { e } , ${ message } ") ;
0 commit comments