From 60cd56a6c00492eebfc521908e983de33f9b4130 Mon Sep 17 00:00:00 2001 From: Moritz Weber Date: Tue, 2 May 2023 17:48:10 +0200 Subject: [PATCH] fix #76 --- CHANGELOG.md | 1 + src/lib/system/models/song_model.dart | 12 ++++---- src/test/track_number_test.dart | 40 +++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/test/track_number_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index cac0021..777c463 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Migration to Material 3 widgets including extensive UI changes - New Icons for linked songs - Added German translation (#51) +- Fixed track number parsing for three digits (#76) ## 1.2.0 diff --git a/src/lib/system/models/song_model.dart b/src/lib/system/models/song_model.dart index c815dd0..ac5f494 100644 --- a/src/lib/system/models/song_model.dart +++ b/src/lib/system/models/song_model.dart @@ -84,7 +84,7 @@ class SongModel extends Song { required DateTime lastModified, }) { final data = songModel.getMap; - final trackNumber = _parseTrackNumber(songModel.track); + final trackNumber = parseTrackNumber(songModel.track); return SongModel( title: songModel.title, @@ -214,18 +214,18 @@ class SongModel extends Song { 'color': color?.value, }); - static List _parseTrackNumber(int? number) { + static List parseTrackNumber(int? number) { if (number == null) return [1, 1]; final numString = number.toString(); - final firstZero = numString.indexOf('0'); - if (firstZero < 0 || firstZero == numString.length - 1) { + if (numString.length < 4) { + // does not contain a disc number return [1, number]; } - final disc = numString.substring(0, firstZero); - final track = numString.substring(firstZero + 1); + final disc = numString.substring(0, numString.length - 3); + final track = numString.substring(numString.length - 3); return [int.parse(disc), int.parse(track)]; } diff --git a/src/test/track_number_test.dart b/src/test/track_number_test.dart new file mode 100644 index 0000000..fca9200 --- /dev/null +++ b/src/test/track_number_test.dart @@ -0,0 +1,40 @@ +import 'package:mucke/system/models/song_model.dart'; +import 'package:test/test.dart'; + +void main() { + // four digits lead to invalid numbers from plugin: + // x-1234:1234 (ok in theory but not unambiguous) + // 1-4444:5444 + // 123-4567:127567 + test('Base case: single digit disc & <3 digit track', () { + expect(SongModel.parseTrackNumber(1001), [1, 1]); + expect(SongModel.parseTrackNumber(2003), [2, 3]); + expect(SongModel.parseTrackNumber(1010), [1, 10]); + }); + + test('double digit disc', () { + expect(SongModel.parseTrackNumber(10001), [10, 1]); + expect(SongModel.parseTrackNumber(10010), [10, 10]); + expect(SongModel.parseTrackNumber(10100), [10, 100]); + expect(SongModel.parseTrackNumber(12999), [12, 999]); + }); + + test('triple digit track', () { + expect(SongModel.parseTrackNumber(1100), [1, 100]); + expect(SongModel.parseTrackNumber(1101), [1, 101]); + expect(SongModel.parseTrackNumber(1999), [1, 999]); + expect(SongModel.parseTrackNumber(12999), [12, 999]); + }); + + test('no disc', () { + expect(SongModel.parseTrackNumber(10), [1, 10]); + expect(SongModel.parseTrackNumber(40), [1, 40]); + expect(SongModel.parseTrackNumber(1), [1, 1]); + }); + + test('triple digit disc', () { + expect(SongModel.parseTrackNumber(123004), [123, 4]); + expect(SongModel.parseTrackNumber(123045), [123, 45]); + expect(SongModel.parseTrackNumber(123456), [123, 456]); + }); +}