@@ -0,0 +1,179 @@
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: Theme.palette.selected.background
29+
30+ property var tracksModel0: {
31+ "tracks": [ ]
32+ }
33+
34+ property var tracksModel1: {
35+ "tracks": [ { title: "Some track name", length: "30", source: "/not/existing/path/testsound1" } ]
36+ }
37+
38+ property var tracksModel2: {
39+ "tracks": [ { title: "Some track name", length: "30", source: "/not/existing/path/testsound1" },
40+ { title: "Some other track name", subtitle: "Subtitle", length: "83", source: "/not/existing/path/testsound2" },
41+ { title: "And another one", length: "7425", source: "/not/existing/path/testsound3" } ]
42+ }
43+
44+ PreviewAudioPlayback {
45+ id: previewAudioPlayback
46+ anchors.fill: parent
47+ widgetData: tracksModel2
48+ }
49+
50+ UT.UnityTestCase {
51+ name: "PreviewAudioPlaybackTest"
52+ when: windowShown
53+
54+ function init() {
55+ waitForRendering(previewAudioPlayback);
56+ }
57+
58+ function test_time_formatter_data() {
59+ return [
60+ { tag: "NaN", value: "not a number", result: "" },
61+ { tag: "0", value: 0, result: "" },
62+ { tag: "-1", value: -1, result: "" },
63+ { tag: "30", value: 30, result: "0:30" },
64+ { tag: "60", value: 60, result: "1:00" },
65+ { tag: "3600", value: 3600, result: "1:00:00" }
66+ ];
67+ }
68+
69+ function test_time_formatter(data) {
70+ var audio = findInvisibleChild(previewAudioPlayback, "audio");
71+ compare(audio.lengthToString(data.value), data.result)
72+ }
73+
74+ function test_tracks_data() {
75+ return [
76+ {tag: "0 tracks", tracksModel: tracksModel0},
77+ {tag: "1 track", tracksModel: tracksModel1},
78+ {tag: "3 tracks", tracksModel: tracksModel2}
79+ ];
80+ }
81+
82+ function test_tracks(data) {
83+ previewAudioPlayback.widgetData = data.tracksModel;
84+ waitForRendering(previewAudioPlayback);
85+
86+ var trackRepeater = findChild(previewAudioPlayback, "trackRepeater");
87+ compare(trackRepeater.count, data.tracksModel["tracks"].length)
88+
89+ for (var i = 0; i < data.tracksModel["tracks"].length; ++i) {
90+ var trackItem = findChild(previewAudioPlayback, "trackItem" + i);
91+ var titleLabel = findChild(trackItem, "trackTitleLabel");
92+ compare(titleLabel.text, data.tracksModel["tracks"][i]["title"])
93+ var subtitleLabel = findChild(trackItem, "trackSubtitleLabel");
94+ if (data.tracksModel["tracks"][i]["subtitle"] !== undefined) {
95+ compare(subtitleLabel.text, data.tracksModel["tracks"][i]["subtitle"])
96+ } else {
97+ compare(subtitleLabel.visible, false)
98+ }
99+ // not checking time label because it's formatted, the model only contains seconds
100+ }
101+ }
102+
103+ function checkPlayerSource(index) {
104+ var modelFilename = previewAudioPlayback.widgetData["tracks"][index]["source"].replace(/^.*[\\\/]/, '');
105+ var playerFilename = findInvisibleChild(previewAudioPlayback, "audio").source.toString().replace(/^.*[\\\/]/, '');
106+
107+ compare(modelFilename, playerFilename, "Player source is not set correctly.");
108+ }
109+
110+ function test_playback() {
111+ previewAudioPlayback.widgetData = tracksModel2;
112+ waitForRendering(previewAudioPlayback);
113+
114+ var track0Item = findChild(previewAudioPlayback, "trackItem0");
115+ var track1Item = findChild(previewAudioPlayback, "trackItem1");
116+ var track2Item = findChild(previewAudioPlayback, "trackItem2");
117+
118+ var track0ProgressBar = findChild(track0Item, "progressBarFill");
119+ var track1ProgressBar = findChild(track1Item, "progressBarFill");
120+ var track2ProgressBar = findChild(track2Item, "progressBarFill");
121+
122+ var track0PlayButton = findChild(track0Item, "playButton");
123+ var track1PlayButton = findChild(track1Item, "playButton");
124+ var track2PlayButton = findChild(track2Item, "playButton");
125+
126+ var audio = findInvisibleChild(previewAudioPlayback, "audio");
127+
128+ // All progress bars must be hidden in the beginning
129+ compare(track0ProgressBar.visible, false);
130+ compare(track1ProgressBar.visible, false);
131+ compare(track2ProgressBar.visible, false);
132+
133+ // Playing track 0 should make progress bar 0 visible
134+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
135+
136+ tryCompare(audio, "playbackState", Audio.PlayingState);
137+ checkPlayerSource(0);
138+
139+ tryCompare(track0ProgressBar, "visible", true);
140+ tryCompare(track1ProgressBar, "visible", false);
141+ tryCompare(track2ProgressBar, "visible", false);
142+
143+ // Clicking the button again should pause it. The progress bar should stay visible
144+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
145+ tryCompare(audio, "playbackState", Audio.PausedState);
146+ checkPlayerSource(0);
147+ tryCompare(track0ProgressBar, "visible", true);
148+
149+ // Continue playback
150+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
151+ tryCompare(audio, "playbackState", Audio.PlayingState);
152+ checkPlayerSource(0);
153+
154+ // Playing track 1 should make progress bar 1 visible and hide progress bar 0 again
155+ mouseClick(track1PlayButton, track1PlayButton.width / 2, track1PlayButton.height / 2);
156+
157+ tryCompare(audio, "playbackState", Audio.PlayingState);
158+ checkPlayerSource(1);
159+
160+ tryCompare(track0ProgressBar, "visible", false);
161+ tryCompare(track1ProgressBar, "visible", true);
162+ tryCompare(track2ProgressBar, "visible", false);
163+
164+ // Playing track 2 should make progress bar 1 visible and hide progress bar 0 again
165+ mouseClick(track2PlayButton, track2PlayButton.width / 2, track2PlayButton.height / 2);
166+
167+ tryCompare(audio, "playbackState", Audio.PlayingState);
168+ checkPlayerSource(2);
169+
170+ tryCompare(track0ProgressBar, "visible", false);
171+ tryCompare(track1ProgressBar, "visible", false);
172+ tryCompare(track2ProgressBar, "visible", true);
173+
174+ // Changing preview should make all players shut up!
175+ previewAudioPlayback.isCurrentPreview = false
176+ tryCompare(audio, "playbackState", Audio.StoppedState);
177+ }
178+ }
179+}