OLD | NEW |
---|---|
(Empty) | |
1 <!doctype html> | |
2 <html> | |
3 <head> | |
4 <title>Test decodeAudioData promises</title> | |
5 | |
6 <script src="../resources/js-test.js"></script> | |
7 <script src="resources/compatibility.js"></script> | |
8 <script src="resources/audio-testing.js"></script> | |
9 </head> | |
10 | |
11 <body> | |
12 <script> | |
13 description("Basic tests for decodeAudioData promise."); | |
14 | |
15 window.jsTestIsAsync = true; | |
16 | |
17 var context = new AudioContext(); | |
18 // Test files for decodeAudioData | |
19 var validAudioFile = "resources/media/24bit-44khz.wav"; | |
20 var invalidAudioFile = "resources/media/invalid-audio-file.txt"; | |
21 | |
22 // Decoded data from validAudioFile | |
23 var referenceDecodedAudioBuffer; | |
24 // Encoded audio data for testing decodeAudioData after the context has been closed. | |
25 var encodedAudioData; | |
26 // Decoded data from decodeAudioData after the context has been closed. | |
27 var decodedAudioBufferAfterClose; | |
28 | |
29 // Utility to load an encoded audio file from |url| and decode it. |success | and |failure| are | |
30 // functions to handle the then and else cases of the promise returned by de codeAudioData. | |
31 function runDecode(url, success, failure, done) { | |
32 var request = new XMLHttpRequest(); | |
33 request.open("GET", url, true); | |
34 request.responseType = "arraybuffer"; | |
35 | |
36 request.onload = function () { | |
37 context.decodeAudioData(request.response) | |
38 .then(success, failure) | |
39 .then(done); | |
40 }; | |
41 | |
42 request.send(); | |
43 } | |
44 | |
45 // Compare that two audio buffers are the same | |
46 function audioBuffersCompareEqual(actualBuffer, expectedBuffer) { | |
47 if (actualBuffer.length != expectedBuffer.length) { | |
48 testFailed("Decoded buffer length is " + actualBuffer.length + ", but ex pected " + expectedBuffer.length); | |
49 return false; | |
50 } | |
51 | |
52 if (actualBuffer.duration != expectedBuffer.duration) { | |
53 testFailed("Decoded buffer duration is " + actualBuffer.duration + ", bu t expected " + expectedBuffer.duration); | |
54 return false; | |
55 } | |
56 | |
57 if (actualBuffer.sampleRate != expectedBuffer.sampleRate) { | |
58 //testFailed("Decoded buffer rate is " + actualBuffer.sampleRate + ", bu t expected " + expectedBuffer.sampleRate); | |
59 return false; | |
60 } | |
61 | |
62 if (actualBuffer.numberOfChannels != expectedBuffer.numberOfChannels) { | |
63 //testFailed("Decoded buffer has " + actualBuffer.numberOfChannels + "ch annels , but expected " + expectedBuffer.numberOfChannels); | |
64 return false; | |
65 } | |
66 | |
67 for (var c = 0; c < expectedBuffer.numberOfChannels; ++c) { | |
68 var actualData = actualBuffer.getChannelData(c); | |
69 var expectedData = expectedBuffer.getChannelData(c); | |
70 for (var k = 0; k < expectedData.length; ++k) { | |
71 if (actualData[k] != expectedData[k]) { | |
72 //testFailed("Decoded buffer differs from expected at channel " + c + " frame " + k + ": " + actualData[k] + ", expected " + expectedData[k]); | |
73 return false; | |
74 } | |
75 } | |
76 } | |
77 | |
78 return true; | |
79 } | |
80 | |
81 // Tests | |
82 var audit = Audit.createTaskRunner(); | |
83 | |
84 // Test that a null audioBuffer causes the promise to be rejected with an In validStateError. | |
85 audit.defineTask("null-audiobuffer", function (done) { | |
86 context.decodeAudioData(null).then(function () { | |
87 testFailed("decodeAudioData(null) incorrectly resolved promise successfu lly."); | |
88 }, function (e) { | |
89 testPassed("decodeAudioData(null) correctly rejected promise: " + e.toSt ring()); | |
90 }).then(done); | |
91 }); | |
92 | |
93 // Decode a valid encoded file and verify that the promise succeeds correctl y. | |
94 audit.defineTask('decode-valid-file', function (done) { | |
95 var url = validAudioFile; | |
96 runDecode(url, | |
97 function (buffer) { | |
98 // Save the buffer for later testing. | |
99 referenceDecodedAudioBuffer = buffer; | |
100 testPassed("Correctly succeeded in decoding " + url); | |
101 }, | |
102 function (e) { | |
103 testFailed("Incorrectly failed to decode " + url + ": " + e.toString() ); | |
104 }, done); | |
105 }); | |
106 | |
107 // Decode a valid encoded file and verify that the promise is rejected corre ctly. | |
108 audit.defineTask("decode-invalid-file", function (done) { | |
109 var url = invalidAudioFile; | |
110 runDecode(url, | |
111 function (buffer) { | |
112 testFailed("Incorrectly succeeded in decoding " + url); | |
113 }, | |
114 function (e) { | |
115 testPassed("Correctly failed to decode " + url + ": " + e.toString()); | |
116 }, done); | |
117 }); | |
118 | |
119 // Decode a valid file and verify that the promise is fulfilled and the succ essCallback is | |
120 // invoked and both have identical decode audio buffers. | |
121 audit.defineTask("promise-and-success-callback", function (done) { | |
122 var request = new XMLHttpRequest(); | |
123 request.open("GET", validAudioFile, true); | |
124 request.responseType = "arraybuffer"; | |
125 | |
126 request.onload = function () { | |
127 var p; | |
128 var prefix = "Decoding valid file: "; | |
129 p = context.decodeAudioData(request.response, | |
yhirano
2015/04/10 04:55:23
context.decodeAudioData(request.response, function
Raymond Toy
2015/04/10 21:00:45
Done.
| |
130 function (callbackBuffer) { | |
131 p.then(function (promiseBuffer) { | |
132 if (promiseBuffer == callbackBuffer) | |
133 testPassed(prefix + "Promise and successCallback succeeded with identical buffers"); | |
134 else | |
135 testFailed(prefix + "Promise and successCallback succeeded with NON-identical buffers"); | |
136 }).then(done); | |
137 }, | |
138 function (e) { | |
139 p.then(function () { | |
140 testFailed(prefix + "Promise fulfilled but errorCallback invoked!! !"); | |
141 }, function () { | |
142 testFailed(prefix + "Expected decoding to succeed but promise reje cted and errorCallback invoked:" + e); | |
143 }).then(done); | |
144 }); | |
145 }; | |
146 | |
147 request.send(); | |
148 }); | |
149 | |
150 // Decode an invalid file and verify that the promise is rejected and the er rorCallback is | |
151 // invoked. | |
152 audit.defineTask("promise-and-error-callback", function (done) { | |
153 var request = new XMLHttpRequest(); | |
154 request.open("GET", invalidAudioFile, true); | |
155 request.responseType = "arraybuffer"; | |
156 | |
157 request.onload = function () { | |
158 var p; | |
159 var prefix = "Decoding invalid file: "; | |
160 p = context.decodeAudioData(request.response, | |
yhirano
2015/04/10 04:55:23
context.decodeAudioData(request.response, function
Raymond Toy
2015/04/10 21:00:45
Done.
| |
161 function () { | |
162 p.then(function () { | |
163 testFailed(prefix + "Expected decoding to fail but promise fulfill ed and successCallback invoked!!!"); | |
164 }, function (e) { | |
165 testFailed(prefix + "Expected decoding to fail but promise rejecte d and successCallback invoked:" + e + "!!!"); | |
166 }).then(done); | |
167 }, | |
168 function () { | |
169 p.then(function () { | |
170 testFailed(prefix + "Promise erroneously fulfilled but errorCallba ck correctly invoked!!!"); | |
171 }, function (e) { | |
172 testPassed(prefix + "Promise correctly rejected and errorCallback correctly invoked: " + e); | |
173 }).then(done); | |
174 }); | |
175 }; | |
176 | |
177 request.send(); | |
178 }); | |
179 | |
180 // Just load up a file so we can run decodeAudioData on it | |
181 audit.defineTask("load-data", function (done) { | |
182 var request = new XMLHttpRequest(); | |
183 request.open("GET", validAudioFile, true); | |
184 request.responseType = "arraybuffer"; | |
185 | |
186 request.onload = function () { | |
187 encodedAudioData = request.response; | |
188 done(); | |
189 }; | |
190 | |
191 request.send(); | |
192 }); | |
193 | |
194 // If the context is closing before decodeAudioData has finished decoding, w e should reject the | |
195 // promise from decodeAudioData. | |
196 audit.defineTask("close-context-with-pending-decode", function (done) { | |
197 context.close() | |
yhirano
2015/04/10 04:55:23
You don't need nested |then|.
context.clonse().th
Raymond Toy
2015/04/10 21:00:45
Done.
| |
198 .then(function () { | |
199 context.decodeAudioData(encodedAudioData).then(function (b) { | |
200 decodedAudioBufferAfterClose = b; | |
201 // Compare this buffer with the previously decoded buffer. Pass i f they're identical. | |
202 if (audioBuffersCompareEqual(decodedAudioBufferAfterClose, referen ceDecodedAudioBuffer)) { | |
203 testPassed("Correctly decoded data after the context has been cl osed"); | |
204 } else { | |
205 testFailed("decodeAudioData succeeded, but data is incorrect"); | |
206 } | |
207 }, function (e) { | |
208 testFailed("Failed to decode valid file after context has been clo sed: " + e); | |
209 }).then(done); | |
210 }); | |
211 }); | |
212 | |
213 audit.defineTask("finish", function (done) { | |
214 finishJSTest(); | |
215 done(); | |
216 }); | |
217 | |
218 audit.runTasks( | |
219 "null-audiobuffer", | |
220 "decode-valid-file", | |
221 "decode-invalid-file", | |
222 "promise-and-success-callback", | |
223 "promise-and-error-callback", | |
224 "load-data", | |
225 "close-context-with-pending-decode", | |
226 "finish" | |
227 ); | |
228 | |
229 successfullyParsed = true; | |
230 </script> | |
231 </body> | |
232 </html> | |
OLD | NEW |