From 282780a26bfea739fc4196c2f3ec9eb5d0d6cab7 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sun, 30 Sep 2018 00:19:04 -0700 Subject: [PATCH] Add many tests for serialization --- js/__snapshots__/serialization.test.ts.snap | 114 +++++++++ .../fixtures/serializedState/v1/balance.json | 110 +++++++++ .../serializedState/v1/double-mode.json | 110 +++++++++ .../serializedState/v1/equalizer-auto.json | 110 +++++++++ .../serializedState/v1/equalizer-band.json | 110 +++++++++ .../serializedState/v1/equalizer-on.json | 110 +++++++++ .../serializedState/v1/equalizer-preamp.json | 110 +++++++++ .../serializedState/v1/focused-window.json | 110 +++++++++ .../serializedState/v1/llama-mode.json | 110 +++++++++ .../v1/main-window-position.json | 110 +++++++++ .../fixtures/serializedState/v1/repeat.json | 110 +++++++++ .../fixtures/serializedState/v1/shuffle.json | 110 +++++++++ .../fixtures/serializedState/v1/volume.json | 110 +++++++++ .../serializedState/v1/window-hidden.json | 110 +++++++++ .../serializedState/v1/window-open.json | 110 +++++++++ .../serializedState/v1/window-shade.json | 110 +++++++++ .../serializedState/v1/window-size.json | 110 +++++++++ js/actionCreators/equalizer.ts | 13 +- js/actionCreators/index.ts | 7 +- js/actionCreators/windows.ts | 12 +- js/selectors.ts | 18 ++ js/serialization.test.ts | 218 ++++++++++++++++++ package.json | 2 + yarn.lock | 8 + 24 files changed, 2148 insertions(+), 4 deletions(-) create mode 100644 js/__snapshots__/serialization.test.ts.snap create mode 100644 js/__tests__/fixtures/serializedState/v1/balance.json create mode 100644 js/__tests__/fixtures/serializedState/v1/double-mode.json create mode 100644 js/__tests__/fixtures/serializedState/v1/equalizer-auto.json create mode 100644 js/__tests__/fixtures/serializedState/v1/equalizer-band.json create mode 100644 js/__tests__/fixtures/serializedState/v1/equalizer-on.json create mode 100644 js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json create mode 100644 js/__tests__/fixtures/serializedState/v1/focused-window.json create mode 100644 js/__tests__/fixtures/serializedState/v1/llama-mode.json create mode 100644 js/__tests__/fixtures/serializedState/v1/main-window-position.json create mode 100644 js/__tests__/fixtures/serializedState/v1/repeat.json create mode 100644 js/__tests__/fixtures/serializedState/v1/shuffle.json create mode 100644 js/__tests__/fixtures/serializedState/v1/volume.json create mode 100644 js/__tests__/fixtures/serializedState/v1/window-hidden.json create mode 100644 js/__tests__/fixtures/serializedState/v1/window-open.json create mode 100644 js/__tests__/fixtures/serializedState/v1/window-shade.json create mode 100644 js/__tests__/fixtures/serializedState/v1/window-size.json create mode 100644 js/serialization.test.ts diff --git a/js/__snapshots__/serialization.test.ts.snap b/js/__snapshots__/serialization.test.ts.snap new file mode 100644 index 00000000..40766381 --- /dev/null +++ b/js/__snapshots__/serialization.test.ts.snap @@ -0,0 +1,114 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`can serialize the initial state 1`] = ` +Object { + "display": Object { + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinColors": Array [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)", + ], + "skinCursors": null, + "skinGenLetterWidths": null, + "skinImages": Object { + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=", + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + }, + "skinPlaylistStyle": null, + "skinRegion": Object {}, + "visualizerStyle": 0, + }, + "equalizer": Object { + "auto": false, + "on": true, + "sliders": Object { + "1000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "170": 50, + "3000": 50, + "310": 50, + "60": 50, + "600": 50, + "6000": 50, + "preamp": 50, + }, + }, + "media": Object { + "balance": 0, + "repeat": false, + "shuffle": false, + "volume": 78, + }, + "version": 1, + "windows": Object { + "focused": "main", + "genWindows": Object { + "equalizer": Object { + "hidden": false, + "open": true, + "position": Object { + "x": 0, + "y": 0, + }, + "shade": false, + "size": Array [ + 0, + 0, + ], + }, + "main": Object { + "hidden": false, + "open": true, + "position": Object { + "x": 0, + "y": 0, + }, + "shade": false, + "size": Array [ + 0, + 0, + ], + }, + "playlist": Object { + "hidden": false, + "open": true, + "position": Object { + "x": 0, + "y": 0, + }, + "shade": false, + "size": Array [ + 0, + 0, + ], + }, + }, + }, +} +`; diff --git a/js/__tests__/fixtures/serializedState/v1/balance.json b/js/__tests__/fixtures/serializedState/v1/balance.json new file mode 100644 index 00000000..3e1f9732 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/balance.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 40, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/double-mode.json b/js/__tests__/fixtures/serializedState/v1/double-mode.json new file mode 100644 index 00000000..d708789b --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/double-mode.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": true, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json b/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json new file mode 100644 index 00000000..b04140c3 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": true, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-band.json b/js/__tests__/fixtures/serializedState/v1/equalizer-band.json new file mode 100644 index 00000000..d5a6a1c1 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-band.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 100, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-on.json b/js/__tests__/fixtures/serializedState/v1/equalizer-on.json new file mode 100644 index 00000000..863671c7 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-on.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": false, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json b/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json new file mode 100644 index 00000000..f7fac93e --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 10 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/focused-window.json b/js/__tests__/fixtures/serializedState/v1/focused-window.json new file mode 100644 index 00000000..79122830 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/focused-window.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "equalizer" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/llama-mode.json b/js/__tests__/fixtures/serializedState/v1/llama-mode.json new file mode 100644 index 00000000..11672b62 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/llama-mode.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": true, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/main-window-position.json b/js/__tests__/fixtures/serializedState/v1/main-window-position.json new file mode 100644 index 00000000..010b4f3f --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/main-window-position.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 100, + "y": 100 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/repeat.json b/js/__tests__/fixtures/serializedState/v1/repeat.json new file mode 100644 index 00000000..5d044daf --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/repeat.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": true + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/shuffle.json b/js/__tests__/fixtures/serializedState/v1/shuffle.json new file mode 100644 index 00000000..4ab8e3b7 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/shuffle.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": true, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/volume.json b/js/__tests__/fixtures/serializedState/v1/volume.json new file mode 100644 index 00000000..1c69d270 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/volume.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 50, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/window-hidden.json b/js/__tests__/fixtures/serializedState/v1/window-hidden.json new file mode 100644 index 00000000..fcf26b25 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/window-hidden.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": true, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/window-open.json b/js/__tests__/fixtures/serializedState/v1/window-open.json new file mode 100644 index 00000000..162c4fbd --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/window-open.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": false, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/window-shade.json b/js/__tests__/fixtures/serializedState/v1/window-shade.json new file mode 100644 index 00000000..da77c080 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/window-shade.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": true, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/window-size.json b/js/__tests__/fixtures/serializedState/v1/window-size.json new file mode 100644 index 00000000..812e5477 --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/window-size.json @@ -0,0 +1,110 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 4, + 5 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/actionCreators/equalizer.ts b/js/actionCreators/equalizer.ts index fb4b8988..2ef90bc0 100644 --- a/js/actionCreators/equalizer.ts +++ b/js/actionCreators/equalizer.ts @@ -1,6 +1,11 @@ import { BANDS } from "../constants"; -import { SET_EQ_ON, SET_EQ_OFF, SET_BAND_VALUE } from "../actionTypes"; +import { + SET_EQ_ON, + SET_EQ_OFF, + SET_BAND_VALUE, + SET_EQ_AUTO +} from "../actionTypes"; import { Band, Dispatchable } from "../types"; const BAND_SNAP_DISTANCE = 10; @@ -52,3 +57,9 @@ export function toggleEq(): Dispatchable { } }; } + +export function toggleEqAuto(): Dispatchable { + return (dispatch, getState) => { + dispatch({ type: SET_EQ_AUTO, value: !getState().equalizer.auto }); + }; +} diff --git a/js/actionCreators/index.ts b/js/actionCreators/index.ts index 65f412cf..5142e3b8 100644 --- a/js/actionCreators/index.ts +++ b/js/actionCreators/index.ts @@ -28,7 +28,9 @@ export { resetWindowSizes, browserWindowSizeChanged, ensureWindowsAreOnScreen, - stackWindows + stackWindows, + toggleLlamaMode, + setFocusedWindow } from "./windows"; export { play, @@ -52,7 +54,8 @@ export { setEqToMid, setEqToMin, setPreamp, - toggleEq + toggleEq, + toggleEqAuto } from "./equalizer"; export { addTracksFromReferences, diff --git a/js/actionCreators/windows.ts b/js/actionCreators/windows.ts index b8e27bbf..754931d5 100644 --- a/js/actionCreators/windows.ts +++ b/js/actionCreators/windows.ts @@ -10,7 +10,9 @@ import { TOGGLE_WINDOW_SHADE_MODE, SET_WINDOW_VISIBILITY, BROWSER_WINDOW_SIZE_CHANGED, - RESET_WINDOW_SIZES + RESET_WINDOW_SIZES, + TOGGLE_LLAMA_MODE, + SET_FOCUSED_WINDOW } from "../actionTypes"; import { getPositionDiff, SizeDiff } from "../resizeUtils"; @@ -57,6 +59,10 @@ export function toggleDoubleSizeMode(): Dispatchable { return withWindowGraphIntegrity({ type: TOGGLE_DOUBLESIZE_MODE }); } +export function toggleLlamaMode(): Dispatchable { + return { type: TOGGLE_LLAMA_MODE }; +} + export function toggleEqualizerShadeMode(): Dispatchable { return withWindowGraphIntegrity({ type: TOGGLE_WINDOW_SHADE_MODE, @@ -90,6 +96,10 @@ export function showWindow(windowId: WindowId): Dispatchable { return { type: SET_WINDOW_VISIBILITY, windowId, hidden: false }; } +export function setFocusedWindow(window: WindowId): Dispatchable { + return { type: SET_FOCUSED_WINDOW, window }; +} + export function setWindowSize( windowId: WindowId, size: [number, number] diff --git a/js/selectors.ts b/js/selectors.ts index 73ddd29a..98842553 100644 --- a/js/selectors.ts +++ b/js/selectors.ts @@ -354,6 +354,14 @@ export function getWindowHidden(state: AppState) { return (windowId: WindowId) => state.windows.genWindows[windowId].hidden; } +export function getFocusedWindow(state: AppState): WindowId { + return state.windows.focused; +} + +export function getWindowPosition(state: AppState) { + return (windowId: WindowId) => state.windows.genWindows[windowId].position; +} + export const getGenWindows = (state: AppState) => { return state.windows.genWindows; }; @@ -367,6 +375,10 @@ export function getDoubled(state: AppState) { return state.display.doubled; } +export function getLlamaMode(state: AppState) { + return state.display.llama; +} + export const getWindowSizes = createSelector( getGenWindows, getDoubled, @@ -406,6 +418,8 @@ export const getVisualizerStyle = (state: AppState) => export const getVolume = (state: AppState) => state.media.volume; export const getBalance = (state: AppState) => state.media.balance; +export const getShuffle = (state: AppState) => state.media.shuffle; +export const getRepeat = (state: AppState) => state.media.repeat; export const getChannels = (state: AppState) => state.media.channels; export function getSerlializedState(state: AppState): SerializedStateV1 { @@ -422,6 +436,10 @@ export function getEqualizerEnabled(state: AppState): boolean { return state.equalizer.on; } +export function getEqualizerAuto(state: AppState): boolean { + return state.equalizer.auto; +} + export function getBrowserWindowSize( state: AppState ): { height: number; width: number } { diff --git a/js/serialization.test.ts b/js/serialization.test.ts new file mode 100644 index 00000000..b1e76144 --- /dev/null +++ b/js/serialization.test.ts @@ -0,0 +1,218 @@ +import fs from "fs"; +import path from "path"; +import reducer from "./reducers"; +import * as Selectors from "./selectors"; +import * as Actions from "./actionCreators"; +import { kebabCase } from "lodash"; + +import { createStore, applyMiddleware } from "redux"; +import thunk from "redux-thunk"; +import { LOAD_SERIALIZED_STATE } from "./actionTypes"; +import { SerializedStateV1 } from "./serializedStates/v1Types"; +import { Dispatchable, AppState } from "./types"; + +function fixturePath(name: string) { + return path.join( + __dirname, + "__tests__/fixtures/serializedState/v1/", + `${kebabCase(name)}.json` + ); +} + +function writeFixture(name: string, state: SerializedStateV1) { + fs.writeFileSync(fixturePath(name), JSON.stringify(state, null, 4)); +} + +function readFixture(name: string): SerializedStateV1 { + return JSON.parse(fs.readFileSync(fixturePath(name), "utf8")); +} + +interface SerializationTestParams { + name: string; + action: Dispatchable; + selector(state: AppState): T; + expected: T; +} + +function testSerialization({ + name, + action, + selector, + expected +}: SerializationTestParams) { + test(name, () => { + const firstStore = getStore(); + firstStore.dispatch(action); + // Ensure we actually changed something + expect(firstStore.getState()).not.toEqual(getStore().getState()); + + const serializedState = Selectors.getSerlializedState( + firstStore.getState() + ); + + if (!fs.existsSync(fixturePath(name))) { + writeFixture(name, serializedState); + console.warn("Wrote new fixture: ", fixturePath(name)); + } + + const readSerializedState = readFixture(name); + + const secondStore = getStore(); + secondStore.dispatch({ + type: LOAD_SERIALIZED_STATE, + serializedState: readSerializedState + }); + expect(selector(secondStore.getState())).toEqual(expected); + }); +} + +const defaultSerializedState = Selectors.getSerlializedState( + getStore().getState() +); + +function getStore() { + const extras = {}; + const enhancer = applyMiddleware(thunk.withExtraArgument(extras)); + return createStore(reducer, enhancer); +} + +describe("can serialize", () => { + test("the initial state", () => { + const store = getStore(); + const serializedState = Selectors.getSerlializedState(store.getState()); + expect(serializedState).toMatchSnapshot(); + + const newStore = getStore(); + newStore.dispatch({ + type: LOAD_SERIALIZED_STATE, + serializedState + }); + expect(store.getState()).toEqual(newStore.getState()); + }); + + /* Media */ + testSerialization({ + name: "volume", + action: Actions.setVolume(50), + selector: Selectors.getVolume, + expected: 50 + }); + + testSerialization({ + name: "balance", + action: Actions.setBalance(40), + selector: Selectors.getBalance, + expected: 40 + }); + + testSerialization({ + name: "shuffle", + action: Actions.toggleShuffle(), + selector: Selectors.getShuffle, + expected: true + }); + + testSerialization({ + name: "repeat", + action: Actions.toggleRepeat(), + selector: Selectors.getRepeat, + expected: true + }); + + /* Equalizer */ + testSerialization({ + name: "equalizer on", + action: Actions.toggleEq(), + selector: Selectors.getEqualizerEnabled, + expected: false + }); + + testSerialization({ + name: "equalizer auto", + action: Actions.toggleEqAuto(), + selector: Selectors.getEqualizerAuto, + expected: true + }); + + testSerialization({ + name: "equalizer band", + action: Actions.setEqBand(60, 100), + selector: state => Selectors.getSliders(state)[60], + expected: 100 + }); + + testSerialization({ + name: "equalizer preamp", + action: Actions.setPreamp(10), + selector: state => Selectors.getSliders(state).preamp, + expected: 10 + }); + + /* Display */ + testSerialization({ + name: "double mode", + action: Actions.toggleDoubleSizeMode(), + selector: Selectors.getDoubled, + expected: true + }); + + testSerialization({ + name: "llama mode", + action: Actions.toggleLlamaMode(), + selector: Selectors.getLlamaMode, + expected: true + }); + + // TODO + // * marqueeStep + // * skinImages + // * skinCursors + // * skinRegion + // * skinGenLetterWidths + // * skinColors + // * skinPlaylistStyle + // * focused + + /* Gen Windows */ + testSerialization({ + name: "window size", + action: Actions.setWindowSize("playlist", [4, 5]), + selector: state => Selectors.getWindowSize(state)("playlist"), + expected: [4, 5] + }); + + testSerialization({ + name: "window open", + action: Actions.closeWindow("playlist"), + selector: state => Selectors.getWindowOpen(state)("playlist"), + expected: false + }); + + testSerialization({ + name: "window hidden", + action: Actions.hideWindow("playlist"), + selector: state => Selectors.getWindowHidden(state)("playlist"), + expected: true + }); + + testSerialization({ + name: "window shade", + action: Actions.toggleEqualizerShadeMode(), + selector: state => Selectors.getWindowShade(state)("equalizer"), + expected: true + }); + + testSerialization({ + name: "main window position", + action: Actions.updateWindowPositions({ main: { x: 100, y: 100 } }), + selector: state => Selectors.getWindowPosition(state)("main"), + expected: { x: 100, y: 100 } + }); + + testSerialization({ + name: "focused window", + action: Actions.setFocusedWindow("equalizer"), + selector: state => Selectors.getFocusedWindow(state), + expected: "equalizer" + }); +}); diff --git a/package.json b/package.json index 6f150376..303e341c 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "@types/classnames": "^2.2.6", "@types/invariant": "^2.2.29", "@types/jest": "^23.3.2", + "@types/lodash": "^4.14.116", "@types/react": "^16.4.14", "@types/react-dom": "^16.0.7", "@types/react-redux": "^6.0.8", @@ -98,6 +99,7 @@ "jest-runner-eslint": "^0.4.0", "jsmediatags": "^3.8.1", "jszip": "^3.1.3", + "lodash": "^4.17.11", "milkdrop-preset-converter-aws": "^0.1.0", "prettier": "^1.14.2", "prop-types": "^15.5.10", diff --git a/yarn.lock b/yarn.lock index 385e290d..4f1d7278 100644 --- a/yarn.lock +++ b/yarn.lock @@ -733,6 +733,10 @@ version "23.3.2" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.2.tgz#07b90f6adf75d42c34230c026a2529e56c249dbb" +"@types/lodash@^4.14.116": + version "4.14.116" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" + "@types/node@*": version "10.1.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.0.tgz#2783ee1b6c47cbd4044f4a233976c1ac5fa9e942" @@ -5409,6 +5413,10 @@ lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"