From 4a323b21ce36c7e9a7206fe4dcae96335efe293e Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 1 Nov 2022 13:53:29 +0100 Subject: [PATCH 1/2] Fix null/undefined lyrics which cause exporter to fail --- .../kotlin/alphaTab/collections/List.kt | 4 ++++ src/model/Track.ts | 1 + test-data/guitarpro7/lyrics-null.gp | Bin 0 -> 12329 bytes test/exporter/Gp7Exporter.test.ts | 18 ++++++++++++------ 4 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 test-data/guitarpro7/lyrics-null.gp diff --git a/src.kotlin/alphaTab/alphaTab/src/commonMain/kotlin/alphaTab/collections/List.kt b/src.kotlin/alphaTab/alphaTab/src/commonMain/kotlin/alphaTab/collections/List.kt index d3068d39d..a131a50ae 100644 --- a/src.kotlin/alphaTab/alphaTab/src/commonMain/kotlin/alphaTab/collections/List.kt +++ b/src.kotlin/alphaTab/alphaTab/src/commonMain/kotlin/alphaTab/collections/List.kt @@ -39,6 +39,10 @@ public class List : Iterable { _data.add(item) } + public fun fill(item: T) { + _data.fill(item) + } + public fun push(items: List) { _data.addAll(items._data) } diff --git a/src/model/Track.ts b/src/model/Track.ts index 1fdb6282d..4ee42e73e 100644 --- a/src/model/Track.ts +++ b/src/model/Track.ts @@ -102,6 +102,7 @@ export class Track { // initialize lyrics list for beat if required if (!beat.lyrics) { beat.lyrics = new Array(lyrics.length); + beat.lyrics.fill(""); } // assign chunk beat.lyrics[li] = lyric.chunks[ci]; diff --git a/test-data/guitarpro7/lyrics-null.gp b/test-data/guitarpro7/lyrics-null.gp new file mode 100644 index 0000000000000000000000000000000000000000..c9a3f91b16cdae6c30342ef7ba2898b0ab1be08c GIT binary patch literal 12329 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 swbFZpzeo3bl)n!EzwOO; { const data = await TestPlatform.loadFile('test-data/' + name); try { return ScoreLoader.loadScoreFromBytes(data); - } - catch (e) { + } catch (e) { return null; } }; @@ -30,7 +29,10 @@ describe('Gp7ExporterTest', () => { return new Gp7Exporter().export(score, null); }; - const testRoundTripEqual: (name: string, ignoreKeys: string[] | null) => Promise = async (name: string, ignoreKeys: string[] | null = null): Promise => { + const testRoundTripEqual: (name: string, ignoreKeys: string[] | null) => Promise = async ( + name: string, + ignoreKeys: string[] | null = null + ): Promise => { try { const expected = await loadScore(name); if (!expected) { @@ -42,7 +44,7 @@ describe('Gp7ExporterTest', () => { const actual = prepareGp7ImporterWithBytes(exported).readScore(); const expectedJson = JsonConverter.scoreToJsObject(expected); - const actualJson = JsonConverter.scoreToJsObject(actual) + const actualJson = JsonConverter.scoreToJsObject(actual); if (!ComparisonHelpers.expectJsonEqual(expectedJson, actualJson, '<' + fileName + '>', ignoreKeys)) { await TestPlatform.saveFile(fileName, exported); @@ -109,7 +111,7 @@ describe('Gp7ExporterTest', () => { await testRoundTripEqual(`conversion/full-song.gpx`, [ 'accidentalmode', // gets upgraded from default 'percussionarticulations', // gets added - 'percussionarticulation', // gets added + 'percussionarticulation' // gets added ]); }); @@ -136,8 +138,12 @@ describe('Gp7ExporterTest', () => { const actual = prepareGp7ImporterWithBytes(exported).readScore(); const expectedJson = JsonConverter.scoreToJsObject(expected); - const actualJson = JsonConverter.scoreToJsObject(actual) + const actualJson = JsonConverter.scoreToJsObject(actual); ComparisonHelpers.expectJsonEqual(expectedJson, actualJson, '', ['accidentalmode']); }); + + it('gp7-lyrics-null', async () => { + await testRoundTripEqual('guitarpro7/lyrics-null.gp', null); + }); }); From 3ac15561810de42374d6b9dd4a393da13dabb07e Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 1 Nov 2022 13:58:56 +0100 Subject: [PATCH 2/2] Ensure empty-string is falsy --- src.csharp/AlphaTab.Test/Test/Globals.cs | 9 ++++++++- .../src/androidTest/kotlin/alphaTab/test/Globals.kt | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src.csharp/AlphaTab.Test/Test/Globals.cs b/src.csharp/AlphaTab.Test/Test/Globals.cs index 05660269e..13e2c6bb3 100644 --- a/src.csharp/AlphaTab.Test/Test/Globals.cs +++ b/src.csharp/AlphaTab.Test/Test/Globals.cs @@ -87,7 +87,14 @@ public void ToBeTrue() public void ToBeFalsy() { - Assert.AreEqual(default!, _actual, _message); + if (_actual is string s) + { + Assert.IsTrue(string.IsNullOrEmpty(s), _message); + } + else + { + Assert.AreEqual(default!, _actual, _message); + } } public void ToThrowError(Type expected) diff --git a/src.kotlin/alphaTab/alphaTab/src/androidTest/kotlin/alphaTab/test/Globals.kt b/src.kotlin/alphaTab/alphaTab/src/androidTest/kotlin/alphaTab/test/Globals.kt index 0f6d5ff93..b30652f2f 100644 --- a/src.kotlin/alphaTab/alphaTab/src/androidTest/kotlin/alphaTab/test/Globals.kt +++ b/src.kotlin/alphaTab/alphaTab/src/androidTest/kotlin/alphaTab/test/Globals.kt @@ -68,7 +68,12 @@ public class Expector { } public fun toBeFalsy() { - kotlin.test.assertNull(_actual, _message) + val actual = _actual; + if(actual is String){ + kotlin.test.assertTrue(actual.isEmpty(), _message) + } else { + kotlin.test.assertNull(_actual, _message) + } } public fun toThrowError(expected: KClass) {