@@ -0,0 +1,160 @@
1+/*
2+ * Copyright 2014 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 Ubuntu.Components 0.1
20+import "../../../../qml/Dash/Previews"
21+import Unity.Test 0.1 as UT
22+import QtMultimedia 5.0
23+
24+Rectangle {
25+ id: root
26+ width: units.gu(60)
27+ height: units.gu(80)
28+ color: "lightgrey"
29+
30+ property var tracksModel0: [
31+ ]
32+
33+ property var tracksModel1: [
34+ { title: "Some track name", length: "0:30", uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg" }
35+ ]
36+
37+ property var tracksModel2: [
38+ { title: "Some track name", length: "0:30", uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg" },
39+ { title: "Some other track name", length: "1:23", uri: "../../tests/qmltests/Dash/Music/data/testsound2.ogg" },
40+ { title: "And another one", length: "123:45", uri: "../../tests/qmltests/Dash/Music/data/testsound3.ogg" }
41+ ]
42+
43+ AudioPlayer {
44+ id: audioPlayer
45+ anchors.fill: parent
46+ model: tracksModel0
47+ }
48+
49+ UT.UnityTestCase {
50+ name: "AudioPlayerTest"
51+ when: windowShown
52+
53+ function init() {
54+ waitForRendering(audioPlayer);
55+ }
56+
57+ function test_tracks_data() {
58+ return [
59+ {tag: "0 tracks", tracksModel: tracksModel0, dividerVisible: false},
60+ {tag: "1 track", tracksModel: tracksModel1, dividerVisible: true},
61+ {tag: "4 track", tracksModel: tracksModel2, dividerVisible: true}
62+ ];
63+ }
64+
65+ function test_tracks(data) {
66+ audioPlayer.model = data.tracksModel;
67+ waitForRendering(audioPlayer);
68+
69+ var trackRepeater = findChild(audioPlayer, "trackRepeater");
70+ compare(trackRepeater.count, data.tracksModel.length)
71+
72+ var topDivider = findChild(audioPlayer, "topDivider");
73+ compare(topDivider.visible, data.dividerVisible);
74+
75+ for (var i = 0; i < data.tracksModel.count; ++i) {
76+ var trackItem = findChild(audioPlayer, "trackItem" + i);
77+ var titleLabel = findChild(trackItem, "trackTitleLabel");
78+ compare(titleLabel.text, data.tracksModel[i]["title"])
79+ var timeLabel = findChild(trackItem, "timeLabel");
80+ compare(timeLabel.text, data.tracksModel[i]["length"])
81+ }
82+ }
83+
84+ function checkPlayerUri(index) {
85+ var modelFilename = audioPlayer.model[index]["uri"].replace(/^.*[\\\/]/, '');
86+ var playerFilename = findInvisibleChild(audioPlayer, "audio").source.toString().replace(/^.*[\\\/]/, '');
87+
88+ compare(modelFilename, playerFilename, "Player source is not set correctly.");
89+ }
90+
91+ function test_playback() {
92+ audioPlayer.model = tracksModel2;
93+ waitForRendering(audioPlayer);
94+
95+ var track0Item = findChild(audioPlayer, "trackItem0");
96+ var track1Item = findChild(audioPlayer, "trackItem1");
97+ var track2Item = findChild(audioPlayer, "trackItem2");
98+
99+ var track0ProgressBar = findChild(track0Item, "progressBarFill");
100+ var track1ProgressBar = findChild(track1Item, "progressBarFill");
101+ var track2ProgressBar = findChild(track2Item, "progressBarFill");
102+
103+ var track0PlayButton = findChild(track0Item, "playButton");
104+ var track1PlayButton = findChild(track1Item, "playButton");
105+ var track2PlayButton = findChild(track2Item, "playButton");
106+
107+ var audio = findInvisibleChild(audioPlayer, "audio");
108+
109+ // All progress bars must be hidden in the beginning
110+ compare(track0ProgressBar.visible, false);
111+ compare(track1ProgressBar.visible, false);
112+ compare(track2ProgressBar.visible, false);
113+
114+ // Playing track 0 should make progress bar 0 visible
115+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
116+
117+ tryCompare(audio, "playbackState", Audio.PlayingState);
118+ checkPlayerUri(0);
119+
120+ tryCompare(track0ProgressBar, "visible", true);
121+ tryCompare(track1ProgressBar, "visible", false);
122+ tryCompare(track2ProgressBar, "visible", false);
123+
124+ // Clicking the button again should pause it. The progress bar should stay visible
125+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
126+ tryCompare(audio, "playbackState", Audio.PausedState);
127+ checkPlayerUri(0);
128+ tryCompare(track0ProgressBar, "visible", true);
129+
130+ // Continue playback
131+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
132+ tryCompare(audio, "playbackState", Audio.PlayingState);
133+ checkPlayerUri(0);
134+
135+ // Playing track 1 should make progress bar 1 visible and hide progress bar 0 again
136+ mouseClick(track1PlayButton, track1PlayButton.width / 2, track1PlayButton.height / 2);
137+
138+ tryCompare(audio, "playbackState", Audio.PlayingState);
139+ checkPlayerUri(1);
140+
141+ tryCompare(track0ProgressBar, "visible", false);
142+ tryCompare(track1ProgressBar, "visible", true);
143+ tryCompare(track2ProgressBar, "visible", false);
144+
145+ // Playing track 2 should make progress bar 1 visible and hide progress bar 0 again
146+ mouseClick(track2PlayButton, track2PlayButton.width / 2, track2PlayButton.height / 2);
147+
148+ tryCompare(audio, "playbackState", Audio.PlayingState);
149+ checkPlayerUri(2);
150+
151+ tryCompare(track0ProgressBar, "visible", false);
152+ tryCompare(track1ProgressBar, "visible", false);
153+ tryCompare(track2ProgressBar, "visible", true);
154+
155+ // Calling stop() should make all players shut up!
156+ audioPlayer.stop()
157+ tryCompare(audio, "playbackState", Audio.StoppedState);
158+ }
159+ }
160+}