You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by pu...@apache.org on 2014/08/19 03:45:49 UTC

[2/2] git commit: Merge renamed tests dir

Merge renamed tests dir


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-media/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-media/commit/22068ff5
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-media/tree/22068ff5
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-media/diff/22068ff5

Branch: refs/heads/master
Commit: 22068ff5c5eb6b1b8867ff0be0eecda8e59b7cb2
Parents: 25083fd a2d16d1
Author: Edna Morales <ed...@ednas-mbp-2.raleigh.ibm.com>
Authored: Wed Aug 13 13:15:59 2014 -0400
Committer: Edna Morales <ed...@ednas-mbp-2.raleigh.ibm.com>
Committed: Wed Aug 13 13:15:59 2014 -0400

----------------------------------------------------------------------
 RELEASENOTES.md  |   5 +
 doc/pl/index.md  |   8 +-
 plugin.xml       |   2 +-
 test/tests.js    | 817 --------------------------------------------------
 tests/plugin.xml |  30 ++
 tests/tests.js   | 817 ++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 857 insertions(+), 822 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-media/blob/22068ff5/tests/tests.js
----------------------------------------------------------------------
diff --cc tests/tests.js
index 0000000,cba8007..7a1e3f8
mode 000000,100644..100644
--- a/tests/tests.js
+++ b/tests/tests.js
@@@ -1,0 -1,764 +1,817 @@@
+ /*
+  *
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *   http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing,
+  * software distributed under the License is distributed on an
+  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  * KIND, either express or implied.  See the License for the
+  * specific language governing permissions and limitations
+  * under the License.
+  *
+  */
+ 
+ exports.defineAutoTests = function () {
+     var failed = function (done, msg, error) {
+         var info = typeof msg == 'undefined' ? 'Unexpected error callback' : msg;
+         expect(true).toFailWithMessage(info + '\n' + JSON.stringify(error));
+         done();
+     };
+ 
+     var succeed = function (done, msg) {
+         var info = typeof msg == 'undefined' ? 'Unexpected success callback' : msg;
+         expect(true).toFailWithMessage(info);
+         done();
+     };
+ 
+     describe('Media', function () {
+ 
+         beforeEach(function () {
+             // Custom Matcher
+             jasmine.Expectation.addMatchers({
+                 toFailWithMessage : function () {
+                     return {
+                         compare : function (error, message) {
+                             var pass = false;
+                             return {
+                                 pass : pass,
+                                 message : message
+                             };
+                         }
+                     };
+                 }
+             });
+         });
+ 
+         it("media.spec.1 should exist", function () {
+             expect(Media).toBeDefined();
+             expect(typeof Media).toBe("function");
+         });
+ 
+         it("media.spec.2 should have the following properties", function () {
+             var media1 = new Media("dummy");
+             expect(media1.id).toBeDefined();
+             expect(media1.src).toBeDefined();
+             expect(media1._duration).toBeDefined();
+             expect(media1._position).toBeDefined();
+             media1.release();
+         });
+ 
+         it("media.spec.3 should define constants for Media status", function () {
+             expect(Media).toBeDefined();
+             expect(Media.MEDIA_NONE).toBe(0);
+             expect(Media.MEDIA_STARTING).toBe(1);
+             expect(Media.MEDIA_RUNNING).toBe(2);
+             expect(Media.MEDIA_PAUSED).toBe(3);
+             expect(Media.MEDIA_STOPPED).toBe(4);
+         });
+ 
+         it("media.spec.4 should define constants for Media errors", function () {
+             expect(MediaError).toBeDefined();
+             expect(MediaError.MEDIA_ERR_NONE_ACTIVE).toBe(0);
+             expect(MediaError.MEDIA_ERR_ABORTED).toBe(1);
+             expect(MediaError.MEDIA_ERR_NETWORK).toBe(2);
+             expect(MediaError.MEDIA_ERR_DECODE).toBe(3);
+             expect(MediaError.MEDIA_ERR_NONE_SUPPORTED).toBe(4);
+         });
+ 
+         it("media.spec.5 should contain a play function", function () {
+             var media1 = new Media();
+             expect(media1.play).toBeDefined();
+             expect(typeof media1.play).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.6 should contain a stop function", function () {
+             var media1 = new Media();
+             expect(media1.stop).toBeDefined();
+             expect(typeof media1.stop).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.7 should contain a seekTo function", function () {
+             var media1 = new Media();
+             expect(media1.seekTo).toBeDefined();
+             expect(typeof media1.seekTo).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.8 should contain a pause function", function () {
+             var media1 = new Media();
+             expect(media1.pause).toBeDefined();
+             expect(typeof media1.pause).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.9 should contain a getDuration function", function () {
+             var media1 = new Media();
+             expect(media1.getDuration).toBeDefined();
+             expect(typeof media1.getDuration).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.10 should contain a getCurrentPosition function", function () {
+             var media1 = new Media();
+             expect(media1.getCurrentPosition).toBeDefined();
+             expect(typeof media1.getCurrentPosition).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.11 should contain a startRecord function", function () {
+             var media1 = new Media();
+             expect(media1.startRecord).toBeDefined();
+             expect(typeof media1.startRecord).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.12 should contain a stopRecord function", function () {
+             var media1 = new Media();
+             expect(media1.stopRecord).toBeDefined();
+             expect(typeof media1.stopRecord).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.13 should contain a release function", function () {
+             var media1 = new Media();
+             expect(media1.release).toBeDefined();
+             expect(typeof media1.release).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.14 should contain a setVolume function", function () {
+             var media1 = new Media();
+             expect(media1.setVolume).toBeDefined();
+             expect(typeof media1.setVolume).toBe('function');
+             media1.release();
+         });
+ 
+         it("media.spec.15 should return MediaError for bad filename", function (done) {
+             var fileName = 'invalid.file.name';
+             //Error callback it has an unexpected behavior under Windows Phone,
+             //it enters to the error callback several times, instead of just one walk-through
+             //JIRA issue related with all details: CB-7092
+             //the conditional statement should be removed once the issue is fixed.
+ 
+             //bb10 dialog pops up, preventing tests from running
+             if (cordova.platformId === 'blackberry10' || cordova.platformId === 'windowsphone') {
+                 expect(true).toFailWithMessage('Platform does not support this feature');
+                 done();
+             } else {
+                 var badMedia = null;
+                 badMedia = new Media(fileName, succeed.bind(null, done, ' badMedia = new Media , Unexpected succees callback, it should not create Media object with invalid file name'), function (result) {
+                         expect(result).toBeDefined();
+                         expect(result.code).toBe(MediaError.MEDIA_ERR_ABORTED);
+                         badMedia.release();
+                         done();
+                     });
+                 badMedia.play();
+             }
+         });
+ 
+         it("media.spec.16 position should be set properly", function (done) {
+             var mediaFile = 'http://cordova.apache.org/downloads/BlueZedEx.mp3',
+             mediaState = Media.MEDIA_STOPPED,
+             successCallback,
+             flag = true,
+             statusChange = function (statusCode) {
+                 if (statusCode == Media.MEDIA_RUNNING && flag) {
+                     //flag variable used to ensure an extra security statement to ensure that the callback is processed only once,
+                     //in case for some reason the statusChange callback is reached more than one time with the same status code.
+                     //Some information about this kind of behavior it can be found at JIRA: CB-7099
+                     flag = false;
+                     setTimeout(function () {
+                         media1.getCurrentPosition(function (position) {
+                             expect(position).toBeGreaterThan(0.0);
+                             media1.stop();
+                             media1.release();
+                             done();
+                         }, failed.bind(null, done, 'media1.getCurrentPosition - Error getting media current position'));
+                     }, 1000);
+                 }
+             };
+             media1 = new Media(mediaFile, successCallback, failed.bind(null, done, 'media1 = new Media - Error creating Media object. Media file: ' + mediaFile), statusChange);
+             media1.play();
+         });
+ 
+         it("media.spec.17 duration should be set properly", function (done) {
+             if (cordova.platformId === 'blackberry10') {
+                 expect(true).toFailWithMessage('Platform does not supported this feature');
+                 done();
+             }
+             var mediaFile = 'http://cordova.apache.org/downloads/BlueZedEx.mp3',
+             mediaState = Media.MEDIA_STOPPED,
+             successCallback,
+             flag = true,
+             statusChange = function (statusCode) {
+                 if (statusCode == Media.MEDIA_RUNNING && flag) {
+                     //flag variable used to ensure an extra security statement to ensure that the callback is processed only once,
+                     //in case for some reason the statusChange callback is reached more than one time with the same status code.
+                     //Some information about this kind of behavior it can be found at JIRA: CB-7099.
+                     flag = false;
+                     setTimeout(function () {
+                         expect(media1.getDuration()).toBeGreaterThan(0.0);
+                         media1.stop();
+                         media1.release();
+                         done();
+                     }, 1000);
+                 }
+             },
+             media1 = new Media(mediaFile, successCallback, failed.bind(null, done, 'media1 = new Media - Error creating Media object. Media file: ' + mediaFile), statusChange);
+             media1.play();
+         });
+     });
+ };
+ 
+ //******************************************************************************************
+ //***************************************Manual Tests***************************************
+ //******************************************************************************************
+ 
+ exports.defineManualTests = function (contentEl, createActionButton) {
+     //-------------------------------------------------------------------------
+     // Audio player
+     //-------------------------------------------------------------------------
+     var media1 = null;
+     var media1Timer = null;
+     var audioSrc = null;
+     var defaultaudio = "http://cordova.apache.org/downloads/BlueZedEx.mp3";
+ 
+     //Play audio function
+     function playAudio(url) {
+         console.log("playAudio()");
+         console.log(" -- media=" + media1);
+ 
+         var src = defaultaudio;
+ 
+         if (url) {
+             src = url;
+         }
+ 
+         // Stop playing if src is different from currently playing source
+         if (src !== audioSrc) {
+             if (media1 !== null) {
+                 stopAudio();
+                 media1 = null;
+             }
+         }
+ 
+         if (media1 === null) {
+ 
+             // TEST STREAMING AUDIO PLAYBACK
+             //var src = "http://nunzioweb.com/misc/Bon_Jovi-Crush_Mystery_Train.mp3";   // works
+             //var src = "http://nunzioweb.com/misc/Bon_Jovi-Crush_Mystery_Train.m3u"; // doesn't work
+             //var src = "http://www.wav-sounds.com/cartoon/bugsbunny1.wav"; // works
+             //var src = "http://www.angelfire.com/fl5/html-tutorial/a/couldyou.mid"; // doesn't work
+             //var src = "MusicSearch/mp3/train.mp3";    // works
+             //var src = "bryce.mp3";  // works
+             //var src = "/android_asset/www/bryce.mp3"; // works
+ 
+             media1 = new Media(src,
+                     function () {
+                     console.log("playAudio():Audio Success");
+                 },
+                     function (err) {
+                     console.log("playAudio():Audio Error: " + err.code);
+                     setAudioStatus("Error: " + err.code);
+                 },
+                     function (status) {
+                     console.log("playAudio():Audio Status: " + status);
+                     setAudioStatus(Media.MEDIA_MSG[status]);
+ 
+                     // If stopped, then stop getting current position
+                     if (Media.MEDIA_STOPPED == status) {
+                         clearInterval(media1Timer);
+                         media1Timer = null;
+                         setAudioPosition("0 sec");
+                     }
+                 });
+         }
+         audioSrc = src;
+         document.getElementById('durationValue').innerHTML = "";
+         // Play audio
+         media1.play();
+         if (media1Timer === null && media1.getCurrentPosition) {
+             media1Timer = setInterval(
+                     function () {
+                     media1.getCurrentPosition(
+                         function (position) {
+                         if (position >= 0.0) {
+                             setAudioPosition(position + " sec");
+                         }
+                     },
+                         function (e) {
+                         console.log("Error getting pos=" + e);
+                         setAudioPosition("Error: " + e);
+                     });
+                 },
+                     1000);
+         }
+ 
+         // Get duration
+         var counter = 0;
+         var timerDur = setInterval(
+                 function () {
+                 counter = counter + 100;
+                 if (counter > 2000) {
+                     clearInterval(timerDur);
+                 }
+                 var dur = media1.getDuration();
+                 if (dur > 0) {
+                     clearInterval(timerDur);
+                     document.getElementById('durationValue').innerHTML = dur + " sec";
+                 }
+             }, 100);
+     }
+ 
+     //Pause audio playback
+     function pauseAudio() {
+         console.log("pauseAudio()");
+         if (media1) {
+             media1.pause();
+         }
+     }
+ 
+     //Stop audio
+     function stopAudio() {
+         console.log("stopAudio()");
+         if (media1) {
+             media1.stop();
+         }
+         clearInterval(media1Timer);
+         media1Timer = null;
+     }
+ 
+     //Release audio
+     function releaseAudio() {
+         console.log("releaseAudio()");
+         if (media1) {
+             media1.stop(); //imlied stop of playback, resets timer
+             media1.release();
+         }
+     }
+ 
+     //Set audio status
+     function setAudioStatus(status) {
+         document.getElementById('statusValue').innerHTML = status;
+     }
+ 
+     //Set audio position
+     function setAudioPosition(position) {
+         document.getElementById('positionValue').innerHTML = position;
+     }
+ 
+     //Seek audio
+     function seekAudio(mode) {
+         var time = document.getElementById("seekInput").value;
+         if (time === "") {
+             time = 5000;
+         } else {
+             time = time * 1000; //we expect the input to be in seconds
+         }
+         if (media1 === null) {
+             console.log("seekTo requested while media1 is null");
+             if (audioSrc === null) {
+                 audioSrc = defaultaudio;
+             }
+             media1 = new Media(audioSrc,
+                     function () {
+                     console.log("seekToAudio():Audio Success");
+                 },
+                     function (err) {
+                     console.log("seekAudio():Audio Error: " + err.code);
+                     setAudioStatus("Error: " + err.code);
+                 },
+                     function (status) {
+                     console.log("seekAudio():Audio Status: " + status);
+                     setAudioStatus(Media.MEDIA_MSG[status]);
+ 
+                     // If stopped, then stop getting current position
+                     if (Media.MEDIA_STOPPED == status) {
+                         clearInterval(media1Timer);
+                         media1Timer = null;
+                         setAudioPosition("0 sec");
+                     }
+                 });
+         }
+ 
+         media1.getCurrentPosition(
+             function (position) {
+             var deltat = time;
+             if (mode === "by") {
+                 deltat = time + position * 1000;
+             }
+             media1.seekTo(deltat,
+                 function () {
+                 console.log("seekAudioTo():Audio Success");
+                 //force an update on the position display
+                 updatePosition();
+             },
+                 function (err) {
+                 console.log("seekAudioTo():Audio Error: " + err.code);
+             });
+         },
+             function (e) {
+             console.log("Error getting pos=" + e);
+             setAudioPosition("Error: " + e);
+         });
+     }
+ 
+     //for forced updates of position after a successful seek
+ 
+     function updatePosition() {
+         media1.getCurrentPosition(
+             function (position) {
+             if (position >= 0.0) {
+                 setAudioPosition(position + " sec");
+             }
+         },
+             function (e) {
+             console.log("Error getting pos=" + e);
+             setAudioPosition("Error: " + e);
+         });
+     }
+ 
+     //-------------------------------------------------------------------------
+     // Audio recorder
+     //-------------------------------------------------------------------------
+     var mediaRec = null;
+     var recTime = 0;
+     var recordSrc = "myRecording.mp3";
+ 
+     //Record audio
+     function recordAudio() {
+         console.log("recordAudio()");
+         console.log(" -- media=" + mediaRec);
+         if (mediaRec == null) {
+             var src = recordSrc;
+             mediaRec = new Media(src,
+                     function () {
+                     console.log("recordAudio():Audio Success");
+                 },
+                     function (err) {
+                     console.log("recordAudio():Audio Error: " + err.code);
+                     setAudioStatus("Error: " + err.code);
+                 },
+                     function (status) {
+                     console.log("recordAudio():Audio Status: " + status);
+                     setAudioStatus(Media.MEDIA_MSG[status]);
+                 });
+         }
+ 
+         // Record audio
+         mediaRec.startRecord();
+ 
+         // Stop recording after 10 sec
+         recTime = 0;
+         var recInterval = setInterval(function () {
+                 recTime = recTime + 1;
+                 setAudioPosition(recTime + " sec");
+                 if (recTime >= 10) {
+                     clearInterval(recInterval);
+                     if (mediaRec.stopAudioRecord) {
+                         mediaRec.stopAudioRecord();
+                     } else {
+                         mediaRec.stopRecord();
+                     }
+                     console.log("recordAudio(): stop");
+                 }
+             }, 1000);
+     }
+ 
+     //Play back recorded audio
+     function playRecording() {
+         playAudio(recordSrc);
+     }
+ 
+     //Function to create a file for iOS recording
+ 
+     function getRecordSrc() {
+         var fsFail = function (error) {
+             console.log("error creating file for iOS recording");
+         };
+         var gotFile = function (file) {
+             recordSrc = file.fullPath;
+             //console.log("recording Src: " + recordSrc);
+         };
+         var gotFS = function (fileSystem) {
+             fileSystem.root.getFile("iOSRecording.wav", {
+                 create : true
+             }, gotFile, fsFail);
+         };
+         window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, gotFS, fsFail);
+     }
+ 
+     //Function to create a file for BB recording
+     function getRecordSrcBB() {
+         var fsFail = function (error) {
+             console.log("error creating file for BB recording");
+         };
+         var gotFile = function (file) {
+             recordSrc = file.fullPath;
+         };
+         var gotFS = function (fileSystem) {
+             fileSystem.root.getFile("BBRecording.amr", {
+                 create : true
+             }, gotFile, fsFail);
+         };
+         window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, gotFS, fsFail);
+     }
+ 
+ //Generate Dynamic Table
+     function generateTable(tableId, rows, cells, elements) {
+         var table = document.createElement('table');
+         for (var r = 0; r < rows; r++) {
+             var row = table.insertRow(r);
+             for (var c = 0; c < cells; c++) {
+                 var cell = row.insertCell(c);
+                 cell.setAttribute("align", "center");
+                 for (var e in elements) {
+                     if (elements[e].position.row == r && elements[e].position.cell == c) {
+                         var htmlElement = document.createElement(elements[e].tag);
+                         var content;
+ 
+                         if (elements[e].content !== "") {
+                             content = document.createTextNode(elements[e].content);
+                             htmlElement.appendChild(content);
+                         }
+                         if (elements[e].type) {
+                             htmlElement.type = elements[e].type;
+                         }
+                         htmlElement.setAttribute("id", elements[e].id);
+                         cell.appendChild(htmlElement);
+                     }
+                 }
+             }
+         }
+         table.setAttribute("align", "center");
+         table.setAttribute("id", tableId);
+         return table;
+     }
+     
+ //Audio && Record Elements
+     var elementsResultsAudio= 
+     [{
+             id : "statusTag",
+             content : "Status:",
+             tag : "div",
+             position : {
+                 row : 0,
+                 cell : 0
+             }
+         }, {
+             id : "statusValue",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 0,
+                 cell : 2
+             }
+         }, {
+             id : "durationTag",
+             content : "Duration:",
+             tag : "div",
+             position : {
+                 row : 1,
+                 cell : 0
+             }
+         }, {
+             id : "durationValue",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 1,
+                 cell : 2
+             }
+         }, {
+             id : "positionTag",
+             content : "Position:",
+             tag : "div",
+             position : {
+                 row : 2,
+                 cell : 0
+             }
+         }, {
+             id : "positionValue",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 2,
+                 cell : 2
+             }
+         }],
+         elementsAudio =
+         [{
+             id : "playBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 0,
+                 cell : 0
+             }
+         }, {
+             id : "pauseBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 0,
+                 cell : 1
+             }
+         }, {
+             id : "stopBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 1,
+                 cell : 0
+             }
+         }, {
+             id : "releaseBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 1,
+                 cell : 1
+             }
+         }, {
+             id : "seekByBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 2,
+                 cell : 0
+             }
+         }, {
+             id : "seekToBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 2,
+                 cell : 1
+             }
+         }, {
+             id : "seekInput",
+             content : "",
+             tag : "input",
+             type : "number",
+             position : {
+                 row : 2,
+                 cell : 2
+             }
+         }
+     ],
+     elementsRecord =
+         [{
+             id : "recordbtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 1,
+                 cell : 0
+             }
+         }, {
+             id : "recordplayBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 1,
+                 cell : 1
+             }
+         }, {
+             id : "recordpauseBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 2,
+                 cell : 0
+             }
+         }, {
+             id : "recordstopBtn",
+             content : "",
+             tag : "div",
+             position : {
+                 row : 2,
+                 cell : 1
+             }
+         }
+     ];
+     
+     //Title audio results
+     var div = document.createElement('h2');
+     div.appendChild(document.createTextNode('Audio'));
+     div.setAttribute("align", "center");
+     contentEl.appendChild(div);
+     //Generate and add results table
+     contentEl.appendChild(generateTable('info', 3, 3, elementsResultsAudio));
+     
+     //Title audio actions
+     div = document.createElement('h2');
+     div.appendChild(document.createTextNode('Actions'));
+     div.setAttribute("align", "center");
+     contentEl.appendChild(div);
+     //Generate and add buttons table
+     contentEl.appendChild(generateTable('audioActions', 3, 3, elementsAudio));
+     createActionButton('Play', function () {
+         playAudio();
+     }, 'playBtn');
+     createActionButton('Pause', function () {
+         pauseAudio();
+     }, 'pauseBtn');
+     createActionButton('Stop', function () {
+         stopAudio();
+     }, 'stopBtn');
+     createActionButton('Release', function () {
+         releaseAudio();
+     }, 'releaseBtn');
+     createActionButton('Seek By', function () {
+         seekAudio('by');
+     }, 'seekByBtn');
+     createActionButton('Seek To', function () {
+         seekAudio('to');
+     }, 'seekToBtn');
+     //get Special path to record if iOS || Blackberry
+     if (cordova.platformId === 'ios')
+         getRecordSrc();
+     else
+         if (cordova.platformId === 'blackberry')
+             getRecordSrcBB();
++
++    //testing process and details
++    function addItemToList(_list, _text)
++    {
++        var item = document.createElement('li');
++        item.appendChild(document.createTextNode(_text));
++        _list.appendChild(item);
++    }
++
++    div = document.createElement('h4');
++    div.appendChild(document.createTextNode('Recommended Test Procedure'));
++    contentEl.appendChild(div);
++
++    var list = document.createElement('ol');
++    addItemToList(list, 'Press play - Will start playing audio. Status: Running, Duration: 61.333 sec, Position: Current position of audio track');
++    addItemToList(list, 'Press pause - Will pause the audio. Status: Paused, Duration: 61.333 sec, Position: Position where track was paused');
++    addItemToList(list, 'Press play - Will begin playing where track left off from the pause');
++    addItemToList(list, 'Press stop - Will stop the audio. Status: Stopped, Duration: 61.333 sec, Position: 0 sec');
++    addItemToList(list, 'Press play - Will begin playing the audio track from the beginning');
++    addItemToList(list, 'Press release - Will stop the audio. Status: Stopped, Duration: 61.333 sec, Position: 0 sec');
++    addItemToList(list, 'Press play - Will begin playing the audio track from the beginning');
++    addItemToList(list, 'Type 10 in the text box beside Seek To button');
++    addItemToList(list, 'Press seek by - Will jump 10 seconds ahead in the audio track. Position: should jump by 10 sec');
++    addItemToList(list, 'Press stop if track is not already stopped');
++    addItemToList(list, 'Type 30 in the text box beside Seek To button');
++    addItemToList(list, 'Press play then seek to - Should jump to Position 30 sec');
++    addItemToList(list, 'Press stop');
++    addItemToList(list, 'Type 5 in the text box beside Seek To button');
++    addItemToList(list, 'Press play, let play past 10 seconds then press seek to - should jump back to position 5 sec');
++
++    div = document.createElement('div');
++    div.setAttribute("style", "background:#B0C4DE;border:1px solid #FFA07A;margin:15px 6px 0px;min-width:295px;max-width:97%;padding:4px 0px 2px 10px;min-height:160px;max-height:200px;overflow:auto");
++    div.appendChild(list);
++    contentEl.appendChild(div);
+     
+     //Title Record Audio
+     div = document.createElement('h2');
+     div.appendChild(document.createTextNode('Record Audio'));
+     div.setAttribute("align", "center");
+     contentEl.appendChild(div);
+     //Generate and add Record buttons table
+     contentEl.appendChild(generateTable('recordContent', 3, 3, elementsRecord));
+     createActionButton('Record Audio \n 10 sec', function () {
+         recordAudio();
+     }, 'recordbtn');
+     createActionButton('Play', function () {
+         playRecording();
+     }, 'recordplayBtn');
+     createActionButton('Pause', function () {
+         pauseAudio();
+     }, 'recordpauseBtn');
+     createActionButton('Stop', function () {
+         stopAudio();
+     }, 'recordstopBtn');
++
++    //testing process and details
++    div = document.createElement('h4');
++    div.appendChild(document.createTextNode('Recommended Test Procedure'));
++    contentEl.appendChild(div);
++
++    list = document.createElement('ol');
++    addItemToList(list, 'Press Record Audio 10 sec - Will start recording audio for 10 seconds. Status: Running, Position: number of seconds recorded (will stop at 10)');
++    addItemToList(list, 'Status will change to Stopped when finished recording');
++    addItemToList(list, 'Press play - Will begin playing the recording. Status: Running, Duration: # of seconds of recording, Position: Current position of recording');
++    addItemToList(list, 'Press stop - Will stop playing the recording. Status: Stopped, Duration: # of seconds of recording, Position: 0 sec');
++    addItemToList(list, 'Press play - Will begin playing the recording from the beginning');
++    addItemToList(list, 'Press pause - Will pause the playback of the recording. Status: Paused, Duration: # of seconds of recording, Position: Position where recording was paused');
++    addItemToList(list, 'Press play - Will begin playing the recording from where it was paused');
++
++    div = document.createElement('div');
++    div.setAttribute("style", "background:#B0C4DE;border:1px solid #FFA07A;margin:15px 6px 0px;min-width:295px;max-width:97%;padding:4px 0px 2px 10px;min-height:160px;max-height:200px;overflow:auto");
++    div.appendChild(list);
++    contentEl.appendChild(div);
+ };