From 218a99a3164e8ae6967335190b72fd36275d1892 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Mon, 21 Aug 2023 10:58:55 -0300 Subject: data, test: track: inherit album props more declaratively --- test/unit/data/things/track.js | 55 +++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 22 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 383e3e3f..d0e50c7f 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -3,6 +3,7 @@ import thingConstructors from '#things'; const { Album, + Artist, Thing, Track, TrackGroup, @@ -20,55 +21,65 @@ function stubAlbum(tracks) { } t.test(`Track.coverArtDate`, t => { - t.plan(5); + t.plan(6); - // Priority order is as follows, with the last (trackCoverArtDate) being - // greatest priority. - const albumDate = new Date('2010-10-10'); const albumTrackArtDate = new Date('2012-12-12'); - const trackDateFirstReleased = new Date('2008-08-08'); const trackCoverArtDate = new Date('2009-09-09'); + const dummyContribs = [{who: 'Test Artist', what: null}] const track = new Track(); track.directory = 'foo'; + track.coverArtistContribsByRef = dummyContribs; const album = stubAlbum([track]); + const artist = new Artist(); + artist.name = 'Test Artist'; + track.albumData = [album]; + track.artistData = [artist]; + + const XXX_CLEAR_TRACK_ALBUM_CACHE = () => { + // XXX clear cache so change in album's property is reflected + track.albumData = []; + track.albumData = [album]; + }; // 1. coverArtDate defaults to null t.equal(track.coverArtDate, null); - // 2. coverArtDate inherits album release date + // 2. coverArtDate inherits album trackArtDate - album.date = albumDate; + album.trackArtDate = albumTrackArtDate; - // XXX clear cache so change in album's property is reflected - track.albumData = []; - track.albumData = [album]; + XXX_CLEAR_TRACK_ALBUM_CACHE(); - t.equal(track.coverArtDate, albumDate); + t.equal(track.coverArtDate, albumTrackArtDate); - // 3. coverArtDate inherits album trackArtDate + // 3. coverArtDate is own value - album.trackArtDate = albumTrackArtDate; + track.coverArtDate = trackCoverArtDate; - // XXX clear cache again - track.albumData = []; - track.albumData = [album]; + t.equal(track.coverArtDate, trackCoverArtDate); - t.equal(track.coverArtDate, albumTrackArtDate); + // 4. coverArtDate is null if track is missing coverArtists - // 4. coverArtDate is overridden dateFirstReleased + track.coverArtistContribsByRef = []; - track.dateFirstReleased = trackDateFirstReleased; + t.equal(track.coverArtDate, null); - t.equal(track.coverArtDate, trackDateFirstReleased); + // 5. coverArtDate is not null if album specifies trackCoverArtistContribs - // 5. coverArtDate is overridden coverArtDate + album.trackCoverArtistContribsByRef = dummyContribs; - track.coverArtDate = trackCoverArtDate; + XXX_CLEAR_TRACK_ALBUM_CACHE(); t.equal(track.coverArtDate, trackCoverArtDate); + + // 6. coverArtDate is null if track disables unique cover artwork + + track.disableUniqueCoverArt = true; + + t.equal(track.coverArtDate, null); }); -- cgit 1.3.0-6-gf8a5 From 13914b9f07f60d6d8aaaddc7df675d41950320c3 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 23 Aug 2023 12:22:34 -0300 Subject: test: Track.{color,date,hasUniqueCoverArt} (unit) --- test/unit/data/things/track.js | 157 ++++++++++++++++++++++++++++++++--------- 1 file changed, 125 insertions(+), 32 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index d0e50c7f..37aa7b9f 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -20,66 +20,159 @@ function stubAlbum(tracks) { return album; } -t.test(`Track.coverArtDate`, t => { - t.plan(6); - - const albumTrackArtDate = new Date('2012-12-12'); - const trackCoverArtDate = new Date('2009-09-09'); - const dummyContribs = [{who: 'Test Artist', what: null}] - +function stubTrack() { const track = new Track(); track.directory = 'foo'; - track.coverArtistContribsByRef = dummyContribs; + return track; +} +function stubTrackAndAlbum() { + const track = stubTrack(); const album = stubAlbum([track]); + track.albumData = [album]; + return {track, album}; +} +function stubArtistAndContribs() { const artist = new Artist(); - artist.name = 'Test Artist'; + artist.name = `Test Artist`; + + const contribs = [{who: `Test Artist`, what: null}]; + const badContribs = [{who: `Figment of Your Imagination`, what: null}]; + return {artist, contribs, badContribs}; +} +function XXX_CLEAR_TRACK_ALBUM_CACHE(track, album) { + // XXX clear cache so change in album's property is reflected + track.albumData = []; track.albumData = [album]; - track.artistData = [artist]; +} - const XXX_CLEAR_TRACK_ALBUM_CACHE = () => { - // XXX clear cache so change in album's property is reflected - track.albumData = []; - track.albumData = [album]; - }; +t.test(`Track.color`, t => { + t.plan(3); - // 1. coverArtDate defaults to null + const {track, album} = stubTrackAndAlbum(); - t.equal(track.coverArtDate, null); + t.equal(track.color, null, + `color #1: defaults to null`); - // 2. coverArtDate inherits album trackArtDate + album.color = '#abcdef'; + XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); - album.trackArtDate = albumTrackArtDate; + t.equal(track.color, '#abcdef', + `color #2: inherits from album`); - XXX_CLEAR_TRACK_ALBUM_CACHE(); + track.color = '#123456'; - t.equal(track.coverArtDate, albumTrackArtDate); + t.equal(track.color, '#123456', + `color #3: is own value`); +}); - // 3. coverArtDate is own value +t.test(`Track.coverArtDate`, t => { + t.plan(6); + + const {track, album} = stubTrackAndAlbum(); + const {artist, contribs} = stubArtistAndContribs(); + + track.coverArtistContribsByRef = contribs; + track.artistData = [artist]; + + t.equal(track.coverArtDate, null, + `coverArtDate #1: defaults to null`); - track.coverArtDate = trackCoverArtDate; + album.trackArtDate = new Date('2012-12-12'); + XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); - t.equal(track.coverArtDate, trackCoverArtDate); + t.same(track.coverArtDate, new Date('2012-12-12'), + `coverArtDate #2: inherits album trackArtDate`); - // 4. coverArtDate is null if track is missing coverArtists + track.coverArtDate = new Date('2009-09-09'); + + t.same(track.coverArtDate, new Date('2009-09-09'), + `coverArtDate #3: is own value`); track.coverArtistContribsByRef = []; - t.equal(track.coverArtDate, null); + t.equal(track.coverArtDate, null, + `coverArtDate #4: is null if track is missing coverArtists`); + + album.trackCoverArtistContribsByRef = contribs; + XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + + t.same(track.coverArtDate, new Date('2009-09-09'), + `coverArtDate #5: is not null if album specifies trackCoverArtistContribs`); + + track.disableUniqueCoverArt = true; + + t.equal(track.coverArtDate, null, + `coverArtDate #6: is null if track disables unique cover artwork`); +}); + +t.test(`Track.date`, t => { + t.plan(3); + + const {track, album} = stubTrackAndAlbum(); + + t.equal(track.date, null, + `date #1: defaults to null`); + + album.date = new Date('2012-12-12'); + XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); - // 5. coverArtDate is not null if album specifies trackCoverArtistContribs + t.same(track.date, album.date, + `date #2: inherits from album`); - album.trackCoverArtistContribsByRef = dummyContribs; + track.dateFirstReleased = new Date('2009-09-09'); + + t.same(track.date, new Date('2009-09-09'), + `date #3: is own dateFirstReleased`); +}); + +t.test(`Track.hasUniqueCoverArt`, t => { + t.plan(7); + + const {track, album} = stubTrackAndAlbum(); + const {artist, contribs, badContribs} = stubArtistAndContribs(); + + track.artistData = [artist]; + album.artistData = [artist]; - XXX_CLEAR_TRACK_ALBUM_CACHE(); + t.equal(track.hasUniqueCoverArt, false, + `hasUniqueCoverArt #1: defaults to false`); - t.equal(track.coverArtDate, trackCoverArtDate); + album.trackCoverArtistContribsByRef = contribs; + XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); - // 6. coverArtDate is null if track disables unique cover artwork + t.equal(track.hasUniqueCoverArt, true, + `hasUniqueCoverArt #2: is true if album specifies trackCoverArtistContribs`); track.disableUniqueCoverArt = true; - t.equal(track.coverArtDate, null); + t.equal(track.hasUniqueCoverArt, false, + `hasUniqueCoverArt #3: is false if disableUniqueCoverArt is true (1/2)`); + + track.disableUniqueCoverArt = false; + + album.trackCoverArtistContribsByRef = badContribs; + XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + + t.equal(track.hasUniqueCoverArt, false, + `hasUniqueCoverArt #4: is false if album's trackCoverArtistContribsByRef resolve empty`); + + track.coverArtistContribsByRef = contribs; + + t.equal(track.hasUniqueCoverArt, true, + `hasUniqueCoverArt #5: is true if track specifies coverArtistContribs`); + + track.disableUniqueCoverArt = true; + + t.equal(track.hasUniqueCoverArt, false, + `hasUniqueCoverArt #6: is false if disableUniqueCoverArt is true (2/2)`); + + track.disableUniqueCoverArt = false; + + track.coverArtistContribsByRef = badContribs; + + t.equal(track.hasUniqueCoverArt, false, + `hasUniqueCoverArt #7: is false if track's coverArtistContribsByRef resolve empty`); }); -- cgit 1.3.0-6-gf8a5 From 087564095ff06fed25a0c21fab01ed9d849937d0 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 25 Aug 2023 13:30:08 -0300 Subject: test: Track.otherReleases (unit) --- test/unit/data/things/track.js | 76 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 7 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 37aa7b9f..9d4ba2c3 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -20,14 +20,14 @@ function stubAlbum(tracks) { return album; } -function stubTrack() { +function stubTrack(directory = 'foo') { const track = new Track(); - track.directory = 'foo'; + track.directory = directory; return track; } -function stubTrackAndAlbum() { - const track = stubTrack(); +function stubTrackAndAlbum(trackDirectory = 'foo') { + const track = stubTrack(trackDirectory); const album = stubAlbum([track]); track.albumData = [album]; return {track, album}; @@ -42,10 +42,30 @@ function stubArtistAndContribs() { return {artist, contribs, badContribs}; } +function assignWikiData({ + XXX_DECACHE = false, + albumData, + trackData, +}) { + for (const album of albumData ?? []) { + if (XXX_DECACHE) { + album.trackData = []; + } + album.trackData = trackData ?? []; + } + + for (const track of trackData ?? []) { + if (XXX_DECACHE) { + track.albumData = []; + track.trackData = []; + } + track.albumData = albumData ?? []; + track.trackData = trackData ?? []; + } +} + function XXX_CLEAR_TRACK_ALBUM_CACHE(track, album) { - // XXX clear cache so change in album's property is reflected - track.albumData = []; - track.albumData = [album]; + assignWikiData({XXX_DECACHE: true, albumData: [album], trackData: [track]}); } t.test(`Track.color`, t => { @@ -176,3 +196,45 @@ t.test(`Track.hasUniqueCoverArt`, t => { t.equal(track.hasUniqueCoverArt, false, `hasUniqueCoverArt #7: is false if track's coverArtistContribsByRef resolve empty`); }); + +t.test(`Track.otherReleases`, t => { + t.plan(6); + + const {track: track1, album: album1} = stubTrackAndAlbum('track1'); + const {track: track2, album: album2} = stubTrackAndAlbum('track2'); + const {track: track3, album: album3} = stubTrackAndAlbum('track3'); + const {track: track4, album: album4} = stubTrackAndAlbum('track4'); + + let trackData = [track1, track2, track3, track4]; + let albumData = [album1, album2, album3, album4]; + assignWikiData({trackData, albumData}); + + t.same(track1.otherReleases, [], + `otherReleases #1: defaults to empty array`); + + track2.originalReleaseTrackByRef = 'track:track1'; + track3.originalReleaseTrackByRef = 'track:track1'; + track4.originalReleaseTrackByRef = 'track:track1'; + assignWikiData({trackData, albumData, XXX_DECACHE: true}); + + t.same(track1.otherReleases, [track2, track3, track4], + `otherReleases #2: otherReleases of original release are its rereleases`); + + trackData = [track1, track3, track2, track4]; + assignWikiData({trackData, albumData}); + + t.same(track1.otherReleases, [track3, track2, track4], + `otherReleases #3: otherReleases matches trackData order`); + + trackData = [track3, track2, track1, track4]; + assignWikiData({trackData, albumData}); + + t.same(track2.otherReleases, [track1, track3, track4], + `otherReleases #4: otherReleases of rerelease are original track then other rereleases (1/3)`); + + t.same(track3.otherReleases, [track1, track2, track4], + `otherReleases #5: otherReleases of rerelease are original track then other rereleases (2/3)`); + + t.same(track4.otherReleases, [track1, track3, track2], + `otherReleases #6: otherReleases of rerelease are original track then other rereleases (1/3)`); +}); -- cgit 1.3.0-6-gf8a5 From f562896d4d67558a32726f7086beebf29019a44d Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 25 Aug 2023 14:06:00 -0300 Subject: yaml, test: mutate/decache wikiData in more reusable ways --- test/unit/data/things/track.js | 105 ++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 54 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 9d4ba2c3..218353c8 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -1,4 +1,6 @@ import t from 'tap'; + +import {linkAndBindWikiData} from '#test-lib'; import thingConstructors from '#things'; const { @@ -6,30 +8,28 @@ const { Artist, Thing, Track, - TrackGroup, } = thingConstructors; -function stubAlbum(tracks) { +function stubAlbum(tracks, directory = 'bar') { const album = new Album(); - album.trackSections = [ - { - tracksByRef: tracks.map(t => Thing.getReference(t)), - }, - ]; - album.trackData = tracks; + album.directory = directory; + + const tracksByRef = tracks.map(t => Thing.getReference(t)); + album.trackSections = [{tracksByRef}]; + return album; } function stubTrack(directory = 'foo') { const track = new Track(); track.directory = directory; + return track; } -function stubTrackAndAlbum(trackDirectory = 'foo') { +function stubTrackAndAlbum(trackDirectory = 'foo', albumDirectory = 'bar') { const track = stubTrack(trackDirectory); - const album = stubAlbum([track]); - track.albumData = [album]; + const album = stubAlbum([track], albumDirectory); return {track, album}; } @@ -39,33 +39,8 @@ function stubArtistAndContribs() { const contribs = [{who: `Test Artist`, what: null}]; const badContribs = [{who: `Figment of Your Imagination`, what: null}]; - return {artist, contribs, badContribs}; -} - -function assignWikiData({ - XXX_DECACHE = false, - albumData, - trackData, -}) { - for (const album of albumData ?? []) { - if (XXX_DECACHE) { - album.trackData = []; - } - album.trackData = trackData ?? []; - } - - for (const track of trackData ?? []) { - if (XXX_DECACHE) { - track.albumData = []; - track.trackData = []; - } - track.albumData = albumData ?? []; - track.trackData = trackData ?? []; - } -} -function XXX_CLEAR_TRACK_ALBUM_CACHE(track, album) { - assignWikiData({XXX_DECACHE: true, albumData: [album], trackData: [track]}); + return {artist, contribs, badContribs}; } t.test(`Track.color`, t => { @@ -73,11 +48,16 @@ t.test(`Track.color`, t => { const {track, album} = stubTrackAndAlbum(); + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album], + trackData: [track], + }); + t.equal(track.color, null, `color #1: defaults to null`); album.color = '#abcdef'; - XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + XXX_decacheWikiData(); t.equal(track.color, '#abcdef', `color #2: inherits from album`); @@ -94,14 +74,20 @@ t.test(`Track.coverArtDate`, t => { const {track, album} = stubTrackAndAlbum(); const {artist, contribs} = stubArtistAndContribs(); + const {XXX_decacheWikiData} = linkAndBindWikiData({ + trackData: [track], + albumData: [album], + artistData: [artist], + }); + track.coverArtistContribsByRef = contribs; - track.artistData = [artist]; t.equal(track.coverArtDate, null, `coverArtDate #1: defaults to null`); album.trackArtDate = new Date('2012-12-12'); - XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + + XXX_decacheWikiData(); t.same(track.coverArtDate, new Date('2012-12-12'), `coverArtDate #2: inherits album trackArtDate`); @@ -117,7 +103,8 @@ t.test(`Track.coverArtDate`, t => { `coverArtDate #4: is null if track is missing coverArtists`); album.trackCoverArtistContribsByRef = contribs; - XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + + XXX_decacheWikiData(); t.same(track.coverArtDate, new Date('2009-09-09'), `coverArtDate #5: is not null if album specifies trackCoverArtistContribs`); @@ -133,11 +120,16 @@ t.test(`Track.date`, t => { const {track, album} = stubTrackAndAlbum(); + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album], + trackData: [track], + }); + t.equal(track.date, null, `date #1: defaults to null`); album.date = new Date('2012-12-12'); - XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + XXX_decacheWikiData(); t.same(track.date, album.date, `date #2: inherits from album`); @@ -154,14 +146,17 @@ t.test(`Track.hasUniqueCoverArt`, t => { const {track, album} = stubTrackAndAlbum(); const {artist, contribs, badContribs} = stubArtistAndContribs(); - track.artistData = [artist]; - album.artistData = [artist]; + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album], + artistData: [artist], + trackData: [track], + }); t.equal(track.hasUniqueCoverArt, false, `hasUniqueCoverArt #1: defaults to false`); album.trackCoverArtistContribsByRef = contribs; - XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + XXX_decacheWikiData(); t.equal(track.hasUniqueCoverArt, true, `hasUniqueCoverArt #2: is true if album specifies trackCoverArtistContribs`); @@ -174,7 +169,7 @@ t.test(`Track.hasUniqueCoverArt`, t => { track.disableUniqueCoverArt = false; album.trackCoverArtistContribsByRef = badContribs; - XXX_CLEAR_TRACK_ALBUM_CACHE(track, album); + XXX_decacheWikiData(); t.equal(track.hasUniqueCoverArt, false, `hasUniqueCoverArt #4: is false if album's trackCoverArtistContribsByRef resolve empty`); @@ -205,9 +200,10 @@ t.test(`Track.otherReleases`, t => { const {track: track3, album: album3} = stubTrackAndAlbum('track3'); const {track: track4, album: album4} = stubTrackAndAlbum('track4'); - let trackData = [track1, track2, track3, track4]; - let albumData = [album1, album2, album3, album4]; - assignWikiData({trackData, albumData}); + const {wikiData, linkWikiDataArrays, XXX_decacheWikiData} = linkAndBindWikiData({ + trackData: [track1, track2, track3, track4], + albumData: [album1, album2, album3, album4], + }); t.same(track1.otherReleases, [], `otherReleases #1: defaults to empty array`); @@ -215,19 +211,20 @@ t.test(`Track.otherReleases`, t => { track2.originalReleaseTrackByRef = 'track:track1'; track3.originalReleaseTrackByRef = 'track:track1'; track4.originalReleaseTrackByRef = 'track:track1'; - assignWikiData({trackData, albumData, XXX_DECACHE: true}); + + XXX_decacheWikiData(); t.same(track1.otherReleases, [track2, track3, track4], `otherReleases #2: otherReleases of original release are its rereleases`); - trackData = [track1, track3, track2, track4]; - assignWikiData({trackData, albumData}); + wikiData.trackData = [track1, track3, track2, track4]; + linkWikiDataArrays(); t.same(track1.otherReleases, [track3, track2, track4], `otherReleases #3: otherReleases matches trackData order`); - trackData = [track3, track2, track1, track4]; - assignWikiData({trackData, albumData}); + wikiData.trackData = [track3, track2, track1, track4]; + linkWikiDataArrays(); t.same(track2.otherReleases, [track1, track3, track4], `otherReleases #4: otherReleases of rerelease are original track then other rereleases (1/3)`); -- cgit 1.3.0-6-gf8a5 From 25beb8731d756bfa4fe6babb9e4b0a707c7823e0 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sat, 26 Aug 2023 19:22:38 -0300 Subject: data, test: misc. additions * Thing.composite.expose * Thing.composite.exposeUpdateValueOrContinue * Track.composite.withAlbumProperty * refactor: Track.color, Track.album, Track.date * refactor: Track.coverArtistContribs * test: Track.album (unit) --- test/unit/data/things/track.js | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 218353c8..08e91732 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -43,6 +43,59 @@ function stubArtistAndContribs() { return {artist, contribs, badContribs}; } +t.test(`Track.album`, t => { + t.plan(6); + + // Note: These asserts use manual albumData/trackData relationships + // to illustrate more specifically the properties which are expected to + // be relevant for this case. Other properties use the same underlying + // get-album behavior as Track.album so aren't tested as aggressively. + + const track1 = stubTrack('track1'); + const track2 = stubTrack('track2'); + const album1 = new Album(); + const album2 = new Album(); + + t.equal(track1.album, null, + `album #1: defaults to null`); + + track1.albumData = [album1, album2]; + track2.albumData = [album1, album2]; + album1.trackData = [track1, track2]; + album2.trackData = [track1, track2]; + album1.trackSections = [{tracksByRef: ['track:track1']}]; + album2.trackSections = [{tracksByRef: ['track:track2']}]; + + t.equal(track1.album, album1, + `album #2: is album when album's trackSections matches track`); + + track1.albumData = [album2, album1]; + + t.equal(track1.album, album1, + `album #3: is album when albumData is in different order`); + + track1.albumData = []; + + t.equal(track1.album, null, + `album #4: is null when track missing albumData`); + + album1.trackData = []; + track1.albumData = [album1, album2]; + + t.equal(track1.album, null, + `album #5: is null when album missing trackData`); + + album1.trackData = [track1, track2]; + album1.trackSections = [{tracksByRef: ['track:track2']}]; + + // XXX_decacheWikiData + track1.albumData = []; + track1.albumData = [album1, album2]; + + t.equal(track1.album, null, + `album #6: is null when album's trackSections don't match track`); +}); + t.test(`Track.color`, t => { t.plan(3); -- cgit 1.3.0-6-gf8a5 From 12b8040b05e81a523ef59ba583dde751206f2e1d Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sat, 26 Aug 2023 20:38:27 -0300 Subject: data, test: retain validator for Track.color --- test/unit/data/things/track.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 08e91732..dbc8434f 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -97,7 +97,7 @@ t.test(`Track.album`, t => { }); t.test(`Track.color`, t => { - t.plan(3); + t.plan(4); const {track, album} = stubTrackAndAlbum(); @@ -119,6 +119,9 @@ t.test(`Track.color`, t => { t.equal(track.color, '#123456', `color #3: is own value`); + + t.throws(() => { track.color = '#aeiouw'; }, TypeError, + `color #4: must be set to valid color`); }); t.test(`Track.coverArtDate`, t => { -- cgit 1.3.0-6-gf8a5 From e6038d8c07971447f444cf597328ca8d9863f8fd Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sat, 26 Aug 2023 21:18:43 -0300 Subject: data, test: Track.color inherits from track section --- test/unit/data/things/track.js | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index dbc8434f..9132376c 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -97,11 +97,11 @@ t.test(`Track.album`, t => { }); t.test(`Track.color`, t => { - t.plan(4); + t.plan(5); const {track, album} = stubTrackAndAlbum(); - const {XXX_decacheWikiData} = linkAndBindWikiData({ + const {wikiData, linkWikiDataArrays, XXX_decacheWikiData} = linkAndBindWikiData({ albumData: [album], trackData: [track], }); @@ -110,18 +110,42 @@ t.test(`Track.color`, t => { `color #1: defaults to null`); album.color = '#abcdef'; + album.trackSections = [{ + color: '#beeeef', + tracksByRef: [Thing.getReference(track)], + }]; XXX_decacheWikiData(); + t.equal(track.color, '#beeeef', + `color #2: inherits from track section before album`); + + // Replace the album with a completely fake one. This isn't realistic, since + // in correct data, Album.tracks depends on Albums.trackSections and so the + // track's album will always have a corresponding track section. But if that + // connection breaks for some future reason (with the album still present), + // Track.color should still inherit directly from the album. + wikiData.albumData = [ + new Proxy({ + color: '#abcdef', + tracks: [track], + trackSections: [ + {color: '#baaaad', tracks: []}, + ], + }, {getPrototypeOf: () => Album.prototype}), + ]; + + linkWikiDataArrays(); + t.equal(track.color, '#abcdef', - `color #2: inherits from album`); + `color #3: inherits from album without matching track section`); track.color = '#123456'; t.equal(track.color, '#123456', - `color #3: is own value`); + `color #4: is own value`); t.throws(() => { track.color = '#aeiouw'; }, TypeError, - `color #4: must be set to valid color`); + `color #5: must be set to valid color`); }); t.test(`Track.coverArtDate`, t => { -- cgit 1.3.0-6-gf8a5 From f874ea879e8b9555baaaa3a38ec6a00432721846 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 31 Aug 2023 11:00:07 -0300 Subject: data, test: update & test Track.originalReleaseTrack --- test/unit/data/things/track.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 9132376c..97d664ee 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -272,6 +272,31 @@ t.test(`Track.hasUniqueCoverArt`, t => { `hasUniqueCoverArt #7: is false if track's coverArtistContribsByRef resolve empty`); }); +t.only(`Track.originalReleaseTrack`, t => { + t.plan(3); + + const {track: track1, album: album1} = stubTrackAndAlbum('track1'); + const {track: track2, album: album2} = stubTrackAndAlbum('track2'); + + const {wikiData, linkWikiDataArrays, XXX_decacheWikiData} = linkAndBindWikiData({ + trackData: [track1, track2], + albumData: [album1, album2], + }); + + t.equal(track2.originalReleaseTrack, null, + `originalReleaseTrack #1: defaults to null`); + + track2.originalReleaseTrackByRef = 'track:track1'; + + t.equal(track2.originalReleaseTrack, track1, + `originalReleaseTrack #2: is resolved from originalReleaseTrackByRef`); + + track2.trackData = []; + + t.equal(track2.originalReleaseTrack, null, + `originalReleaseTrack #3: is null when track missing trackData`); +}); + t.test(`Track.otherReleases`, t => { t.plan(6); -- cgit 1.3.0-6-gf8a5 From 6f54b1211b5b07fe747ce4ebafdf917ce7851324 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 31 Aug 2023 19:22:54 -0300 Subject: test: Track.coverArtFileExtension (unit) --- test/unit/data/things/track.js | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 97d664ee..16162fb7 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -195,6 +195,66 @@ t.test(`Track.coverArtDate`, t => { `coverArtDate #6: is null if track disables unique cover artwork`); }); +t.test(`Track.coverArtFileExtension`, t => { + t.plan(8); + + const {track, album} = stubTrackAndAlbum(); + const {artist, contribs} = stubArtistAndContribs(); + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + trackData: [track], + albumData: [album], + artistData: [artist], + }); + + t.equal(track.coverArtFileExtension, null, + `coverArtFileExtension #1: defaults to null`); + + track.coverArtistContribsByRef = contribs; + + t.equal(track.coverArtFileExtension, 'jpg', + `coverArtFileExtension #2: is jpg if has cover art and not further specified`); + + track.coverArtistContribsByRef = []; + + album.coverArtistContribsByRef = contribs; + XXX_decacheWikiData(); + + t.equal(track.coverArtFileExtension, null, + `coverArtFileExtension #3: only has value for unique cover art`); + + track.coverArtistContribsByRef = contribs; + + album.trackCoverArtFileExtension = 'png'; + XXX_decacheWikiData(); + + t.equal(track.coverArtFileExtension, 'png', + `coverArtFileExtension #4: inherits album trackCoverArtFileExtension (1/2)`); + + track.coverArtFileExtension = 'gif'; + + t.equal(track.coverArtFileExtension, 'gif', + `coverArtFileExtension #5: is own value (1/2)`); + + track.coverArtistContribsByRef = []; + + album.trackCoverArtistContribsByRef = contribs; + XXX_decacheWikiData(); + + t.equal(track.coverArtFileExtension, 'gif', + `coverArtFileExtension #6: is own value (2/2)`); + + track.coverArtFileExtension = null; + + t.equal(track.coverArtFileExtension, 'png', + `coverArtFileExtension #7: inherits album trackCoverArtFileExtension (2/2)`); + + track.disableUniqueCoverArt = true; + + t.equal(track.coverArtFileExtension, null, + `coverArtFileExtension #8: is null if track disables unique cover art`); +}); + t.test(`Track.date`, t => { t.plan(3); -- cgit 1.3.0-6-gf8a5 From 6325a70991396412eb8e93cee5f17bdb2859ae9d Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 31 Aug 2023 19:52:42 -0300 Subject: data, test: update & test misc. Track reverse reference lists * update & test Track.referencedByTracks * update & test Track.sampledByTracks * update & test Track.featuredInFlashes * update Thing.common.reverseReferenceList * add Thing.composite.withReverseReferenceList * add Track.composite.trackReverseReferenceList --- test/unit/data/things/track.js | 119 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 5 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 16162fb7..8939d964 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -6,6 +6,8 @@ import thingConstructors from '#things'; const { Album, Artist, + Flash, + FlashAct, Thing, Track, } = thingConstructors; @@ -43,6 +45,16 @@ function stubArtistAndContribs() { return {artist, contribs, badContribs}; } +function stubFlashAndAct(directory = 'zam') { + const flash = new Flash(); + flash.directory = directory; + + const flashAct = new FlashAct(); + flashAct.flashesByRef = [Thing.getReference(flash)]; + + return {flash, flashAct}; +} + t.test(`Track.album`, t => { t.plan(6); @@ -155,9 +167,9 @@ t.test(`Track.coverArtDate`, t => { const {artist, contribs} = stubArtistAndContribs(); const {XXX_decacheWikiData} = linkAndBindWikiData({ - trackData: [track], albumData: [album], artistData: [artist], + trackData: [track], }); track.coverArtistContribsByRef = contribs; @@ -202,9 +214,9 @@ t.test(`Track.coverArtFileExtension`, t => { const {artist, contribs} = stubArtistAndContribs(); const {XXX_decacheWikiData} = linkAndBindWikiData({ - trackData: [track], albumData: [album], artistData: [artist], + trackData: [track], }); t.equal(track.coverArtFileExtension, null, @@ -280,6 +292,32 @@ t.test(`Track.date`, t => { `date #3: is own dateFirstReleased`); }); +t.test(`Track.featuredInFlashes`, t => { + t.plan(2); + + const {track, album} = stubTrackAndAlbum('track1'); + + const {flash: flash1, flashAct: flashAct1} = stubFlashAndAct('flash1'); + const {flash: flash2, flashAct: flashAct2} = stubFlashAndAct('flash2'); + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album], + trackData: [track], + flashData: [flash1, flash2], + flashActData: [flashAct1, flashAct2], + }); + + t.same(track.featuredInFlashes, [], + `featuredInFlashes #1: defaults to empty array`); + + flash1.featuredTracksByRef = ['track:track1']; + flash2.featuredTracksByRef = ['track:track1']; + XXX_decacheWikiData(); + + t.same(track.featuredInFlashes, [flash1, flash2], + `featuredInFlashes #2: matches flashes' featuredTracks`); +}); + t.test(`Track.hasUniqueCoverArt`, t => { t.plan(7); @@ -339,8 +377,8 @@ t.only(`Track.originalReleaseTrack`, t => { const {track: track2, album: album2} = stubTrackAndAlbum('track2'); const {wikiData, linkWikiDataArrays, XXX_decacheWikiData} = linkAndBindWikiData({ - trackData: [track1, track2], albumData: [album1, album2], + trackData: [track1, track2], }); t.equal(track2.originalReleaseTrack, null, @@ -366,8 +404,8 @@ t.test(`Track.otherReleases`, t => { const {track: track4, album: album4} = stubTrackAndAlbum('track4'); const {wikiData, linkWikiDataArrays, XXX_decacheWikiData} = linkAndBindWikiData({ - trackData: [track1, track2, track3, track4], albumData: [album1, album2, album3, album4], + trackData: [track1, track2, track3, track4], }); t.same(track1.otherReleases, [], @@ -376,7 +414,6 @@ t.test(`Track.otherReleases`, t => { track2.originalReleaseTrackByRef = 'track:track1'; track3.originalReleaseTrackByRef = 'track:track1'; track4.originalReleaseTrackByRef = 'track:track1'; - XXX_decacheWikiData(); t.same(track1.otherReleases, [track2, track3, track4], @@ -400,3 +437,75 @@ t.test(`Track.otherReleases`, t => { t.same(track4.otherReleases, [track1, track3, track2], `otherReleases #6: otherReleases of rerelease are original track then other rereleases (1/3)`); }); + +t.test(`Track.referencedByTracks`, t => { + t.plan(4); + + const {track: track1, album: album1} = stubTrackAndAlbum('track1'); + const {track: track2, album: album2} = stubTrackAndAlbum('track2'); + const {track: track3, album: album3} = stubTrackAndAlbum('track3'); + const {track: track4, album: album4} = stubTrackAndAlbum('track4'); + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album1, album2, album3, album4], + trackData: [track1, track2, track3, track4], + }); + + t.same(track1.referencedByTracks, [], + `referencedByTracks #1: defaults to empty array`); + + track2.referencedTracksByRef = ['track:track1']; + track3.referencedTracksByRef = ['track:track1']; + XXX_decacheWikiData(); + + t.same(track1.referencedByTracks, [track2, track3], + `referencedByTracks #2: matches tracks' referencedTracks`); + + track4.sampledTracksByRef = ['track:track1']; + XXX_decacheWikiData(); + + t.same(track1.referencedByTracks, [track2, track3], + `referencedByTracks #3: doesn't match tracks' sampledTracks`); + + track3.originalReleaseTrackByRef = 'track:track2'; + XXX_decacheWikiData(); + + t.same(track1.referencedByTracks, [track2], + `referencedByTracks #4: doesn't include re-releases`); +}); + +t.test(`Track.sampledByTracks`, t => { + t.plan(4); + + const {track: track1, album: album1} = stubTrackAndAlbum('track1'); + const {track: track2, album: album2} = stubTrackAndAlbum('track2'); + const {track: track3, album: album3} = stubTrackAndAlbum('track3'); + const {track: track4, album: album4} = stubTrackAndAlbum('track4'); + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album1, album2, album3, album4], + trackData: [track1, track2, track3, track4], + }); + + t.same(track1.sampledByTracks, [], + `sampledByTracks #1: defaults to empty array`); + + track2.sampledTracksByRef = ['track:track1']; + track3.sampledTracksByRef = ['track:track1']; + XXX_decacheWikiData(); + + t.same(track1.sampledByTracks, [track2, track3], + `sampledByTracks #2: matches tracks' sampledTracks`); + + track4.referencedTracksByRef = ['track:track1']; + XXX_decacheWikiData(); + + t.same(track1.sampledByTracks, [track2, track3], + `sampledByTracks #3: doesn't match tracks' referencedTracks`); + + track3.originalReleaseTrackByRef = 'track:track2'; + XXX_decacheWikiData(); + + t.same(track1.sampledByTracks, [track2], + `sampledByTracks #4: doesn't include re-releases`); +}); -- cgit 1.3.0-6-gf8a5 From bbccaf51222cb4bed73466164496f5bc1030292c Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 7 Sep 2023 17:30:54 -0300 Subject: data: roll paired "byRef" and "dynamic" properties into one --- test/unit/data/things/track.js | 76 +++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 38 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 8939d964..bb8d7079 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -16,8 +16,8 @@ function stubAlbum(tracks, directory = 'bar') { const album = new Album(); album.directory = directory; - const tracksByRef = tracks.map(t => Thing.getReference(t)); - album.trackSections = [{tracksByRef}]; + const trackRefs = tracks.map(t => Thing.getReference(t)); + album.trackSections = [{tracks: trackRefs}]; return album; } @@ -50,7 +50,7 @@ function stubFlashAndAct(directory = 'zam') { flash.directory = directory; const flashAct = new FlashAct(); - flashAct.flashesByRef = [Thing.getReference(flash)]; + flashAct.flashes = [Thing.getReference(flash)]; return {flash, flashAct}; } @@ -75,8 +75,8 @@ t.test(`Track.album`, t => { track2.albumData = [album1, album2]; album1.trackData = [track1, track2]; album2.trackData = [track1, track2]; - album1.trackSections = [{tracksByRef: ['track:track1']}]; - album2.trackSections = [{tracksByRef: ['track:track2']}]; + album1.trackSections = [{tracks: ['track:track1']}]; + album2.trackSections = [{tracks: ['track:track2']}]; t.equal(track1.album, album1, `album #2: is album when album's trackSections matches track`); @@ -98,7 +98,7 @@ t.test(`Track.album`, t => { `album #5: is null when album missing trackData`); album1.trackData = [track1, track2]; - album1.trackSections = [{tracksByRef: ['track:track2']}]; + album1.trackSections = [{tracks: ['track:track2']}]; // XXX_decacheWikiData track1.albumData = []; @@ -124,7 +124,7 @@ t.test(`Track.color`, t => { album.color = '#abcdef'; album.trackSections = [{ color: '#beeeef', - tracksByRef: [Thing.getReference(track)], + tracks: [Thing.getReference(track)], }]; XXX_decacheWikiData(); @@ -172,7 +172,7 @@ t.test(`Track.coverArtDate`, t => { trackData: [track], }); - track.coverArtistContribsByRef = contribs; + track.coverArtistContribs = contribs; t.equal(track.coverArtDate, null, `coverArtDate #1: defaults to null`); @@ -189,12 +189,12 @@ t.test(`Track.coverArtDate`, t => { t.same(track.coverArtDate, new Date('2009-09-09'), `coverArtDate #3: is own value`); - track.coverArtistContribsByRef = []; + track.coverArtistContribs = []; t.equal(track.coverArtDate, null, `coverArtDate #4: is null if track is missing coverArtists`); - album.trackCoverArtistContribsByRef = contribs; + album.trackCoverArtistContribs = contribs; XXX_decacheWikiData(); @@ -222,20 +222,20 @@ t.test(`Track.coverArtFileExtension`, t => { t.equal(track.coverArtFileExtension, null, `coverArtFileExtension #1: defaults to null`); - track.coverArtistContribsByRef = contribs; + track.coverArtistContribs = contribs; t.equal(track.coverArtFileExtension, 'jpg', `coverArtFileExtension #2: is jpg if has cover art and not further specified`); - track.coverArtistContribsByRef = []; + track.coverArtistContribs = []; - album.coverArtistContribsByRef = contribs; + album.coverArtistContribs = contribs; XXX_decacheWikiData(); t.equal(track.coverArtFileExtension, null, `coverArtFileExtension #3: only has value for unique cover art`); - track.coverArtistContribsByRef = contribs; + track.coverArtistContribs = contribs; album.trackCoverArtFileExtension = 'png'; XXX_decacheWikiData(); @@ -248,9 +248,9 @@ t.test(`Track.coverArtFileExtension`, t => { t.equal(track.coverArtFileExtension, 'gif', `coverArtFileExtension #5: is own value (1/2)`); - track.coverArtistContribsByRef = []; + track.coverArtistContribs = []; - album.trackCoverArtistContribsByRef = contribs; + album.trackCoverArtistContribs = contribs; XXX_decacheWikiData(); t.equal(track.coverArtFileExtension, 'gif', @@ -310,8 +310,8 @@ t.test(`Track.featuredInFlashes`, t => { t.same(track.featuredInFlashes, [], `featuredInFlashes #1: defaults to empty array`); - flash1.featuredTracksByRef = ['track:track1']; - flash2.featuredTracksByRef = ['track:track1']; + flash1.featuredTracks = ['track:track1']; + flash2.featuredTracks = ['track:track1']; XXX_decacheWikiData(); t.same(track.featuredInFlashes, [flash1, flash2], @@ -333,7 +333,7 @@ t.test(`Track.hasUniqueCoverArt`, t => { t.equal(track.hasUniqueCoverArt, false, `hasUniqueCoverArt #1: defaults to false`); - album.trackCoverArtistContribsByRef = contribs; + album.trackCoverArtistContribs = contribs; XXX_decacheWikiData(); t.equal(track.hasUniqueCoverArt, true, @@ -346,13 +346,13 @@ t.test(`Track.hasUniqueCoverArt`, t => { track.disableUniqueCoverArt = false; - album.trackCoverArtistContribsByRef = badContribs; + album.trackCoverArtistContribs = badContribs; XXX_decacheWikiData(); t.equal(track.hasUniqueCoverArt, false, - `hasUniqueCoverArt #4: is false if album's trackCoverArtistContribsByRef resolve empty`); + `hasUniqueCoverArt #4: is false if album's trackCoverArtistContribs resolve empty`); - track.coverArtistContribsByRef = contribs; + track.coverArtistContribs = contribs; t.equal(track.hasUniqueCoverArt, true, `hasUniqueCoverArt #5: is true if track specifies coverArtistContribs`); @@ -364,10 +364,10 @@ t.test(`Track.hasUniqueCoverArt`, t => { track.disableUniqueCoverArt = false; - track.coverArtistContribsByRef = badContribs; + track.coverArtistContribs = badContribs; t.equal(track.hasUniqueCoverArt, false, - `hasUniqueCoverArt #7: is false if track's coverArtistContribsByRef resolve empty`); + `hasUniqueCoverArt #7: is false if track's coverArtistContribs resolve empty`); }); t.only(`Track.originalReleaseTrack`, t => { @@ -384,10 +384,10 @@ t.only(`Track.originalReleaseTrack`, t => { t.equal(track2.originalReleaseTrack, null, `originalReleaseTrack #1: defaults to null`); - track2.originalReleaseTrackByRef = 'track:track1'; + track2.originalReleaseTrack = 'track:track1'; t.equal(track2.originalReleaseTrack, track1, - `originalReleaseTrack #2: is resolved from originalReleaseTrackByRef`); + `originalReleaseTrack #2: is resolved from own value`); track2.trackData = []; @@ -411,9 +411,9 @@ t.test(`Track.otherReleases`, t => { t.same(track1.otherReleases, [], `otherReleases #1: defaults to empty array`); - track2.originalReleaseTrackByRef = 'track:track1'; - track3.originalReleaseTrackByRef = 'track:track1'; - track4.originalReleaseTrackByRef = 'track:track1'; + track2.originalReleaseTrack = 'track:track1'; + track3.originalReleaseTrack = 'track:track1'; + track4.originalReleaseTrack = 'track:track1'; XXX_decacheWikiData(); t.same(track1.otherReleases, [track2, track3, track4], @@ -435,7 +435,7 @@ t.test(`Track.otherReleases`, t => { `otherReleases #5: otherReleases of rerelease are original track then other rereleases (2/3)`); t.same(track4.otherReleases, [track1, track3, track2], - `otherReleases #6: otherReleases of rerelease are original track then other rereleases (1/3)`); + `otherReleases #6: otherReleases of rerelease are original track then other rereleases (3/3)`); }); t.test(`Track.referencedByTracks`, t => { @@ -454,20 +454,20 @@ t.test(`Track.referencedByTracks`, t => { t.same(track1.referencedByTracks, [], `referencedByTracks #1: defaults to empty array`); - track2.referencedTracksByRef = ['track:track1']; - track3.referencedTracksByRef = ['track:track1']; + track2.referencedTracks = ['track:track1']; + track3.referencedTracks = ['track:track1']; XXX_decacheWikiData(); t.same(track1.referencedByTracks, [track2, track3], `referencedByTracks #2: matches tracks' referencedTracks`); - track4.sampledTracksByRef = ['track:track1']; + track4.sampledTracks = ['track:track1']; XXX_decacheWikiData(); t.same(track1.referencedByTracks, [track2, track3], `referencedByTracks #3: doesn't match tracks' sampledTracks`); - track3.originalReleaseTrackByRef = 'track:track2'; + track3.originalReleaseTrack = 'track:track2'; XXX_decacheWikiData(); t.same(track1.referencedByTracks, [track2], @@ -490,20 +490,20 @@ t.test(`Track.sampledByTracks`, t => { t.same(track1.sampledByTracks, [], `sampledByTracks #1: defaults to empty array`); - track2.sampledTracksByRef = ['track:track1']; - track3.sampledTracksByRef = ['track:track1']; + track2.sampledTracks = ['track:track1']; + track3.sampledTracks = ['track:track1']; XXX_decacheWikiData(); t.same(track1.sampledByTracks, [track2, track3], `sampledByTracks #2: matches tracks' sampledTracks`); - track4.referencedTracksByRef = ['track:track1']; + track4.referencedTracks = ['track:track1']; XXX_decacheWikiData(); t.same(track1.sampledByTracks, [track2, track3], `sampledByTracks #3: doesn't match tracks' referencedTracks`); - track3.originalReleaseTrackByRef = 'track:track2'; + track3.originalReleaseTrack = 'track:track2'; XXX_decacheWikiData(); t.same(track1.sampledByTracks, [track2], -- cgit 1.3.0-6-gf8a5 From 7132dc6df4a2aabcd0c6f445a91bbd988e64623d Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 8 Sep 2023 09:05:24 -0300 Subject: test: Track.coverArtDate: test contribs lists resolving empty --- test/unit/data/things/track.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index bb8d7079..6597c2f9 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -161,10 +161,10 @@ t.test(`Track.color`, t => { }); t.test(`Track.coverArtDate`, t => { - t.plan(6); + t.plan(8); const {track, album} = stubTrackAndAlbum(); - const {artist, contribs} = stubArtistAndContribs(); + const {artist, contribs, badContribs} = stubArtistAndContribs(); const {XXX_decacheWikiData} = linkAndBindWikiData({ albumData: [album], @@ -192,19 +192,32 @@ t.test(`Track.coverArtDate`, t => { track.coverArtistContribs = []; t.equal(track.coverArtDate, null, - `coverArtDate #4: is null if track is missing coverArtists`); + `coverArtDate #4: is null if track coverArtistContribs empty`); album.trackCoverArtistContribs = contribs; XXX_decacheWikiData(); t.same(track.coverArtDate, new Date('2009-09-09'), - `coverArtDate #5: is not null if album specifies trackCoverArtistContribs`); + `coverArtDate #5: is not null if album trackCoverArtistContribs specified`); + + album.trackCoverArtistContribs = badContribs; + + XXX_decacheWikiData(); + t.equal(track.coverArtDate, null, + `coverArtDate #6: is null if album trackCoverArtistContribs resolves empty`); + + track.coverArtistContribs = badContribs; + + t.equal(track.coverArtDate, null, + `coverArtDate #7: is null if track coverArtistContribs resolves empty`); + + track.coverArtistContribs = contribs; track.disableUniqueCoverArt = true; t.equal(track.coverArtDate, null, - `coverArtDate #6: is null if track disables unique cover artwork`); + `coverArtDate #8: is null if track disables unique cover artwork`); }); t.test(`Track.coverArtFileExtension`, t => { -- cgit 1.3.0-6-gf8a5 From f4305e5ab0a64a648f39c647b817a4ba09848f11 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 8 Sep 2023 12:34:48 -0300 Subject: test: Album.trackSections (unit) --- test/unit/data/things/track.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 6597c2f9..8aecf789 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -383,7 +383,7 @@ t.test(`Track.hasUniqueCoverArt`, t => { `hasUniqueCoverArt #7: is false if track's coverArtistContribs resolve empty`); }); -t.only(`Track.originalReleaseTrack`, t => { +t.test(`Track.originalReleaseTrack`, t => { t.plan(3); const {track: track1, album: album1} = stubTrackAndAlbum('track1'); -- cgit 1.3.0-6-gf8a5 From a8718915ffcb9b3977ccab479817c8bd8d9b20c6 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 8 Sep 2023 15:39:40 -0300 Subject: test: Track.commentatorArtists (unit) --- test/unit/data/things/track.js | 68 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 8aecf789..5e7fd829 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -32,14 +32,20 @@ function stubTrack(directory = 'foo') { function stubTrackAndAlbum(trackDirectory = 'foo', albumDirectory = 'bar') { const track = stubTrack(trackDirectory); const album = stubAlbum([track], albumDirectory); + return {track, album}; } -function stubArtistAndContribs() { +function stubArtist(artistName = `Test Artist`) { const artist = new Artist(); - artist.name = `Test Artist`; + artist.name = artistName; + + return artist; +} - const contribs = [{who: `Test Artist`, what: null}]; +function stubArtistAndContribs(artistName = `Test Artist`) { + const artist = stubArtist(artistName); + const contribs = [{who: artistName, what: null}]; const badContribs = [{who: `Figment of Your Imagination`, what: null}]; return {artist, contribs, badContribs}; @@ -160,6 +166,62 @@ t.test(`Track.color`, t => { `color #5: must be set to valid color`); }); +t.test(`Track.commentatorArtists`, t => { + t.plan(6); + + const track = new Track(); + const artist1 = stubArtist(`SnooPING`); + const artist2 = stubArtist(`ASUsual`); + const artist3 = stubArtist(`Icy`); + + linkAndBindWikiData({ + trackData: [track], + artistData: [artist1, artist2, artist3], + }); + + track.commentary = + `SnooPING:\n` + + `Wow.\n`; + + t.same(track.commentatorArtists, [artist1], + `Track.commentatorArtists #1: works with one commentator`); + + track.commentary += + `ASUsual:\n` + + `Yes!\n`; + + t.same(track.commentatorArtists, [artist1, artist2], + `Track.commentatorArtists #2: works with two commentators`); + + track.commentary += + `Icy:\n` + + `Incredible.\n`; + + t.same(track.commentatorArtists, [artist1, artist2, artist3], + `Track.commentatorArtists #3: works with boldface name`); + + track.commentary = + `Icy: (project manager)\n` + + `Very good track.\n`; + + t.same(track.commentatorArtists, [artist3], + `Track.commentatorArtists #4: works with parenthical accent`); + + track.commentary += + `SNooPING ASUsual Icy:\n` + + `WITH ALL THREE POWERS COMBINED...`; + + t.same(track.commentatorArtists, [artist3], + `Track.commentatorArtists #5: ignores artist names not found`); + + track.commentary += + `Icy:\n` + + `I'm back!\n`; + + t.same(track.commentatorArtists, [artist3], + `Track.commentatorArtists #6: ignores duplicate artist`); +}); + t.test(`Track.coverArtDate`, t => { t.plan(8); -- cgit 1.3.0-6-gf8a5 From b5cfc2a793f22da60606a4dd7387fcf3d3163843 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Mon, 25 Sep 2023 14:23:23 -0300 Subject: data: misc. improvements for input validation & infrastructure --- test/unit/data/things/track.js | 1 + 1 file changed, 1 insertion(+) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 5e7fd829..f68510c6 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -1,5 +1,6 @@ import t from 'tap'; +import {showAggregate} from '#sugar'; import {linkAndBindWikiData} from '#test-lib'; import thingConstructors from '#things'; -- cgit 1.3.0-6-gf8a5 From b37d81240307f3e38faaa781c3932feff53e9aac Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 6 Oct 2023 12:06:15 -0300 Subject: data, test: fix track contribs not inheriting properly --- test/unit/data/things/track.js | 95 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index f68510c6..06a4041d 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -115,6 +115,51 @@ t.test(`Track.album`, t => { `album #6: is null when album's trackSections don't match track`); }); +t.test(`Track.artistContribs`, t => { + t.plan(4); + + const {track, album} = stubTrackAndAlbum(); + const artist1 = stubArtist(`Artist 1`); + const artist2 = stubArtist(`Artist 2`); + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album], + artistData: [artist1, artist2], + trackData: [track], + }); + + t.same(track.artistContribs, [], + `artistContribs #1: defaults to empty array`); + + album.artistContribs = [ + {who: `Artist 1`, what: `composition`}, + {who: `Artist 2`, what: null}, + ]; + + XXX_decacheWikiData(); + + t.same(track.artistContribs, + [{who: artist1, what: `composition`}, {who: artist2, what: null}], + `artistContribs #2: inherits album artistContribs`); + + track.artistContribs = [ + {who: `Artist 1`, what: `arrangement`}, + ]; + + t.same(track.artistContribs, [{who: artist1, what: `arrangement`}], + `artistContribs #3: resolves from own value`); + + track.artistContribs = [ + {who: `Artist 1`, what: `snooping`}, + {who: `Artist 413`, what: `as`}, + {who: `Artist 2`, what: `usual`}, + ]; + + t.same(track.artistContribs, + [{who: artist1, what: `snooping`}, {who: artist2, what: `usual`}], + `artistContribs #4: filters out names without matches`); +}); + t.test(`Track.color`, t => { t.plan(5); @@ -223,6 +268,56 @@ t.test(`Track.commentatorArtists`, t => { `Track.commentatorArtists #6: ignores duplicate artist`); }); +t.test(`Track.coverArtistContribs`, t => { + t.plan(5); + + const {track, album} = stubTrackAndAlbum(); + const artist1 = stubArtist(`Artist 1`); + const artist2 = stubArtist(`Artist 2`); + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [album], + artistData: [artist1, artist2], + trackData: [track], + }); + + t.same(track.coverArtistContribs, [], + `coverArtistContribs #1: defaults to empty array`); + + album.trackCoverArtistContribs = [ + {who: `Artist 1`, what: `lines`}, + {who: `Artist 2`, what: null}, + ]; + + XXX_decacheWikiData(); + + t.same(track.coverArtistContribs, + [{who: artist1, what: `lines`}, {who: artist2, what: null}], + `coverArtistContribs #2: inherits album trackCoverArtistContribs`); + + track.coverArtistContribs = [ + {who: `Artist 1`, what: `collage`}, + ]; + + t.same(track.coverArtistContribs, [{who: artist1, what: `collage`}], + `coverArtistContribs #3: resolves from own value`); + + track.coverArtistContribs = [ + {who: `Artist 1`, what: `snooping`}, + {who: `Artist 413`, what: `as`}, + {who: `Artist 2`, what: `usual`}, + ]; + + t.same(track.coverArtistContribs, + [{who: artist1, what: `snooping`}, {who: artist2, what: `usual`}], + `coverArtistContribs #4: filters out names without matches`); + + track.disableUniqueCoverArt = true; + + t.same(track.coverArtistContribs, [], + `coverArtistContribs #5: is empty if track disables unique cover artwork`); +}); + t.test(`Track.coverArtDate`, t => { t.plan(8); -- cgit 1.3.0-6-gf8a5 From 645a127bef38c3a7a2ef1b94d23b25fb7bdc4191 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 18 Oct 2023 14:26:49 -0300 Subject: data, test: wrap property value errors with proper class & cause --- test/unit/data/things/track.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'test/unit/data/things/track.js') diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index 06a4041d..806efbf1 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -208,7 +208,8 @@ t.test(`Track.color`, t => { t.equal(track.color, '#123456', `color #4: is own value`); - t.throws(() => { track.color = '#aeiouw'; }, TypeError, + t.throws(() => { track.color = '#aeiouw'; }, + {cause: TypeError}, `color #5: must be set to valid color`); }); -- cgit 1.3.0-6-gf8a5