diff options
Diffstat (limited to 'test/unit/data/things')
-rw-r--r-- | test/unit/data/things/album.js | 185 | ||||
-rw-r--r-- | test/unit/data/things/art-tag.js | 18 | ||||
-rw-r--r-- | test/unit/data/things/track.js | 157 | ||||
-rw-r--r-- | test/unit/data/things/validators.js | 16 |
4 files changed, 268 insertions, 108 deletions
diff --git a/test/unit/data/things/album.js b/test/unit/data/things/album.js index 46ea83b..d28ab70 100644 --- a/test/unit/data/things/album.js +++ b/test/unit/data/things/album.js @@ -8,6 +8,7 @@ const { ArtTag, Artist, Track, + TrackSection, } = thingConstructors; function stubArtTag(tagName = `Test Art Tag`) { @@ -21,8 +22,8 @@ function stubArtistAndContribs() { const artist = new Artist(); artist.name = `Test Artist`; - const contribs = [{who: `Test Artist`, what: null}]; - const badContribs = [{who: `Figment of Your Imagination`, what: null}]; + const contribs = [{artist: `Test Artist`, annotation: null}]; + const badContribs = [{artist: `Figment of Your Imagination`, annotation: null}]; return {artist, contribs, badContribs}; } @@ -34,6 +35,15 @@ function stubTrack(directory = 'foo') { return track; } +function stubTrackSection(album, tracks, directory = 'baz') { + const trackSection = new TrackSection(); + trackSection.unqualifiedDirectory = directory; + trackSection.tracks = tracks.map(t => Thing.getReference(t)); + trackSection.ownTrackData = tracks; + trackSection.ownAlbumData = [album]; + return trackSection; +} + t.test(`Album.artTags`, t => { t.plan(3); @@ -237,78 +247,115 @@ t.test(`Album.tracks`, t => { t.plan(5); const album = new Album(); + album.directory = 'foo'; + const track1 = stubTrack('track1'); const track2 = stubTrack('track2'); const track3 = stubTrack('track3'); const tracks = [track1, track2, track3]; - album.ownTrackData = tracks; + const section1 = stubTrackSection(album, [], 'section1'); + const section2 = stubTrackSection(album, [], 'section2'); + const section3 = stubTrackSection(album, [], 'section3'); + const section4 = stubTrackSection(album, [], 'section4'); + const section5 = stubTrackSection(album, [], 'section5'); + const section6 = stubTrackSection(album, [], 'section6'); + const sections = [section1, section2, section3, section4, section5, section6]; for (const track of tracks) { track.albumData = [album]; } + for (const section of sections) { + section.ownAlbumData = [album]; + } + t.same(album.tracks, [], `Album.tracks #1: defaults to empty array`); - album.trackSections = [ - {tracks: ['track:track1', 'track:track2', 'track:track3']}, - ]; + section1.tracks = ['track:track1', 'track:track2', 'track:track3']; + section1.ownTrackData = [track1, track2, track3]; + + album.trackSections = [section1]; t.same(album.tracks, [track1, track2, track3], `Album.tracks #2: pulls tracks from one track section`); - album.trackSections = [ - {tracks: ['track:track1']}, - {tracks: ['track:track2', 'track:track3']}, - ]; + section1.tracks = ['track:track1']; + section2.tracks = ['track:track2', 'track:track3']; + + section1.ownTrackData = [track1]; + section2.ownTrackData = [track2, track3]; + + album.trackSections = [section1, section2]; t.same(album.tracks, [track1, track2, track3], `Album.tracks #3: pulls tracks from multiple track sections`); - album.trackSections = [ - {tracks: ['track:track1', 'track:does-not-exist']}, - {tracks: ['track:this-one-neither', 'track:track2']}, - {tracks: ['track:effectively-empty-section']}, - {tracks: ['track:track3']}, - ]; + section1.tracks = ['track:track1', 'track:does-not-exist']; + section2.tracks = ['track:this-one-neither', 'track:track2']; + section3.tracks = ['track:effectively-empty-section']; + section4.tracks = ['track:track3']; + + section1.ownTrackData = [track1]; + section2.ownTrackData = [track2]; + section3.ownTrackData = []; + section4.ownTrackData = [track3]; + + album.trackSections = [section1, section2, section3, section4]; t.same(album.tracks, [track1, track2, track3], `Album.tracks #4: filters out references without matches`); - album.trackSections = [ - {tracks: ['track:track1']}, - {}, - {tracks: ['track:track2']}, - {}, - {}, - {tracks: ['track:track3']}, - ]; + section1.tracks = ['track:track1']; + section2.tracks = []; + section3.tracks = ['track:track2']; + section4.tracks = []; + section5.tracks = []; + section6.tracks = ['track:track3']; + + section1.ownTrackData = [track1]; + section2.ownTrackData = []; + section3.ownTrackData = [track2]; + section4.ownTrackData = []; + section5.ownTrackData = []; + section6.ownTrackData = [track3]; + + album.trackSections = [section1, section2, section3, section4, section5, section6]; t.same(album.tracks, [track1, track2, track3], - `Album.tracks #5: skips missing tracks property`); + `Album.tracks #5: skips empty track sections`); }); t.test(`Album.trackSections`, t => { t.plan(7); const album = new Album(); + const track1 = stubTrack('track1'); const track2 = stubTrack('track2'); const track3 = stubTrack('track3'); const track4 = stubTrack('track4'); const tracks = [track1, track2, track3, track4]; - album.ownTrackData = tracks; + const section1 = stubTrackSection(album, [], 'section1'); + const section2 = stubTrackSection(album, [], 'section2'); + const section3 = stubTrackSection(album, [], 'section3'); + const section4 = stubTrackSection(album, [], 'section4'); + const section5 = stubTrackSection(album, [], 'section5'); + const sections = [section1, section2, section3, section4, section5]; for (const track of tracks) { track.albumData = [album]; } - album.trackSections = [ - {tracks: ['track:track1', 'track:track2']}, - {tracks: ['track:track3', 'track:track4']}, - ]; + section1.tracks = ['track:track1', 'track:track2']; + section2.tracks = ['track:track3', 'track:track4']; + + section1.ownTrackData = [track1, track2]; + section2.ownTrackData = [track3, track4]; + + album.trackSections = [section1, section2]; t.match(album.trackSections, [ {tracks: [track1, track2]}, @@ -320,11 +367,18 @@ t.test(`Album.trackSections`, t => { {tracks: [track3, track4], startIndex: 2}, ], `Album.trackSections #2: exposes startIndex`); - album.trackSections = [ - {name: 'First section', tracks: ['track:track1']}, - {name: 'Second section', tracks: ['track:track2']}, - {tracks: ['track:track3']}, - ]; + section1.tracks = ['track:track1']; + section2.tracks = ['track:track2']; + section3.tracks = ['track:track3']; + + section1.ownTrackData = [track1]; + section2.ownTrackData = [track2]; + section3.ownTrackData = [track3]; + + section1.name = 'First section'; + section2.name = 'Second section'; + + album.trackSections = [section1, section2, section3]; t.match(album.trackSections, [ {name: 'First section', tracks: [track1]}, @@ -334,11 +388,11 @@ t.test(`Album.trackSections`, t => { album.color = '#123456'; - album.trackSections = [ - {tracks: ['track:track1'], color: null}, - {tracks: ['track:track2'], color: '#abcdef'}, - {tracks: ['track:track3'], color: null}, - ]; + section2.color = '#abcdef'; + + // XXX_decacheWikiData + album.trackSections = []; + album.trackSections = [section1, section2, section3]; t.match(album.trackSections, [ {tracks: [track1], color: '#123456'}, @@ -346,11 +400,11 @@ t.test(`Album.trackSections`, t => { {tracks: [track3], color: '#123456'}, ], `Album.trackSections #4: exposes color, inherited from album`); - album.trackSections = [ - {tracks: ['track:track1'], dateOriginallyReleased: null}, - {tracks: ['track:track2'], dateOriginallyReleased: new Date('2009-04-11')}, - {tracks: ['track:track3'], dateOriginallyReleased: null}, - ]; + section2.dateOriginallyReleased = new Date('2009-04-11'); + + // XXX_decacheWikiData + album.trackSections = []; + album.trackSections = [section1, section2, section3]; t.match(album.trackSections, [ {tracks: [track1], dateOriginallyReleased: null}, @@ -358,11 +412,12 @@ t.test(`Album.trackSections`, t => { {tracks: [track3], dateOriginallyReleased: null}, ], `Album.trackSections #5: exposes dateOriginallyReleased, if present`); - album.trackSections = [ - {tracks: ['track:track1'], isDefaultTrackSection: true}, - {tracks: ['track:track2'], isDefaultTrackSection: false}, - {tracks: ['track:track3'], isDefaultTrackSection: null}, - ]; + section1.isDefaultTrackSection = true; + section2.isDefaultTrackSection = false; + + // XXX_decacheWikiData + album.trackSections = []; + album.trackSections = [section1, section2, section3]; t.match(album.trackSections, [ {tracks: [track1], isDefaultTrackSection: true}, @@ -370,19 +425,33 @@ t.test(`Album.trackSections`, t => { {tracks: [track3], isDefaultTrackSection: false}, ], `Album.trackSections #6: exposes isDefaultTrackSection, defaults to false`); - album.trackSections = [ - {tracks: ['track:track1', 'track:track2', 'track:snooping'], color: '#112233'}, - {tracks: ['track:track3', 'track:as-usual'], color: '#334455'}, - {tracks: [], color: '#bbbbba'}, - {tracks: ['track:icy', 'track:chilly', 'track:frigid'], color: '#556677'}, - {tracks: ['track:track4'], color: '#778899'}, - ]; + section1.tracks = ['track:track1', 'track:track2', 'track:snooping']; + section2.tracks = ['track:track3', 'track:as-usual']; + section3.tracks = []; + section4.tracks = ['track:icy', 'track:chilly', 'track:frigid']; + section5.tracks = ['track:track4']; + + section1.ownTrackData = [track1, track2]; + section2.ownTrackData = [track3]; + section3.ownTrackData = []; + section4.ownTrackData = []; + section5.ownTrackData = [track4]; + + section1.color = '#112233'; + section2.color = '#334455'; + section3.color = '#bbbbba'; + section4.color = '#556677'; + section5.color = '#778899'; + + album.trackSections = [section1, section2, section3, section4, section5]; t.match(album.trackSections, [ {tracks: [track1, track2], color: '#112233'}, {tracks: [track3], color: '#334455'}, + {tracks: [], color: '#bbbbba'}, + {tracks: [], color: '#556677'}, {tracks: [track4], color: '#778899'}, - ], `Album.trackSections #7: filters out references without matches & empty sections`); + ], `Album.trackSections #7: filters out references without matches, keeps empty sections`); }); t.test(`Album.wallpaperFileExtension`, t => { diff --git a/test/unit/data/things/art-tag.js b/test/unit/data/things/art-tag.js index 561c93e..427b357 100644 --- a/test/unit/data/things/art-tag.js +++ b/test/unit/data/things/art-tag.js @@ -8,18 +8,28 @@ const { Artist, ArtTag, Track, + trackSection, } = thingConstructors; function stubAlbum(tracks, directory = 'bar') { const album = new Album(); album.directory = directory; - const trackRefs = tracks.map(t => Thing.getReference(t)); - album.trackSections = [{tracks: trackRefs}]; + const trackSection = stubTrackSection(album, tracks); + album.trackSections = [trackSection]; return album; } +function stubTrackSection(album, tracks, directory = 'baz') { + const trackSection = new TrackSection(); + trackSection.unqualifiedDirectory = directory; + trackSection.tracks = tracks.map(t => Thing.getReference(t)); + trackSection.ownTrackData = tracks; + trackSection.ownAlbumData = [album]; + return trackSection; +} + function stubTrack(directory = 'foo') { const track = new Track(); track.directory = directory; @@ -43,8 +53,8 @@ function stubArtist(artistName = `Test Artist`) { function stubArtistAndContribs(artistName = `Test Artist`) { const artist = stubArtist(artistName); - const contribs = [{who: artistName, what: null}]; - const badContribs = [{who: `Figment of Your Imagination`, what: null}]; + const contribs = [{artist: artistName, annotation: null}]; + const badContribs = [{artist: `Figment of Your Imagination`, annotation: null}]; return {artist, contribs, badContribs}; } diff --git a/test/unit/data/things/track.js b/test/unit/data/things/track.js index b1c1611..644d21c 100644 --- a/test/unit/data/things/track.js +++ b/test/unit/data/things/track.js @@ -11,18 +11,28 @@ const { FlashAct, Thing, Track, + TrackSection, } = thingConstructors; function stubAlbum(tracks, directory = 'bar') { const album = new Album(); album.directory = directory; - const trackRefs = tracks.map(t => Thing.getReference(t)); - album.trackSections = [{tracks: trackRefs}]; + const trackSection = stubTrackSection(album, tracks); + album.trackSections = [trackSection]; return album; } +function stubTrackSection(album, tracks, directory = 'baz') { + const trackSection = new TrackSection(); + trackSection.unqualifiedDirectory = directory; + trackSection.tracks = tracks.map(t => Thing.getReference(t)); + trackSection.ownTrackData = tracks; + trackSection.ownAlbumData = [album]; + return trackSection; +} + function stubTrack(directory = 'foo') { const track = new Track(); track.directory = directory; @@ -46,8 +56,8 @@ function stubArtist(artistName = `Test Artist`) { function stubArtistAndContribs(artistName = `Test Artist`) { const artist = stubArtist(artistName); - const contribs = [{who: artistName, what: null}]; - const badContribs = [{who: `Figment of Your Imagination`, what: null}]; + const contribs = [{artist: artistName, annotation: null}]; + const badContribs = [{artist: `Figment of Your Imagination`, annotation: null}]; return {artist, contribs, badContribs}; } @@ -81,16 +91,22 @@ t.test(`Track.album`, t => { const track2 = stubTrack('track2'); const album1 = new Album(); const album2 = new Album(); + const section1 = new TrackSection(); + const section2 = new TrackSection(); t.equal(track1.album, null, `album #1: defaults to null`); track1.albumData = [album1, album2]; track2.albumData = [album1, album2]; - album1.ownTrackData = [track1, track2]; - album2.ownTrackData = [track1, track2]; - album1.trackSections = [{tracks: ['track:track1']}]; - album2.trackSections = [{tracks: ['track:track2']}]; + section1.ownTrackData = [track1]; + section2.ownTrackData = [track2]; + section1.ownAlbumData = [album1]; + section2.ownAlbumData = [album2]; + section1.tracks = ['track:track1']; + section2.tracks = ['track:track2']; + album1.trackSections = [section1]; + album2.trackSections = [section2]; t.equal(track1.album, album1, `album #2: is album when album's trackSections matches track`); @@ -105,21 +121,83 @@ t.test(`Track.album`, t => { t.equal(track1.album, null, `album #4: is null when track missing albumData`); - album1.ownTrackData = []; - track1.albumData = [album1, album2]; + section1.ownTrackData = []; + + // XXX_decacheWikiData + album1.trackSections = []; + album1.trackSections = [section1]; + track1.albumData = []; + track1.albumData = [album2, album1]; t.equal(track1.album, null, - `album #5: is null when album missing ownTrackData`); + `album #5: is null when album track section missing ownTrackData`); - album1.ownTrackData = [track1, track2]; - album1.trackSections = [{tracks: ['track:track2']}]; + section1.ownTrackData = [track2]; + section1.tracks = ['track:track2']; // XXX_decacheWikiData + album1.trackSections = []; + album1.trackSections = [section1]; track1.albumData = []; - track1.albumData = [album1, album2]; + track1.albumData = [album2, album1]; t.equal(track1.album, null, - `album #6: is null when album's trackSections don't match track`); + `album #6: is null when album track section doesn't match track`); +}); + +t.test(`Track.alwaysReferenceByDirectory`, t => { + t.plan(7); + + const {track: originalTrack, album: originalAlbum} = + stubTrackAndAlbum('original-track', 'original-album'); + + const {track: rereleaseTrack, album: rereleaseAlbum} = + stubTrackAndAlbum('rerelease-track', 'rerelease-album'); + + originalTrack.name = 'Cowabunga'; + rereleaseTrack.name = 'Cowabunga'; + + originalTrack.dataSourceAlbum = 'album:original-album'; + rereleaseTrack.dataSourceAlbum = 'album:rerelease-album'; + + rereleaseTrack.originalReleaseTrack = 'track:original-track'; + + const {XXX_decacheWikiData} = linkAndBindWikiData({ + albumData: [originalAlbum, rereleaseAlbum], + trackData: [originalTrack, rereleaseTrack], + }); + + t.equal(originalTrack.alwaysReferenceByDirectory, false, + `alwaysReferenceByDirectory #1: defaults to false`); + + t.equal(rereleaseTrack.alwaysReferenceByDirectory, true, + `alwaysReferenceByDirectory #2: is true if rerelease name matches original`); + + rereleaseTrack.name = 'Foo Dog!'; + + t.equal(rereleaseTrack.alwaysReferenceByDirectory, false, + `alwaysReferenceByDirectory #3: is false if rerelease name doesn't match original`); + + rereleaseTrack.name = `COWabunga`; + + t.equal(rereleaseTrack.alwaysReferenceByDirectory, false, + `alwaysReferenceByDirectory #4: is false if rerelease name doesn't match original exactly`); + + rereleaseAlbum.alwaysReferenceTracksByDirectory = true; + XXX_decacheWikiData(); + + t.equal(rereleaseTrack.alwaysReferenceByDirectory, true, + `alwaysReferenceByDirectory #5: is true if album's alwaysReferenceTracksByDirectory is true`); + + rereleaseTrack.alwaysReferenceByDirectory = false; + + t.equal(rereleaseTrack.alwaysReferenceByDirectory, false, + `alwaysReferenceByDirectory #6: doesn't inherit from album if set to false`); + + rereleaseTrack.name = 'Cowabunga'; + + t.equal(rereleaseTrack.alwaysReferenceByDirectory, false, + `alwaysReferenceByDirectory #7: doesn't compare original release name if set to false`); }); t.test(`Track.artTags`, t => { @@ -189,31 +267,31 @@ t.test(`Track.artistContribs`, t => { `artistContribs #1: defaults to empty array`); album.artistContribs = [ - {who: `Artist 1`, what: `composition`}, - {who: `Artist 2`, what: null}, + {artist: `Artist 1`, annotation: `composition`}, + {artist: `Artist 2`, annotation: null}, ]; XXX_decacheWikiData(); t.same(track.artistContribs, - [{who: artist1, what: `composition`}, {who: artist2, what: null}], + [{artist: artist1, annotation: `composition`}, {artist: artist2, annotation: null}], `artistContribs #2: inherits album artistContribs`); track.artistContribs = [ - {who: `Artist 1`, what: `arrangement`}, + {artist: `Artist 1`, annotation: `arrangement`}, ]; - t.same(track.artistContribs, [{who: artist1, what: `arrangement`}], + t.same(track.artistContribs, [{artist: artist1, annotation: `arrangement`}], `artistContribs #3: resolves from own value`); track.artistContribs = [ - {who: `Artist 1`, what: `snooping`}, - {who: `Artist 413`, what: `as`}, - {who: `Artist 2`, what: `usual`}, + {artist: `Artist 1`, annotation: `snooping`}, + {artist: `Artist 413`, annotation: `as`}, + {artist: `Artist 2`, annotation: `usual`}, ]; t.same(track.artistContribs, - [{who: artist1, what: `snooping`}, {who: artist2, what: `usual`}], + [{artist: artist1, annotation: `snooping`}, {artist: artist2, annotation: `usual`}], `artistContribs #4: filters out names without matches`); }); @@ -230,11 +308,13 @@ t.test(`Track.color`, t => { t.equal(track.color, null, `color #1: defaults to null`); + const section = stubTrackSection(album, [track]); + album.color = '#abcdef'; - album.trackSections = [{ - color: '#beeeef', - tracks: [Thing.getReference(track)], - }]; + section.color = '#beeeef'; + + album.trackSections = [section]; + XXX_decacheWikiData(); t.equal(track.color, '#beeeef', @@ -248,6 +328,7 @@ t.test(`Track.color`, t => { track.albumData = [ { constructor: {[Thing.referenceType]: 'album'}, + [Thing.isThing]: true, color: '#abcdef', tracks: [track], trackSections: [ @@ -303,7 +384,7 @@ t.test(`Track.commentatorArtists`, t => { `Track.commentatorArtists #2: works with two commentators`); track.commentary = commentary += - `<i>Icy|<b>Icy What You Did There</b>:</i>\n` + + `<i>Icy|<b>Icy annotation You Did There</b>:</i>\n` + `Incredible.\n`; t.same(track.commentatorArtists, [artist1, artist2, artist3], @@ -362,31 +443,31 @@ t.test(`Track.coverArtistContribs`, t => { `coverArtistContribs #1: defaults to empty array`); album.trackCoverArtistContribs = [ - {who: `Artist 1`, what: `lines`}, - {who: `Artist 2`, what: null}, + {artist: `Artist 1`, annotation: `lines`}, + {artist: `Artist 2`, annotation: null}, ]; XXX_decacheWikiData(); t.same(track.coverArtistContribs, - [{who: artist1, what: `lines`}, {who: artist2, what: null}], + [{artist: artist1, annotation: `lines`}, {artist: artist2, annotation: null}], `coverArtistContribs #2: inherits album trackCoverArtistContribs`); track.coverArtistContribs = [ - {who: `Artist 1`, what: `collage`}, + {artist: `Artist 1`, annotation: `collage`}, ]; - t.same(track.coverArtistContribs, [{who: artist1, what: `collage`}], + t.same(track.coverArtistContribs, [{artist: artist1, annotation: `collage`}], `coverArtistContribs #3: resolves from own value`); track.coverArtistContribs = [ - {who: `Artist 1`, what: `snooping`}, - {who: `Artist 413`, what: `as`}, - {who: `Artist 2`, what: `usual`}, + {artist: `Artist 1`, annotation: `snooping`}, + {artist: `Artist 413`, annotation: `as`}, + {artist: `Artist 2`, annotation: `usual`}, ]; t.same(track.coverArtistContribs, - [{who: artist1, what: `snooping`}, {who: artist2, what: `usual`}], + [{artist: artist1, annotation: `snooping`}, {artist: artist2, annotation: `usual`}], `coverArtistContribs #4: filters out names without matches`); track.disableUniqueCoverArt = true; diff --git a/test/unit/data/things/validators.js b/test/unit/data/things/validators.js index 11134a9..3a217d6 100644 --- a/test/unit/data/things/validators.js +++ b/test/unit/data/things/validators.js @@ -1,5 +1,5 @@ import t from 'tap'; -import {showAggregate} from '#sugar'; +import {showAggregate} from '#aggregate'; import { // Basic types @@ -280,17 +280,17 @@ t.test('isContentString', t => { t.test('isContribution', t => { t.plan(4); - t.ok(isContribution({who: 'artist:toby-fox', what: 'Music'})); - t.ok(isContribution({who: 'Toby Fox'})); - t.throws(() => isContribution(({who: 'group:umspaf', what: 'Organizing'})), - {errors: /who/}); - t.throws(() => isContribution(({who: 'artist:toby-fox', what: 123})), - {errors: /what/}); + t.ok(isContribution({artist: 'artist:toby-fox', annotation: 'Music'})); + t.ok(isContribution({artist: 'Toby Fox'})); + t.throws(() => isContribution(({artist: 'group:umspaf', annotation: 'Organizing'})), + {errors: /artist/}); + t.throws(() => isContribution(({artist: 'artist:toby-fox', annotation: 123})), + {errors: /annotation/}); }); t.test('isContributionList', t => { t.plan(4); - t.ok(isContributionList([{who: 'Beavis'}, {who: 'Butthead', what: 'Wrangling'}])); + t.ok(isContributionList([{artist: 'Beavis'}, {artist: 'Butthead', annotation: 'Wrangling'}])); t.ok(isContributionList([])); t.throws(() => isContributionList(2)); t.throws(() => isContributionList(['Charlie', 'Woodstock'])); |