@@ -0,0 +1,174 @@
1+/*
2+ * Copyright 2013 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import "../../../../Dash/Music"
20+import Unity.Test 0.1 as UT
21+import QtMultimedia 5.0
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(60)
26+ height: units.gu(80)
27+ color: "lightgrey"
28+
29+ MusicPreview {
30+ id: musicPreview
31+ anchors.fill: parent
32+ isCurrent: true
33+
34+ previewData: QtObject {
35+ property string rendererName: "preview-music"
36+ property string title: "Music Preview"
37+ property string subtitle: "Subtitle"
38+ property string description: "This is the description"
39+ property string image: "../../tests/qmltests/Components/tst_LazyImage/square.png"
40+ property var actions: [
41+ { id: 123, displayName: "Play"},
42+ { id: 456, displayName: "Show in folder"}
43+ ]
44+ property var tracks: tracksModel2
45+ }
46+ }
47+
48+ ListModel {
49+ id: tracksModel0
50+ }
51+ ListModel {
52+ id: tracksModel1
53+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg"; trackNo: 1; title: "Some track name"; length: "0:30"}
54+ }
55+ ListModel {
56+ id: tracksModel2
57+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg"; trackNo: 1; title: "Some track name"; length: "0:30"}
58+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg"; trackNo: 2; title: "Some track name"; length: "0:30"}
59+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound2.ogg"; trackNo: 3; title: "Some other track name"; length: "1:23"}
60+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound3.ogg"; trackNo: 4; title: "And another one"; length: "123:45"}
61+ }
62+
63+ UT.UnityTestCase {
64+ name: "MusicPreviewTest"
65+ when: windowShown
66+
67+ function init() {
68+ waitForRendering(musicPreview);
69+ }
70+
71+ function test_tracks_data() {
72+ return [
73+ {tag: "0 tracks", tracksModel: tracksModel0, dividerVisible: false},
74+ {tag: "1 track", tracksModel: tracksModel1, dividerVisible: true},
75+ {tag: "4 track", tracksModel: tracksModel2, dividerVisible: true}
76+ ];
77+ }
78+
79+ function test_tracks(data) {
80+ musicPreview.previewData.tracks = data.tracksModel;
81+ waitForRendering(musicPreview);
82+
83+ var trackRepeater = findChild(musicPreview, "trackRepeater");
84+ compare(trackRepeater.count, data.tracksModel.count)
85+
86+ var topDivider = findChild(musicPreview, "topDivider");
87+ compare(topDivider.visible, data.dividerVisible);
88+
89+ for (var i = 0; i < data.tracksModel.count; ++i) {
90+ var trackItem = findChild(musicPreview, "trackItem" + i);
91+ var titleLabel = findChild(trackItem, "trackTitleLabel");
92+ compare(titleLabel.text, data.tracksModel.get(i).title)
93+ var timeLabel = findChild(trackItem, "timeLabel");
94+ compare(timeLabel.text, data.tracksModel.get(i).length)
95+ }
96+ }
97+
98+ function checkPlayerUri(index) {
99+ var modelFilename = musicPreview.previewData.tracks.get(index).uri.replace(/^.*[\\\/]/, '');
100+ var playerFilename = findInvisibleChild(musicPreview, "audioPlayer").source.toString().replace(/^.*[\\\/]/, '');
101+
102+ compare(modelFilename, playerFilename, "Player source is not set correctly.");
103+ }
104+
105+ function test_playback() {
106+ musicPreview.previewData.tracks = tracksModel2;
107+ waitForRendering(musicPreview);
108+
109+ var track0Item = findChild(musicPreview, "trackItem0");
110+ var track1Item = findChild(musicPreview, "trackItem1");
111+ var track2Item = findChild(musicPreview, "trackItem2");
112+
113+ var track0ProgressBar = findChild(track0Item, "progressBarFill");
114+ var track1ProgressBar = findChild(track1Item, "progressBarFill");
115+ var track2ProgressBar = findChild(track2Item, "progressBarFill");
116+
117+ var track0PlayButton = findChild(track0Item, "playButton");
118+ var track1PlayButton = findChild(track1Item, "playButton");
119+ var track2PlayButton = findChild(track2Item, "playButton");
120+
121+ var audioPlayer = findInvisibleChild(musicPreview, "audioPlayer");
122+
123+ // All progress bars must be hidden in the beginning
124+ compare(track0ProgressBar.visible, false);
125+ compare(track1ProgressBar.visible, false);
126+ compare(track2ProgressBar.visible, false);
127+
128+ // Playing track 0 should make progress bar 0 visible
129+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
130+
131+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
132+ checkPlayerUri(0);
133+
134+ tryCompare(track0ProgressBar, "visible", true);
135+ tryCompare(track1ProgressBar, "visible", false);
136+ tryCompare(track2ProgressBar, "visible", false);
137+
138+ // Clicking the button again should pause it. The progress bar should stay visible
139+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
140+ tryCompare(audioPlayer, "playbackState", Audio.PausedState);
141+ checkPlayerUri(0);
142+ tryCompare(track0ProgressBar, "visible", true);
143+
144+ // Continue playback
145+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
146+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
147+ checkPlayerUri(0);
148+
149+ // Playing track 1 should make progress bar 1 visible and hide progress bar 0 again
150+ mouseClick(track1PlayButton, track1PlayButton.width / 2, track1PlayButton.height / 2);
151+
152+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
153+ checkPlayerUri(1);
154+
155+ tryCompare(track0ProgressBar, "visible", false);
156+ tryCompare(track1ProgressBar, "visible", true);
157+ tryCompare(track2ProgressBar, "visible", false);
158+
159+ // Playing track 2 should make progress bar 1 visible and hide progress bar 0 again
160+ mouseClick(track2PlayButton, track2PlayButton.width / 2, track2PlayButton.height / 2);
161+
162+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
163+ checkPlayerUri(2);
164+
165+ tryCompare(track0ProgressBar, "visible", false);
166+ tryCompare(track1ProgressBar, "visible", false);
167+ tryCompare(track2ProgressBar, "visible", true);
168+
169+ // Switching away from this preview should make all players shut up!
170+ musicPreview.isCurrent = false
171+ tryCompare(audioPlayer, "playbackState", Audio.StoppedState);
172+ }
173+ }
174+}