cordova-ubuntu-tests-2.11+14.04.20140130.3/0000755000015000001560000000000012272510677020247 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/0000755000015000001560000000000012272510677021073 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/benchmarks/0000755000015000001560000000000012272510677023210 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/benchmarks/arraybuffer.html0000644000015000001560000001100412272510571026373 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

ArrayBuffer Benchmark

Settings

 

Back
Results:

  

cordova-ubuntu-tests-2.11+14.04.20140130.3/www/benchmarks/autobench.html0000644000015000001560000001606312272510571026045 0ustar  pbuserpbgroup00000000000000


  
    
     
    Cordova Mobile Spec
    
          
    
    


  
  
    

Auto-Benchmarks

Name Results
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/benchmarks/uubench.js0000644000015000001560000000503712272510571025175 0ustar pbuserpbgroup00000000000000// // uubench - Async Benchmarking v0.0.1 // http://github.com/akdubya/uubench // // Copyright (c) 2010, Aleksander Williams // Released under the MIT License. // (function(uubench){ function Bench(id, test, options, callback) { this.id = id; this.options = options; this.test = test; this.loop = test.length > 1; this.callback = callback; } Bench.prototype.run = function(iter) { var self = this, fn = self.test, checkfn = self.options.type === "adaptive" ? adaptive : fixed, i = iter, pend = i, min = self.options.min, start; if (self.loop) { pend = 1; start = new Date(); fn(checkfn, i); } else { start = new Date(); while (i--) { fn(checkfn); } } function fixed() { if (--pend === 0) { var elapsed = new Date() - start; self.callback({iterations: iter, elapsed: elapsed}); } } function adaptive() { if (--pend === 0) { var elapsed = new Date() - start; if (elapsed < min) { self.run(iter*2); } else { self.callback({iterations: iter, elapsed: elapsed}); } } } } uubench.Bench = Bench; uubench.defaults = { type: "adaptive", // adaptive or fixed iterations: 10, // starting iterations min: 100, // minimum run time (ms) - adaptive only delay: 100 // delay between tests (ms) } function Suite(opts) { for (var key in uubench.defaults) { if (opts[key] === undefined) { opts[key] = uubench.defaults[key]; } } this.options = opts; this.tests = []; } Suite.prototype.bench = function(name, fn) { var self = this; self.tests.push(new Bench(name, fn, this.options, function(stats) { self.emit("result", name, stats); self.pending--; self.check(); })); } Suite.prototype.run = function() { if (this.pending) return; var self = this, len = self.tests.length; self.emit("start", self.tests); self.start = new Date().getTime(); self.pending = len; for (var i=0; i Cordova Mobile Spec AutoBench ArrayBuffer Benchmark

exec() Benchmark

Before running on Android, set the following constants in NativeToJsMessagingBridge:
Settings



 

Back
Results: Clear

  
      
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/location/0000755000015000001560000000000012272510677022703 5ustar  pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/location/index.html0000644000015000001560000001525112272510571024675 0ustar  pbuserpbgroup00000000000000




  
    
     
    Cordova Mobile Spec
    
          

      


  
  
  
    

Location

Status: Stopped
Latitude: 
Longitude: 
Altitude: 
Accuracy: 
Heading: 
Speed: 
Altitude Accuracy: 
Time: 

Action

Use Built-in WebView navigator.geolocation

Get Location Start Watching Location Stop Watching Location Get Location Up to 30 Seconds Old

USe Cordova Geolocation Plugin

Get Location Start Watching Location Stop Watching Location Get Location Up to 30 Seconds Old

 

Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/0000755000015000001560000000000012272510677026036 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/www/0000755000015000001560000000000012272510677026662 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/www/whitelist.js0000644000015000001560000000243512272510571031231 0ustar pbuserpbgroup00000000000000/* * * 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. * */ var argscheck = require('cordova/argscheck'), exec = require('cordova/exec'); module.exports = { match: function(url, patterns, callback) { //argscheck.checkArgs('fF', 'Whitelist.match', arguments); exec(callback, callback, "WhitelistAPI", "URLMatchesPatterns", [url, patterns]); }, test: function(url, callback) { //argscheck.checkArgs('fF', 'Whitelist.test', arguments); exec(callback, callback, "WhitelistAPI", "URLIsAllowed", [url]); } } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/README.md0000644000015000001560000000030412272510571027303 0ustar pbuserpbgroup00000000000000cordova-plugin-whitelist ------------------------ This is an optional JavaScript interface to the core Cordova Whitelist functionality. It is currently used by Mobile Spec to test the whitelist. cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/0000755000015000001560000000000012272510677027015 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/cordova-incl.js0000644000015000001560000000527012272510571031730 0ustar pbuserpbgroup00000000000000/* * * 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. * */ var PLAT; (function getPlatform() { var platforms = { android: /Android/, ios: /(iPad)|(iPhone)|(iPod)/, blackberry10: /(BB10)/, blackberry: /(PlayBook)|(BlackBerry)/, windows8: /MSAppHost/, windowsphone: /Windows Phone/ }; for (var key in platforms) { if (platforms[key].exec(navigator.userAgent)) { PLAT = key; break; } } })(); var scripts = document.getElementsByTagName('script'); var currentPath = scripts[scripts.length - 1].src; var platformCordovaPath = currentPath.replace("cordova-incl.js", "cordova." + PLAT + ".js"); var normalCordovaPath = currentPath.replace("cordova-incl.js", "cordova.js"); var cordovaPath = normalCordovaPath; if (PLAT) { // XHR to local file is an error on some platforms, windowsphone for one try { var xhr = new XMLHttpRequest(); xhr.open("GET", platformCordovaPath, false); xhr.onreadystatechange = function() { if (this.readyState == this.DONE && this.responseText.length > 0) { if(parseInt(this.status) >= 400){ cordovaPath = normalCordovaPath; }else{ cordovaPath = platformCordovaPath; } } }; xhr.send(null); } catch(e){ cordovaPath = normalCordovaPath; } // access denied! } if (!window._doNotWriteCordovaScript) { if (PLAT != "windows8") { document.write(''); } else { var s = document.createElement('script'); s.src = cordovaPath; document.head.appendChild(s); } } function backHome() { if (window.device && device.platform && device.platform.toLowerCase() == 'android') { navigator.app.backHistory(); } else { window.history.go(-1); } } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/master.css0000644000015000001560000000641312272510571031017 0ustar pbuserpbgroup00000000000000/* * * 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. * */ body { background:#222 none repeat scroll 0 0; color:#666; font-family:Helvetica; font-size:72%; line-height:1.5em; margin:0; border-top:1px solid #393939; } #info{ background:#ffa; border: 1px solid #ffd324; -webkit-border-radius: 5px; border-radius: 5px; clear:both; margin:15px 6px 0; min-width:295px; max-width:97%; padding:4px 0px 2px 10px; word-wrap:break-word; margin-bottom:10px; display:inline-block; min-height: 160px; max-height: 300px; overflow: auto; -webkit-overflow-scrolling: touch; } #info > h4{ font-size:.95em; margin:5px 0; } #stage.theme{ padding-top:3px; } /* Definition List */ #stage.theme > dl{ padding-top:10px; clear:both; margin:0; list-style-type:none; padding-left:10px; overflow:auto; } #stage.theme > dl > dt{ font-weight:bold; float:left; margin-left:5px; } #stage.theme > dl > dd{ width:45px; float:left; color:#a87; font-weight:bold; } /* Content Styling */ #stage.theme > h1, #stage.theme > h2, #stage.theme > p{ margin:1em 0 .5em 13px; } #stage.theme > h1{ color:#eee; font-size:1.6em; text-align:center; margin:0; margin-top:15px; padding:0; } #stage.theme > h2{ clear:both; margin:0; padding:3px; font-size:1em; text-align:center; } /* Stage Buttons */ #stage.theme .btn{ border: 1px solid #555; -webkit-border-radius: 5px; border-radius: 5px; text-align:center; display:inline-block; background:#444; width:150px; color:#9ab; font-size:1.1em; text-decoration:none; padding:1.2em 0; margin:3px 0px 3px 5px; } #stage.theme .large{ width:308px; padding:1.2em 0; } #stage.theme .wide{ width:100%; padding:1.2em 0; } #stage.theme .backBtn{ border: 1px solid #555; -webkit-border-radius: 5px; border-radius: 5px; text-align:center; display:block; float:right; background:#666; width:75px; color:#9ab; font-size:1.1em; text-decoration:none; padding:1.2em 0; margin:3px 5px 3px 5px; } #stage.theme .input{ border: 1px solid #555; -webkit-border-radius: 5px; border-radius: 5px; text-align:center; display:block; float:light; background:#888; color:#9cd; font-size:1.1em; text-decoration:none; padding:1.2em 0; margin:3px 0px 3px 5px; } #stage.theme .numeric{ width:100%; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/main.js0000644000015000001560000001172712272510571030300 0ustar pbuserpbgroup00000000000000/* * * 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. * */ var deviceInfo = function() { document.getElementById("platform").innerHTML = device.platform; document.getElementById("version").innerHTML = device.version; document.getElementById("uuid").innerHTML = device.uuid; document.getElementById("model").innerHTML = device.model; document.getElementById("width").innerHTML = screen.width; document.getElementById("height").innerHTML = screen.height; document.getElementById("colorDepth").innerHTML = screen.colorDepth; }; var getLocation = function() { var suc = function(p) { alert(p.coords.latitude + " " + p.coords.longitude); }; var locFail = function() { }; navigator.geolocation.getCurrentPosition(suc, locFail); }; var beep = function() { navigator.notification.beep(2); }; var vibrate = function() { navigator.notification.vibrate(0); }; function roundNumber(num) { var dec = 3; var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec); return result; } var accelerationWatch = null; function updateAcceleration(a) { document.getElementById('x').innerHTML = roundNumber(a.x); document.getElementById('y').innerHTML = roundNumber(a.y); document.getElementById('z').innerHTML = roundNumber(a.z); } var toggleAccel = function() { if (accelerationWatch !== null) { navigator.accelerometer.clearWatch(accelerationWatch); updateAcceleration({ x : "", y : "", z : "" }); accelerationWatch = null; } else { var options = {}; options.frequency = 1000; accelerationWatch = navigator.accelerometer.watchAcceleration( updateAcceleration, function(ex) { alert("accel fail (" + ex.name + ": " + ex.message + ")"); }, options); } }; var preventBehavior = function(e) { e.preventDefault(); }; function dump_pic(data) { var viewport = document.getElementById('viewport'); console.log(data); viewport.style.display = ""; viewport.style.position = "absolute"; viewport.style.top = "10px"; viewport.style.left = "10px"; document.getElementById("test_img").src = "data:image/jpeg;base64," + data; } function fail(msg) { alert(msg); } function show_pic() { navigator.camera.getPicture(dump_pic, fail, { quality : 50 }); } function close() { var viewport = document.getElementById('viewport'); viewport.style.position = "relative"; viewport.style.display = "none"; } // This is just to do this. function readFile() { navigator.file.read('/sdcard/cordova.txt', fail, fail); } function writeFile() { navigator.file.write('foo.txt', "This is a test of writing to a file", fail, fail); } function contacts_success(contacts) { alert(contacts.length + ' contacts returned.' + (contacts[2] && contacts[2].name ? (' Third contact is ' + contacts[2].name.formatted) : '')); } function get_contacts() { var obj = new ContactFindOptions(); obj.filter = ""; obj.multiple = true; obj.limit = 5; navigator.service.contacts.find( [ "displayName", "name" ], contacts_success, fail, obj); } var networkReachableCallback = function(reachability) { // There is no consistency on the format of reachability var networkState = reachability.code || reachability; var currentState = {}; currentState[NetworkStatus.NOT_REACHABLE] = 'No network connection'; currentState[NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK] = 'Carrier data connection'; currentState[NetworkStatus.REACHABLE_VIA_WIFI_NETWORK] = 'WiFi connection'; confirm("Connection type:\n" + currentState[networkState]); }; function check_network() { navigator.network.isReachable("www.mobiledevelopersolutions.com", networkReachableCallback, {}); } function init() { // the next line makes it impossible to see Contacts on the HTC Evo since it // doesn't have a scroll button // document.addEventListener("touchmove", preventBehavior, false); document.addEventListener("deviceready", deviceInfo, true); document.getElementById("user-agent").textContent = navigator.userAgent; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/index.html0000644000015000001560000000604012272510571031003 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Apache Cordova Tests

Platform:

Version:

UUID:

Model:

Width: , Height: , Color Depth:

User-Agent:

Automatic Test Accelerometer Audio Play/Record Battery Camera Compass Contacts Events Location Lazy Loading of cordova-incl.js Misc Content Network Notification Splashscreen Web SQL Local Storage Benchmarks In App Browser cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/0000755000015000001560000000000012272510677030665 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/jasmine.css0000644000015000001560000001445412272510571033026 0ustar pbuserpbgroup00000000000000body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } #HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } #HTMLReporter a { text-decoration: none; } #HTMLReporter a:hover { text-decoration: underline; } #HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } #HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } #HTMLReporter #jasmine_content { position: fixed; right: 100%; } #HTMLReporter .version { color: #aaaaaa; } #HTMLReporter .banner { margin-top: 14px; } #HTMLReporter .duration { color: #aaaaaa; float: right; } #HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } #HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } #HTMLReporter .symbolSummary li.passed { font-size: 14px; } #HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } #HTMLReporter .symbolSummary li.failed { line-height: 9px; } #HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } #HTMLReporter .symbolSummary li.skipped { font-size: 14px; } #HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } #HTMLReporter .symbolSummary li.pending { line-height: 11px; } #HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } #HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } #HTMLReporter .runningAlert { background-color: #666666; } #HTMLReporter .skippedAlert { background-color: #aaaaaa; } #HTMLReporter .skippedAlert:first-child { background-color: #333333; } #HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } #HTMLReporter .passingAlert { background-color: #a6b779; } #HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } #HTMLReporter .failingAlert { background-color: #cf867e; } #HTMLReporter .failingAlert:first-child { background-color: #b03911; } #HTMLReporter .results { margin-top: 14px; } #HTMLReporter #details { display: none; } #HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } #HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } #HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } #HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } #HTMLReporter.showDetails .summary { display: none; } #HTMLReporter.showDetails #details { display: block; } #HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } #HTMLReporter .summary { margin-top: 14px; } #HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } #HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } #HTMLReporter .summary .specSummary.failed a { color: #b03911; } #HTMLReporter .description + .suite { margin-top: 0; } #HTMLReporter .suite { margin-top: 14px; } #HTMLReporter .suite a { color: #333333; } #HTMLReporter #details .specDetail { margin-bottom: 28px; } #HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } #HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } #HTMLReporter .resultMessage span.result { display: block; } #HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } #TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } #TrivialReporter a:visited, #TrivialReporter a { color: #303; } #TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } #TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } #TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } #TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } #TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } #TrivialReporter .runner.running { background-color: yellow; } #TrivialReporter .options { text-align: right; font-size: .8em; } #TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } #TrivialReporter .suite .suite { margin: 5px; } #TrivialReporter .suite.passed { background-color: #dfd; } #TrivialReporter .suite.failed { background-color: #fdd; } #TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } #TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } #TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } #TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } #TrivialReporter .spec.skipped { background-color: #bbb; } #TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } #TrivialReporter .passed { background-color: #cfc; display: none; } #TrivialReporter .failed { background-color: #fbb; } #TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } #TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } #TrivialReporter .resultMessage .mismatch { color: black; } #TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } #TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } #TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } #TrivialReporter #jasmine_content { position: fixed; right: 100%; } #TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/tests/0000755000015000001560000000000012272510677032027 5ustar pbuserpbgroup00000000000000././@LongLink0000000000000000000000000000015700000000000011220 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/tests/whitelist.tests.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/tests/whitelis0000644000015000001560000001740012272510571033575 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Whitelist API (cordova.whitelist)', function () { it("should exist", function() { expect(cordova.whitelist).toBeDefined(); }); describe("Match function", function() { function expectMatchWithResult(result) { return (function(url, patterns, description) { description = description || ((result ? "should accept " : "should reject ") + url + " for " + JSON.stringify(patterns)); it(description, function() { var cb = jasmine.createSpy(); runs(function() { cordova.whitelist.match(url, patterns, cb); }); waitsFor(function() { return cb.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(cb).toHaveBeenCalledWith(result); }); }); }); } var itShouldMatch = expectMatchWithResult(true); var itShouldNotMatch = expectMatchWithResult(false); it("should exist", function() { expect(cordova.whitelist.match).toBeDefined(); expect(typeof cordova.whitelist.match).toBe("function"); }); itShouldMatch('http://www.apache.org/',['*'], "should accept any domain for *"); itShouldNotMatch('http://www.apache.org/',[], "should not accept any domain for []"); itShouldMatch('http://apache.org/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/some/path', ['http://*.apache.org']); itShouldMatch('http://some.domain.under.apache.org/', ['http://*.apache.org']); itShouldMatch('http://user:pass@apache.org/', ['http://*.apache.org']); itShouldMatch('http://user:pass@www.apache.org/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/?some=params', ['http://*.apache.org']); itShouldNotMatch('http://apache.com/', ['http://*.apache.org']); itShouldNotMatch('http://www.evil.com/?url=www.apache.org', ['http://*.apache.org']); itShouldNotMatch('http://www.evil.com/?url=http://www.apache.org', ['http://*.apache.org']); itShouldNotMatch('http://www.evil.com/?url=http%3A%2F%2Fwww%2Eapache%2Eorg', ['http://*.apache.org']); itShouldNotMatch('https://apache.org/', ['http://*.apache.org']); itShouldNotMatch('http://www.apache.org:pass@evil.com/', ['http://*.apache.org']); itShouldNotMatch('http://www.apache.org.evil.com/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/',['http://*.apache.org','https://*.apache.org']); itShouldMatch('https://www.apache.org/',['http://*.apache.org','https://*.apache.org']); itShouldNotMatch('ftp://www.apache.org/',['http://*.apache.org','https://*.apache.org']); itShouldNotMatch('http://www.apache.com/',['http://*.apache.org','https://*.apache.org']); itShouldMatch('http://www.apache.org/',['http://www.apache.org']); itShouldNotMatch('http://build.apache.org/',['http://www.apache.org']); itShouldNotMatch('http://apache.org/',['http://www.apache.org']); itShouldMatch('http://www.apache.org/', ['http://*/*']); itShouldMatch('http://www.apache.org/foo/bar.html', ['http://*/*']); itShouldMatch('http://www.apache.org/foo', ['http://*/foo*']); itShouldMatch('http://www.apache.org/foo/bar.html', ['http://*/foo*']); itShouldNotMatch('http://www.apache.org/', ['http://*/foo*']); itShouldMatch('file:///foo', ['file:///*']); itShouldMatch('file:///foo', ['file:///foo*']); itShouldMatch('file:///foo/bar.html', ['file:///foo*']); itShouldNotMatch('file:///etc/foo', ['file:///foo*']); itShouldNotMatch('http://www.apache.org/foo', ['file:///foo*']); itShouldMatch('http://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('https://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('ftp://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('file://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('content://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('foo://www.apache.org/', ['*://www.apache.org/*']); itShouldNotMatch('http://www.apache.com/', ['*://www.apache.org/*']); itShouldMatch('http://www.apache.org/', ['*.apache.org']); itShouldMatch('https://www.apache.org/', ['*.apache.org']); itShouldNotMatch('ftp://www.apache.org/', ['*.apache.org']); itShouldMatch('http://www.apache.org:81/', ['http://www.apache.org:81/*']); itShouldMatch('http://user:pass@www.apache.org:81/foo/bar.html', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:80/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:foo/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:81@www.apache.org/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:81@www.evil.com/', ['http://www.apache.org:81/*']); }); describe("Test function", function() { function expectTestWithResult(result) { return (function(url, description) { description = description || ((result ? "should accept " : "should reject ") + url); it(description, function() { var cb = jasmine.createSpy(); runs(function() { cordova.whitelist.test(url, cb); }); waitsFor(function() { return cb.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(cb).toHaveBeenCalledWith(result); }); }); }); } var itShouldAccept = expectTestWithResult(true); var itShouldReject = expectTestWithResult(false); it("should exist", function() { expect(cordova.whitelist.test).toBeDefined(); expect(typeof cordova.whitelist.test).toBe("function"); }); itShouldAccept('http://apache.org'); itShouldAccept('http://apache.org/'); itShouldAccept('http://www.apache.org/'); itShouldAccept('http://www.apache.org/some/path'); itShouldAccept('http://some.domain.under.apache.org/'); itShouldAccept('http://user:pass@apache.org/'); itShouldAccept('http://user:pass@www.apache.org/'); itShouldAccept('https://www.apache.org/'); itShouldReject('ftp://www.apache.org/'); itShouldReject('http://www.apache.com/'); itShouldReject('http://www.apache.org:pass@evil.com/'); itShouldReject('http://www.apache.org.evil.com/'); itShouldAccept('file:///foo'); itShouldAccept('content:///foo'); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/jasmine.js0000644000015000001560000020607312272510571032652 0ustar pbuserpbgroup00000000000000var isCommonJS = typeof window == "undefined"; /** * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. * * @namespace */ var jasmine = {}; if (isCommonJS) exports.jasmine = jasmine; /** * @private */ jasmine.unimplementedMethod_ = function() { throw new Error("unimplemented method"); }; /** * Use jasmine.undefined instead of undefined, since undefined is just * a plain old variable and may be redefined by somebody else. * * @private */ jasmine.undefined = jasmine.___undefined___; /** * Show diagnostic messages in the console if set to true * */ jasmine.VERBOSE = false; /** * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. * */ jasmine.DEFAULT_UPDATE_INTERVAL = 250; /** * Default timeout interval in milliseconds for waitsFor() blocks. */ jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; jasmine.getGlobal = function() { function getGlobal() { return this; } return getGlobal(); }; /** * Allows for bound functions to be compared. Internal use only. * * @ignore * @private * @param base {Object} bound 'this' for the function * @param name {Function} function to find */ jasmine.bindOriginal_ = function(base, name) { var original = base[name]; if (original.apply) { return function() { return original.apply(base, arguments); }; } else { // IE support return jasmine.getGlobal()[name]; } }; jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); jasmine.MessageResult = function(values) { this.type = 'log'; this.values = values; this.trace = new Error(); // todo: test better }; jasmine.MessageResult.prototype.toString = function() { var text = ""; for (var i = 0; i < this.values.length; i++) { if (i > 0) text += " "; if (jasmine.isString_(this.values[i])) { text += this.values[i]; } else { text += jasmine.pp(this.values[i]); } } return text; }; jasmine.ExpectationResult = function(params) { this.type = 'expect'; this.matcherName = params.matcherName; this.passed_ = params.passed; this.expected = params.expected; this.actual = params.actual; this.message = this.passed_ ? 'Passed.' : params.message; var trace = (params.trace || new Error(this.message)); this.trace = this.passed_ ? '' : trace; }; jasmine.ExpectationResult.prototype.toString = function () { return this.message; }; jasmine.ExpectationResult.prototype.passed = function () { return this.passed_; }; /** * Getter for the Jasmine environment. Ensures one gets created */ jasmine.getEnv = function() { var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); return env; }; /** * @ignore * @private * @param value * @returns {Boolean} */ jasmine.isArray_ = function(value) { return jasmine.isA_("Array", value); }; /** * @ignore * @private * @param value * @returns {Boolean} */ jasmine.isString_ = function(value) { return jasmine.isA_("String", value); }; /** * @ignore * @private * @param value * @returns {Boolean} */ jasmine.isNumber_ = function(value) { return jasmine.isA_("Number", value); }; /** * @ignore * @private * @param {String} typeName * @param value * @returns {Boolean} */ jasmine.isA_ = function(typeName, value) { return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; }; /** * Pretty printer for expecations. Takes any object and turns it into a human-readable string. * * @param value {Object} an object to be outputted * @returns {String} */ jasmine.pp = function(value) { var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); stringPrettyPrinter.format(value); return stringPrettyPrinter.string; }; /** * Returns true if the object is a DOM Node. * * @param {Object} obj object to check * @returns {Boolean} */ jasmine.isDomNode = function(obj) { return obj.nodeType > 0; }; /** * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. * * @example * // don't care about which function is passed in, as long as it's a function * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); * * @param {Class} clazz * @returns matchable object of the type clazz */ jasmine.any = function(clazz) { return new jasmine.Matchers.Any(clazz); }; /** * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the * attributes on the object. * * @example * // don't care about any other attributes than foo. * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); * * @param sample {Object} sample * @returns matchable object for the sample */ jasmine.objectContaining = function (sample) { return new jasmine.Matchers.ObjectContaining(sample); }; /** * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. * * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine * expectation syntax. Spies can be checked if they were called or not and what the calling params were. * * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). * * Spies are torn down at the end of every spec. * * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. * * @example * // a stub * var myStub = jasmine.createSpy('myStub'); // can be used anywhere * * // spy example * var foo = { * not: function(bool) { return !bool; } * } * * // actual foo.not will not be called, execution stops * spyOn(foo, 'not'); // foo.not spied upon, execution will continue to implementation * spyOn(foo, 'not').andCallThrough(); * * // fake example * var foo = { * not: function(bool) { return !bool; } * } * * // foo.not(val) will return val * spyOn(foo, 'not').andCallFake(function(value) {return value;}); * * // mock example * foo.not(7 == 7); * expect(foo.not).toHaveBeenCalled(); * expect(foo.not).toHaveBeenCalledWith(true); * * @constructor * @see spyOn, jasmine.createSpy, jasmine.createSpyObj * @param {String} name */ jasmine.Spy = function(name) { /** * The name of the spy, if provided. */ this.identity = name || 'unknown'; /** * Is this Object a spy? */ this.isSpy = true; /** * The actual function this spy stubs. */ this.plan = function() { }; /** * Tracking of the most recent call to the spy. * @example * var mySpy = jasmine.createSpy('foo'); * mySpy(1, 2); * mySpy.mostRecentCall.args = [1, 2]; */ this.mostRecentCall = {}; /** * Holds arguments for each call to the spy, indexed by call count * @example * var mySpy = jasmine.createSpy('foo'); * mySpy(1, 2); * mySpy(7, 8); * mySpy.mostRecentCall.args = [7, 8]; * mySpy.argsForCall[0] = [1, 2]; * mySpy.argsForCall[1] = [7, 8]; */ this.argsForCall = []; this.calls = []; }; /** * Tells a spy to call through to the actual implemenatation. * * @example * var foo = { * bar: function() { // do some stuff } * } * * // defining a spy on an existing property: foo.bar * spyOn(foo, 'bar').andCallThrough(); */ jasmine.Spy.prototype.andCallThrough = function() { this.plan = this.originalValue; return this; }; /** * For setting the return value of a spy. * * @example * // defining a spy from scratch: foo() returns 'baz' * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); * * // defining a spy on an existing property: foo.bar() returns 'baz' * spyOn(foo, 'bar').andReturn('baz'); * * @param {Object} value */ jasmine.Spy.prototype.andReturn = function(value) { this.plan = function() { return value; }; return this; }; /** * For throwing an exception when a spy is called. * * @example * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); * * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' * spyOn(foo, 'bar').andThrow('baz'); * * @param {String} exceptionMsg */ jasmine.Spy.prototype.andThrow = function(exceptionMsg) { this.plan = function() { throw exceptionMsg; }; return this; }; /** * Calls an alternate implementation when a spy is called. * * @example * var baz = function() { * // do some stuff, return something * } * // defining a spy from scratch: foo() calls the function baz * var foo = jasmine.createSpy('spy on foo').andCall(baz); * * // defining a spy on an existing property: foo.bar() calls an anonymnous function * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); * * @param {Function} fakeFunc */ jasmine.Spy.prototype.andCallFake = function(fakeFunc) { this.plan = fakeFunc; return this; }; /** * Resets all of a spy's the tracking variables so that it can be used again. * * @example * spyOn(foo, 'bar'); * * foo.bar(); * * expect(foo.bar.callCount).toEqual(1); * * foo.bar.reset(); * * expect(foo.bar.callCount).toEqual(0); */ jasmine.Spy.prototype.reset = function() { this.wasCalled = false; this.callCount = 0; this.argsForCall = []; this.calls = []; this.mostRecentCall = {}; }; jasmine.createSpy = function(name) { var spyObj = function() { spyObj.wasCalled = true; spyObj.callCount++; var args = jasmine.util.argsToArray(arguments); spyObj.mostRecentCall.object = this; spyObj.mostRecentCall.args = args; spyObj.argsForCall.push(args); spyObj.calls.push({object: this, args: args}); return spyObj.plan.apply(this, arguments); }; var spy = new jasmine.Spy(name); for (var prop in spy) { spyObj[prop] = spy[prop]; } spyObj.reset(); return spyObj; }; /** * Determines whether an object is a spy. * * @param {jasmine.Spy|Object} putativeSpy * @returns {Boolean} */ jasmine.isSpy = function(putativeSpy) { return putativeSpy && putativeSpy.isSpy; }; /** * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something * large in one call. * * @param {String} baseName name of spy class * @param {Array} methodNames array of names of methods to make spies */ jasmine.createSpyObj = function(baseName, methodNames) { if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); } var obj = {}; for (var i = 0; i < methodNames.length; i++) { obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); } return obj; }; /** * All parameters are pretty-printed and concatenated together, then written to the current spec's output. * * Be careful not to leave calls to jasmine.log in production code. */ jasmine.log = function() { var spec = jasmine.getEnv().currentSpec; spec.log.apply(spec, arguments); }; /** * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. * * @example * // spy example * var foo = { * not: function(bool) { return !bool; } * } * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops * * @see jasmine.createSpy * @param obj * @param methodName * @returns a Jasmine spy that can be chained with all spy methods */ var spyOn = function(obj, methodName) { return jasmine.getEnv().currentSpec.spyOn(obj, methodName); }; if (isCommonJS) exports.spyOn = spyOn; /** * Creates a Jasmine spec that will be added to the current suite. * * // TODO: pending tests * * @example * it('should be true', function() { * expect(true).toEqual(true); * }); * * @param {String} desc description of this specification * @param {Function} func defines the preconditions and expectations of the spec */ var it = function(desc, func) { return jasmine.getEnv().it(desc, func); }; if (isCommonJS) exports.it = it; /** * Creates a disabled Jasmine spec. * * A convenience method that allows existing specs to be disabled temporarily during development. * * @param {String} desc description of this specification * @param {Function} func defines the preconditions and expectations of the spec */ var xit = function(desc, func) { return jasmine.getEnv().xit(desc, func); }; if (isCommonJS) exports.xit = xit; /** * Starts a chain for a Jasmine expectation. * * It is passed an Object that is the actual value and should chain to one of the many * jasmine.Matchers functions. * * @param {Object} actual Actual value to test against and expected value */ var expect = function(actual) { return jasmine.getEnv().currentSpec.expect(actual); }; if (isCommonJS) exports.expect = expect; /** * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. * * @param {Function} func Function that defines part of a jasmine spec. */ var runs = function(func) { jasmine.getEnv().currentSpec.runs(func); }; if (isCommonJS) exports.runs = runs; /** * Waits a fixed time period before moving to the next block. * * @deprecated Use waitsFor() instead * @param {Number} timeout milliseconds to wait */ var waits = function(timeout) { jasmine.getEnv().currentSpec.waits(timeout); }; if (isCommonJS) exports.waits = waits; /** * Waits for the latchFunction to return true before proceeding to the next block. * * @param {Function} latchFunction * @param {String} optional_timeoutMessage * @param {Number} optional_timeout */ var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); }; if (isCommonJS) exports.waitsFor = waitsFor; /** * A function that is called before each spec in a suite. * * Used for spec setup, including validating assumptions. * * @param {Function} beforeEachFunction */ var beforeEach = function(beforeEachFunction) { jasmine.getEnv().beforeEach(beforeEachFunction); }; if (isCommonJS) exports.beforeEach = beforeEach; /** * A function that is called after each spec in a suite. * * Used for restoring any state that is hijacked during spec execution. * * @param {Function} afterEachFunction */ var afterEach = function(afterEachFunction) { jasmine.getEnv().afterEach(afterEachFunction); }; if (isCommonJS) exports.afterEach = afterEach; /** * Defines a suite of specifications. * * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization * of setup in some tests. * * @example * // TODO: a simple suite * * // TODO: a simple suite with a nested describe block * * @param {String} description A string, usually the class under test. * @param {Function} specDefinitions function that defines several specs. */ var describe = function(description, specDefinitions) { return jasmine.getEnv().describe(description, specDefinitions); }; if (isCommonJS) exports.describe = describe; /** * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. * * @param {String} description A string, usually the class under test. * @param {Function} specDefinitions function that defines several specs. */ var xdescribe = function(description, specDefinitions) { return jasmine.getEnv().xdescribe(description, specDefinitions); }; if (isCommonJS) exports.xdescribe = xdescribe; // Provide the XMLHttpRequest class for IE 5.x-6.x: jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { function tryIt(f) { try { return f(); } catch(e) { } return null; } var xhr = tryIt(function() { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }) || tryIt(function() { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }) || tryIt(function() { return new ActiveXObject("Msxml2.XMLHTTP"); }) || tryIt(function() { return new ActiveXObject("Microsoft.XMLHTTP"); }); if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); return xhr; } : XMLHttpRequest; /** * @namespace */ jasmine.util = {}; /** * Declare that a child class inherit it's prototype from the parent class. * * @private * @param {Function} childClass * @param {Function} parentClass */ jasmine.util.inherit = function(childClass, parentClass) { /** * @private */ var subclass = function() { }; subclass.prototype = parentClass.prototype; childClass.prototype = new subclass(); }; jasmine.util.formatException = function(e) { var lineNumber; if (e.line) { lineNumber = e.line; } else if (e.lineNumber) { lineNumber = e.lineNumber; } var file; if (e.sourceURL) { file = e.sourceURL; } else if (e.fileName) { file = e.fileName; } var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); if (file && lineNumber) { message += ' in ' + file + ' (line ' + lineNumber + ')'; } return message; }; jasmine.util.htmlEscape = function(str) { if (!str) return str; return str.replace(/&/g, '&') .replace(//g, '>'); }; jasmine.util.argsToArray = function(args) { var arrayOfArgs = []; for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); return arrayOfArgs; }; jasmine.util.extend = function(destination, source) { for (var property in source) destination[property] = source[property]; return destination; }; /** * Environment for Jasmine * * @constructor */ jasmine.Env = function() { this.currentSpec = null; this.currentSuite = null; this.currentRunner_ = new jasmine.Runner(this); this.reporter = new jasmine.MultiReporter(); this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; this.lastUpdate = 0; this.specFilter = function() { return true; }; this.nextSpecId_ = 0; this.nextSuiteId_ = 0; this.equalityTesters_ = []; // wrap matchers this.matchersClass = function() { jasmine.Matchers.apply(this, arguments); }; jasmine.util.inherit(this.matchersClass, jasmine.Matchers); jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); }; jasmine.Env.prototype.setTimeout = jasmine.setTimeout; jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; jasmine.Env.prototype.setInterval = jasmine.setInterval; jasmine.Env.prototype.clearInterval = jasmine.clearInterval; /** * @returns an object containing jasmine version build info, if set. */ jasmine.Env.prototype.version = function () { if (jasmine.version_) { return jasmine.version_; } else { throw new Error('Version not set'); } }; /** * @returns string containing jasmine version build info, if set. */ jasmine.Env.prototype.versionString = function() { if (!jasmine.version_) { return "version unknown"; } var version = this.version(); var versionString = version.major + "." + version.minor + "." + version.build; if (version.release_candidate) { versionString += ".rc" + version.release_candidate; } versionString += " revision " + version.revision; return versionString; }; /** * @returns a sequential integer starting at 0 */ jasmine.Env.prototype.nextSpecId = function () { return this.nextSpecId_++; }; /** * @returns a sequential integer starting at 0 */ jasmine.Env.prototype.nextSuiteId = function () { return this.nextSuiteId_++; }; /** * Register a reporter to receive status updates from Jasmine. * @param {jasmine.Reporter} reporter An object which will receive status updates. */ jasmine.Env.prototype.addReporter = function(reporter) { this.reporter.addReporter(reporter); }; jasmine.Env.prototype.execute = function() { this.currentRunner_.execute(); }; jasmine.Env.prototype.describe = function(description, specDefinitions) { var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); var parentSuite = this.currentSuite; if (parentSuite) { parentSuite.add(suite); } else { this.currentRunner_.add(suite); } this.currentSuite = suite; var declarationError = null; try { specDefinitions.call(suite); } catch(e) { declarationError = e; } if (declarationError) { this.it("encountered a declaration exception", function() { throw declarationError; }); } this.currentSuite = parentSuite; return suite; }; jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { if (this.currentSuite) { this.currentSuite.beforeEach(beforeEachFunction); } else { this.currentRunner_.beforeEach(beforeEachFunction); } }; jasmine.Env.prototype.currentRunner = function () { return this.currentRunner_; }; jasmine.Env.prototype.afterEach = function(afterEachFunction) { if (this.currentSuite) { this.currentSuite.afterEach(afterEachFunction); } else { this.currentRunner_.afterEach(afterEachFunction); } }; jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { return { execute: function() { } }; }; jasmine.Env.prototype.it = function(description, func) { var spec = new jasmine.Spec(this, this.currentSuite, description); this.currentSuite.add(spec); this.currentSpec = spec; if (func) { spec.runs(func); } return spec; }; jasmine.Env.prototype.xit = function(desc, func) { return { id: this.nextSpecId(), runs: function() { } }; }; jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { return true; } a.__Jasmine_been_here_before__ = b; b.__Jasmine_been_here_before__ = a; var hasKey = function(obj, keyName) { return obj !== null && obj[keyName] !== jasmine.undefined; }; for (var property in b) { if (!hasKey(a, property) && hasKey(b, property)) { mismatchKeys.push("expected has key '" + property + "', but missing from actual."); } } for (property in a) { if (!hasKey(b, property) && hasKey(a, property)) { mismatchKeys.push("expected missing key '" + property + "', but present in actual."); } } for (property in b) { if (property == '__Jasmine_been_here_before__') continue; if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); } } if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { mismatchValues.push("arrays were not the same length"); } delete a.__Jasmine_been_here_before__; delete b.__Jasmine_been_here_before__; return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { mismatchKeys = mismatchKeys || []; mismatchValues = mismatchValues || []; for (var i = 0; i < this.equalityTesters_.length; i++) { var equalityTester = this.equalityTesters_[i]; var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); if (result !== jasmine.undefined) return result; } if (a === b) return true; if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { return (a == jasmine.undefined && b == jasmine.undefined); } if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { return a === b; } if (a instanceof Date && b instanceof Date) { return a.getTime() == b.getTime(); } if (a.jasmineMatches) { return a.jasmineMatches(b); } if (b.jasmineMatches) { return b.jasmineMatches(a); } if (a instanceof jasmine.Matchers.ObjectContaining) { return a.matches(b); } if (b instanceof jasmine.Matchers.ObjectContaining) { return b.matches(a); } if (jasmine.isString_(a) && jasmine.isString_(b)) { return (a == b); } if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { return (a == b); } if (typeof a === "object" && typeof b === "object") { return this.compareObjects_(a, b, mismatchKeys, mismatchValues); } //Straight check return (a === b); }; jasmine.Env.prototype.contains_ = function(haystack, needle) { if (jasmine.isArray_(haystack)) { for (var i = 0; i < haystack.length; i++) { if (this.equals_(haystack[i], needle)) return true; } return false; } return haystack.indexOf(needle) >= 0; }; jasmine.Env.prototype.addEqualityTester = function(equalityTester) { this.equalityTesters_.push(equalityTester); }; /** No-op base class for Jasmine reporters. * * @constructor */ jasmine.Reporter = function() { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportRunnerResults = function(runner) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportSuiteResults = function(suite) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportSpecStarting = function(spec) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportSpecResults = function(spec) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.log = function(str) { }; /** * Blocks are functions with executable code that make up a spec. * * @constructor * @param {jasmine.Env} env * @param {Function} func * @param {jasmine.Spec} spec */ jasmine.Block = function(env, func, spec) { this.env = env; this.func = func; this.spec = spec; }; jasmine.Block.prototype.execute = function(onComplete) { try { this.func.apply(this.spec); } catch (e) { this.spec.fail(e); } onComplete(); }; /** JavaScript API reporter. * * @constructor */ jasmine.JsApiReporter = function() { this.started = false; this.finished = false; this.suites_ = []; this.results_ = {}; }; jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { this.started = true; var suites = runner.topLevelSuites(); for (var i = 0; i < suites.length; i++) { var suite = suites[i]; this.suites_.push(this.summarize_(suite)); } }; jasmine.JsApiReporter.prototype.suites = function() { return this.suites_; }; jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { var isSuite = suiteOrSpec instanceof jasmine.Suite; var summary = { id: suiteOrSpec.id, name: suiteOrSpec.description, type: isSuite ? 'suite' : 'spec', children: [] }; if (isSuite) { var children = suiteOrSpec.children(); for (var i = 0; i < children.length; i++) { summary.children.push(this.summarize_(children[i])); } } return summary; }; jasmine.JsApiReporter.prototype.results = function() { return this.results_; }; jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { return this.results_[specId]; }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { this.finished = true; }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { this.results_[spec.id] = { messages: spec.results().getItems(), result: spec.results().failedCount > 0 ? "failed" : "passed" }; }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.log = function(str) { }; jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ var results = {}; for (var i = 0; i < specIds.length; i++) { var specId = specIds[i]; results[specId] = this.summarizeResult_(this.results_[specId]); } return results; }; jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ var summaryMessages = []; var messagesLength = result.messages.length; for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { var resultMessage = result.messages[messageIndex]; summaryMessages.push({ text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, passed: resultMessage.passed ? resultMessage.passed() : true, type: resultMessage.type, message: resultMessage.message, trace: { stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined } }); } return { result : result.result, messages : summaryMessages }; }; /** * @constructor * @param {jasmine.Env} env * @param actual * @param {jasmine.Spec} spec */ jasmine.Matchers = function(env, actual, spec, opt_isNot) { this.env = env; this.actual = actual; this.spec = spec; this.isNot = opt_isNot || false; this.reportWasCalled_ = false; }; // todo: @deprecated as of Jasmine 0.11, remove soon [xw] jasmine.Matchers.pp = function(str) { throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); }; // todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] jasmine.Matchers.prototype.report = function(result, failing_message, details) { throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); }; jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { for (var methodName in prototype) { if (methodName == 'report') continue; var orig = prototype[methodName]; matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); } }; jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { return function() { var matcherArgs = jasmine.util.argsToArray(arguments); var result = matcherFunction.apply(this, arguments); if (this.isNot) { result = !result; } if (this.reportWasCalled_) return result; var message; if (!result) { if (this.message) { message = this.message.apply(this, arguments); if (jasmine.isArray_(message)) { message = message[this.isNot ? 1 : 0]; } } else { var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; if (matcherArgs.length > 0) { for (var i = 0; i < matcherArgs.length; i++) { if (i > 0) message += ","; message += " " + jasmine.pp(matcherArgs[i]); } } message += "."; } } var expectationResult = new jasmine.ExpectationResult({ matcherName: matcherName, passed: result, expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], actual: this.actual, message: message }); this.spec.addMatcherResult(expectationResult); return jasmine.undefined; }; }; /** * toBe: compares the actual to the expected using === * @param expected */ jasmine.Matchers.prototype.toBe = function(expected) { return this.actual === expected; }; /** * toNotBe: compares the actual to the expected using !== * @param expected * @deprecated as of 1.0. Use not.toBe() instead. */ jasmine.Matchers.prototype.toNotBe = function(expected) { return this.actual !== expected; }; /** * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. * * @param expected */ jasmine.Matchers.prototype.toEqual = function(expected) { return this.env.equals_(this.actual, expected); }; /** * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual * @param expected * @deprecated as of 1.0. Use not.toEqual() instead. */ jasmine.Matchers.prototype.toNotEqual = function(expected) { return !this.env.equals_(this.actual, expected); }; /** * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes * a pattern or a String. * * @param expected */ jasmine.Matchers.prototype.toMatch = function(expected) { return new RegExp(expected).test(this.actual); }; /** * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch * @param expected * @deprecated as of 1.0. Use not.toMatch() instead. */ jasmine.Matchers.prototype.toNotMatch = function(expected) { return !(new RegExp(expected).test(this.actual)); }; /** * Matcher that compares the actual to jasmine.undefined. */ jasmine.Matchers.prototype.toBeDefined = function() { return (this.actual !== jasmine.undefined); }; /** * Matcher that compares the actual to jasmine.undefined. */ jasmine.Matchers.prototype.toBeUndefined = function() { return (this.actual === jasmine.undefined); }; /** * Matcher that compares the actual to null. */ jasmine.Matchers.prototype.toBeNull = function() { return (this.actual === null); }; /** * Matcher that boolean not-nots the actual. */ jasmine.Matchers.prototype.toBeTruthy = function() { return !!this.actual; }; /** * Matcher that boolean nots the actual. */ jasmine.Matchers.prototype.toBeFalsy = function() { return !this.actual; }; /** * Matcher that checks to see if the actual, a Jasmine spy, was called. */ jasmine.Matchers.prototype.toHaveBeenCalled = function() { if (arguments.length > 0) { throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); } if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { return [ "Expected spy " + this.actual.identity + " to have been called.", "Expected spy " + this.actual.identity + " not to have been called." ]; }; return this.actual.wasCalled; }; /** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; /** * Matcher that checks to see if the actual, a Jasmine spy, was not called. * * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead */ jasmine.Matchers.prototype.wasNotCalled = function() { if (arguments.length > 0) { throw new Error('wasNotCalled does not take arguments'); } if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { return [ "Expected spy " + this.actual.identity + " to not have been called.", "Expected spy " + this.actual.identity + " to have been called." ]; }; return !this.actual.wasCalled; }; /** * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. * * @example * */ jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { var expectedArgs = jasmine.util.argsToArray(arguments); if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { if (this.actual.callCount === 0) { // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw] return [ "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.", "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was." ]; } else { return [ "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall), "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall) ]; } }; return this.env.contains_(this.actual.argsForCall, expectedArgs); }; /** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; /** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ jasmine.Matchers.prototype.wasNotCalledWith = function() { var expectedArgs = jasmine.util.argsToArray(arguments); if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { return [ "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" ]; }; return !this.env.contains_(this.actual.argsForCall, expectedArgs); }; /** * Matcher that checks that the expected item is an element in the actual Array. * * @param {Object} expected */ jasmine.Matchers.prototype.toContain = function(expected) { return this.env.contains_(this.actual, expected); }; /** * Matcher that checks that the expected item is NOT an element in the actual Array. * * @param {Object} expected * @deprecated as of 1.0. Use not.toContain() instead. */ jasmine.Matchers.prototype.toNotContain = function(expected) { return !this.env.contains_(this.actual, expected); }; jasmine.Matchers.prototype.toBeLessThan = function(expected) { return this.actual < expected; }; jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { return this.actual > expected; }; /** * Matcher that checks that the expected item is equal to the actual item * up to a given level of decimal precision (default 2). * * @param {Number} expected * @param {Number} precision */ jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { if (!(precision === 0)) { precision = precision || 2; } var multiplier = Math.pow(10, precision); var actual = Math.round(this.actual * multiplier); expected = Math.round(expected * multiplier); return expected == actual; }; /** * Matcher that checks that the expected exception was thrown by the actual. * * @param {String} expected */ jasmine.Matchers.prototype.toThrow = function(expected) { var result = false; var exception; if (typeof this.actual != 'function') { throw new Error('Actual is not a function'); } try { this.actual(); } catch (e) { exception = e; } if (exception) { result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); } var not = this.isNot ? "not " : ""; this.message = function() { if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); } else { return "Expected function to throw an exception."; } }; return result; }; jasmine.Matchers.Any = function(expectedClass) { this.expectedClass = expectedClass; }; jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { if (this.expectedClass == String) { return typeof other == 'string' || other instanceof String; } if (this.expectedClass == Number) { return typeof other == 'number' || other instanceof Number; } if (this.expectedClass == Function) { return typeof other == 'function' || other instanceof Function; } if (this.expectedClass == Object) { return typeof other == 'object'; } return other instanceof this.expectedClass; }; jasmine.Matchers.Any.prototype.jasmineToString = function() { return ''; }; jasmine.Matchers.ObjectContaining = function (sample) { this.sample = sample; }; jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { mismatchKeys = mismatchKeys || []; mismatchValues = mismatchValues || []; var env = jasmine.getEnv(); var hasKey = function(obj, keyName) { return obj != null && obj[keyName] !== jasmine.undefined; }; for (var property in this.sample) { if (!hasKey(other, property) && hasKey(this.sample, property)) { mismatchKeys.push("expected has key '" + property + "', but missing from actual."); } else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); } } return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { return ""; }; // Mock setTimeout, clearTimeout // Contributed by Pivotal Computer Systems, www.pivotalsf.com jasmine.FakeTimer = function() { this.reset(); var self = this; self.setTimeout = function(funcToCall, millis) { self.timeoutsMade++; self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); return self.timeoutsMade; }; self.setInterval = function(funcToCall, millis) { self.timeoutsMade++; self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); return self.timeoutsMade; }; self.clearTimeout = function(timeoutKey) { self.scheduledFunctions[timeoutKey] = jasmine.undefined; }; self.clearInterval = function(timeoutKey) { self.scheduledFunctions[timeoutKey] = jasmine.undefined; }; }; jasmine.FakeTimer.prototype.reset = function() { this.timeoutsMade = 0; this.scheduledFunctions = {}; this.nowMillis = 0; }; jasmine.FakeTimer.prototype.tick = function(millis) { var oldMillis = this.nowMillis; var newMillis = oldMillis + millis; this.runFunctionsWithinRange(oldMillis, newMillis); this.nowMillis = newMillis; }; jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { var scheduledFunc; var funcsToRun = []; for (var timeoutKey in this.scheduledFunctions) { scheduledFunc = this.scheduledFunctions[timeoutKey]; if (scheduledFunc != jasmine.undefined && scheduledFunc.runAtMillis >= oldMillis && scheduledFunc.runAtMillis <= nowMillis) { funcsToRun.push(scheduledFunc); this.scheduledFunctions[timeoutKey] = jasmine.undefined; } } if (funcsToRun.length > 0) { funcsToRun.sort(function(a, b) { return a.runAtMillis - b.runAtMillis; }); for (var i = 0; i < funcsToRun.length; ++i) { try { var funcToRun = funcsToRun[i]; this.nowMillis = funcToRun.runAtMillis; funcToRun.funcToCall(); if (funcToRun.recurring) { this.scheduleFunction(funcToRun.timeoutKey, funcToRun.funcToCall, funcToRun.millis, true); } } catch(e) { } } this.runFunctionsWithinRange(oldMillis, nowMillis); } }; jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { this.scheduledFunctions[timeoutKey] = { runAtMillis: this.nowMillis + millis, funcToCall: funcToCall, recurring: recurring, timeoutKey: timeoutKey, millis: millis }; }; /** * @namespace */ jasmine.Clock = { defaultFakeTimer: new jasmine.FakeTimer(), reset: function() { jasmine.Clock.assertInstalled(); jasmine.Clock.defaultFakeTimer.reset(); }, tick: function(millis) { jasmine.Clock.assertInstalled(); jasmine.Clock.defaultFakeTimer.tick(millis); }, runFunctionsWithinRange: function(oldMillis, nowMillis) { jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); }, scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); }, useMock: function() { if (!jasmine.Clock.isInstalled()) { var spec = jasmine.getEnv().currentSpec; spec.after(jasmine.Clock.uninstallMock); jasmine.Clock.installMock(); } }, installMock: function() { jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; }, uninstallMock: function() { jasmine.Clock.assertInstalled(); jasmine.Clock.installed = jasmine.Clock.real; }, real: { setTimeout: jasmine.getGlobal().setTimeout, clearTimeout: jasmine.getGlobal().clearTimeout, setInterval: jasmine.getGlobal().setInterval, clearInterval: jasmine.getGlobal().clearInterval }, assertInstalled: function() { if (!jasmine.Clock.isInstalled()) { throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); } }, isInstalled: function() { return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; }, installed: null }; jasmine.Clock.installed = jasmine.Clock.real; //else for IE support jasmine.getGlobal().setTimeout = function(funcToCall, millis) { if (jasmine.Clock.installed.setTimeout.apply) { return jasmine.Clock.installed.setTimeout.apply(this, arguments); } else { return jasmine.Clock.installed.setTimeout(funcToCall, millis); } }; jasmine.getGlobal().setInterval = function(funcToCall, millis) { if (jasmine.Clock.installed.setInterval.apply) { return jasmine.Clock.installed.setInterval.apply(this, arguments); } else { return jasmine.Clock.installed.setInterval(funcToCall, millis); } }; jasmine.getGlobal().clearTimeout = function(timeoutKey) { if (jasmine.Clock.installed.clearTimeout.apply) { return jasmine.Clock.installed.clearTimeout.apply(this, arguments); } else { return jasmine.Clock.installed.clearTimeout(timeoutKey); } }; jasmine.getGlobal().clearInterval = function(timeoutKey) { if (jasmine.Clock.installed.clearTimeout.apply) { return jasmine.Clock.installed.clearInterval.apply(this, arguments); } else { return jasmine.Clock.installed.clearInterval(timeoutKey); } }; /** * @constructor */ jasmine.MultiReporter = function() { this.subReporters_ = []; }; jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); jasmine.MultiReporter.prototype.addReporter = function(reporter) { this.subReporters_.push(reporter); }; (function() { var functionNames = [ "reportRunnerStarting", "reportRunnerResults", "reportSuiteResults", "reportSpecStarting", "reportSpecResults", "log" ]; for (var i = 0; i < functionNames.length; i++) { var functionName = functionNames[i]; jasmine.MultiReporter.prototype[functionName] = (function(functionName) { return function() { for (var j = 0; j < this.subReporters_.length; j++) { var subReporter = this.subReporters_[j]; if (subReporter[functionName]) { subReporter[functionName].apply(subReporter, arguments); } } }; })(functionName); } })(); /** * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults * * @constructor */ jasmine.NestedResults = function() { /** * The total count of results */ this.totalCount = 0; /** * Number of passed results */ this.passedCount = 0; /** * Number of failed results */ this.failedCount = 0; /** * Was this suite/spec skipped? */ this.skipped = false; /** * @ignore */ this.items_ = []; }; /** * Roll up the result counts. * * @param result */ jasmine.NestedResults.prototype.rollupCounts = function(result) { this.totalCount += result.totalCount; this.passedCount += result.passedCount; this.failedCount += result.failedCount; }; /** * Adds a log message. * @param values Array of message parts which will be concatenated later. */ jasmine.NestedResults.prototype.log = function(values) { this.items_.push(new jasmine.MessageResult(values)); }; /** * Getter for the results: message & results. */ jasmine.NestedResults.prototype.getItems = function() { return this.items_; }; /** * Adds a result, tracking counts (total, passed, & failed) * @param {jasmine.ExpectationResult|jasmine.NestedResults} result */ jasmine.NestedResults.prototype.addResult = function(result) { if (result.type != 'log') { if (result.items_) { this.rollupCounts(result); } else { this.totalCount++; if (result.passed()) { this.passedCount++; } else { this.failedCount++; } } } this.items_.push(result); }; /** * @returns {Boolean} True if everything below passed */ jasmine.NestedResults.prototype.passed = function() { return this.passedCount === this.totalCount; }; /** * Base class for pretty printing for expectation results. */ jasmine.PrettyPrinter = function() { this.ppNestLevel_ = 0; }; /** * Formats a value in a nice, human-readable string. * * @param value */ jasmine.PrettyPrinter.prototype.format = function(value) { if (this.ppNestLevel_ > 40) { throw new Error('jasmine.PrettyPrinter: format() nested too deeply!'); } this.ppNestLevel_++; try { if (value === jasmine.undefined) { this.emitScalar('undefined'); } else if (value === null) { this.emitScalar('null'); } else if (value === jasmine.getGlobal()) { this.emitScalar(''); } else if (value.jasmineToString) { this.emitScalar(value.jasmineToString()); } else if (typeof value === 'string') { this.emitString(value); } else if (jasmine.isSpy(value)) { this.emitScalar("spy on " + value.identity); } else if (value instanceof RegExp) { this.emitScalar(value.toString()); } else if (typeof value === 'function') { this.emitScalar('Function'); } else if (typeof value.nodeType === 'number') { this.emitScalar('HTMLNode'); } else if (value instanceof Date) { this.emitScalar('Date(' + value + ')'); } else if (value.__Jasmine_been_here_before__) { this.emitScalar(''); } else if (jasmine.isArray_(value) || typeof value == 'object') { value.__Jasmine_been_here_before__ = true; if (jasmine.isArray_(value)) { this.emitArray(value); } else { this.emitObject(value); } delete value.__Jasmine_been_here_before__; } else { this.emitScalar(value.toString()); } } finally { this.ppNestLevel_--; } }; jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { for (var property in obj) { if (property == '__Jasmine_been_here_before__') continue; fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && obj.__lookupGetter__(property) !== null) : false); } }; jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; jasmine.StringPrettyPrinter = function() { jasmine.PrettyPrinter.call(this); this.string = ''; }; jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { this.append(value); }; jasmine.StringPrettyPrinter.prototype.emitString = function(value) { this.append("'" + value + "'"); }; jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { this.append('[ '); for (var i = 0; i < array.length; i++) { if (i > 0) { this.append(', '); } this.format(array[i]); } this.append(' ]'); }; jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { var self = this; this.append('{ '); var first = true; this.iterateObject(obj, function(property, isGetter) { if (first) { first = false; } else { self.append(', '); } self.append(property); self.append(' : '); if (isGetter) { self.append(''); } else { self.format(obj[property]); } }); this.append(' }'); }; jasmine.StringPrettyPrinter.prototype.append = function(value) { this.string += value; }; jasmine.Queue = function(env) { this.env = env; this.blocks = []; this.running = false; this.index = 0; this.offset = 0; this.abort = false; }; jasmine.Queue.prototype.addBefore = function(block) { this.blocks.unshift(block); }; jasmine.Queue.prototype.add = function(block) { this.blocks.push(block); }; jasmine.Queue.prototype.insertNext = function(block) { this.blocks.splice((this.index + this.offset + 1), 0, block); this.offset++; }; jasmine.Queue.prototype.start = function(onComplete) { this.running = true; this.onComplete = onComplete; this.next_(); }; jasmine.Queue.prototype.isRunning = function() { return this.running; }; jasmine.Queue.LOOP_DONT_RECURSE = true; jasmine.Queue.prototype.next_ = function() { var self = this; var goAgain = true; while (goAgain) { goAgain = false; if (self.index < self.blocks.length && !this.abort) { var calledSynchronously = true; var completedSynchronously = false; var onComplete = function () { if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { completedSynchronously = true; return; } if (self.blocks[self.index].abort) { self.abort = true; } self.offset = 0; self.index++; var now = new Date().getTime(); if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { self.env.lastUpdate = now; self.env.setTimeout(function() { self.next_(); }, 0); } else { if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { goAgain = true; } else { self.next_(); } } }; self.blocks[self.index].execute(onComplete); calledSynchronously = false; if (completedSynchronously) { onComplete(); } } else { self.running = false; if (self.onComplete) { self.onComplete(); } } } }; jasmine.Queue.prototype.results = function() { var results = new jasmine.NestedResults(); for (var i = 0; i < this.blocks.length; i++) { if (this.blocks[i].results) { results.addResult(this.blocks[i].results()); } } return results; }; /** * Runner * * @constructor * @param {jasmine.Env} env */ jasmine.Runner = function(env) { var self = this; self.env = env; self.queue = new jasmine.Queue(env); self.before_ = []; self.after_ = []; self.suites_ = []; }; jasmine.Runner.prototype.execute = function() { var self = this; if (self.env.reporter.reportRunnerStarting) { self.env.reporter.reportRunnerStarting(this); } self.queue.start(function () { self.finishCallback(); }); }; jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { beforeEachFunction.typeName = 'beforeEach'; this.before_.splice(0,0,beforeEachFunction); }; jasmine.Runner.prototype.afterEach = function(afterEachFunction) { afterEachFunction.typeName = 'afterEach'; this.after_.splice(0,0,afterEachFunction); }; jasmine.Runner.prototype.finishCallback = function() { this.env.reporter.reportRunnerResults(this); }; jasmine.Runner.prototype.addSuite = function(suite) { this.suites_.push(suite); }; jasmine.Runner.prototype.add = function(block) { if (block instanceof jasmine.Suite) { this.addSuite(block); } this.queue.add(block); }; jasmine.Runner.prototype.specs = function () { var suites = this.suites(); var specs = []; for (var i = 0; i < suites.length; i++) { specs = specs.concat(suites[i].specs()); } return specs; }; jasmine.Runner.prototype.suites = function() { return this.suites_; }; jasmine.Runner.prototype.topLevelSuites = function() { var topLevelSuites = []; for (var i = 0; i < this.suites_.length; i++) { if (!this.suites_[i].parentSuite) { topLevelSuites.push(this.suites_[i]); } } return topLevelSuites; }; jasmine.Runner.prototype.results = function() { return this.queue.results(); }; /** * Internal representation of a Jasmine specification, or test. * * @constructor * @param {jasmine.Env} env * @param {jasmine.Suite} suite * @param {String} description */ jasmine.Spec = function(env, suite, description) { if (!env) { throw new Error('jasmine.Env() required'); } if (!suite) { throw new Error('jasmine.Suite() required'); } var spec = this; spec.id = env.nextSpecId ? env.nextSpecId() : null; spec.env = env; spec.suite = suite; spec.description = description; spec.queue = new jasmine.Queue(env); spec.afterCallbacks = []; spec.spies_ = []; spec.results_ = new jasmine.NestedResults(); spec.results_.description = description; spec.matchersClass = null; }; jasmine.Spec.prototype.getFullName = function() { return this.suite.getFullName() + ' ' + this.description + '.'; }; jasmine.Spec.prototype.results = function() { return this.results_; }; /** * All parameters are pretty-printed and concatenated together, then written to the spec's output. * * Be careful not to leave calls to jasmine.log in production code. */ jasmine.Spec.prototype.log = function() { return this.results_.log(arguments); }; jasmine.Spec.prototype.runs = function (func) { var block = new jasmine.Block(this.env, func, this); this.addToQueue(block); return this; }; jasmine.Spec.prototype.addToQueue = function (block) { if (this.queue.isRunning()) { this.queue.insertNext(block); } else { this.queue.add(block); } }; /** * @param {jasmine.ExpectationResult} result */ jasmine.Spec.prototype.addMatcherResult = function(result) { this.results_.addResult(result); }; jasmine.Spec.prototype.expect = function(actual) { var positive = new (this.getMatchersClass_())(this.env, actual, this); positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); return positive; }; /** * Waits a fixed time period before moving to the next block. * * @deprecated Use waitsFor() instead * @param {Number} timeout milliseconds to wait */ jasmine.Spec.prototype.waits = function(timeout) { var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); this.addToQueue(waitsFunc); return this; }; /** * Waits for the latchFunction to return true before proceeding to the next block. * * @param {Function} latchFunction * @param {String} optional_timeoutMessage * @param {Number} optional_timeout */ jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { var latchFunction_ = null; var optional_timeoutMessage_ = null; var optional_timeout_ = null; for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; switch (typeof arg) { case 'function': latchFunction_ = arg; break; case 'string': optional_timeoutMessage_ = arg; break; case 'number': optional_timeout_ = arg; break; } } var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); this.addToQueue(waitsForFunc); return this; }; jasmine.Spec.prototype.fail = function (e) { var expectationResult = new jasmine.ExpectationResult({ passed: false, message: e ? jasmine.util.formatException(e) : 'Exception', trace: { stack: e.stack } }); this.results_.addResult(expectationResult); }; jasmine.Spec.prototype.getMatchersClass_ = function() { return this.matchersClass || this.env.matchersClass; }; jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { var parent = this.getMatchersClass_(); var newMatchersClass = function() { parent.apply(this, arguments); }; jasmine.util.inherit(newMatchersClass, parent); jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); this.matchersClass = newMatchersClass; }; jasmine.Spec.prototype.finishCallback = function() { this.env.reporter.reportSpecResults(this); }; jasmine.Spec.prototype.finish = function(onComplete) { this.removeAllSpies(); this.finishCallback(); if (onComplete) { onComplete(); } }; jasmine.Spec.prototype.after = function(doAfter) { if (this.queue.isRunning()) { this.queue.add(new jasmine.Block(this.env, doAfter, this)); } else { this.afterCallbacks.unshift(doAfter); } }; jasmine.Spec.prototype.execute = function(onComplete) { var spec = this; if (!spec.env.specFilter(spec)) { spec.results_.skipped = true; spec.finish(onComplete); return; } this.env.reporter.reportSpecStarting(this); spec.env.currentSpec = spec; spec.addBeforesAndAftersToQueue(); spec.queue.start(function () { spec.finish(onComplete); }); }; jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { var runner = this.env.currentRunner(); var i; for (var suite = this.suite; suite; suite = suite.parentSuite) { for (i = 0; i < suite.before_.length; i++) { this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); } } for (i = 0; i < runner.before_.length; i++) { this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); } for (i = 0; i < this.afterCallbacks.length; i++) { this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); } for (suite = this.suite; suite; suite = suite.parentSuite) { for (i = 0; i < suite.after_.length; i++) { this.queue.add(new jasmine.Block(this.env, suite.after_[i], this)); } } for (i = 0; i < runner.after_.length; i++) { this.queue.add(new jasmine.Block(this.env, runner.after_[i], this)); } }; jasmine.Spec.prototype.explodes = function() { throw 'explodes function should not have been called'; }; jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { if (obj == jasmine.undefined) { throw "spyOn could not find an object to spy upon for " + methodName + "()"; } if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { throw methodName + '() method does not exist'; } if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { throw new Error(methodName + ' has already been spied upon'); } var spyObj = jasmine.createSpy(methodName); this.spies_.push(spyObj); spyObj.baseObj = obj; spyObj.methodName = methodName; spyObj.originalValue = obj[methodName]; obj[methodName] = spyObj; return spyObj; }; jasmine.Spec.prototype.removeAllSpies = function() { for (var i = 0; i < this.spies_.length; i++) { var spy = this.spies_[i]; spy.baseObj[spy.methodName] = spy.originalValue; } this.spies_ = []; }; /** * Internal representation of a Jasmine suite. * * @constructor * @param {jasmine.Env} env * @param {String} description * @param {Function} specDefinitions * @param {jasmine.Suite} parentSuite */ jasmine.Suite = function(env, description, specDefinitions, parentSuite) { var self = this; self.id = env.nextSuiteId ? env.nextSuiteId() : null; self.description = description; self.queue = new jasmine.Queue(env); self.parentSuite = parentSuite; self.env = env; self.before_ = []; self.after_ = []; self.children_ = []; self.suites_ = []; self.specs_ = []; }; jasmine.Suite.prototype.getFullName = function() { var fullName = this.description; for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { fullName = parentSuite.description + ' ' + fullName; } return fullName; }; jasmine.Suite.prototype.finish = function(onComplete) { this.env.reporter.reportSuiteResults(this); this.finished = true; if (typeof(onComplete) == 'function') { onComplete(); } }; jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { beforeEachFunction.typeName = 'beforeEach'; this.before_.unshift(beforeEachFunction); }; jasmine.Suite.prototype.afterEach = function(afterEachFunction) { afterEachFunction.typeName = 'afterEach'; this.after_.unshift(afterEachFunction); }; jasmine.Suite.prototype.results = function() { return this.queue.results(); }; jasmine.Suite.prototype.add = function(suiteOrSpec) { this.children_.push(suiteOrSpec); if (suiteOrSpec instanceof jasmine.Suite) { this.suites_.push(suiteOrSpec); this.env.currentRunner().addSuite(suiteOrSpec); } else { this.specs_.push(suiteOrSpec); } this.queue.add(suiteOrSpec); }; jasmine.Suite.prototype.specs = function() { return this.specs_; }; jasmine.Suite.prototype.suites = function() { return this.suites_; }; jasmine.Suite.prototype.children = function() { return this.children_; }; jasmine.Suite.prototype.execute = function(onComplete) { var self = this; this.queue.start(function () { self.finish(onComplete); }); }; jasmine.WaitsBlock = function(env, timeout, spec) { this.timeout = timeout; jasmine.Block.call(this, env, null, spec); }; jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); jasmine.WaitsBlock.prototype.execute = function (onComplete) { if (jasmine.VERBOSE) { this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); } this.env.setTimeout(function () { onComplete(); }, this.timeout); }; /** * A block which waits for some condition to become true, with timeout. * * @constructor * @extends jasmine.Block * @param {jasmine.Env} env The Jasmine environment. * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. * @param {Function} latchFunction A function which returns true when the desired condition has been met. * @param {String} message The message to display if the desired condition hasn't been met within the given time period. * @param {jasmine.Spec} spec The Jasmine spec. */ jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { this.timeout = timeout || env.defaultTimeoutInterval; this.latchFunction = latchFunction; this.message = message; this.totalTimeSpentWaitingForLatch = 0; jasmine.Block.call(this, env, null, spec); }; jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; jasmine.WaitsForBlock.prototype.execute = function(onComplete) { if (jasmine.VERBOSE) { this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); } var latchFunctionResult; try { latchFunctionResult = this.latchFunction.apply(this.spec); } catch (e) { this.spec.fail(e); onComplete(); return; } if (latchFunctionResult) { onComplete(); } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); this.spec.fail({ name: 'timeout', message: message }); this.abort = true; onComplete(); } else { this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; var self = this; this.env.setTimeout(function() { self.execute(onComplete); }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); } }; jasmine.version_= { "major": 1, "minor": 2, "build": 0, "revision": 1333310630, "release_candidate": 1 }; cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/pages/0000755000015000001560000000000012272510677031764 5ustar pbuserpbgroup00000000000000././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/pages/whitelist.htmlcordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/pages/whitelis0000644000015000001560000000450412272510571033533 0ustar pbuserpbgroup00000000000000 Cordova: Whitelist API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/index.html0000644000015000001560000000633012272510571032655 0ustar pbuserpbgroup00000000000000 Cordova API Specs

Cordova API Specs

Run All Tests Run Accelerometer Tests Run Battery Tests Run Camera Tests Run Capture Tests Run Compass Tests Run Contacts Tests Run Data URI Tests Run Device Tests Run File Tests Run FileTransfer Tests Run Geolocation Tests Run Globalization Tests Run Media Tests Run Network Tests Run Notification Tests Run Platform Tests Run Storage Tests Run Bridge Tests Run Whitelist Tests

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/0000755000015000001560000000000012272510677031631 5ustar pbuserpbgroup00000000000000././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/ReporterView.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/ReporterV0000644000015000001560000001112612272510571033476 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter.ReporterView = function(dom) { this.startedAt = new Date(); this.runningSpecCount = 0; this.completeSpecCount = 0; this.passedCount = 0; this.failedCount = 0; this.skippedCount = 0; this.createResultsMenu = function() { this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), ' | ', this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); this.summaryMenuItem.onclick = function() { dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); }; this.detailsMenuItem.onclick = function() { showDetails(); }; }; this.addSpecs = function(specs, specFilter) { this.totalSpecCount = specs.length; this.views = { specs: {}, suites: {} }; for (var i = 0; i < specs.length; i++) { var spec = specs[i]; this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); if (specFilter(spec)) { this.runningSpecCount++; } } }; this.specComplete = function(spec) { this.completeSpecCount++; if (isUndefined(this.views.specs[spec.id])) { this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); } var specView = this.views.specs[spec.id]; switch (specView.status()) { case 'passed': this.passedCount++; break; case 'failed': this.failedCount++; break; case 'skipped': this.skippedCount++; break; } specView.refresh(); this.refresh(); }; this.suiteComplete = function(suite) { var suiteView = this.views.suites[suite.id]; if (isUndefined(suiteView)) { return; } suiteView.refresh(); }; this.refresh = function() { if (isUndefined(this.resultsMenu)) { this.createResultsMenu(); } // currently running UI if (isUndefined(this.runningAlert)) { this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"}); dom.alert.appendChild(this.runningAlert); } this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); // skipped specs UI if (isUndefined(this.skippedAlert)) { this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"}); } this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; if (this.skippedCount === 1 && isDefined(dom.alert)) { dom.alert.appendChild(this.skippedAlert); } // passing specs UI if (isUndefined(this.passedAlert)) { this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"}); } this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); // failing specs UI if (isUndefined(this.failedAlert)) { this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); } this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); if (this.failedCount === 1 && isDefined(dom.alert)) { dom.alert.appendChild(this.failedAlert); dom.alert.appendChild(this.resultsMenu); } // summary info this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; }; this.complete = function() { dom.alert.removeChild(this.runningAlert); this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; if (this.failedCount === 0) { dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); } else { showDetails(); } dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); }; return this; function showDetails() { if (dom.reporter.className.search(/showDetails/) === -1) { dom.reporter.className += " showDetails"; } } function isUndefined(obj) { return typeof obj === 'undefined'; } function isDefined(obj) { return !isUndefined(obj); } function specPluralizedFor(count) { var str = count + " spec"; if (count > 1) { str += "s" } return str; } }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); ././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/SuiteView.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/SuiteView0000644000015000001560000000126212272510571033472 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { this.suite = suite; this.dom = dom; this.views = views; this.element = this.createDom('div', { className: 'suite' }, this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description) ); this.appendToSummary(this.suite, this.element); }; jasmine.HtmlReporter.SuiteView.prototype.status = function() { return this.getSpecStatus(this.suite); }; jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { this.element.className += " " + this.status(); }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/SpecView.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/SpecView.0000644000015000001560000000462412272510571033356 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter.SpecView = function(spec, dom, views) { this.spec = spec; this.dom = dom; this.views = views; this.symbol = this.createDom('li', { className: 'pending' }); this.dom.symbolSummary.appendChild(this.symbol); this.summary = this.createDom('div', { className: 'specSummary' }, this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.spec.getFullName()), title: this.spec.getFullName() }, this.spec.description) ); this.detail = this.createDom('div', { className: 'specDetail' }, this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.spec.getFullName()), title: this.spec.getFullName() }, this.spec.getFullName()) ); }; jasmine.HtmlReporter.SpecView.prototype.status = function() { return this.getSpecStatus(this.spec); }; jasmine.HtmlReporter.SpecView.prototype.refresh = function() { this.symbol.className = this.status(); switch (this.status()) { case 'skipped': break; case 'passed': this.appendSummaryToSuiteDiv(); break; case 'failed': this.appendSummaryToSuiteDiv(); this.appendFailureDetail(); break; } }; jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { this.summary.className += ' ' + this.status(); this.appendToSummary(this.spec, this.summary); }; jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { this.detail.className += ' ' + this.status(); var resultItems = this.spec.results().getItems(); var messagesDiv = this.createDom('div', { className: 'messages' }); for (var i = 0; i < resultItems.length; i++) { var result = resultItems[i]; if (result.type == 'log') { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); } else if (result.type == 'expect' && result.passed && !result.passed()) { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); if (result.trace.stack) { messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); } } } if (messagesDiv.childNodes.length > 0) { this.detail.appendChild(messagesDiv); this.dom.details.appendChild(this.detail); } }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView); ././@LongLink0000000000000000000000000000016200000000000011214 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/HtmlReporterHelpers.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/HtmlRepor0000644000015000001560000000274212272510571033466 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporterHelpers = {}; jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { var el = document.createElement(type); for (var i = 2; i < arguments.length; i++) { var child = arguments[i]; if (typeof child === 'string') { el.appendChild(document.createTextNode(child)); } else { if (child) { el.appendChild(child); } } } for (var attr in attrs) { if (attr == "className") { el[attr] = attrs[attr]; } else { el.setAttribute(attr, attrs[attr]); } } return el; }; jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { var results = child.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.skipped) { status = 'skipped'; } return status; }; jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { var parentDiv = this.dom.summary; var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; var parent = child[parentSuite]; if (parent) { if (typeof this.views.suites[parent.id] == 'undefined') { this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); } parentDiv = this.views.suites[parent.id].element; } parentDiv.appendChild(childElement); }; jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { for(var fn in jasmine.HtmlReporterHelpers) { ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; } }; ././@LongLink0000000000000000000000000000015600000000000011217 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/TrivialReporter.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/TrivialRe0000644000015000001560000001554112272510571033454 0ustar pbuserpbgroup00000000000000/* @deprecated Use jasmine.HtmlReporter instead */ jasmine.TrivialReporter = function(doc) { this.document = doc || document; this.suiteDivs = {}; this.logRunningSpecs = false; }; jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { var el = document.createElement(type); for (var i = 2; i < arguments.length; i++) { var child = arguments[i]; if (typeof child === 'string') { el.appendChild(document.createTextNode(child)); } else { if (child) { el.appendChild(child); } } } for (var attr in attrs) { if (attr == "className") { el[attr] = attrs[attr]; } else { el.setAttribute(attr, attrs[attr]); } } return el; }; jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { var showPassed, showSkipped; this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, this.createDom('div', { className: 'banner' }, this.createDom('div', { className: 'logo' }, this.createDom('span', { className: 'title' }, "Jasmine"), this.createDom('span', { className: 'version' }, runner.env.versionString())), this.createDom('div', { className: 'options' }, "Show ", showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") ) ), this.runnerDiv = this.createDom('div', { className: 'runner running' }, this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), this.runnerMessageSpan = this.createDom('span', {}, "Running..."), this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) ); this.document.body.appendChild(this.outerDiv); var suites = runner.suites(); for (var i = 0; i < suites.length; i++) { var suite = suites[i]; var suiteDiv = this.createDom('div', { className: 'suite' }, this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); this.suiteDivs[suite.id] = suiteDiv; var parentDiv = this.outerDiv; if (suite.parentSuite) { parentDiv = this.suiteDivs[suite.parentSuite.id]; } parentDiv.appendChild(suiteDiv); } this.startedAt = new Date(); var self = this; showPassed.onclick = function(evt) { if (showPassed.checked) { self.outerDiv.className += ' show-passed'; } else { self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); } }; showSkipped.onclick = function(evt) { if (showSkipped.checked) { self.outerDiv.className += ' show-skipped'; } else { self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); } }; }; jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { var results = runner.results(); var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; this.runnerDiv.setAttribute("class", className); //do it twice for IE this.runnerDiv.setAttribute("className", className); var specs = runner.specs(); var specCount = 0; for (var i = 0; i < specs.length; i++) { if (this.specFilter(specs[i])) { specCount++; } } var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); }; jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { var results = suite.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.totalCount === 0) { // todo: change this to check results.skipped status = 'skipped'; } this.suiteDivs[suite.id].className += " " + status; }; jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { if (this.logRunningSpecs) { this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); } }; jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { var results = spec.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.skipped) { status = 'skipped'; } var specDiv = this.createDom('div', { className: 'spec ' + status }, this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(spec.getFullName()), title: spec.getFullName() }, spec.description)); var resultItems = results.getItems(); var messagesDiv = this.createDom('div', { className: 'messages' }); for (var i = 0; i < resultItems.length; i++) { var result = resultItems[i]; if (result.type == 'log') { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); } else if (result.type == 'expect' && result.passed && !result.passed()) { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); if (result.trace.stack) { messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); } } } if (messagesDiv.childNodes.length > 0) { specDiv.appendChild(messagesDiv); } this.suiteDivs[spec.suite.id].appendChild(specDiv); }; jasmine.TrivialReporter.prototype.log = function() { var console = jasmine.getGlobal().console; if (console && console.log) { if (console.log.apply) { console.log.apply(console, arguments); } else { console.log(arguments); // ie fix: console.log.apply doesn't exist on ie } } }; jasmine.TrivialReporter.prototype.getLocation = function() { return this.document.location; }; jasmine.TrivialReporter.prototype.specFilter = function(spec) { var paramMap = {}; var params = this.getLocation().search.substring(1).split('&'); for (var i = 0; i < params.length; i++) { var p = params[i].split('='); paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); } if (!paramMap.spec) { return true; } return spec.getFullName().indexOf(paramMap.spec) === 0; }; ././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/HtmlReporter.jscordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/html/HtmlRepor0000644000015000001560000000523412272510571033465 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter = function(_doc) { var self = this; var doc = _doc || window.document; var reporterView; var dom = {}; // Jasmine Reporter Public Interface self.logRunningSpecs = false; self.reportRunnerStarting = function(runner) { var specs = runner.specs() || []; if (specs.length == 0) { return; } createReporterDom(runner.env.versionString()); doc.body.appendChild(dom.reporter); reporterView = new jasmine.HtmlReporter.ReporterView(dom); reporterView.addSpecs(specs, self.specFilter); }; self.reportRunnerResults = function(runner) { reporterView && reporterView.complete(); }; self.reportSuiteResults = function(suite) { reporterView.suiteComplete(suite); }; self.reportSpecStarting = function(spec) { if (self.logRunningSpecs) { self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); } }; self.reportSpecResults = function(spec) { reporterView.specComplete(spec); }; self.log = function() { var console = jasmine.getGlobal().console; if (console && console.log) { if (console.log.apply) { console.log.apply(console, arguments); } else { console.log(arguments); // ie fix: console.log.apply doesn't exist on ie } } }; self.specFilter = function(spec) { if (!focusedSpecName()) { return true; } return spec.getFullName().indexOf(focusedSpecName()) === 0; }; return self; function focusedSpecName() { var specName; (function memoizeFocusedSpec() { if (specName) { return; } var paramMap = []; var params = doc.location.search.substring(1).split('&'); for (var i = 0; i < params.length; i++) { var p = params[i].split('='); paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); } specName = paramMap.spec; })(); return specName; } function createReporterDom(version) { dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, dom.banner = self.createDom('div', { className: 'banner' }, self.createDom('span', { className: 'title' }, "Jasmine "), self.createDom('span', { className: 'version' }, version)), dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), dom.alert = self.createDom('div', {className: 'alert'}), dom.results = self.createDom('div', {className: 'results'}, dom.summary = self.createDom('div', { className: 'summary' }), dom.details = self.createDom('div', { id: 'details' })) ); } }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/test/autotest/test-runner.js0000644000015000001560000000406112272510571033503 0ustar pbuserpbgroup00000000000000/* * * 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. * */ if (window.sessionStorage != null) { window.sessionStorage.clear(); } // Timeout is 2 seconds to allow physical devices enough // time to query the response. This is important for some // Android devices. var Tests = function() {}; Tests.TEST_TIMEOUT = 7500; // Creates a spy that will fail if called. function createDoNotCallSpy(name, opt_extraMessage) { return jasmine.createSpy().andCallFake(function() { var errorMessage = name + ' should not have been called.'; if (arguments.length) { errorMessage += ' Got args: ' + JSON.stringify(arguments); } if (opt_extraMessage) { errorMessage += '\n' + opt_extraMessage; } expect(false).toBe(true, errorMessage); }); } // Waits for any of the given spys to be called. // Last param may be a custom timeout duration. function waitsForAny() { var spys = [].slice.call(arguments); var timeout = Tests.TEST_TIMEOUT; if (typeof spys[spys.length - 1] == 'number') { timeout = spys.pop(); } waitsFor(function() { for (var i = 0; i < spys.length; ++i) { if (spys[i].wasCalled) { return true; } } return false; }, "Expecting callbacks to be called.", timeout); } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/0000755000015000001560000000000012272510677026625 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/ios/0000755000015000001560000000000012272510677027417 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/ios/CDVWhitelistAPI.h0000644000015000001560000000173712272510571032434 0ustar pbuserpbgroup00000000000000/* 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. */ #import #import @interface CDVWhitelistAPI : CDVPlugin {} - (void)URLMatchesPatterns:(CDVInvokedUrlCommand*)command; - (void)URLIsAllowed:(CDVInvokedUrlCommand*)command; @end cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/ios/CDVWhitelistAPI.m0000644000015000001560000000351012272510571032430 0ustar pbuserpbgroup00000000000000/* 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. */ #import #import "CDVWhitelistAPI.h" @implementation CDVWhitelistAPI - (void)URLMatchesPatterns:(CDVInvokedUrlCommand*)command { NSString *url = [command argumentAtIndex:0]; NSArray *allowedHosts = [command argumentAtIndex:1]; CDVWhitelist* whitelist = [[CDVWhitelist alloc] initWithArray:allowedHosts]; bool isAllowed = [whitelist URLIsAllowed:[NSURL URLWithString:url]]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:isAllowed]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } - (void)URLIsAllowed:(CDVInvokedUrlCommand*)command { NSString *url = [command argumentAtIndex:0]; CDVWhitelist* whitelist = [(CDVViewController *)self.viewController whitelist]; bool isAllowed = [whitelist URLIsAllowed:[NSURL URLWithString:url]]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:isAllowed]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } @end cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/android/0000755000015000001560000000000012272510677030245 5ustar pbuserpbgroup00000000000000././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/android/WhitelistAPI.javacordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/src/android/WhitelistAPI.jav0000644000015000001560000000502112272510571033244 0ustar pbuserpbgroup00000000000000/* 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. */ package org.apache.cordova.test; import org.apache.cordova.Whitelist; import org.apache.cordova.Config; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; import org.json.JSONArray; import org.json.JSONException; public class WhitelistAPI extends CordovaPlugin { /** * Executes the request and returns PluginResult. * * @param action The action to execute. * @param args JSONArry of arguments for the plugin. * @param callbackContext The callback id used when calling back into JavaScript. * @return True if the action was valid, false if not. */ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("URLMatchesPatterns")) { String url = args.getString(0); JSONArray patterns = args.getJSONArray(1); Whitelist whitelist = new Whitelist(); for (int i=0; i < patterns.length(); i++) { String pattern = patterns.getString(i); whitelist.addWhiteListEntry(pattern, false); } boolean isAllowed = whitelist.isUrlWhiteListed(url); callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, isAllowed)); return true; } else if (action.equals("URLIsAllowed")) { String url = args.getString(0); boolean isAllowed = Config.isUrlWhiteListed(url); callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, isAllowed)); return true; } return false; } } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/docs/0000755000015000001560000000000012272510677026766 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/docs/whitelist.md0000644000015000001560000000326712272510571031325 0ustar pbuserpbgroup00000000000000--- license: 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. --- Whitelist ========= > The `whitelist` object provides an interface for testing whether arbitrary > URLs are allowed by the currently active configuration, or would be allowed > by a given set of whitelist patterns. Methods ------- - cordova.whitelist.match - cordova.whitelist.test ### cordova.whitelist.match Indicates whether a given URL would be allowed by a set of Whitelist URL patterns. cordova.whitelist.match(url, patterns, callback); `callback` will be invoked with a boolean argument indicating whether the url matches the set of patterns. ### cordova.whitelist.test Indicates whether a given URL would be allowed by the current application configuration. cordova.whitelist.test(url, callback); `callback` will be invoked with a boolean argument indicating whether the url is currently whitelisted. cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-plugin-whitelist/plugin.xml0000644000015000001560000000215712272510571030054 0ustar pbuserpbgroup00000000000000 Whitelist cordova-ubuntu-tests-2.11+14.04.20140130.3/www/cordova-incl.js0000644000015000001560000000220612272510571024002 0ustar pbuserpbgroup00000000000000/* * * 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. * */ document.write(''); function backHome() { if (window.device && device.platform && device.platform.toLowerCase() == 'android') { navigator.app.backHistory(); } else { window.history.go(-1); } } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/README.md0000644000015000001560000000364412272510571022352 0ustar pbuserpbgroup00000000000000 ## Mobile Spec Suite ## These specs are designed to run inside the mobile device that implements it - _it will fail in the DESKTOP browser_. These set of tests is designed to be used with Cordova. You should initialize a fresh Cordova repository for a target platform and then toss these files into the www folder, replacing the contents. Make sure you include cordova.js in the www folder (see the code in cordova-incl.js for clarification). This is done so that you don't have to modify every HTML file when you want to test a new version of Cordova. The goal is to test mobile device functionality inside a mobile browser. Where possible, the Cordova API lines up with HTML 5 spec. Maybe down the road we could use this spec for parts of HTML 5, too :) ### Requirements ### Various parts of this test suite communicate with external servers. Therefore, when you wrap up the test suite inside a Cordova application, make sure you add the following entries to the whitelist! - audio.ibeat.org - cordova-filetransfer.jitsu.com - whatheaders.com - apache.org (with all subdomains) - www.google.com - httpssss://example.com (bad protocol necessary) cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/0000755000015000001560000000000012272510677023606 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/inject.css0000644000015000001560000000153512272510571025571 0ustar pbuserpbgroup00000000000000/* * 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. */ #style-update-file { display: block !important; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/inject.js0000644000015000001560000000160412272510571025412 0ustar pbuserpbgroup00000000000000/* * 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. */ var d = document.getElementById("header") d.innerHTML = "Script file successfully injected"; cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/inject.html0000644000015000001560000000325212272510571025743 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

InAppBrowser - Script / Style Injection Test

cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/local.html0000644000015000001560000000406312272510571025562 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

InAppBrowser - Local URL

You have successfully loaded a local URL
User-Agent =

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/local.pdf0000644000015000001560000002057012272510571025370 0ustar pbuserpbgroup00000000000000%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xE?0w>`"qq#i`L P?ޟf84-fރv".P3#er:Y_Sb68*҈C5["*FW#Seg~`5yj%ݕ-x(73NQl0 endstream endobj 5 0 obj 150 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1.0 8 0 R >> >> endobj 9 0 obj << /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xUMlUgŠU+'ZEi *:i"Rm֛ew6QOT! zZ~^TTH 8YCz̛fK}D|XU$~uB}NRI/<Ƈ7ޅצר܎{%U:,vsks$Gȭ!|];DbUxfϵt$Y:卵HNIVz-#Cz [Eydʈx0q+G#؅бGU ZT扞ȗsgWs;<ć̫|xHK}/wѴ%Q)o))_)ϕ$+ʊrY||ݧ(u[=vfq1ܱAk3o,mEp gK~nߥvjjyaqmBim ր6vq5y=klfUg=.SfE#fsH޵]:QV݇I!H&ɒf3Ì}sDf7N=ΈY1:yɄsd{}^_{4md(EsߚbPןY"s>aض@ Y'~Gjju72J&"j endstream endobj 10 0 obj 1088 endobj 7 0 obj [ /ICCBased 9 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 11 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ADYXYT+Helvetica /FontDescriptor 12 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 116 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 500 556 556 278 0 0 0 0 0 222 0 0 556 556 0 0 500 278 ] >> endobj 12 0 obj << /Type /FontDescriptor /FontName /ADYXYT+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth -441 /MaxWidth 1500 /FontFile2 13 0 R >> endobj 13 0 obj << /Length 14 0 R /Length1 8084 /Filter /FlateDecode >> stream xYyxTE?uNw;+ i&t%%D@ A3q DE ~3 MCetg>7gQ~n|nuUSnթ_:uw- B ?Obva?}gkVZGTUk'O=]+ryY$x2sO~57-E޺=]j_ۙ~枞nW뜨OZP_$xp#C+J.鲔OA'yO_?;/[aR}+ƳqQI&I1hΉA=jsrfa솇1>nr?c܄1$caN '`%jι`qUj1'g}bN yVvLHgAo8"/GsOEyb v8^JG.+: + Z v}aw{(rf]}mk]Ϳ髆6!wU_TAj}Ҿ:r_t暛{:]9hfs~=X_L~\8`| g@;6?lN1J8 pLvkd50otȇ\1 ?%/a%<{l2a-Qx#D?( V7h|_J`!O9̥ƟcC\F,^$^x{~%EF]hfC3d"8" klCNk I/J1A.fț,ncp"3e{ٗ5QґtB{1l1 RHfF*< %)xs'Qa=o 3;S﹪wOb~ `1)4^ 87Vx JtΏGfƸy=O>QY~,.$*ږdiB@')Y[Q:I&? 8۫ hg12tNW3RuPYi7Y{=*[}v2d;! F/6h>i}GitzSUu@Q`fTcH`NI2HDʀVI"F !JzpwB+iO-N4$(M-+sg ]EJH3`%BC~f)eSSf]òȐUT I/b&s}iʩ?c ǷbIn-FBl/XEֈ漥s_ynv{nLRԸuo3{Hc4+|# P<V l"͑4;BXPR-[imr('^߰s ѷ߽w퓻t/2\8S?gG}k?ϳL>q|Vmy /d1Ov`v1'k`S`R fYQ y=c->v虥"/yRv9< Irv7-k-$A859F &V!RcQ,9ӧ굩ZS$y3lz`;&jG5nE<&*Y ]u);ɷ[ۭhBR:ĩeSрp]*mq*ŒU^^E0rQZaipg#rXeSJLF.[9wc[Mm)K,|v%6a2]Ft*!L/u$wTM##"'/I> <,!iK!Wܭݗ_>ِ4MT8BCXmJbň=ʄ o"F.8:Uc|D0!'#2$h1ЁL u}ybL3N xzqHRC7;X=>r8Ƨ׏V6Ms>T30Vdz2V_Y_YOO{=^,.Q>OfyuyoFI5bw #g@PjRiN3MU>i-8*[ '腱,c-RԱ &P\Oo%y$S%C\F೑rf0Kĕ!I*J$t]"4Ld"oLr"O%cOT0S Kn;^9 B,+vLЦ9g2y_c+Ù ~wyҸpw%]Ӌg5k-}I_M_+|I ꠗK XF2,0j) /Y,V9ؕ> tFcd@= K1Rv=pg,JN78g7,ٲ_2ֱpy0❫Ϡ߰;=IXBj[za,+'"faF(YS׹{y;IHir! 0HHOc|ă4L\W˯i?1^ʫ^7]\|O#0+ endstream endobj 14 0 obj 5020 endobj 15 0 obj (Untitled) endobj 16 0 obj (Mac OS X 10.8.2 Quartz PDFContext) endobj 17 0 obj (Andrew Grieve) endobj 18 0 obj (TextEdit) endobj 19 0 obj (D:20130117190221Z00'00') endobj 20 0 obj () endobj 21 0 obj [ ] endobj 1 0 obj << /Title 15 0 R /Author 17 0 R /Producer 16 0 R /Creator 18 0 R /CreationDate 19 0 R /ModDate 19 0 R /Keywords 20 0 R /AAPL:Keywords 21 0 R >> endobj xref 0 22 0000000000 65535 f 0000007812 00000 n 0000000265 00000 n 0000001715 00000 n 0000000022 00000 n 0000000246 00000 n 0000000369 00000 n 0000001680 00000 n 0000001848 00000 n 0000000468 00000 n 0000001659 00000 n 0000001798 00000 n 0000002211 00000 n 0000002462 00000 n 0000007572 00000 n 0000007593 00000 n 0000007620 00000 n 0000007672 00000 n 0000007704 00000 n 0000007731 00000 n 0000007773 00000 n 0000007792 00000 n trailer << /Size 22 /Root 11 0 R /Info 1 0 R /ID [ <40d0410f7a1ab0d4e4ff7f580372636b> <40d0410f7a1ab0d4e4ff7f580372636b> ] >> startxref 7971 %%EOF cordova-ubuntu-tests-2.11+14.04.20140130.3/www/inappbrowser/index.html0000644000015000001560000003131312272510571025575 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

InAppBrowser

Make sure http://www.google.com is white listed.
Make sure http://www.apple.com is not in the white list.
In iOS, starred * tests will leave the app with no way to return.

User-Agent:

Back

Local URL

Default: CordovaWebView
Target=Self: CordovaWebView
Target=System: Error
Target=Blank: InAppBrowser
Target=Random: InAppBrowser
Target=Random, no location bar: InAppBrowser

White Listed URL

Default: CordovaWebView*
Target=Self: CordovaWebView*
Target=System: System Browser
Target=Blank: InAppBrowser
Target=Random: InAppBrowser
Target=Random, no location bar: InAppBrowser

Non White Listed URL

Default: InAppBrowser
Target=Self: InAppBrowser
Target=System: System
Target=Blank: InAppBrowser
Target=Random: InAppBrowser
Target=Random, no location bar: InAppBrowser

Page with redirect

http://google.com (should 301)
http://www.zhihu.com/answer/16714076 (should 302)

PDF URL

Remote URL
Local URL

INVALID URL

Invalid Scheme
Invalid Host
Missing File

CSS / JS Injection

Original Document
CSS File Injection
CSS File Injection (CB)
CSS Literal Injection
CSS Literal Injection (CB)
Script File Injection
Script File Injection (CB)
Script Literal Injection
Script Literal Injection (CB)

Open Hidden

google.com hidden
show hidden
close hidden
google.com not hidden

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/master.css0000644000015000001560000000641312272510571023075 0ustar pbuserpbgroup00000000000000/* * * 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. * */ body { background:#222 none repeat scroll 0 0; color:#666; font-family:Helvetica; font-size:72%; line-height:1.5em; margin:0; border-top:1px solid #393939; } #info{ background:#ffa; border: 1px solid #ffd324; -webkit-border-radius: 5px; border-radius: 5px; clear:both; margin:15px 6px 0; min-width:295px; max-width:97%; padding:4px 0px 2px 10px; word-wrap:break-word; margin-bottom:10px; display:inline-block; min-height: 160px; max-height: 300px; overflow: auto; -webkit-overflow-scrolling: touch; } #info > h4{ font-size:.95em; margin:5px 0; } #stage.theme{ padding-top:3px; } /* Definition List */ #stage.theme > dl{ padding-top:10px; clear:both; margin:0; list-style-type:none; padding-left:10px; overflow:auto; } #stage.theme > dl > dt{ font-weight:bold; float:left; margin-left:5px; } #stage.theme > dl > dd{ width:45px; float:left; color:#a87; font-weight:bold; } /* Content Styling */ #stage.theme > h1, #stage.theme > h2, #stage.theme > p{ margin:1em 0 .5em 13px; } #stage.theme > h1{ color:#eee; font-size:1.6em; text-align:center; margin:0; margin-top:15px; padding:0; } #stage.theme > h2{ clear:both; margin:0; padding:3px; font-size:1em; text-align:center; } /* Stage Buttons */ #stage.theme .btn{ border: 1px solid #555; -webkit-border-radius: 5px; border-radius: 5px; text-align:center; display:inline-block; background:#444; width:150px; color:#9ab; font-size:1.1em; text-decoration:none; padding:1.2em 0; margin:3px 0px 3px 5px; } #stage.theme .large{ width:308px; padding:1.2em 0; } #stage.theme .wide{ width:100%; padding:1.2em 0; } #stage.theme .backBtn{ border: 1px solid #555; -webkit-border-radius: 5px; border-radius: 5px; text-align:center; display:block; float:right; background:#666; width:75px; color:#9ab; font-size:1.1em; text-decoration:none; padding:1.2em 0; margin:3px 5px 3px 5px; } #stage.theme .input{ border: 1px solid #555; -webkit-border-radius: 5px; border-radius: 5px; text-align:center; display:block; float:light; background:#888; color:#9cd; font-size:1.1em; text-decoration:none; padding:1.2em 0; margin:3px 0px 3px 5px; } #stage.theme .numeric{ width:100%; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/contacts/0000755000015000001560000000000012272510677022711 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/contacts/index.html0000644000015000001560000001146712272510571024710 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Contacts

Results:

Action

Get phone's contacts
Add a new contact 'Dooney Evans'

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/notification/0000755000015000001560000000000012272510677023561 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/notification/index.html0000644000015000001560000001265712272510571025562 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Notifications and Dialogs

Action

Beep
Vibrate
Alert Dialog
Confirm Dialog - Deprecated
Confirm Dialog
Prompt Dialog
Built-in Alert Dialog
Built-in Confirm Dialog
Built-in Prompt Dialog

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/tools/0000755000015000001560000000000012272510677022233 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/tools/toetag0000755000015000001560000000406212272510571023437 0ustar pbuserpbgroup00000000000000## # # 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. # ## ## # # # ## defaultpath="../autotest/tests/" ## # regex ## # regex for id'ing a spec specreg="^[ \t]*it(\".*" # regex for id'ing a tagged spec tagged=".*spec\.[0-9]*" # default suite name suitename="SUITE" toetagtargets() { for file in ${targets[@]} do echo toetagging $file suitename $file echo Suite Name: $suitename found=$(grep -c "$specreg" $defaultpath$file) foundtagged=$(grep -c "$tagged" $defaultpath$file) echo found $found specs to toetag echo found $foundtagged specs already tagged tagcode=0 declare -i tagcode temp=$IFS IFS=" " totag=$(grep $specreg $defaultpath$file | grep -v $tagged) for line in $totag do tagcode=$tagcode+1 modline=$(echo "$line" | sed s/it\(\"/it\(\"$suitename.spec.$tagcode\ /) echo "$line" sed -i '.bak' s#"$line"#"$modline"# $defaultpath$file done echo IFS=$temp echo echo done } ## # suite name is first segment of file name delimited by '.' ## suitename() { temp=$IFS IFS='.' read -ra suitename <<< "$1" IFS=$temp } # read all entries in default_path read -a targets <<< $(ls $defaultpath) toetagtargets cordova-ubuntu-tests-2.11+14.04.20140130.3/www/plugins.xml0000644000015000001560000000352712272510571023276 0ustar pbuserpbgroup00000000000000 cordova-ubuntu-tests-2.11+14.04.20140130.3/www/misc/0000755000015000001560000000000012272510677022026 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/misc/page2.html0000644000015000001560000000525312272510571023710 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Page2 App

This is page 2 of a Apache Cordova app

Platform:

Version:

UUID:

Name:

Width: , Height: , Color Depth:

about:blank
invalid URL
whatheaders.com
apache.org
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/misc/index.html0000644000015000001560000000622012272510571024014 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Display Other Content

Action

Call 411
Send Mail Send SMS Load Web Site Load a page with iframes Load page with query param

Android Only

Map IBM Search Android market View image app

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/audio/0000755000015000001560000000000012272510677022174 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/audio/index.html0000644000015000001560000003354712272510571024176 0ustar pbuserpbgroup00000000000000 Cordova Audio Tests

Audio

Status:
Duration:
Position:

Action

Play Sample Audio
Play
Pause
Stop
Release
Seek By
Seek To


Record Audio
Record Audio for 10 sec
Play
Pause
Stop

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/network/0000755000015000001560000000000012272510677022564 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/network/index.html0000644000015000001560000000546212272510571024561 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Network Events and State

Results:

Action

Show Network Connection

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/dependencies-plugin/0000755000015000001560000000000012272510677025015 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/dependencies-plugin/plugin.xml0000644000015000001560000000600612272510571027030 0ustar pbuserpbgroup00000000000000 Mobile-Spec plugin to quickly pull in all cordova plugins cordova-ubuntu-tests-2.11+14.04.20140130.3/www/main.js0000644000015000001560000001172712272510571022356 0ustar pbuserpbgroup00000000000000/* * * 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. * */ var deviceInfo = function() { document.getElementById("platform").innerHTML = device.platform; document.getElementById("version").innerHTML = device.version; document.getElementById("uuid").innerHTML = device.uuid; document.getElementById("model").innerHTML = device.model; document.getElementById("width").innerHTML = screen.width; document.getElementById("height").innerHTML = screen.height; document.getElementById("colorDepth").innerHTML = screen.colorDepth; }; var getLocation = function() { var suc = function(p) { alert(p.coords.latitude + " " + p.coords.longitude); }; var locFail = function() { }; navigator.geolocation.getCurrentPosition(suc, locFail); }; var beep = function() { navigator.notification.beep(2); }; var vibrate = function() { navigator.notification.vibrate(0); }; function roundNumber(num) { var dec = 3; var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec); return result; } var accelerationWatch = null; function updateAcceleration(a) { document.getElementById('x').innerHTML = roundNumber(a.x); document.getElementById('y').innerHTML = roundNumber(a.y); document.getElementById('z').innerHTML = roundNumber(a.z); } var toggleAccel = function() { if (accelerationWatch !== null) { navigator.accelerometer.clearWatch(accelerationWatch); updateAcceleration({ x : "", y : "", z : "" }); accelerationWatch = null; } else { var options = {}; options.frequency = 1000; accelerationWatch = navigator.accelerometer.watchAcceleration( updateAcceleration, function(ex) { alert("accel fail (" + ex.name + ": " + ex.message + ")"); }, options); } }; var preventBehavior = function(e) { e.preventDefault(); }; function dump_pic(data) { var viewport = document.getElementById('viewport'); console.log(data); viewport.style.display = ""; viewport.style.position = "absolute"; viewport.style.top = "10px"; viewport.style.left = "10px"; document.getElementById("test_img").src = "data:image/jpeg;base64," + data; } function fail(msg) { alert(msg); } function show_pic() { navigator.camera.getPicture(dump_pic, fail, { quality : 50 }); } function close() { var viewport = document.getElementById('viewport'); viewport.style.position = "relative"; viewport.style.display = "none"; } // This is just to do this. function readFile() { navigator.file.read('/sdcard/cordova.txt', fail, fail); } function writeFile() { navigator.file.write('foo.txt', "This is a test of writing to a file", fail, fail); } function contacts_success(contacts) { alert(contacts.length + ' contacts returned.' + (contacts[2] && contacts[2].name ? (' Third contact is ' + contacts[2].name.formatted) : '')); } function get_contacts() { var obj = new ContactFindOptions(); obj.filter = ""; obj.multiple = true; obj.limit = 5; navigator.service.contacts.find( [ "displayName", "name" ], contacts_success, fail, obj); } var networkReachableCallback = function(reachability) { // There is no consistency on the format of reachability var networkState = reachability.code || reachability; var currentState = {}; currentState[NetworkStatus.NOT_REACHABLE] = 'No network connection'; currentState[NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK] = 'Carrier data connection'; currentState[NetworkStatus.REACHABLE_VIA_WIFI_NETWORK] = 'WiFi connection'; confirm("Connection type:\n" + currentState[networkState]); }; function check_network() { navigator.network.isReachable("www.mobiledevelopersolutions.com", networkReachableCallback, {}); } function init() { // the next line makes it impossible to see Contacts on the HTC Evo since it // doesn't have a scroll button // document.addEventListener("touchmove", preventBehavior, false); document.addEventListener("deviceready", deviceInfo, true); document.getElementById("user-agent").textContent = navigator.userAgent; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/battery/0000755000015000001560000000000012272510677022545 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/battery/index.html0000644000015000001560000001010212272510571024525 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Battery

Status:
Level:
Plugged:
Low:
Critical:

Action

Add "batterystatus" listener
Remove "batterystatus" listener
Add "batterylow" listener
Remove "batterylow" listener
Add "batterycritical" listener
Remove "batterycritical" listener

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/LICENSE0000644000015000001560000002630112272510571022073 0ustar pbuserpbgroup00000000000000The MIT License Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2009-2011 Rob Ellis, Brock Whitten, Brian LeRoux Copyright 2010-2011, IBM Corporation Copyright 2011 Adobe Licensed 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. cordova-ubuntu-tests-2.11+14.04.20140130.3/www/lazyloadjs/0000755000015000001560000000000012272510677023247 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/lazyloadjs/index.html0000644000015000001560000000406112272510571025236 0ustar pbuserpbgroup00000000000000 Lazy-Loading of cordova-incl.js test

Lazy-Loading of cordova-incl.js

onDeviceReady has not yet fired.

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/beep.wav0000644000015000001560000001766212272510571022532 0ustar pbuserpbgroup00000000000000RIFFWAVEfmt @@dataF~|~y|wuxq{}ntnmrfyzcndblZwyWf\YfNtwM`SOaErvC[KG\;ot9UɑC?ʭW3ms1OҔ<7ҲR)kr(Kٕ51ڷN"ip!F0+LgoC+&Heo@'"Fen=$Ddn;"C dm :!B cm : B dn :!C dm;#Deo=& Feo@)$IgpC.)Khq!Fޖ2/۶O$jq(Kה85ԲS,ls/OВ?;˭X4mt8UƐGDè]>pvB[OLbGrwL`WVgSuzVg`^m]xzamiishz}mtssyt}x||}~~~|y~~vzutwn{|kskiqcy{_lb`kWvyUeYVdLswJ_PM_BpuAYHEé[8ot7SˑA=̯V0ms/NӔ:6ԳR(jq&Iۖ40۷M!ip E.)JgoB*%Gfo?&!Eem=#D dm;"C dm*C `r7#F `r8#F `q8$Gar:'Ibr=*"Kbs@/'Net"Dߙ4-ۺR#fu(H٘:3ӵV*iv0Mѕ@:˯Z3kv8RǓHBª^=nxBXOJcFqyL_XShQszVe`]m\v|`ligsgy}lsrqys|~w{||}z~~wzutxo{}msmiqcx|akcamXtzVd[WgMrzL^RMaCpxBXKEª]9mv8R˔D=˰X1jv0Mԗ<5ҵU(hu)Gۘ6.ںQ!ft!C0)Ndt?-$Kbs<)Iar:&Gar8$F `q7#E `r7#F `q8#G aq9&Gaq;(Ics>,#LdsA0(߼Oet#Eݘ5.ظR$gt*I֗;5ѳV-iv2NΕC<ɮ[6lv;TƒID_?nxDZQMeIqyN`YVjTs{Xgb`o^v|dnkiujy}nuvt}uy{z~}}|~xzwtypz}mrnjrdw|bke`nYs|Xd\ViMp{M]TNdDmzCVMD_:ky:PʗF<ʲ[1gx2Kә?4ҷX)ex)Eڛ8-ټT!cw#A4&Pav=0"N`v9+L^u7)J ]u5'I \u4&J \u3%I \u4&J ]u6(K]v8*M_v;-!O`v>2&Rbw$Aߝ8,ٻT#cw*Fך=3ѶY,fx2KϘD:ɱ\4iy;QŕKB`>lzCXQKfHo{M^YUjSs|Xeb^p^v}clkhuiy~nstrzt|y|~uW`\TkLl~MYUJfAh}CQO@b8e}9J˛F8ǵ_/a}3DҝA0ϻ\&^}*?۠<)X\|$;6#UY|73TW}4/RV|1,Q U}/+P T|.*O T}-*O T}.+Q U|0,RV}1/SW|52UY}86#W[}&<ޢ;)տZ#^},BןA0ι^,a}4HϜF9ƴa5e~h~FUTJiHkO\\SmSoZdd^r^tdkmhwjwntvt{u|z|~}}||x|uvuqxlxjnlfs`t_gd\oUp~U_]RkKl~KXTIf@i~AQÙN@²b6e~8K͛G7˷_.a}1E֟@/ҽ[&^}*@ݡ;)X\~$;7#VZ}63TX}3/RW}-@R,/~U Q+.T Q+.~T Q+.~U R-/~VS/3~WT25~YV!69"~[Yځ';ߥ>(~]#[Ӂ-?آC/~ͽa,^́5EПI7~Ƿc4aŁ=LƛO?~g=fFSVIlHiOZ]SoSnYbe]~s]rdjlgwiworur{t{y{}|}}}y}vxvqxlxkpnguat`he\qVpW_^RmLkMWWIiAgCPÚO@e7cĀ:I̝I7ȹa._́3DբD/п_'\Ԁ+>ܤ=(\Yڀ%9:"ZW 45~XT03~WS/0U R,.~U R,.~T Q,-~T R,.~U R-/~VS02~WU36~ZWށ"7:#~[Y؁(<ݥ?*^&]Ҁ/A֡D1~̻a._ʁ7G͞J9ĵd7c€?NŚPBg@gHUXK~lKkQ\_TpUo\dg\wz`imf~whunquq{tzy{||~~~}y|wxwsynwmpog~vcsbgg]~rWnX^_R}nLiNVXH}kAeDOœR?|g8`ă=H̡L6|Ǻe0]̓4BԣF.|a'ZԄ-;ܧA'{_Vۄ'7< {]T!29{[R/5{ZP,2zX N*1zX N)1zX M)0zX N)2zX N*3zYO-5zZQ09{\S#4̪P.om,PҎ67ԯL(nk$Lُ/1ܳH mjH*+DlhF%'AkgC"#@jgA!> jf @< if ?= jg >< jg @=jg@!?jhB#%BkiD&(DljH+-G nk"Kې03ٰK'om)Pӎ79ҭQ/po1Tˍ?AɧV8rp:Y‹GH[BtsD_OQaKuuNdXYfUxwYkabn`zyeqkltl|{pwuv{x~|~~~~{zzu}}rxqqsj{zgrghm_yx\k]^gTwuQeTTaJutF`LM[?sqЭQ.qm+PՐ56ذK&ol#Lܑ/0ߴH mjH*+Emh?4|mA%"Cgl?"Agk= @ fk < A fk = @ fk < A gl># Cgl@%"EhmB)'HjmF.,Kjn"Iݔ31ٴO&mp*MՒ98үS.nr1S̐A?ʫW7os;WÎHG]@quD\PPbJtvNbYXhUvxXiban`y{cokktk|}ovuuzw~~{|||{v}}sxsqtk{{hqhgn`yz]j_^iUvxReVUcJtuH_NL]@rs=YďECƩX7ps5R͑?=ήS/nq-N֓85׳O&lo%Jܔ1/޷KjnF,*HimC'%Egl@%"Chk>"Bfl< @ gk =@ fk < @ fk =!Bgl># Cgl@&$FhmC)'HinF/-޷K!ko$Jۓ42سO(lp+Nӑ;:ϮT1nr3SːAAǪZ9pt=YJJ^CruF^RL~mMhYViTuzXhbao^x{cnkjuj{}nvutzu}z}~}}}|x}~txtrvl{|ipjhpaw{^ja^jUuySdYUeKrwH^OL`Apv?WÑHCī[7mt5R̓A;ͱV/ls-LՕ:4յR&ir&Hݗ4.ܹNgr D/)Keq@+#Hdp=& Gdo;$E bo:"E co9"D bo9!D co:#Eco;%Fdp=(!Heq?,%KeqC0+ߺN hr$Gܗ61׶R'js+LԔ<7бV0ku4P˓C?ǬZ8mv Cordova Mobile Spec

Events

Results:

Action

Intercept backbutton
Stop intercept of backbutton
Intercept menubutton
Stop intercept of menubutton
Intercept searchbutton
Stop intercept of searchbutton
Intercept resume
Stop intercept of resume
Intercept pause
Stop intercept of pause
Intercept online
Stop intercept of online
Intercept offline
Stop intercept of offline

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/storage/0000755000015000001560000000000012272510677022537 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/storage/index.html0000644000015000001560000000460112272510571024526 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Local Storage

You have run this app an untold number of time(s).

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/splashscreen/0000755000015000001560000000000012272510677023565 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/splashscreen/index.html0000644000015000001560000000342412272510571025556 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Splashscreen

Action

Show for 1 second
Show for 5 seconds

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/camera/0000755000015000001560000000000012272510677022323 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/camera/index.html0000644000015000001560000003610312272510571024314 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Camera

Status:
img: canvas:

Cordova Camera API

camera.getPicture()

Native File Inputs

input type=file
capture=camera
capture=camcorder
capture=microphone

Actions

Get File Metadata
Read with FileReader
Copy Image
Write Image
Upload Image
Draw Using Canvas
Remove Image

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/accelerometer/0000755000015000001560000000000012272510677023705 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/accelerometer/index.html0000644000015000001560000001204212272510571025672 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Acceleration

Stopped
X:
Y:
Z:

Action

Get Acceleration
Start Watch
Clear Watch

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/VERSION0000644000015000001560000000000412272510571022126 0ustar pbuserpbgroup00000000000000dev cordova-ubuntu-tests-2.11+14.04.20140130.3/www/sql/0000755000015000001560000000000012272510677021672 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/sql/index.html0000644000015000001560000001440412272510571023663 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

HTML5 Database

Results:

Action

Create, Add, Read Database
Read Database

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/index.html0000644000015000001560000000606112272510571023064 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Apache Cordova Tests

Platform:

Version:

UUID:

Model:

Width: , Height: , Color Depth:

User-Agent:

Automatic Test Accelerometer Audio Play/Record Battery Camera Compass Contacts Events Location Lazy Loading of cordova-incl.js Misc Content Network Notification Splashscreen Web SQL Local Storage Benchmarks In App Browser cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/0000755000015000001560000000000012272510677022743 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/jasmine.css0000644000015000001560000001445412272510571025104 0ustar pbuserpbgroup00000000000000body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } #HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } #HTMLReporter a { text-decoration: none; } #HTMLReporter a:hover { text-decoration: underline; } #HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } #HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } #HTMLReporter #jasmine_content { position: fixed; right: 100%; } #HTMLReporter .version { color: #aaaaaa; } #HTMLReporter .banner { margin-top: 14px; } #HTMLReporter .duration { color: #aaaaaa; float: right; } #HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } #HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } #HTMLReporter .symbolSummary li.passed { font-size: 14px; } #HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } #HTMLReporter .symbolSummary li.failed { line-height: 9px; } #HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } #HTMLReporter .symbolSummary li.skipped { font-size: 14px; } #HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } #HTMLReporter .symbolSummary li.pending { line-height: 11px; } #HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } #HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } #HTMLReporter .runningAlert { background-color: #666666; } #HTMLReporter .skippedAlert { background-color: #aaaaaa; } #HTMLReporter .skippedAlert:first-child { background-color: #333333; } #HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } #HTMLReporter .passingAlert { background-color: #a6b779; } #HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } #HTMLReporter .failingAlert { background-color: #cf867e; } #HTMLReporter .failingAlert:first-child { background-color: #b03911; } #HTMLReporter .results { margin-top: 14px; } #HTMLReporter #details { display: none; } #HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } #HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } #HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } #HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } #HTMLReporter.showDetails .summary { display: none; } #HTMLReporter.showDetails #details { display: block; } #HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } #HTMLReporter .summary { margin-top: 14px; } #HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } #HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } #HTMLReporter .summary .specSummary.failed a { color: #b03911; } #HTMLReporter .description + .suite { margin-top: 0; } #HTMLReporter .suite { margin-top: 14px; } #HTMLReporter .suite a { color: #333333; } #HTMLReporter #details .specDetail { margin-bottom: 28px; } #HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } #HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } #HTMLReporter .resultMessage span.result { display: block; } #HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } #TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } #TrivialReporter a:visited, #TrivialReporter a { color: #303; } #TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } #TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } #TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } #TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } #TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } #TrivialReporter .runner.running { background-color: yellow; } #TrivialReporter .options { text-align: right; font-size: .8em; } #TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } #TrivialReporter .suite .suite { margin: 5px; } #TrivialReporter .suite.passed { background-color: #dfd; } #TrivialReporter .suite.failed { background-color: #fdd; } #TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } #TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } #TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } #TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } #TrivialReporter .spec.skipped { background-color: #bbb; } #TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } #TrivialReporter .passed { background-color: #cfc; display: none; } #TrivialReporter .failed { background-color: #fbb; } #TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } #TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } #TrivialReporter .resultMessage .mismatch { color: black; } #TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } #TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } #TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } #TrivialReporter #jasmine_content { position: fixed; right: 100%; } #TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/0000755000015000001560000000000012272510677024105 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/file.tests.js0000644000015000001560000052361012272510571026523 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('File API', function() { // Adding a Jasmine helper matcher, to report errors when comparing to FileError better. var fileErrorMap = { 1: 'NOT_FOUND_ERR', 2: 'SECURITY_ERR', 3: 'ABORT_ERR', 4: 'NOT_READABLE_ERR', 5: 'ENCODING_ERR', 6: 'NO_MODIFICATION_ALLOWED_ERR', 7: 'INVALID_STATE_ERR', 8: 'SYNTAX_ERR', 9: 'INVALID_MODIFICATION_ERR', 10:'QUOTA_EXCEEDED_ERR', 11:'TYPE_MISMATCH_ERR', 12:'PATH_EXISTS_ERR' }; beforeEach(function() { this.addMatchers({ toBeFileError: function(code) { var error = this.actual; this.message = function(){ return "Expected FileError with code " + fileErrorMap[error.code] + " (" + error.code + ") to be " + fileErrorMap[code] + "(" + code + ")"; }; return (error.code == code); }, toCanonicallyMatch:function(path){ this.message = function(){ return "Expected paths to match : " + path + " should be " + this.actual; }; var a = path.split("/").join("").split("\\").join(""); var b = this.actual.split("/").join("").split("\\").join(""); return a == b; } }); }); // HELPER FUNCTIONS // deletes specified file or directory var deleteEntry = function(name, success, error) { // deletes entry, if it exists window.resolveLocalFileSystemURI(root.toURL() + '/' + name, function(entry) { if (entry.isDirectory === true) { entry.removeRecursively(success, error); } else { entry.remove(success, error); } }, success); }; // deletes file, if it exists, then invokes callback var deleteFile = function(fileName, callback) { root.getFile(fileName, null, // remove file system entry function(entry) { entry.remove(callback, function() { console.log('[ERROR] deleteFile cleanup method invoked fail callback.'); }); }, // doesn't exist callback); }; // deletes and re-creates the specified file var createFile = function(fileName, success, error) { deleteEntry(fileName, function() { root.getFile(fileName, {create: true}, success, error); }, error); }; // deletes and re-creates the specified directory var createDirectory = function(dirName, success, error) { deleteEntry(dirName, function() { root.getDirectory(dirName, {create: true}, success, error); }, error); }; var createFail = function(module) { return jasmine.createSpy("Fail").andCallFake(function(err) { console.log('[ERROR ' + module + '] ' + JSON.stringify(err)); }); }; var createWin = function(module) { return jasmine.createSpy("Win").andCallFake(function() { console.log('[ERROR ' + module + '] Unexpected success callback'); }); }; describe('FileError object', function() { it("file.spec.1 should define FileError constants", function() { expect(FileError.NOT_FOUND_ERR).toBe(1); expect(FileError.SECURITY_ERR).toBe(2); expect(FileError.ABORT_ERR).toBe(3); expect(FileError.NOT_READABLE_ERR).toBe(4); expect(FileError.ENCODING_ERR).toBe(5); expect(FileError.NO_MODIFICATION_ALLOWED_ERR).toBe(6); expect(FileError.INVALID_STATE_ERR).toBe(7); expect(FileError.SYNTAX_ERR).toBe(8); expect(FileError.INVALID_MODIFICATION_ERR).toBe(9); expect(FileError.QUOTA_EXCEEDED_ERR).toBe(10); expect(FileError.TYPE_MISMATCH_ERR).toBe(11); expect(FileError.PATH_EXISTS_ERR).toBe(12); }); }); describe('LocalFileSystem', function() { it("file.spec.2 should define LocalFileSystem constants", function() { expect(LocalFileSystem.TEMPORARY).toBe(0); expect(LocalFileSystem.PERSISTENT).toBe(1); }); describe('window.requestFileSystem', function() { it("file.spec.3 should be defined", function() { expect(window.requestFileSystem).toBeDefined(); }); it("file.spec.4 should be able to retrieve a PERSISTENT file system", function() { var win = jasmine.createSpy().andCallFake(function(fileSystem) { expect(fileSystem).toBeDefined(); expect(fileSystem.name).toBeDefined(); expect(fileSystem.name).toBe("persistent"); expect(fileSystem.root).toBeDefined(); }), fail = createFail('window.requestFileSystem'); // retrieve PERSISTENT file system runs(function() { window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, win, fail); }); waitsFor(function() { return win.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(win).toHaveBeenCalled(); }); }); it("file.spec.5 should be able to retrieve a TEMPORARY file system", function() { var win = jasmine.createSpy().andCallFake(function(fileSystem) { expect(fileSystem).toBeDefined(); expect(fileSystem.name).toBeDefined(); expect(fileSystem.name).toBe("temporary"); expect(fileSystem.root).toBeDefined(); }), fail = createFail('window.requestFileSystem'); // Request the file system runs(function() { window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, win, fail); }); waitsFor(function() { return win.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(win).toHaveBeenCalled(); }); }); it("file.spec.6 should error if you request a file system that is too large", function() { var fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.QUOTA_EXCEEDED_ERR); }), win = createWin('window.requestFileSystem'); // Request the file system runs(function() { window.requestFileSystem(LocalFileSystem.TEMPORARY, 1000000000000000, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "error callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).toHaveBeenCalled(); }); }); it("file.spec.7 should error out if you request a file system that does not exist", function() { var fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.SYNTAX_ERR); }), win = createWin('window.requestFileSystem'); // Request the file system runs(function() { window.requestFileSystem(-1, 0, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "error callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).toHaveBeenCalled(); }); }); }); describe('window.resolveLocalFileSystemURI', function() { it("file.spec.3 should be defined", function() { expect(window.resolveLocalFileSystemURI).toBeDefined(); }); it("file.spec.9 should resolve a valid file name", function() { var fileName = "resolve.file.uri", win = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.name).toCanonicallyMatch(fileName); // cleanup deleteEntry(fileName); }), fail = createFail('window.resolveLocalFileSystemURI'); resolveCallback = jasmine.createSpy().andCallFake(function(entry) { // lookup file system entry runs(function() { window.resolveLocalFileSystemURI(entry.toURL(), win, fail); }); waitsFor(function() { return win.wasCalled; }, "resolveLocalFileSystemURI callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); // create a new file entry runs(function() { createFile(fileName, resolveCallback, fail); }); waitsFor(function() { return resolveCallback.wasCalled; }, "createFile callback never called", Tests.TEST_TIMEOUT); }); it("file.spec.10 resolve valid file name with parameters", function() { var fileName = "resolve.file.uri.params", win = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.name).toBe(fileName); // cleanup deleteEntry(fileName); }), fail = createFail('window.resolveLocalFileSystemURI'); resolveCallback = jasmine.createSpy().andCallFake(function(entry) { // lookup file system entry runs(function() { window.resolveLocalFileSystemURI(entry.toURL() + "?1234567890", win, fail); }); waitsFor(function() { return win.wasCalled; }, "resolveLocalFileSystemURI callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); // create a new file entry runs(function() { createFile(fileName, resolveCallback, fail); }); waitsFor(function() { return resolveCallback.wasCalled; }, "createFile callback never called", Tests.TEST_TIMEOUT); }); it("file.spec.11 should error (NOT_FOUND_ERR) when resolving (non-existent) invalid file name", function() { var fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); }), win = createWin('window.resolveLocalFileSystemURI'); // lookup file system entry runs(function() { window.resolveLocalFileSystemURI("file:///this.is.not.a.valid.file.txt", win, fail); }); waitsFor(function() { return fail.wasCalled; }, "error callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); it("file.spec.12 should error (ENCODING_ERR) when resolving invalid URI with leading /", function() { var fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.ENCODING_ERR); }), win = createWin('window.resolveLocalFileSystemURI'); // lookup file system entry runs(function() { window.resolveLocalFileSystemURI("/this.is.not.a.valid.url", win, fail); }); waitsFor(function() { return fail.wasCalled; }, "error callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); }); }); describe('Metadata interface', function() { it("file.spec.13 should exist and have the right properties", function() { var metadata = new Metadata(); expect(metadata).toBeDefined(); expect(metadata.modificationTime).toBeDefined(); }); }); describe('Flags interface', function() { it("file.spec.13 should exist and have the right properties", function() { var flags = new Flags(false, true); expect(flags).toBeDefined(); expect(flags.create).toBeDefined(); expect(flags.create).toBe(false); expect(flags.exclusive).toBeDefined(); expect(flags.exclusive).toBe(true); }); }); describe('FileSystem interface', function() { it("file.spec.15 should have a root that is a DirectoryEntry", function() { var win = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(false); expect(entry.isDirectory).toBe(true); expect(entry.name).toBeDefined(); expect(entry.fullPath).toBeDefined(); expect(entry.getMetadata).toBeDefined(); expect(entry.moveTo).toBeDefined(); expect(entry.copyTo).toBeDefined(); expect(entry.toURL).toBeDefined(); expect(entry.remove).toBeDefined(); expect(entry.getParent).toBeDefined(); expect(entry.createReader).toBeDefined(); expect(entry.getFile).toBeDefined(); expect(entry.getDirectory).toBeDefined(); expect(entry.removeRecursively).toBeDefined(); }), fail = createFail('FileSystem'); runs(function() { window.resolveLocalFileSystemURI(root.toURL(), win, fail); }); waitsFor(function() { return win.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(win).toHaveBeenCalled(); }); }); }); describe('DirectoryEntry', function() { it("file.spec.16 getFile: get Entry for file that does not exist", function() { var fileName = "de.no.file", filePath = root.fullPath + '/' + fileName, fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); }), win = createWin('DirectoryEntry'); // create:false, exclusive:false, file does not exist runs(function() { root.getFile(fileName, {create:false}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "error callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); it("file.spec.17 etFile: create new file", function() { var fileName = "de.create.file", filePath = root.fullPath + '/' + fileName, win = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.name).toCanonicallyMatch(fileName); expect(entry.fullPath).toBe(filePath); // cleanup entry.remove(null, null); }), fail = createFail('DirectoryEntry'); // create:true, exclusive:false, file does not exist runs(function() { root.getFile(fileName, {create: true}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.18 getFile: create new file (exclusive)", function() { var fileName = "de.create.exclusive.file", filePath = root.fullPath + '/' + fileName, win = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.name).toBe(fileName); expect(entry.fullPath).toBe(filePath); // cleanup entry.remove(null, null); }), fail = createFail('DirectoryEntry'); // create:true, exclusive:true, file does not exist runs(function() { root.getFile(fileName, {create: true, exclusive:true}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.19 getFile: create file that already exists", function() { var fileName = "de.create.existing.file", filePath = root.fullPath + '/' + fileName, getFile = jasmine.createSpy().andCallFake(function(file) { // create:true, exclusive:false, file exists runs(function() { root.getFile(fileName, {create:true}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "win was never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), fail = createFail('DirectoryEntry'), win = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.name).toCanonicallyMatch(fileName); expect(entry.fullPath).toBe(filePath); // cleanup entry.remove(null, fail); }); // create file to kick off it runs(function() { root.getFile(fileName, {create:true}, getFile, fail); }); waitsFor(function() { return getFile.wasCalled; }, "getFile was never called", Tests.TEST_TIMEOUT); }); it("file.spec.20 getFile: create file that already exists (exclusive)", function() { var fileName = "de.create.exclusive.existing.file", filePath = root.fullPath + '/' + fileName, existingFile, getFile = jasmine.createSpy().andCallFake(function(file) { existingFile = file; // create:true, exclusive:true, file exists runs(function() { root.getFile(fileName, {create:true, exclusive:true}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.PATH_EXISTS_ERR); // cleanup existingFile.remove(null, fail); }), win = createWin('DirectoryEntry'); // create file to kick off it runs(function() { root.getFile(fileName, {create:true}, getFile, fail); }); waitsFor(function() { return getFile.wasCalled; }, "getFile never called", Tests.TEST_TIMEOUT); }); it("file.spec.21 getFile: get Entry for existing file", function() { var fileName = "de.get.file", filePath = root.fullPath + '/' + fileName, win = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.name).toCanonicallyMatch(fileName); expect(entry.fullPath).toCanonicallyMatch(filePath); entry.remove(null, fail); //clean up }), fail = createFail('DirectoryEntry'), getFile = jasmine.createSpy().andCallFake(function(file) { // create:false, exclusive:false, file exists runs(function() { root.getFile(fileName, {create:false}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "getFile success callback", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); // create file to kick off it runs(function() { root.getFile(fileName, {create:true}, getFile, fail); }); waitsFor(function() { return getFile.wasCalled; }, "file creation", Tests.TEST_TIMEOUT); }); it("file.spec.22 DirectoryEntry.getFile: get FileEntry for invalid path", function() { var fileName = "de:invalid:path", fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.ENCODING_ERR); }), win = createWin('DirectoryEntry'); // create:false, exclusive:false, invalid path runs(function() { root.getFile(fileName, {create:false}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); it("file.spec.23 DirectoryEntry.getDirectory: get Entry for directory that does not exist", function() { var dirName = "de.no.dir", dirPath = root.fullPath + '/' + dirName, fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); }), win = createWin('DirectoryEntry'); // create:false, exclusive:false, directory does not exist runs(function() { root.getDirectory(dirName, {create:false}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); it("file.spec.24 DirectoryEntry.getDirectory: create new dir with space then resolveFileSystemURI", function() { var dirName = "de create dir", dirPath = root.fullPath + '/' + dirName, getDir = jasmine.createSpy().andCallFake(function(dirEntry) { var dirURI = dirEntry.toURL(); // now encode URI and try to resolve runs(function() { window.resolveLocalFileSystemURI(dirURI, win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), win = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.name).toCanonicallyMatch(dirName); expect(directory.fullPath).toCanonicallyMatch(dirPath); // cleanup directory.remove(null, fail); }), fail = createFail('DirectoryEntry'); // create:true, exclusive:false, directory does not exist runs(function() { root.getDirectory(dirName, {create: true}, getDir, fail); }); waitsFor(function() { return getDir.wasCalled; }, "getDir never called", Tests.TEST_TIMEOUT); }); it("file.spec.25 DirectoryEntry.getDirectory: create new dir with space resolveFileSystemURI with encoded URI", function() { var dirName = "de create dir", dirPath = root.fullPath + '/' + dirName, getDir = jasmine.createSpy().andCallFake(function(dirEntry) { var dirURI = dirEntry.toURL(); // now encode URI and try to resolve runs(function() { window.resolveLocalFileSystemURI(encodeURI(dirURI), win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), win = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.name).toCanonicallyMatch(dirName); expect(directory.fullPath).toCanonicallyMatch(dirPath); // cleanup directory.remove(null, fail); }), fail = createFail('DirectoryEntry'); // create:true, exclusive:false, directory does not exist runs(function() { root.getDirectory(dirName, {create: true}, getDir, fail); }); waitsFor(function() { return getDir.wasCalled; }, "getDir never called", Tests.TEST_TIMEOUT); }); it("file.spec.26 DirectoryEntry.getDirectory: create new directory", function() { var dirName = "de.create.dir", dirPath = root.fullPath + '/' + dirName, win = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.name).toCanonicallyMatch(dirName); expect(directory.fullPath).toCanonicallyMatch(dirPath); // cleanup directory.remove(null, fail); }), fail = createFail('DirectoryEntry'); // create:true, exclusive:false, directory does not exist runs(function() { root.getDirectory(dirName, {create: true}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.27 DirectoryEntry.getDirectory: create new directory (exclusive)", function() { var dirName = "de.create.exclusive.dir", dirPath = root.fullPath + '/' + dirName, win = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.name).toCanonicallyMatch(dirName); expect(directory.fullPath).toCanonicallyMatch(dirPath); // cleanup directory.remove(null, fail); }), fail = createFail('DirectoryEntry'); // create:true, exclusive:true, directory does not exist runs(function() { root.getDirectory(dirName, {create: true, exclusive:true}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.28 DirectoryEntry.getDirectory: create directory that already exists", function() { var dirName = "de.create.existing.dir", dirPath = root.fullPath + '/' + dirName, getDir = jasmine.createSpy().andCallFake(function(directory) { // create:true, exclusive:false, directory exists runs(function() { root.getDirectory(dirName, {create:true}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), win = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.name).toCanonicallyMatch(dirName); expect(directory.fullPath).toCanonicallyMatch(dirPath); // cleanup directory.remove(null, fail); }), fail = createFail('DirectoryEntry'); // create directory to kick off it runs(function() { root.getDirectory(dirName, {create:true}, getDir, this.fail); }); waitsFor(function() { return getDir.wasCalled; }, "getDir never called", Tests.TEST_TIMEOUT); }); it("file.spec.29 DirectoryEntry.getDirectory: create directory that already exists (exclusive)", function() { var dirName = "de.create.exclusive.existing.dir", dirPath = root.fullPath + '/' + dirName, existingDir, getDir = jasmine.createSpy().andCallFake(function(directory) { existingDir = directory; // create:true, exclusive:true, directory exists runs(function() { root.getDirectory(dirName, {create:true, exclusive:true}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.PATH_EXISTS_ERR); // cleanup existingDir.remove(null, fail); }), win = createWin('DirectoryEntry'); // create directory to kick off it runs(function() { root.getDirectory(dirName, {create:true}, getDir, fail); }); waitsFor(function() { return getDir.wasCalled; }, "getDir never called", Tests.TEST_TIMEOUT); }); it("file.spec.30 DirectoryEntry.getDirectory: get Entry for existing directory", function() { var dirName = "de.get.dir", dirPath = root.fullPath + '/' + dirName, getDir = jasmine.createSpy().andCallFake(function(directory) { // create:false, exclusive:false, directory exists runs(function() { root.getDirectory(dirName, {create:false}, win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), win = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.name).toCanonicallyMatch(dirName); expect(directory.fullPath).toCanonicallyMatch(dirPath); // cleanup directory.remove(null, fail); }), fail = createFail('DirectoryEntry'); // create directory to kick it off runs(function() { root.getDirectory(dirName, {create:true}, getDir, fail); }); waitsFor(function() { return getDir.wasCalled; }, "getDir never called", Tests.TEST_TIMEOUT); }); it("file.spec.31 DirectoryEntry.getDirectory: get DirectoryEntry for invalid path", function() { var dirName = "de:invalid:path", fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.ENCODING_ERR); }), win = createWin('DirectoryEntry'); // create:false, exclusive:false, invalid path runs(function() { root.getDirectory(dirName, {create:false}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); it("file.spec.32 DirectoryEntry.getDirectory: get DirectoryEntry for existing file", function() { var fileName = "de.existing.file", existingFile, filePath = root.fullPath + '/' + fileName, getDir = jasmine.createSpy().andCallFake(function(file) { existingFile = file; // create:false, exclusive:false, existing file runs(function() { root.getDirectory(fileName, {create:false}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.TYPE_MISMATCH_ERR); // cleanup existingFile.remove(null, null); }), win = createWin('DirectoryEntry'); // create file to kick off it runs(function() { root.getFile(fileName, {create:true}, getDir, fail); }); waitsFor(function() { return getDir.wasCalled; }, "getDir was never called", Tests.TEST_TIMEOUT); }); it("file.spec.33 DirectoryEntry.getFile: get FileEntry for existing directory", function() { var dirName = "de.existing.dir", existingDir, dirPath = root.fullPath + '/' + dirName, getFile = jasmine.createSpy().andCallFake(function(directory) { existingDir = directory; // create:false, exclusive:false, existing directory runs(function() { root.getFile(dirName, {create:false}, win, fail); }); waitsFor(function() { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), fail = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.TYPE_MISMATCH_ERR); // cleanup existingDir.remove(null, null); }), win = createWin('DirectoryEntry'); // create directory to kick off it runs(function() { root.getDirectory(dirName, {create:true}, getFile, fail); }); waitsFor(function() { return getFile.wasCalled; }, "getFile never called", Tests.TEST_TIMEOUT); }); it("file.spec.34 DirectoryEntry.removeRecursively on directory", function() { var dirName = "de.removeRecursively", subDirName = "dir", dirPath = root.fullPath + '/' + dirName, //subDirPath = this.root.fullPath + '/' + subDirName, subDirPath = dirPath + '/' + subDirName, entryCallback = jasmine.createSpy().andCallFake(function(entry) { // delete directory var deleteDirectory = jasmine.createSpy().andCallFake(function(directory) { runs(function() { entry.removeRecursively(remove, fail); }); waitsFor(function() { return remove.wasCalled; }, "remove never called", Tests.TEST_TIMEOUT); }); // create a sub-directory within directory runs(function() { entry.getDirectory(subDirName, {create: true}, deleteDirectory, fail); }); waitsFor(function() { return deleteDirectory.wasCalled; }, "deleteDirectory never called", Tests.TEST_TIMEOUT); }), remove = jasmine.createSpy().andCallFake(function() { // it that removed directory no longer exists runs(function() { root.getDirectory(dirName, {create:false}, win, dirExists); }); waitsFor(function() { return dirExists.wasCalled; }, "dirExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(dirExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), dirExists = jasmine.createSpy().andCallFake(function(error){ expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); }), fail = createFail('DirectoryEntry'), win = createWin('DirectoryEntry'); // create a new directory entry to kick off it runs(function() { root.getDirectory(dirName, {create:true}, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.35 createReader: create reader on existing directory", function() { // create reader for root directory var reader = root.createReader(); expect(reader).toBeDefined(); expect(typeof reader.readEntries).toBe('function'); }); it("file.spec.36 removeRecursively on root file system", function() { var remove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NO_MODIFICATION_ALLOWED_ERR); }), win = createWin('DirectoryEntry'); // remove root file system runs(function() { root.removeRecursively(win, remove); }); waitsFor(function() { return remove.wasCalled; }, "remove never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(remove).toHaveBeenCalled(); }); }); }); describe('DirectoryReader interface', function() { describe("readEntries", function() { it("file.spec.37 should read contents of existing directory", function() { var reader, win = jasmine.createSpy().andCallFake(function(entries) { expect(entries).toBeDefined(); expect(entries instanceof Array).toBe(true); }), fail = createFail('DirectoryReader'); // create reader for root directory reader = root.createReader(); // read entries runs(function() { reader.readEntries(win, fail); }); waitsFor(function() { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.109 should return an empty entry list on the second call", function() { var reader, firstWin = jasmine.createSpy().andCallFake(function(entries) { expect(entries).toBeDefined(); expect(entries instanceof Array).toBe(true); expect(entries.length).not.toBe(0); reader.readEntries(secondWin, fail); }), secondWin = jasmine.createSpy().andCallFake(function(entries) { expect(entries).toBeDefined(); expect(entries instanceof Array).toBe(true); expect(entries.length).toBe(0); }), fail = createFail('DirectoryReader'); runs(function() { // Add a file to ensure the root directory is non-empty and then read the contents of the directory. root.getFile('test109.txt', { create: true }, function() { reader = root.createReader(); reader.readEntries(firstWin, fail); }, fail); }); waitsFor(function() { return secondWin.wasCalled; }, "secondWin never called", Tests.TEST_TIMEOUT); runs(function() { expect(firstWin).toHaveBeenCalled(); expect(secondWin).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); // Remove the test file. root.getFile('test109.txt', { create: false }, function(fileEntry) { fileEntry.remove(); }, fail); }); }); it("file.spec.38 should read contents of directory that has been removed", function() { var dirName = "de.createReader.notfound", dirPath = root.fullPath + '/' + dirName, entryCallback = jasmine.createSpy().andCallFake(function(directory) { // read entries var readEntries = jasmine.createSpy().andCallFake(function() { var reader = directory.createReader(); runs(function() { reader.readEntries(win, itReader); }); waitsFor(function() { return itReader.wasCalled; }, "itReader never called", Tests.TEST_TIMEOUT); }); // delete directory runs(function() { directory.removeRecursively(readEntries, fail); }); waitsFor(function() { return readEntries.wasCalled; }, "readEntries never called", Tests.TEST_TIMEOUT); }), itReader = jasmine.createSpy().andCallFake(function(error) { var itDirectoryExists = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); }); expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); runs(function() { root.getDirectory(dirName, {create:false}, win, itDirectoryExists); }); waitsFor(function() { return itDirectoryExists.wasCalled; }, "itDirectoryExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itDirectoryExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), fail = createFail('DirectoryReader'), win = createWin('DirectoryReader'); // create a new directory entry to kick off it runs(function() { root.getDirectory(dirName, {create:true}, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); }); }); describe('File', function() { it("file.spec.39 constructor should be defined", function() { expect(File).toBeDefined(); expect(typeof File).toBe('function'); }); it("file.spec.40 should be define File attributes", function() { var file = new File(); expect(file.name).toBeDefined(); expect(file.fullPath).toBeDefined(); expect(file.type).toBeDefined(); expect(file.lastModifiedDate).toBeDefined(); expect(file.size).toBeDefined(); }); }); describe('FileEntry', function() { it("file.spec.41 should be define FileEntry methods", function() { var fileName = "fe.methods", itFileEntry = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(typeof fileEntry.createWriter).toBe('function'); expect(typeof fileEntry.file).toBe('function'); expect(fileEntry.file instanceof file).toBe(true); // cleanup fileEntry.remove(null, fail); }), fail = createFail('FileEntry'); // create a new file entry to kick off it runs(function() { root.getFile(fileName, {create:true}, itFileEntry, fail); }); waitsFor(function() { return itFileEntry.wasCalled; }, "itFileEntry never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileEntry).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.42 createWriter should return a FileWriter object", function() { var fileName = "fe.createWriter", itFile, entryCallback = jasmine.createSpy().andCallFake(function(fileEntry) { itFile = fileEntry; runs(function() { fileEntry.createWriter(itWriter, fail); }); waitsFor(function() { return itWriter.wasCalled; }, "itWriter", Tests.TEST_TIMEOUT); runs(function() { expect(itWriter).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itWriter = jasmine.createSpy().andCallFake(function(writer) { expect(writer).toBeDefined(); expect(writer instanceof FileWriter).toBe(true); // cleanup itFile.remove(null, fail); }), fail = createFail('FileEntry'); // create a new file entry to kick off it runs(function() { root.getFile(fileName, {create:true}, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.43 file should return a File object", function() { var fileName = "fe.file", newFile, entryCallback = jasmine.createSpy().andCallFake(function(fileEntry) { newFile = fileEntry; runs(function() { fileEntry.file(itFile, fail); }); waitsFor(function() { return itFile.wasCalled; }, "itFile never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFile).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itFile = jasmine.createSpy().andCallFake(function(file) { expect(file).toBeDefined(); expect(file instanceof File).toBe(true); // cleanup newFile.remove(null, fail); }), fail = createFail('FileEntry'); // create a new file entry to kick off it runs(function() { root.getFile(fileName, {create:true}, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.44 file: on File that has been removed", function() { var fileName = "fe.no.file", entryCallback = jasmine.createSpy().andCallFake(function(fileEntry) { // create File object var getFile = jasmine.createSpy().andCallFake(function() { runs(function() { fileEntry.file(win, itFile); }); waitsFor(function() { return itFile.wasCalled; }, "itFile never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFile).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }); // delete file runs(function() { fileEntry.remove(getFile, fail); }); waitsFor(function() { return getFile.wasCalled; }, "getFile never called", Tests.TEST_TIMEOUT); }), itFile = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); }), fail = createFail('FileEntry'), win = createWin('FileEntry'); // create a new file entry to kick off it runs(function() { root.getFile(fileName, {create:true}, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); }); describe('Entry', function() { it("file.spec.45 Entry object", function() { var fileName = "entry", fullPath = root.fullPath + '/' + fileName, fail = createFail('Entry'), itEntry = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.name).toCanonicallyMatch(fileName); expect(entry.fullPath).toCanonicallyMatch(fullPath); expect(typeof entry.getMetadata).toBe('function'); expect(typeof entry.setMetadata).toBe('function'); expect(typeof entry.moveTo).toBe('function'); expect(typeof entry.copyTo).toBe('function'); expect(typeof entry.toURL).toBe('function'); expect(typeof entry.remove).toBe('function'); expect(typeof entry.getParent).toBe('function'); expect(typeof entry.createWriter).toBe('function'); expect(typeof entry.file).toBe('function'); // cleanup deleteEntry(fileName); }); // create a new file entry runs(function() { createFile(fileName, itEntry, fail); }); waitsFor(function() { return itEntry.wasCalled; }, "itEntry", Tests.TEST_TIMEOUT); runs(function() { expect(itEntry).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.46 Entry.getMetadata on file", function() { var fileName = "entry.metadata.file", entryCallback = jasmine.createSpy().andCallFake(function(entry) { runs(function() { entry.getMetadata(itMetadata, fail); }); waitsFor(function() { return itMetadata.wasCalled; }, "itMetadata never called", Tests.TEST_TIMEOUT); runs(function() { expect(itMetadata).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), fail = createFail('Entry'), itMetadata = jasmine.createSpy().andCallFake(function(metadata) { expect(metadata).toBeDefined(); expect(metadata.modificationTime instanceof Date).toBe(true); // cleanup deleteEntry(fileName); }); // create a new file entry runs(function() { createFile(fileName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, 'entryCallback never called', Tests.TEST_TIMEOUT); }); it("file.spec.47 Entry.getMetadata on directory", function() { var dirName = "entry.metadata.dir", entryCallback = jasmine.createSpy().andCallFake(function(entry) { runs(function() { entry.getMetadata(itMetadata, fail); }); waitsFor(function() { return itMetadata.wasCalled; }, "itMetadata never called", Tests.TEST_TIMEOUT); runs(function() { expect(itMetadata).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), fail = createFail('Entry'), itMetadata = jasmine.createSpy().andCallFake(function(metadata) { expect(metadata).toBeDefined(); expect(metadata.modificationTime instanceof Date).toBe(true); // cleanup deleteEntry(dirName); }); // create a new directory entry runs(function() { createDirectory(dirName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.48 Entry.getParent on file in root file system", function() { var fileName = "entry.parent.file", rootPath = root.fullPath, fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { runs(function() { entry.getParent(itParent, fail); }); waitsFor(function() { return itParent.wasCalled; }, "itCalled never called", Tests.TEST_TIMEOUT); runs(function() { expect(itParent).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itParent = jasmine.createSpy().andCallFake(function(parent) { expect(parent).toBeDefined(); expect(parent.fullPath).toCanonicallyMatch(rootPath); // cleanup deleteEntry(fileName); }); // create a new file entry runs(function() { createFile(fileName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.49 Entry.getParent on directory in root file system", function() { var dirName = "entry.parent.dir", rootPath = root.fullPath, fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { runs(function() { entry.getParent(itParent, fail); }); waitsFor(function() { return itParent.wasCalled; }, "itParent never called", Tests.TEST_TIMEOUT); runs(function() { expect(itParent).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itParent = jasmine.createSpy().andCallFake(function(parent) { expect(parent).toBeDefined(); expect(parent.fullPath).toCanonicallyMatch(rootPath); // cleanup deleteEntry(dirName); }); // create a new directory entry runs(function() { createDirectory(dirName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.50 Entry.getParent on root file system", function() { var rootPath = root.fullPath, itParent = jasmine.createSpy().andCallFake(function(parent) { expect(parent).toBeDefined(); expect(parent.fullPath).toCanonicallyMatch(rootPath); }), fail = createFail('Entry'); // create a new directory entry runs(function() { root.getParent(itParent, fail); }); waitsFor(function() { return itParent.wasCalled; }, "itParent never called", Tests.TEST_TIMEOUT); runs(function() { expect(itParent).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.51 Entry.toURL on file", function() { var fileName = "entry.uri.file", rootPath = root.fullPath, itURI = jasmine.createSpy().andCallFake(function(entry) { var uri = entry.toURL(); expect(uri).toBeDefined(); expect(uri.indexOf(rootPath)).not.toBe(-1); // cleanup deleteEntry(fileName); }), fail = createFail('Entry'); // create a new file entry runs(function() { createFile(fileName, itURI, fail); }); waitsFor(function() { return itURI.wasCalled; }, "itURI never called", Tests.TEST_TIMEOUT); runs(function() { expect(itURI).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.52 Entry.toURL on directory", function() { var dirName = "entry.uri.dir", rootPath = root.fullPath, itURI = jasmine.createSpy().andCallFake(function(entry) { var uri = entry.toURL(); expect(uri).toBeDefined(); expect(uri.indexOf(rootPath)).not.toBe(-1); // cleanup deleteEntry(dirName); }), fail = createFail('Entry'); // create a new directory entry runs(function() { createDirectory(dirName, itURI, fail); }); waitsFor(function() { return itURI.wasCalled; }, "itURI never called", Tests.TEST_TIMEOUT); runs(function() { expect(itURI).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.53 Entry.remove on file", function() { var fileName = "entry.rm.file", fullPath = root.fullPath + '/' + fileName, win = createWin('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { var checkRemove = jasmine.createSpy().andCallFake(function() { runs(function() { root.getFile(fileName, null, win, itRemove); }); waitsFor(function() { return itRemove.wasCalled; }, "itRemove never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itRemove).toHaveBeenCalled(); }); }); expect(entry).toBeDefined(); runs(function() { entry.remove(checkRemove, fail); }); waitsFor(function() { return checkRemove.wasCalled; }, "checkRemove never called", Tests.TEST_TIMEOUT); }), itRemove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(fileName); }), fail = createFail('Entry'); // create a new file entry runs(function() { createFile(fileName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.54 remove on empty directory", function() { var dirName = "entry.rm.dir", fullPath = root.fullPath + '/' + dirName, entryCallback = jasmine.createSpy().andCallFake(function(entry) { var checkRemove = jasmine.createSpy().andCallFake(function() { runs(function() { root.getDirectory(dirName, null, win, itRemove); }); waitsFor(function() { return itRemove.wasCalled; }, "itRemove never called", Tests.TEST_TIMEOUT); runs(function() { expect(itRemove).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); expect(entry).toBeDefined(); runs(function() { entry.remove(checkRemove, fail); }); waitsFor(function() { return checkRemove.wasCalled; }, "checkRemove never called", Tests.TEST_TIMEOUT); }), itRemove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(dirName); }), win = createWin('Entry'), fail = createFail('Entry'); // create a new directory entry runs(function() { createDirectory(dirName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.55 remove on non-empty directory", function() { var dirName = "entry.rm.dir.not.empty", fullPath = root.fullPath + '/' + dirName, fileName = "remove.txt", entryCallback = jasmine.createSpy().andCallFake(function(entry) { var checkFile = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // verify that dir still exists runs(function() { root.getDirectory(dirName, null, itRemove, fail); }); waitsFor(function() { return itRemove.wasCalled; }, "itRemove never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itRemove).toHaveBeenCalled(); }); }); // delete directory var deleteDirectory = jasmine.createSpy().andCallFake(function(fileEntry) { runs(function() { entry.remove(win, checkFile); }); waitsFor(function() { return checkFile.wasCalled; }, "checkFile never called", Tests.TEST_TIMEOUT); }); // create a file within directory, then try to delete directory runs(function() { entry.getFile(fileName, {create: true}, deleteDirectory, fail); }); waitsFor(function() { return deleteDirectory.wasCalled; }, "deleteDirectory never called", Tests.TEST_TIMEOUT); }), itRemove = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.fullPath).toCanonicallyMatch(fullPath); // cleanup deleteEntry(dirName); }), win = createWin('Entry'), fail = createFail('Entry'); // create a new directory entry runs(function() { createDirectory(dirName, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.56 remove on root file system", function() { var itRemove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NO_MODIFICATION_ALLOWED_ERR); }), win = createWin('Entry'); // remove entry that doesn't exist runs(function() { root.remove(win, itRemove); }); waitsFor(function() { return itRemove.wasCalled; }, "itRemove never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(itRemove).toHaveBeenCalled(); }); }); it("file.spec.57 copyTo: file", function() { var file1 = "entry.copy.file1", file2 = "entry.copy.file2", fullPath = root.fullPath + '/' + file2, fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { // copy file1 to file2 runs(function() { entry.copyTo(root, file2, itCopy, fail); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy never called", Tests.TEST_TIMEOUT); }), itCopy = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.fullPath).toCanonicallyMatch(fullPath); expect(entry.name).toCanonicallyMatch(file2); runs(function() { root.getFile(file2, {create:false}, itFileExists, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(itFileExists).toHaveBeenCalled(); }); }), itFileExists = jasmine.createSpy().andCallFake(function(entry2) { // a bit redundant since copy returned this entry already expect(entry2).toBeDefined(); expect(entry2.isFile).toBe(true); expect(entry2.isDirectory).toBe(false); expect(entry2.fullPath).toCanonicallyMatch(fullPath); expect(entry2.name).toCanonicallyMatch(file2); // cleanup deleteEntry(file1); deleteEntry(file2); }); // create a new file entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.58 copyTo: file onto itself", function() { var file1 = "entry.copy.fos.file1", entryCallback = jasmine.createSpy().andCallFake(function(entry) { // copy file1 onto itself runs(function() { entry.copyTo(root, null, win, itCopy); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy never called", Tests.TEST_TIMEOUT); runs(function() { expect(itCopy).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); }); }), fail = createFail('Entry'), win = createWin('Entry'), itCopy = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // cleanup deleteEntry(file1); }); // create a new file entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.59 copyTo: directory", function() { var file1 = "file1", srcDir = "entry.copy.srcDir", dstDir = "entry.copy.dstDir", dstPath = root.fullPath + '/' + dstDir, filePath = dstPath + '/' + file1, entryCallback = jasmine.createSpy().andCallFake(function(directory) { var copyDir = jasmine.createSpy().andCallFake(function(fileEntry) { // copy srcDir to dstDir runs(function() { directory.copyTo(root, dstDir, itCopy, fail); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy never called", Tests.TEST_TIMEOUT); }); // create a file within new directory runs(function() { directory.getFile(file1, {create: true}, copyDir, fail); }); waitsFor(function() { return copyDir.wasCalled; }, "copyDir never called", Tests.TEST_TIMEOUT); }), itCopy = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.fullPath).toCanonicallyMatch(dstPath); expect(directory.name).toCanonicallyMatch(dstDir); runs(function() { root.getDirectory(dstDir, {create:false}, itDirExists, fail); }); waitsFor(function() { return itDirExists.wasCalled; }, "itDirExists never called", Tests.TEST_TIMEOUT); }), itDirExists = jasmine.createSpy().andCallFake(function(dirEntry) { expect(dirEntry).toBeDefined(); expect(dirEntry.isFile).toBe(false); expect(dirEntry.isDirectory).toBe(true); expect(dirEntry.fullPath).toCanonicallyMatch(dstPath); expect(dirEntry.name).toCanonicallyMatch(dstDir); runs(function() { dirEntry.getFile(file1, {create:false}, itFileExists, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.isFile).toBe(true); expect(fileEntry.isDirectory).toBe(false); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); expect(fileEntry.name).toCanonicallyMatch(file1); // cleanup deleteEntry(srcDir); deleteEntry(dstDir); }), fail = createFail('Entry'); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.60 copyTo: directory to backup at same root directory", function() { var file1 = "file1", srcDir = "entry.copy.srcDirSame", dstDir = "entry.copy.srcDirSame-backup", dstPath = root.fullPath + '/' + dstDir, filePath = dstPath + '/' + file1, fail = createFail('Entry copyTo: directory to backup at same root'), entryCallback = function(directory) { var copyDir = function(fileEntry) { // copy srcDir to dstDir directory.copyTo(root, dstDir, itCopy, fail); }; // create a file within new directory directory.getFile(file1, {create: true}, copyDir, fail); }, itCopy = function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.fullPath).toCanonicallyMatch(dstPath); expect(directory.name).toCanonicallyMatch(dstDir); root.getDirectory(dstDir, {create:false}, itDirExists, fail); }, itDirExists = function(dirEntry) { expect(dirEntry).toBeDefined(); expect(dirEntry.isFile).toBe(false); expect(dirEntry.isDirectory).toBe(true); expect(dirEntry.fullPath).toCanonicallyMatch(dstPath); expect(dirEntry.name).toCanonicallyMatch(dstDir); dirEntry.getFile(file1, {create:false}, itFileExists, fail); }, itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { var cleanSrc = jasmine.createSpy(); var cleanDst = jasmine.createSpy(); runs(function() { expect(fileEntry).toBeDefined(); expect(fileEntry.isFile).toBe(true); expect(fileEntry.isDirectory).toBe(false); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); expect(fileEntry.name).toCanonicallyMatch(file1); expect(fail).not.toHaveBeenCalled(); // cleanup deleteEntry(srcDir, cleanSrc); deleteEntry(dstDir, cleanDst); }); waitsFor(function() { return cleanSrc.wasCalled && cleanDst.wasCalled; }, "cleanSrc and cleanDst cleanup methods", Tests.TEST_TIMEOUT); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists", 10000); }); it("file.spec.61 copyTo: directory onto itself", function() { var file1 = "file1", srcDir = "entry.copy.dos.srcDir", srcPath = root.fullPath + '/' + srcDir, filePath = srcPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry copyTo: directory onto itself'), entryCallback = jasmine.createSpy().andCallFake(function(directory) { var copyDir = jasmine.createSpy().andCallFake(function(fileEntry) { // copy srcDir onto itself runs(function() { directory.copyTo(root, null, win, itCopy); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy never called", Tests.TEST_TIMEOUT); }); // create a file within new directory runs(function() { directory.getFile(file1, {create: true}, copyDir, fail); }); waitsFor(function() { return copyDir.wasCalled; }, "copyDir never called", Tests.TEST_TIMEOUT); }), itCopy = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); runs(function() { root.getDirectory(srcDir, {create:false}, itDirectoryExists, fail); }); waitsFor(function() { return itDirectoryExists.wasCalled; }, "itDirectoryExists", Tests.TEST_TIMEOUT); }), itDirectoryExists = jasmine.createSpy().andCallFake(function(dirEntry) { // returning confirms existence so just check fullPath entry expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(srcPath); runs(function() { dirEntry.getFile(file1, {create:false}, itFileExists, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itFileExists).toHaveBeenCalled(); }); }), itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(srcDir); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.62 copyTo: directory into itself", function() { var srcDir = "entry.copy.dis.srcDir", dstDir = "entry.copy.dis.dstDir", fail = createFail('Entry'), win = createWin('Entry'), srcPath = root.fullPath + '/' + srcDir, entryCallback = jasmine.createSpy().andCallFake(function(directory) { // copy source directory into itself runs(function() { directory.copyTo(directory, dstDir, win, itCopy); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy", Tests.TEST_TIMEOUT); }), itCopy = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); runs(function() { root.getDirectory(srcDir, {create:false}, itDirectoryExists, fail); }); waitsFor(function() { return itDirectoryExists.wasCalled; }, "itDirectoryExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itDirectoryExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itDirectoryExists = jasmine.createSpy().andCallFake(function(dirEntry) { // returning confirms existence so just check fullPath entry expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(srcPath); // cleanup deleteEntry(srcDir); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.63 copyTo: directory that does not exist", function() { var file1 = "entry.copy.dnf.file1", dstDir = "entry.copy.dnf.dstDir", filePath = root.fullPath + '/' + file1, dstPath = root.fullPath + '/' + dstDir, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { // copy file to target directory that does not exist runs(function() { directory = new DirectoryEntry(); directory.fullPath = dstPath; entry.copyTo(directory, null, win, itCopy); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy never called", Tests.TEST_TIMEOUT); }), itCopy = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); runs(function() { root.getFile(file1, {create: false}, itFileExists, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(file1); }); // create a new file entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.64 copyTo: invalid target name", function() { var file1 = "entry.copy.itn.file1", file2 = "bad:file:name", filePath = root.fullPath + '/' + file1, fail = createFail('Entry'), win = createWin('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { // copy file1 to file2 runs(function() { entry.copyTo(root, file2, win, itCopy); }); waitsFor(function() { return itCopy.wasCalled; }, "itCopy never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(itCopy).toHaveBeenCalled(); }); }), itCopy = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.ENCODING_ERR); // cleanup deleteEntry(file1); }); // create a new file entry runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.65 moveTo: file to same parent", function() { var file1 = "entry.move.fsp.file1", file2 = "entry.move.fsp.file2", srcPath = root.fullPath + '/' + file1, dstPath = root.fullPath + '/' + file2, fail = createFail('Entry'), win = createWin('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { // move file1 to file2 runs(function() { entry.moveTo(root, file2, itMove, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.fullPath).toCanonicallyMatch(dstPath); expect(entry.name).toCanonicallyMatch(file2); runs(function() { root.getFile(file2, {create:false}, itMovedExists, fail); }); waitsFor(function() { return itMovedExists.wasCalled; }, "itMovedExists never called", Tests.TEST_TIMEOUT); }), itMovedExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(dstPath); runs(function() { root.getFile(file1, {create:false}, win, itOrig); }); waitsFor(function() { return itOrig.wasCalled; }, "itOrig never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itOrig).toHaveBeenCalled(); }); }), itOrig = jasmine.createSpy().andCallFake(function(error) { //expect(navigator.fileMgr.itFileExists(srcPath) === false, "original file should not exist."); expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(file1); deleteEntry(file2); }); // create a new file entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.66 moveTo: file to new parent", function() { var file1 = "entry.move.fnp.file1", dir = "entry.move.fnp.dir", srcPath = root.fullPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), dstPath = root.fullPath + '/' + dir + '/' + file1, entryCallback = jasmine.createSpy().andCallFake(function(entry) { // move file1 to new directory var moveFile = jasmine.createSpy().andCallFake(function(directory) { var itMove = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.fullPath).toCanonicallyMatch(dstPath); expect(entry.name).toCanonicallyMatch(file1); // it the moved file exists runs(function() { directory.getFile(file1, {create:false}, itMovedExists, fail); }); waitsFor(function() { return itMovedExists.wasCalled; }, "itMovedExists never called", Tests.TEST_TIMEOUT); }); // move the file runs(function() { entry.moveTo(directory, null, itMove, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }); // create a parent directory to move file to runs(function() { root.getDirectory(dir, {create: true}, moveFile, fail); }); waitsFor(function() { return moveFile.wasCalled; }, "moveFile never called", Tests.TEST_TIMEOUT); }), itMovedExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(dstPath); runs(function() { root.getFile(file1, {create:false}, win, itOrig); }); waitsFor(function() { return itOrig.wasCalled; }, "itOrig never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itOrig).toHaveBeenCalled(); }); }), itOrig = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(file1); deleteEntry(dir); }); // ensure destination directory is cleaned up first runs(function() { deleteEntry(dir, function() { // create a new file entry to kick off it createFile(file1, entryCallback, fail); }, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.67 moveTo: directory to same parent", function() { var file1 = "file1", srcDir = "entry.move.dsp.srcDir", dstDir = "entry.move.dsp.dstDir", srcPath = root.fullPath + '/' + srcDir, dstPath = root.fullPath + '/' + dstDir, filePath = dstPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(directory) { var moveDir = jasmine.createSpy().andCallFake(function(fileEntry) { // move srcDir to dstDir runs(function() { directory.moveTo(root, dstDir, itMove, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }); // create a file within directory runs(function() { directory.getFile(file1, {create: true}, moveDir, fail); }); waitsFor(function() { return moveDir.wasCalled; }, "moveDir never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.fullPath).toCanonicallyMatch(dstPath); expect(directory.name).toCanonicallyMatch(dstDir); // it that moved file exists in destination dir runs(function() { directory.getFile(file1, {create:false}, itMovedExists, fail); }); waitsFor(function() { return itMovedExists.wasCalled; }, "itMovedExists never called", Tests.TEST_TIMEOUT); }), itMovedExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // check that the moved file no longer exists in original dir runs(function() { root.getFile(file1, {create:false}, win, itOrig); }); waitsFor(function() { return itOrig.wasCalled; }, "itOrig never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itOrig).toHaveBeenCalled(); }); }), itOrig = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(srcDir); deleteEntry(dstDir); }); // ensure destination directory is cleaned up before it runs(function() { deleteEntry(dstDir, function() { // create a new directory entry to kick off it createDirectory(srcDir, entryCallback, fail); }, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.68 moveTo: directory to same parent with same name", function() { var file1 = "file1", srcDir = "entry.move.dsp.srcDir", dstDir = "entry.move.dsp.srcDir-backup", srcPath = root.fullPath + '/' + srcDir, dstPath = root.fullPath + '/' + dstDir, filePath = dstPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(directory) { var moveDir = jasmine.createSpy().andCallFake(function(fileEntry) { // move srcDir to dstDir runs(function() { directory.moveTo(root, dstDir, itMove, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }); // create a file within directory runs(function() { directory.getFile(file1, {create: true}, moveDir, fail); }); waitsFor(function() { return moveDir.wasCalled; }, "moveDir never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.fullPath).toCanonicallyMatch(dstPath); expect(directory.name).toCanonicallyMatch(dstDir); // check that moved file exists in destination dir runs(function() { directory.getFile(file1, {create:false}, itMovedExists, null); }); waitsFor(function() { return itMovedExists.wasCalled; }, "itMovedExists never called", Tests.TEST_TIMEOUT); }), itMovedExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // check that the moved file no longer exists in original dir runs(function() { root.getFile(file1, {create:false}, win, itOrig); }); waitsFor(function() { return itOrig.wasCalled; }, "itOrig never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itOrig).toHaveBeenCalled(); }); }), itOrig = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(srcDir); deleteEntry(dstDir); }); // ensure destination directory is cleaned up before it runs(function() { deleteEntry(dstDir, function() { // create a new directory entry to kick off it createDirectory(srcDir, entryCallback, fail); }, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.69 moveTo: directory to new parent", function() { var file1 = "file1", srcDir = "entry.move.dnp.srcDir", dstDir = "entry.move.dnp.dstDir", srcPath = root.fullPath + '/' + srcDir, dstPath = root.fullPath + '/' + dstDir, filePath = dstPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(directory) { var moveDir = jasmine.createSpy().andCallFake(function(fileEntry) { // move srcDir to dstDir runs(function() { directory.moveTo(root, dstDir, itMove, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }); // create a file within directory runs(function() { directory.getFile(file1, {create: true}, moveDir, fail); }); waitsFor(function() { return moveDir.wasCalled; }, "moveDir never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.fullPath).toCanonicallyMatch(dstPath); expect(directory.name).toCanonicallyMatch(dstDir); // it that moved file exists in destination dir runs(function() { directory.getFile(file1, {create:false}, itMovedExists, fail); }); waitsFor(function() { return itMovedExists.wasCalled; }, "itMovedExists never called", Tests.TEST_TIMEOUT); }), itMovedExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // it that the moved file no longer exists in original dir runs(function() { root.getFile(file1, {create:false}, win, itOrig); }); waitsFor(function() { return itOrig.wasCalled; }, "itOrig never called", Tests.TEST_TIMEOUT); runs(function() { expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); expect(itOrig).toHaveBeenCalled(); }); }), itOrig = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(srcDir); deleteEntry(dstDir); }); // ensure destination directory is cleaned up before it runs(function() { deleteEntry(dstDir, function() { // create a new directory entry to kick off it createDirectory(srcDir, entryCallback, fail); }, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.70 moveTo: directory onto itself", function() { var file1 = "file1", srcDir = "entry.move.dos.srcDir", srcPath = root.fullPath + '/' + srcDir, filePath = srcPath + '/' + file1, fail = createFail('Entry'), win = createWin('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(directory) { var moveDir = jasmine.createSpy().andCallFake(function(fileEntry) { // move srcDir onto itself runs(function() { directory.moveTo(root, null, win, itMove); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }); // create a file within new directory runs(function() { directory.getFile(file1, {create: true}, moveDir, fail); }); waitsFor(function() { return moveDir.wasCalled; }, "moveDir never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // it that original dir still exists runs(function() { root.getDirectory(srcDir, {create:false}, itDirectoryExists, fail); }); waitsFor(function() { return itDirectoryExists.wasCalled; }, "itDirectoryExists", Tests.TEST_TIMEOUT); }), itDirectoryExists = jasmine.createSpy().andCallFake(function(dirEntry) { // returning confirms existence so just check fullPath entry expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(srcPath); runs(function() { dirEntry.getFile(file1, {create:false}, itFileExists, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(srcDir); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.71 moveTo: directory into itself", function() { var srcDir = "entry.move.dis.srcDir", dstDir = "entry.move.dis.dstDir", srcPath = root.fullPath + '/' + srcDir, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(directory) { // move source directory into itself runs(function() { directory.moveTo(directory, dstDir, win, itMove); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // make sure original directory still exists runs(function() { root.getDirectory(srcDir, {create:false}, itDirectoryExists, fail); }); waitsFor(function() { return itDirectoryExists.wasCalled; }, "itDirectoryExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(itDirectoryExists).toHaveBeenCalled(); }); }), itDirectoryExists = jasmine.createSpy().andCallFake(function(entry) { expect(entry).toBeDefined(); expect(entry.fullPath).toCanonicallyMatch(srcPath); // cleanup deleteEntry(srcDir); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.72 moveTo: file onto itself", function() { var file1 = "entry.move.fos.file1", filePath = root.fullPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = jasmine.createSpy().andCallFake(function(entry) { // move file1 onto itself runs(function() { entry.moveTo(root, null, win, itMove); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); }), itMove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); //it that original file still exists runs(function() { root.getFile(file1, {create:false}, itFileExists, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }), itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(file1); }); // create a new file entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return entryCallback.wasCalled; }, "entryCallback never called", Tests.TEST_TIMEOUT); }); it("file.spec.73 moveTo: file onto existing directory", function() { var file1 = "entry.move.fod.file1", dstDir = "entry.move.fod.dstDir", subDir = "subDir", dirPath = root.fullPath + '/' + dstDir + '/' + subDir, filePath = root.fullPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { var createSubDirectory = function(directory) { var moveFile = function(subDirectory) { var itMove = function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // check that original dir still exists directory.getDirectory(subDir, {create:false}, itDirectoryExists, fail); }; // move file1 onto sub-directory entry.moveTo(directory, subDir, win, itMove); }; // create sub-directory directory.getDirectory(subDir, {create: true}, moveFile, fail); }; // create top level directory root.getDirectory(dstDir, {create: true}, createSubDirectory, fail); }, itDirectoryExists = function(dirEntry) { expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(dirPath); // check that original file still exists root.getFile(file1, {create:false},itFileExists, fail); }, itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(file1); deleteEntry(dstDir); }); // ensure destination directory is cleaned up before it runs(function() { deleteEntry(dstDir, function() { // create a new file entry to kick off it createFile(file1, entryCallback, fail); }, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.74 moveTo: directory onto existing file", function() { var file1 = "entry.move.dof.file1", srcDir = "entry.move.dof.srcDir", dirPath = root.fullPath + '/' + srcDir, filePath = root.fullPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { var moveDir = function(fileEntry) { // move directory onto file entry.moveTo(root, file1, win, itMove); }; // create file root.getFile(file1, {create: true}, moveDir, fail); }, itMove = function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // it that original directory exists root.getDirectory(srcDir, {create:false}, itDirectoryExists, fail); }, itDirectoryExists = function(dirEntry) { // returning confirms existence so just check fullPath entry expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(dirPath); // it that original file exists root.getFile(file1, {create:false}, itFileExists, fail); }, itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(file1); deleteEntry(srcDir); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.75 copyTo: directory onto existing file", function() { var file1 = "entry.copy.dof.file1", srcDir = "entry.copy.dof.srcDir", dirPath = root.fullPath + '/' + srcDir, filePath = root.fullPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { var copyDir = function(fileEntry) { // move directory onto file entry.copyTo(root, file1, win, itMove); }; // create file root.getFile(file1, {create: true}, copyDir, fail); }, itMove = function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); //check that original dir still exists root.getDirectory(srcDir, {create:false}, itDirectoryExists, fail); }, itDirectoryExists = function(dirEntry) { // returning confirms existence so just check fullPath entry expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(dirPath); // it that original file still exists root.getFile(file1, {create:false}, itFileExists, fail); }, itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // cleanup deleteEntry(file1); deleteEntry(srcDir); }); // create a new directory entry to kick off it runs(function() { createDirectory(srcDir, entryCallback, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.76 moveTo: directory onto directory that is not empty", function() { var srcDir = "entry.move.dod.srcDir", dstDir = "entry.move.dod.dstDir", subDir = "subDir", srcPath = root.fullPath + '/' + srcDir, dstPath = root.fullPath + '/' + dstDir + '/' + subDir, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { var createSubDirectory = function(directory) { var moveDir = function(subDirectory) { // move srcDir onto dstDir (not empty) entry.moveTo(root, dstDir, win, itMove); }; var itMove = function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.INVALID_MODIFICATION_ERR); // it that destination directory still exists directory.getDirectory(subDir, {create:false}, itDirectoryExists, fail); }; // create sub-directory directory.getDirectory(subDir, {create: true}, moveDir, fail); }; // create top level directory root.getDirectory(dstDir, {create: true}, createSubDirectory, fail); }, itDirectoryExists = function(dirEntry) { // returning confirms existence so just check fullPath entry expect(dirEntry).toBeDefined(); expect(dirEntry.fullPath).toCanonicallyMatch(dstPath); // it that source directory exists root.getDirectory(srcDir,{create:false}, itSrcDirectoryExists, fail); }, itSrcDirectoryExists = jasmine.createSpy().andCallFake(function(srcEntry){ expect(srcEntry).toBeDefined(); expect(srcEntry.fullPath).toCanonicallyMatch(srcPath); // cleanup deleteEntry(srcDir); deleteEntry(dstDir); }); // ensure destination directory is cleaned up before it runs(function() { deleteEntry(dstDir, function() { // create a new file entry to kick off it createDirectory(srcDir, entryCallback, fail); }, fail); }); waitsFor(function() { return itSrcDirectoryExists.wasCalled; }, "itSrcDirectoryExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itSrcDirectoryExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.77 moveTo: file replace existing file", function() { var file1 = "entry.move.frf.file1", file2 = "entry.move.frf.file2", file1Path = root.fullPath + '/' + file1, file2Path = root.fullPath + '/' + file2, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { var moveFile = function(fileEntry) { // replace file2 with file1 entry.moveTo(root, file2, itMove, fail); }; // create file root.getFile(file2, {create: true}, moveFile,fail); }, itMove = function(entry) { expect(entry).toBeDefined(); expect(entry.isFile).toBe(true); expect(entry.isDirectory).toBe(false); expect(entry.fullPath).toCanonicallyMatch(file2Path); expect(entry.name).toCanonicallyMatch(file2); // it that old file does not exists root.getFile(file1, {create:false}, win, itFileMoved); }, itFileMoved = function(error){ expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // it that new file exists root.getFile(file2, {create:false}, itFileExists, fail); }, itFileExists = jasmine.createSpy().andCallFake(function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(file2Path); // cleanup deleteEntry(file1); deleteEntry(file2); }); // create a new directory entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return itFileExists.wasCalled; }, "itFileExists never called", Tests.TEST_TIMEOUT); runs(function() { expect(itFileExists).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.78 moveTo: directory replace empty directory", function() { var file1 = "file1", srcDir = "entry.move.drd.srcDir", dstDir = "entry.move.drd.dstDir", srcPath = root.fullPath + '/' + srcDir, dstPath = root.fullPath + '/' + dstDir, win = createWin('Entry'), fail = createFail('Entry'), filePath = dstPath + '/' + file1, entryCallback = function(directory) { var mkdir = function(fileEntry) { // create destination directory root.getDirectory(dstDir, {create: true}, moveDir, fail); }; var moveDir = function(fileEntry) { // move srcDir to dstDir directory.moveTo(root, dstDir, itMove, fail); }; // create a file within source directory directory.getFile(file1, {create: true}, mkdir, fail); }, itMove = function(directory) { expect(directory).toBeDefined(); expect(directory.isFile).toBe(false); expect(directory.isDirectory).toBe(true); expect(directory.fullPath).toCanonicallyMatch(dstPath); expect(directory.name).toCanonicallyMatch(dstDir); // check that old directory contents have been moved directory.getFile(file1, {create:false}, itFileExists, fail); }, itFileExists = function(fileEntry) { expect(fileEntry).toBeDefined(); expect(fileEntry.fullPath).toCanonicallyMatch(filePath); // check that old directory no longer exists root.getDirectory(srcDir, {create:false}, win, itRemoved); }, itRemoved = jasmine.createSpy().andCallFake(function(error){ expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(srcDir); deleteEntry(dstDir); }); // ensure destination directory is cleaned up before it runs(function() { deleteEntry(dstDir, function() { // create a new directory entry to kick off it createDirectory(srcDir, entryCallback, fail); }, fail); }); waitsFor(function() { return itRemoved.wasCalled; }, "itRemoved never called", Tests.TEST_TIMEOUT); runs(function() { expect(itRemoved).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.79 moveTo: directory that does not exist", function() { var file1 = "entry.move.dnf.file1", dstDir = "entry.move.dnf.dstDir", filePath = root.fullPath + '/' + file1, dstPath = root.fullPath + '/' + dstDir, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { // move file to directory that does not exist directory = new DirectoryEntry(); directory.fullPath = dstPath; entry.moveTo(directory, null, win, itMove); }, itMove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.NOT_FOUND_ERR); // cleanup deleteEntry(file1); }); // create a new file entry to kick off it runs(function() { createFile(file1, entryCallback, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); runs(function() { expect(itMove).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.80 moveTo: invalid target name", function() { var file1 = "entry.move.itn.file1", file2 = "bad:file:name", filePath = root.fullPath + '/' + file1, win = createWin('Entry'), fail = createFail('Entry'), entryCallback = function(entry) { // move file1 to file2 entry.moveTo(root, file2, win, itMove); }, itMove = jasmine.createSpy().andCallFake(function(error) { expect(error).toBeDefined(); expect(error).toBeFileError(FileError.ENCODING_ERR); // cleanup deleteEntry(file1); }); // create a new file entry to kick off it runs(function() { createFile(file1,entryCallback, fail); }); waitsFor(function() { return itMove.wasCalled; }, "itMove never called", Tests.TEST_TIMEOUT); runs(function() { expect(itMove).toHaveBeenCalled(); expect(win).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); }); describe('FileReader', function() { it("file.spec.81 should have correct methods", function() { var reader = new FileReader(); expect(reader).toBeDefined(); expect(typeof reader.readAsBinaryString).toBe('function'); expect(typeof reader.readAsDataURL).toBe('function'); expect(typeof reader.readAsText).toBe('function'); expect(typeof reader.readAsArrayBuffer).toBe('function'); expect(typeof reader.abort).toBe('function'); }); }); describe('read method', function(){ it("file.spec.82 should error out on non-existent file", function() { var reader = new FileReader(); var verifier = jasmine.createSpy().andCallFake(function(evt) { expect(evt).toBeDefined(); expect(evt.target.error).toBeFileError(FileError.NOT_FOUND_ERR); }); reader.onerror = verifier; var myFile = new File(); myFile.fullPath = root.fullPath + '/' + "doesnotexist.err"; reader.readAsText(myFile); waitsFor(function() { return verifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); }); it("file.spec.83 should be able to read native blob objects", function() { // Skip test if blobs are not supported (e.g.: Android 2.3). if (typeof window.Blob == 'undefined' || typeof window.Uint8Array == 'undefined') { return; } var contents = 'asdf'; var uint8Array = new Uint8Array(contents.length); for (var i = 0; i < contents.length; ++i) { uint8Array[i] = contents.charCodeAt(i); } var Builder = window.BlobBuilder || window.WebKitBlobBuilder; var blob; if (Builder) { var builder = new Builder(); builder.append(uint8Array.buffer); builder.append(contents); blob = builder.getBlob("text/plain"); } else { try { // iOS 6 does not support Views, so pass in the buffer. blob = new Blob([uint8Array.buffer, contents]); } catch (e) { // Skip the test if we can't create a blob (e.g.: iOS 5). if (e instanceof TypeError) { return; } throw e; } } var verifier = jasmine.createSpy().andCallFake(function(evt) { expect(evt).toBeDefined(); expect(evt.target.result).toBe('asdfasdf'); }); var reader = new FileReader(); reader.onloadend = verifier; reader.readAsText(blob); waitsFor(function() { return verifier.wasCalled; }, "verifier never called", 300); }); function writeDummyFile(writeBinary, callback) { var fileName = "dummy.txt", fileEntry = null, writerFail = createFail('createWriter'), getFileFail = createFail('getFile'), fileFail = createFail('file'), callback = jasmine.createSpy().andCallFake(callback), fileData = '\u20AC\xEB - There is an exception to every rule. Except this one.', fileDataAsBinaryString = '\xe2\x82\xac\xc3\xab - There is an exception to every rule. Except this one.', createWriter = function(fe) { fileEntry = fe; fileEntry.createWriter(writeFile, writerFail); }, // writes file and reads it back in writeFile = function(writer) { writer.onwriteend = function() { fileEntry.file(function(f) { callback(fileEntry, f, fileData, fileDataAsBinaryString); }, fileFail); }; writer.write(fileData); }; fileData += writeBinary ? 'bin:\x01\x00' : ''; fileDataAsBinaryString += writeBinary ? 'bin:\x01\x00' : ''; // create a file, write to it, and read it in again root.getFile(fileName, {create: true}, createWriter, getFileFail); waitsForAny(getFileFail, writerFail, fileFail, callback); } function runReaderTest(funcName, writeBinary, verifierFunc, sliceStart, sliceEnd) { writeDummyFile(writeBinary, function(fileEntry, file, fileData, fileDataAsBinaryString) { var readWin = jasmine.createSpy().andCallFake(function(evt) { expect(evt).toBeDefined(); verifierFunc(evt, fileData, fileDataAsBinaryString); }); var reader = new FileReader(); var readFail = createFail(funcName); reader.onload = readWin; reader.onerror = readFail; if (sliceEnd !== undefined) { file = file.slice(sliceStart, sliceEnd); } else if (sliceStart !== undefined) { file = file.slice(sliceStart); } reader[funcName](file); waitsForAny(readWin, readFail); }); } function arrayBufferEqualsString(buf, str) { var buf = new Uint8Array(ab); var match = buf.length == str.length; for (var i = 0; match && i < buf.length; i++) { match = buf[i] == str.charCodeAt(i); } return match; } it("file.spec.84 should read file properly, readAsText", function() { runReaderTest('readAsText', false, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(fileData); }); }); it("file.spec.85 should read file properly, Data URI", function() { runReaderTest('readAsDataURL', true, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result.substr(0,23)).toBe("data:text/plain;base64,"); expect(evt.target.result.slice(23)).toBe(atob(fileData)); }); }); it("file.spec.86 should read file properly, readAsBinaryString", function() { runReaderTest('readAsBinaryString', true, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(fileDataAsBinaryString); }); }); it("file.spec.87 should read file properly, readAsArrayBuffer", function() { // Skip test if ArrayBuffers are not supported (e.g.: Android 2.3). if (typeof window.ArrayBuffer == 'undefined') { return; } runReaderTest('readAsArrayBuffer', true, function(evt, fileData, fileDataAsBinaryString) { expect(arrayBufferEqualsString(evt.target.result, fileDataAsBinaryString)).toBe(true); }); }); it("file.spec.88 should read sliced file: readAsText", function() { runReaderTest('readAsText', false, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(fileDataAsBinaryString.slice(10, 40)); }, 10, 40); }); it("file.spec.89 should read sliced file: slice past eof", function() { runReaderTest('readAsText', false, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(fileData.slice(-5, 9999)); }, -5, 9999); }); it("file.spec.90 should read sliced file: slice to eof", function() { runReaderTest('readAsText', false, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(fileData.slice(-5)); }, -5); }); it("file.spec.91 should read empty slice", function() { runReaderTest('readAsText', false, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(''); }, 0, 0); }); it("file.spec.92 should read sliced file properly, readAsDataURL", function() { runReaderTest('readAsDataURL', true, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result.slice(0, 23)).toBe("data:text/plain;base64,"); expect(evt.target.result.slice(23)).toBe(atob(fileDataAsBinaryString.slice( 10, -3))); }, 10, -3); }); it("file.spec.93 should read sliced file properly, readAsBinaryString", function() { runReaderTest('readAsBinaryString', true, function(evt, fileData, fileDataAsBinaryString) { expect(evt.target.result).toBe(fileDataAsBinaryString.slice(-10, -5)); }, -10, -5); }); it("file.spec.94 should read sliced file properly, readAsArrayBuffer", function() { // Skip test if ArrayBuffers are not supported (e.g.: Android 2.3). if (typeof window.ArrayBuffer == 'undefined') { return; } runReaderTest('readAsArrayBuffer', true, function(evt, fileData, fileDataAsBinaryString) { expect(arrayBufferEqualsString(evt.target.result, fileDataAsBinaryString.slice(0, -1))).toBe(true); }, 0, -1); }); }); describe('FileWriter', function(){ it("file.spec.95 should have correct methods", function() { // retrieve a FileWriter object var fileName = "writer.methods", fail = createFail('FileWriter'), verifier = jasmine.createSpy().andCallFake(function(writer) { expect(writer).toBeDefined(); expect(typeof writer.write).toBe('function'); expect(typeof writer.seek).toBe('function'); expect(typeof writer.truncate).toBe('function'); expect(typeof writer.abort).toBe('function'); // cleanup deleteFile(fileName); }), it_writer = function(fileEntry) { fileEntry.createWriter(verifier, fail); }; // it FileWriter runs(function() { root.getFile(fileName, {create: true}, it_writer, fail); }); waitsFor(function() { return verifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(verifier).toHaveBeenCalled(); }); }); it("file.spec.96 should be able to write and append to file, createWriter", function() { var fileName = "writer.append", theWriter, filePath = root.fullPath + '/' + fileName, // file content rule = "There is an exception to every rule.", // for checkin file length length = rule.length, fail = createFail('FileWriter'), verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // append some more stuff var exception = " Except this one."; theWriter.onwriteend = anotherVerifier; length += exception.length; theWriter.seek(theWriter.length); theWriter.write(exception); }), anotherVerifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes initial file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; writer.onwriteend = verifier; writer.write(rule); }, fail); }; // create file, then write and append to it runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return anotherVerifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); runs(function() { expect(fail).not.toHaveBeenCalled(); expect(verifier).toHaveBeenCalled(); expect(anotherVerifier).toHaveBeenCalled(); }); }); it("file.spec.97 should be able to write and append to file, File object", function() { var fileName = "writer.append", theWriter, filePath = root.fullPath + '/' + fileName, // file content rule = "There is an exception to every rule.", // for checking file length length = rule.length, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // append some more stuff var exception = " Except this one."; theWriter.onwriteend = anotherVerifier; length += exception.length; theWriter.seek(theWriter.length); theWriter.write(exception); }), anotherVerifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes initial file content write_file = function(file) { theWriter = new FileWriter(file); theWriter.onwriteend = verifier; theWriter.write(rule); }; // create file, then write and append to it runs(function() { var file = new File(); file.fullPath = filePath; write_file(file); }); waitsFor(function() { return anotherVerifier.wasCalled; }, "verifier", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(anotherVerifier).toHaveBeenCalled(); }); }); it("file.spec.98 should be able to seek to the middle of the file and write more data than file.length", function() { var fileName = "writer.seek.write", filePath = root.fullPath + '/' + fileName, theWriter, // file content rule = "This is our sentence.", // for iting file length length = rule.length, fail = createFail('FileWriter'), verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // append some more stuff var exception = "newer sentence."; theWriter.onwriteend = anotherVerifier; length = 12 + exception.length; theWriter.seek(12); theWriter.write(exception); }), anotherVerifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes initial file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.write(rule); }, fail); }; // create file, then write and append to it runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return anotherVerifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(anotherVerifier).toHaveBeenCalled(); }); }); it("file.spec.99 should be able to seek to the middle of the file and write less data than file.length", function() { var fileName = "writer.seek.write2", filePath = root.fullPath + '/' + fileName, // file content rule = "This is our sentence.", theWriter, fail = createFail('FileWriter'), // for iting file length length = rule.length, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // append some more stuff var exception = "new."; theWriter.onwriteend = anotherVerifier; length = 8 + exception.length; theWriter.seek(8); theWriter.write(exception); }), anotherVerifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes initial file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.write(rule); }, fail); }; // create file, then write and append to it runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return anotherVerifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(anotherVerifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.100 should be able to write XML data", function() { var fileName = "writer.xml", filePath = root.fullPath + '/' + fileName, fail = createFail('FileWriter'), theWriter, // file content rule = '\n\nData\n\n', // for iting file length length = rule.length, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.write(rule); }, fail); }; // creates file, then write XML data runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return verifier.wasCalled; }, "verifier", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.101 should be able to write JSON data", function() { var fileName = "writer.json", filePath = root.fullPath + '/' + fileName, theWriter, // file content rule = '{ "name": "Guy Incognito", "email": "here@there.com" }', fail = createFail('FileWriter'), // for iting file length length = rule.length, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.write(rule); }, fail); }; // creates file, then write JSON content runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return verifier.wasCalled; }, "verifier", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.102 should be able to seek", function() { var fileName = "writer.seek", // file content rule = "There is an exception to every rule. Except this one.", theWriter, // for iting file length length = rule.length, fail = createFail('FileWriter'), verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.position).toBe(length); theWriter.seek(-5); expect(theWriter.position).toBe(length-5); theWriter.seek(length + 100); expect(theWriter.position).toBe(length); theWriter.seek(10); expect(theWriter.position).toBe(10); // cleanup deleteFile(fileName); }), // writes file content and its writer.seek seek_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.seek(-100); expect(theWriter.position).toBe(0); theWriter.write(rule); }, fail); }; // creates file, then write JSON content runs(function() { createFile(fileName, seek_file); }); waitsFor(function() { return verifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.103 should be able to truncate", function() { var fileName = "writer.truncate", rule = "There is an exception to every rule. Except this one.", fail = createFail('FileWriter'), theWriter, // writes file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = function(evt) { truncate_file(theWriter); }; theWriter.write(rule); }, fail); }, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(36); expect(theWriter.position).toBe(36); // cleanup deleteFile(fileName); }), // and its writer.truncate truncate_file = function(writer) { writer.onwriteend = verifier; writer.truncate(36); }; // creates file, writes to it, then truncates it runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return verifier.wasCalled; }, "verifier never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.104 should be able to write binary data from an ArrayBuffer", function() { // Skip test if ArrayBuffers are not supported (e.g.: Android 2.3). if (typeof window.ArrayBuffer == 'undefined') { return; } var fileName = "bufferwriter.bin", filePath = root.fullPath + '/' + fileName, theWriter, // file content data = new ArrayBuffer(32), dataView = new Int8Array(data), fail = createFail('FileWriter'), // for verifying file length length = 32, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.write(data); }, fail); }; for (i=0; i < dataView.length; i++) { dataView[i] = i; } // creates file, then write content runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return verifier.wasCalled; }, "verifier", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.105 should be able to write binary data from a Blob", function() { // Skip test if Blobs are not supported (e.g.: Android 2.3). if (typeof window.Blob == 'undefined' || typeof window.ArrayBuffer == 'undefined') { return; } var fileName = "blobwriter.bin", filePath = root.fullPath + '/' + fileName, theWriter, fail = createFail('FileWriter'), // file content data = new ArrayBuffer(32), dataView = new Int8Array(data), blob, // for verifying file length length = 32, verifier = jasmine.createSpy().andCallFake(function(evt) { expect(theWriter.length).toBe(length); expect(theWriter.position).toBe(length); // cleanup deleteFile(fileName); }), // writes file content write_file = function(fileEntry) { fileEntry.createWriter(function(writer) { theWriter = writer; theWriter.onwriteend = verifier; theWriter.write(blob); }, fail); }; for (i=0; i < dataView.length; i++) { dataView[i] = i; } try { // Mobile Safari: Use Blob constructor blob = new Blob([data], {"type": "application/octet-stream"}) } catch(e) { if (window.WebKitBlobBuilder) { // Android Browser: Use deprecated BlobBuilder var builder = new WebKitBlobBuilder() builder.append(data) blob = builder.getBlob('application/octet-stream'); } else { // We have no way defined to create a Blob, so fail fail(); } } // creates file, then write content runs(function() { createFile(fileName, write_file); }); waitsFor(function() { return verifier.wasCalled; }, "verifier", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.106 should be able to write a File to a FileWriter", function() { var dummyFileName = 'dummy.txt', outputFileName = 'verify.txt', dummyFileText = 'This text should be written to two files', fail = createFail('FileWriter'), verifier = jasmine.createSpy("verifier").andCallFake(function(outputFileWriter) { expect(outputFileWriter.length).toBe(dummyFileText.length); expect(outputFileWriter.position).toBe(dummyFileText.length); deleteFile(fileName); }), writeFile = function(fileName, fileData, win) { var theWriter, filePath = root.fullPath + '/' + fileName, // writes file content to new file write_file = function(fileEntry) { writerEntry = fileEntry; fileEntry.createWriter(function(writer) { theWriter = writer; writer.onwriteend = function(ev) { if (typeof fileData.length !== "undefined") { expect(theWriter.length).toBe(fileData.length); expect(theWriter.position).toBe(fileData.length); } win(theWriter); } writer.onerror = fail; writer.write(fileData); }, fail); }; createFile(fileName, write_file, fail); }, openFile = function(fileName, callback) { root.getFile(fileName, {create: false}, function(fileEntry) { fileEntry.file(callback, fail); }, fail); }; runs(function() { writeFile(dummyFileName, dummyFileText, function(dummyFileWriter) { openFile(dummyFileName, function(file) { writeFile(outputFileName, file, verifier); }); }); }); waitsFor(function() { return (verifier.wasCalled || fail.wasCalled); }, "callbacks never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.107 should be able to write a sliced File to a FileWriter", function() { var dummyFileName = 'dummy2.txt', outputFileName = 'verify2.txt', dummyFileText = 'This text should be written to two files', fail = createFail('FileWriter'), verifier = jasmine.createSpy("verifier").andCallFake(function(outputFileWriter) { expect(outputFileWriter.length).toBe(10); expect(outputFileWriter.position).toBe(10); deleteFile(fileName); }), writeFile = function(fileName, fileData, win) { var theWriter, filePath = root.fullPath + '/' + fileName, // writes file content to new file write_file = function(fileEntry) { writerEntry = fileEntry; fileEntry.createWriter(function(writer) { theWriter = writer; writer.onwriteend = function(ev) { if (typeof fileData.length !== "undefined") { expect(theWriter.length).toBe(fileData.length); expect(theWriter.position).toBe(fileData.length); } win(theWriter); } writer.onerror = fail; writer.write(fileData); }, fail); }; createFile(fileName, write_file, fail); }, openFile = function(fileName, callback) { root.getFile(fileName, {create: false}, function(fileEntry) { fileEntry.file(callback, fail); }, fail); }; runs(function() { writeFile(dummyFileName, dummyFileText, function(dummyFileWriter) { openFile(dummyFileName, function(file) { writeFile(outputFileName, file.slice(10,20), verifier); }); }); }); waitsFor(function() { return (verifier.wasCalled || fail.wasCalled); }, "callbacks never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); it("file.spec.108 should be able to write binary data from a File", function() { // Skip test if Blobs are not supported (e.g.: Android 2.3). if (typeof window.Blob == 'undefined' || typeof window.ArrayBuffer == 'undefined') { return; } var dummyFileName = "blobwriter.bin", outputFileName = 'verify.bin', fail = createFail('FileWriter'), // file content data = new ArrayBuffer(32), dataView = new Int8Array(data), blob, // for verifying file length length = 32, verifier = jasmine.createSpy("verifier").andCallFake(function(outputFileWriter) { expect(outputFileWriter.length).toBe(length); expect(outputFileWriter.position).toBe(length); // cleanup deleteFile(fileName); }), writeFile = function(fileName, fileData, win) { var theWriter, filePath = root.fullPath + '/' + fileName, // writes file content to new file write_file = function(fileEntry) { writerEntry = fileEntry; fileEntry.createWriter(function(writer) { theWriter = writer; writer.onwriteend = function(ev) { if (typeof fileData.length !== "undefined") { expect(theWriter.length).toBe(fileData.length); expect(theWriter.position).toBe(fileData.length); } win(theWriter); } writer.onerror = fail; writer.write(fileData); }, fail); }; createFile(fileName, write_file, fail); }, openFile = function(fileName, callback) { root.getFile(fileName, {create: false}, function(fileEntry) { fileEntry.file(callback, fail); }, fail); }; for (i=0; i < dataView.length; i++) { dataView[i] = i; } try { // Mobile Safari: Use Blob constructor blob = new Blob([data], {"type": "application/octet-stream"}) } catch(e) { if (window.WebKitBlobBuilder) { // Android Browser: Use deprecated BlobBuilder var builder = new WebKitBlobBuilder() builder.append(data) blob = builder.getBlob('application/octet-stream'); } else { // We have no way defined to create a Blob, so fail fail(); } } runs(function() { writeFile(dummyFileName, blob, function(dummyFileWriter) { openFile(dummyFileName, function(file) { writeFile(outputFileName, file, verifier); }); }); }); waitsFor(function() { return (verifier.wasCalled || fail.wasCalled); }, "callbacks never called", Tests.TEST_TIMEOUT); runs(function() { expect(verifier).toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/battery.tests.js0000644000015000001560000000172512272510571027254 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Battery (navigator.battery)', function () {; it("battery.spec.1 should exist", function() { expect(navigator.battery).toBeDefined(); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/storage.tests.js0000644000015000001560000002212712272510571027245 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe("Session Storage", function () { it("storage.spec.1 should exist", function () { expect(window.sessionStorage).toBeDefined(); expect(typeof window.sessionStorage.length).not.toBe('undefined'); expect(typeof(window.sessionStorage.key)).toBe('function'); expect(typeof(window.sessionStorage.getItem)).toBe('function'); expect(typeof(window.sessionStorage.setItem)).toBe('function'); expect(typeof(window.sessionStorage.removeItem)).toBe('function'); expect(typeof(window.sessionStorage.clear)).toBe('function'); }); it("storage.spec.2 check length", function () { expect(window.sessionStorage.length).toBe(0); window.sessionStorage.setItem("key","value"); expect(window.sessionStorage.length).toBe(1); window.sessionStorage.removeItem("key"); expect(window.sessionStorage.length).toBe(0); }); it("storage.spec.3 check key", function () { expect(window.sessionStorage.key(0)).toBe(null); window.sessionStorage.setItem("test","value"); expect(window.sessionStorage.key(0)).toBe("test"); window.sessionStorage.removeItem("test"); expect(window.sessionStorage.key(0)).toBe(null); }); it("storage.spec.4 check getItem", function() { expect(window.sessionStorage.getItem("item")).toBe(null); window.sessionStorage.setItem("item","value"); expect(window.sessionStorage.getItem("item")).toBe("value"); window.sessionStorage.removeItem("item"); expect(window.sessionStorage.getItem("item")).toBe(null); }); it("storage.spec.5 check setItem", function() { expect(window.sessionStorage.getItem("item")).toBe(null); window.sessionStorage.setItem("item","value"); expect(window.sessionStorage.getItem("item")).toBe("value"); window.sessionStorage.setItem("item","newval"); expect(window.sessionStorage.getItem("item")).toBe("newval"); window.sessionStorage.removeItem("item"); expect(window.sessionStorage.getItem("item")).toBe(null); }); it("storage.spec.6 can remove an item", function () { expect(window.sessionStorage.getItem("item")).toBe(null); window.sessionStorage.setItem("item","value"); expect(window.sessionStorage.getItem("item")).toBe("value"); window.sessionStorage.removeItem("item"); expect(window.sessionStorage.getItem("item")).toBe(null); }); it("storage.spec.7 check clear", function() { window.sessionStorage.setItem("item1","value"); window.sessionStorage.setItem("item2","value"); window.sessionStorage.setItem("item3","value"); expect(window.sessionStorage.length).toBe(3); window.sessionStorage.clear(); expect(window.sessionStorage.length).toBe(0); }); it("storage.spec.8 check dot notation", function() { expect(window.sessionStorage.item).not.toBeDefined(); window.sessionStorage.item = "value"; expect(window.sessionStorage.item).toBe("value"); window.sessionStorage.removeItem("item"); expect(window.sessionStorage.item).not.toBeDefined(); }); describe("Local Storage", function () { it("storage.spec.9 should exist", function() { expect(window.localStorage).toBeDefined(); expect(window.localStorage.length).toBeDefined(); expect(typeof window.localStorage.key).toBe("function"); expect(typeof window.localStorage.getItem).toBe("function"); expect(typeof window.localStorage.setItem).toBe("function"); expect(typeof window.localStorage.removeItem).toBe("function"); expect(typeof window.localStorage.clear).toBe("function"); }); it("storage.spec.10 check length", function() { expect(window.localStorage.length).toBe(0); window.localStorage.setItem("key","value"); expect(window.localStorage.length).toBe(1); window.localStorage.removeItem("key"); expect(window.localStorage.length).toBe(0); }); it("storage.spec.11 check key", function() { expect(window.localStorage.key(0)).toBe(null); window.localStorage.setItem("test","value"); expect(window.localStorage.key(0)).toBe("test"); window.localStorage.removeItem("test"); expect(window.localStorage.key(0)).toBe(null); }); it("storage.spec.4 check getItem", function() { expect(window.localStorage.getItem("item")).toBe(null); window.localStorage.setItem("item","value"); expect(window.localStorage.getItem("item")).toBe("value"); window.localStorage.removeItem("item"); expect(window.localStorage.getItem("item")).toBe(null); }); it("storage.spec.5 check setItem", function() { expect(window.localStorage.getItem("item")).toBe(null); window.localStorage.setItem("item","value"); expect(window.localStorage.getItem("item")).toBe("value"); window.localStorage.setItem("item","newval"); expect(window.localStorage.getItem("item")).toBe("newval"); window.localStorage.removeItem("item"); expect(window.localStorage.getItem("item")).toBe(null); }); it("storage.spec.14 check removeItem", function() { expect(window.localStorage.getItem("item")).toBe(null); window.localStorage.setItem("item","value"); expect(window.localStorage.getItem("item")).toBe("value"); window.localStorage.removeItem("item"); expect(window.localStorage.getItem("item")).toBe(null); }); it("storage.spec.7 check clear", function() { expect(window.localStorage.getItem("item1")).toBe(null); expect(window.localStorage.getItem("item2")).toBe(null); expect(window.localStorage.getItem("item3")).toBe(null); window.localStorage.setItem("item1","value"); window.localStorage.setItem("item2","value"); window.localStorage.setItem("item3","value"); expect(window.localStorage.getItem("item1")).toBe("value"); expect(window.localStorage.getItem("item2")).toBe("value"); expect(window.localStorage.getItem("item3")).toBe("value"); expect(window.localStorage.length).toBe(3); window.localStorage.clear(); expect(window.localStorage.length).toBe(0); expect(window.localStorage.getItem("item1")).toBe(null); expect(window.localStorage.getItem("item2")).toBe(null); expect(window.localStorage.getItem("item3")).toBe(null); }); it("storage.spec.8 check dot notation", function() { expect(window.localStorage.item).not.toBeDefined(); window.localStorage.item = "value"; expect(window.localStorage.item).toBe("value"); window.localStorage.removeItem("item"); expect(window.localStorage.item).not.toBeDefined(); }); }); describe("HTML 5 Storage", function () { it("storage.spec.9 should exist", function() { expect(window.openDatabase); }); it("storage.spec.17 should contain an openDatabase function", function() { expect(window.openDatabase).toBeDefined(); expect(typeof window.openDatabase == 'function').toBe(true); }); it("storage.spec.18 Should be able to create and drop tables", function() { var win = jasmine.createSpy('win'); var fail1 = createDoNotCallSpy('fail1'); var fail2 = createDoNotCallSpy('fail2'); var db = openDatabase("Database", "1.0", "HTML5 Database API example", 5*1024*1024); db.transaction(function(t) { t.executeSql('CREATE TABLE IF NOT EXISTS foo(id int, name varchar(255));'); t.executeSql('CREATE TABLE IF NOT EXISTS foo2(id int, name varchar(255));'); }, fail1, step2); function step2() { db.transaction(function(t) { t.executeSql('DROP TABLE foo;'); t.executeSql('DROP TABLE foo2'); }, fail2, win); } waitsForAny(win, fail1, fail2); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/notification.tests.js0000644000015000001560000000356712272510571030276 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Notification (navigator.notification)', function () { it("should exist", function() { expect(navigator.notification).toBeDefined(); }); it("should contain a vibrate function", function() { expect(typeof navigator.notification.vibrate).toBeDefined(); expect(typeof navigator.notification.vibrate).toBe("function"); }); it("should contain a beep function", function() { expect(typeof navigator.notification.beep).toBeDefined(); expect(typeof navigator.notification.beep).toBe("function"); }); it("should contain an alert function", function() { expect(typeof navigator.notification.alert).toBeDefined(); expect(typeof navigator.notification.alert).toBe("function"); }); it("should contain a confirm function", function() { expect(typeof navigator.notification.confirm).toBeDefined(); expect(typeof navigator.notification.confirm).toBe("function"); }); it("should contain a prompt function", function() { expect(typeof navigator.notification.prompt).toBeDefined(); expect(typeof navigator.notification.prompt).toBe("function"); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/compass.tests.js0000644000015000001560000001017712272510571027250 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Compass (navigator.compass)', function () { it("compass.spec.1 should exist", function() { expect(navigator.compass).toBeDefined(); }); it("compass.spec.2 should contain a getCurrentHeading function", function() { expect(navigator.compass.getCurrentHeading).toBeDefined(); expect(typeof navigator.compass.getCurrentHeading == 'function').toBe(true); }); it("compass.spec.3 getCurrentHeading success callback should be called with a Heading object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a instanceof CompassHeading).toBe(true); expect(a.magneticHeading).toBeDefined(); expect(typeof a.magneticHeading == 'number').toBe(true); expect(a.trueHeading).not.toBe(undefined); expect(typeof a.trueHeading == 'number' || a.trueHeading === null).toBe(true); expect(a.headingAccuracy).not.toBe(undefined); expect(typeof a.headingAccuracy == 'number' || a.headingAccuracy === null).toBe(true); expect(typeof a.timestamp == 'number').toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.compass.getCurrentHeading(win, fail); }); waitsFor(function () { return win.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); expect(win).toHaveBeenCalled(); }); }); it("compass.spec.4 should contain a watchHeading function", function() { expect(navigator.compass.watchHeading).toBeDefined(); expect(typeof navigator.compass.watchHeading == 'function').toBe(true); }); it("compass.spec.5 should contain a clearWatch function", function() { expect(navigator.compass.clearWatch).toBeDefined(); expect(typeof navigator.compass.clearWatch == 'function').toBe(true); }); describe('Compass Constants (window.CompassError)', function () { it("compass.spec.1 should exist", function() { expect(window.CompassError).toBeDefined(); expect(window.CompassError.COMPASS_INTERNAL_ERR).toBe(0); expect(window.CompassError.COMPASS_NOT_SUPPORTED).toBe(20); }); }); describe('Compass Heading model (CompassHeading)', function () { it("compass.spec.1 should exist", function() { expect(CompassHeading).toBeDefined(); }); it("compass.spec.8 should be able to create a new CompassHeading instance with no parameters", function() { var h = new CompassHeading(); expect(h).toBeDefined(); expect(h.magneticHeading).toBeUndefined(); expect(h.trueHeading).toBeUndefined(); expect(h.headingAccuracy).toBeUndefined(); expect(typeof h.timestamp == 'number').toBe(true); }); it("compass.spec.9 should be able to create a new CompassHeading instance with parameters", function() { var h = new CompassHeading(1,2,3,4); expect(h.magneticHeading).toBe(1); expect(h.trueHeading).toBe(2); expect(h.headingAccuracy).toBe(3); expect(h.timestamp.valueOf()).toBe(4); expect(typeof h.timestamp == 'number').toBe(true); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/network.tests.js0000644000015000001560000000404612272510571027272 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Network (navigator.connection)', function () { it("network.spec.1 should exist", function() { expect(navigator.network && navigator.network.connection).toBeDefined(); expect(navigator.connection).toBeDefined(); }); it("network.spec.2 should be set to a valid value", function() { var validValues = { 'unknown': 1, 'ethernet': 1, 'wifi': 1, '2g': 1, '3g': 1, '4g': 1, 'none': 1 }; expect(validValues[navigator.connection.type]).toBe(1); }); it("network.spec.3 should have the same value in deprecated and non-deprecated apis", function() { expect(navigator.network.connection.type).toBe(navigator.connection.type); }); it("network.spec.4 should define constants for connection status", function() { expect(Connection.UNKNOWN).toBe("unknown"); expect(Connection.ETHERNET).toBe("ethernet"); expect(Connection.WIFI).toBe("wifi"); expect(Connection.CELL_2G).toBe("2g"); expect(Connection.CELL_3G).toBe("3g"); expect(Connection.CELL_4G).toBe("4g"); expect(Connection.NONE).toBe("none"); expect(Connection.CELL).toBe("cellular"); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/device.tests.js0000644000015000001560000000362112272510571027036 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Device Information (window.device)', function () { it("should exist", function() { expect(window.device).toBeDefined(); }); it("should contain a platform specification that is a string", function() { expect(window.device.platform).toBeDefined(); expect((new String(window.device.platform)).length > 0).toBe(true); }); it("should contain a version specification that is a string", function() { expect(window.device.version).toBeDefined(); expect((new String(window.device.version)).length > 0).toBe(true); }); it("should contain a UUID specification that is a string or a number", function() { expect(window.device.uuid).toBeDefined(); if (typeof window.device.uuid == 'string' || typeof window.device.uuid == 'object') { expect((new String(window.device.uuid)).length > 0).toBe(true); } else { expect(window.device.uuid > 0).toBe(true); } }); it("should contain a cordova specification that is a string", function() { expect(window.device.cordova).toBeDefined(); expect((new String(window.device.cordova)).length > 0).toBe(true); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/whitelist.tests.js0000644000015000001560000001740012272510571027613 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Whitelist API (cordova.whitelist)', function () { it("should exist", function() { expect(cordova.whitelist).toBeDefined(); }); describe("Match function", function() { function expectMatchWithResult(result) { return (function(url, patterns, description) { description = description || ((result ? "should accept " : "should reject ") + url + " for " + JSON.stringify(patterns)); it(description, function() { var cb = jasmine.createSpy(); runs(function() { cordova.whitelist.match(url, patterns, cb); }); waitsFor(function() { return cb.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(cb).toHaveBeenCalledWith(result); }); }); }); } var itShouldMatch = expectMatchWithResult(true); var itShouldNotMatch = expectMatchWithResult(false); it("should exist", function() { expect(cordova.whitelist.match).toBeDefined(); expect(typeof cordova.whitelist.match).toBe("function"); }); itShouldMatch('http://www.apache.org/',['*'], "should accept any domain for *"); itShouldNotMatch('http://www.apache.org/',[], "should not accept any domain for []"); itShouldMatch('http://apache.org/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/some/path', ['http://*.apache.org']); itShouldMatch('http://some.domain.under.apache.org/', ['http://*.apache.org']); itShouldMatch('http://user:pass@apache.org/', ['http://*.apache.org']); itShouldMatch('http://user:pass@www.apache.org/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/?some=params', ['http://*.apache.org']); itShouldNotMatch('http://apache.com/', ['http://*.apache.org']); itShouldNotMatch('http://www.evil.com/?url=www.apache.org', ['http://*.apache.org']); itShouldNotMatch('http://www.evil.com/?url=http://www.apache.org', ['http://*.apache.org']); itShouldNotMatch('http://www.evil.com/?url=http%3A%2F%2Fwww%2Eapache%2Eorg', ['http://*.apache.org']); itShouldNotMatch('https://apache.org/', ['http://*.apache.org']); itShouldNotMatch('http://www.apache.org:pass@evil.com/', ['http://*.apache.org']); itShouldNotMatch('http://www.apache.org.evil.com/', ['http://*.apache.org']); itShouldMatch('http://www.apache.org/',['http://*.apache.org','https://*.apache.org']); itShouldMatch('https://www.apache.org/',['http://*.apache.org','https://*.apache.org']); itShouldNotMatch('ftp://www.apache.org/',['http://*.apache.org','https://*.apache.org']); itShouldNotMatch('http://www.apache.com/',['http://*.apache.org','https://*.apache.org']); itShouldMatch('http://www.apache.org/',['http://www.apache.org']); itShouldNotMatch('http://build.apache.org/',['http://www.apache.org']); itShouldNotMatch('http://apache.org/',['http://www.apache.org']); itShouldMatch('http://www.apache.org/', ['http://*/*']); itShouldMatch('http://www.apache.org/foo/bar.html', ['http://*/*']); itShouldMatch('http://www.apache.org/foo', ['http://*/foo*']); itShouldMatch('http://www.apache.org/foo/bar.html', ['http://*/foo*']); itShouldNotMatch('http://www.apache.org/', ['http://*/foo*']); itShouldMatch('file:///foo', ['file:///*']); itShouldMatch('file:///foo', ['file:///foo*']); itShouldMatch('file:///foo/bar.html', ['file:///foo*']); itShouldNotMatch('file:///etc/foo', ['file:///foo*']); itShouldNotMatch('http://www.apache.org/foo', ['file:///foo*']); itShouldMatch('http://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('https://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('ftp://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('file://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('content://www.apache.org/', ['*://www.apache.org/*']); itShouldMatch('foo://www.apache.org/', ['*://www.apache.org/*']); itShouldNotMatch('http://www.apache.com/', ['*://www.apache.org/*']); itShouldMatch('http://www.apache.org/', ['*.apache.org']); itShouldMatch('https://www.apache.org/', ['*.apache.org']); itShouldNotMatch('ftp://www.apache.org/', ['*.apache.org']); itShouldMatch('http://www.apache.org:81/', ['http://www.apache.org:81/*']); itShouldMatch('http://user:pass@www.apache.org:81/foo/bar.html', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:80/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:foo/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:81@www.apache.org/', ['http://www.apache.org:81/*']); itShouldNotMatch('http://www.apache.org:81@www.evil.com/', ['http://www.apache.org:81/*']); }); describe("Test function", function() { function expectTestWithResult(result) { return (function(url, description) { description = description || ((result ? "should accept " : "should reject ") + url); it(description, function() { var cb = jasmine.createSpy(); runs(function() { cordova.whitelist.test(url, cb); }); waitsFor(function() { return cb.wasCalled; }, "success callback never called", Tests.TEST_TIMEOUT); runs(function() { expect(cb).toHaveBeenCalledWith(result); }); }); }); } var itShouldAccept = expectTestWithResult(true); var itShouldReject = expectTestWithResult(false); it("should exist", function() { expect(cordova.whitelist.test).toBeDefined(); expect(typeof cordova.whitelist.test).toBe("function"); }); itShouldAccept('http://apache.org'); itShouldAccept('http://apache.org/'); itShouldAccept('http://www.apache.org/'); itShouldAccept('http://www.apache.org/some/path'); itShouldAccept('http://some.domain.under.apache.org/'); itShouldAccept('http://user:pass@apache.org/'); itShouldAccept('http://user:pass@www.apache.org/'); itShouldAccept('https://www.apache.org/'); itShouldReject('ftp://www.apache.org/'); itShouldReject('http://www.apache.com/'); itShouldReject('http://www.apache.org:pass@evil.com/'); itShouldReject('http://www.apache.org.evil.com/'); itShouldAccept('file:///foo'); itShouldAccept('content:///foo'); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/splashscreen.tests.js0000644000015000001560000000256712272510571030301 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Splashscreen (cordova)', function () { it("splashscreen.spec.1 should exist", function() { expect(navigator.splashscreen).toBeDefined(); }); it("splashscreen.spec.2 exec method should exist", function() { expect(navigator.splashscreen.show).toBeDefined(); expect(typeof navigator.splashscreen.show).toBe('function'); }); it("splashscreen.spec.3 exec method should exist", function() { expect(navigator.splashscreen.hide).toBeDefined(); expect(typeof navigator.splashscreen.hide).toBe('function'); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/media.tests.js0000644000015000001560000001177612272510571026670 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Media', function () { it("should exist", function() { expect(Media).toBeDefined(); expect(typeof Media).toBe("function"); }); it("media.spec.1 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("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("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.2 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.3 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.4 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.5 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.6 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.7 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.8 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.9 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.10 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.11 should contain a setVolume function", function() { var media1 = new Media(); expect(media1.setVolume).toBeDefined(); expect(typeof media1.setVolume).toBe('function'); media1.release(); }); it("should return MediaError for bad filename", function() { var badMedia = null, win = jasmine.createSpy(), fail = jasmine.createSpy().andCallFake(function (result) { expect(result).toBeDefined(); expect(result.code).toBe(MediaError.MEDIA_ERR_ABORTED); }); runs(function () { badMedia = new Media("invalid.file.name", win,fail); badMedia.play(); }); waitsFor(function () { return fail.wasCalled; }, Tests.TEST_TIMEOUT); runs(function () { expect(win).not.toHaveBeenCalled(); badMedia.release(); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/contacts.tests.js0000644000015000001560000005604712272510571027427 0ustar pbuserpbgroup00000000000000/* * * 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. * */ // global to store a contact so it doesn't have to be created or retrieved multiple times // all of the setup/teardown test methods can reference the following variables to make sure to do the right cleanup var gContactObj = null; var gContactId = null; var removeContact = function(){ if (gContactObj) { gContactObj.remove(function(){},function(){ console.log("[CONTACTS ERROR]: removeContact cleanup method failed to clean up test artifacts."); }); gContactObj = null; } }; describe("Contacts (navigator.contacts)", function () { it("contacts.spec.1 should exist", function() { expect(navigator.contacts).toBeDefined(); }); it("contacts.spec.2 should contain a find function", function() { expect(navigator.contacts.find).toBeDefined(); expect(typeof navigator.contacts.find).toBe('function'); }); describe("find method", function() { it("contacts.spec.3 success callback should be called with an array", function() { var win = jasmine.createSpy().andCallFake(function(result) { expect(result).toBeDefined(); expect(result instanceof Array).toBe(true); }), fail = jasmine.createSpy(), obj = new ContactFindOptions(); runs(function () { obj.filter=""; obj.multiple=true; navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], win, fail, obj); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("success callback should be called with an array, even if partial ContactFindOptions specified", function () { var win = jasmine.createSpy().andCallFake(function (result) { expect(result).toBeDefined(); expect(result instanceof Array).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], win, fail, { multiple: true }); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("contacts.spec.4 should throw an exception if success callback is empty", function() { var fail = function() {}; var obj = new ContactFindOptions(); obj.filter=""; obj.multiple=true; expect(function () { navigator.contacts.find(["displayName", "name", "emails", "phoneNumbers"], null, fail, obj); }).toThrow(); }); it("contacts.spec.5 error callback should be called when no fields are specified", function() { var win = jasmine.createSpy(), fail = jasmine.createSpy(function(result) { expect(result).toBeDefined(); expect(result.code).toBe(ContactError.INVALID_ARGUMENT_ERROR); }), obj = new ContactFindOptions(); runs(function () { obj.filter=""; obj.multiple=true; navigator.contacts.find([], win, fail, obj); }); waitsFor(function () { return fail.wasCalled; }, Tests.TEST_TIMEOUT); runs(function () { expect(win).not.toHaveBeenCalled(); expect(fail).toHaveBeenCalled(); }); }); describe("with newly-created contact", function () { afterEach(removeContact); it("contacts.spec.6 should be able to find a contact by name", function() { var foundName = jasmine.createSpy().andCallFake(function(result) { var bFound = false; try { for (var i=0; i < result.length; i++) { if (result[i].name.familyName == "Delete") { bFound = true; break; } } } catch(e) { return false; } return bFound; }), fail = jasmine.createSpy(), test = jasmine.createSpy().andCallFake(function(savedContact) { console.log('in test'); // update so contact will get removed gContactObj = savedContact; // ---- // Find asserts // --- var findWin = jasmine.createSpy().andCallFake(function(object) { console.log('in findwin'); expect(object instanceof Array).toBe(true); expect(object.length >= 1).toBe(true); expect(foundName(object)).toBe(true); }), findFail = jasmine.createSpy(), obj = new ContactFindOptions(); obj.filter="Delete"; obj.multiple=true; runs(function () { navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], findWin, findFail, obj); }); waitsFor(function () { return foundName.wasCalled; }, "foundName not done", Tests.TEST_TIMEOUT); runs(function () { expect(findFail).not.toHaveBeenCalled(); expect(fail).not.toHaveBeenCalled(); }); }); runs(function () { gContactObj = new Contact(); gContactObj.name = new ContactName(); gContactObj.name.familyName = "Delete"; gContactObj.save(test, fail); }); waitsFor(function () { return test.wasCalled; }, "test not done", Tests.TEST_TIMEOUT); }); }); }); describe('create method', function() { it("contacts.spec.7 should exist", function() { expect(navigator.contacts.create).toBeDefined(); expect(typeof navigator.contacts.create).toBe('function'); }); it("contacts.spec.8 should return a Contact object", function() { var bDay = new Date(1976, 7,4); var obj = navigator.contacts.create({"displayName": "test name", "gender": "male", "note": "my note", "name": {"formatted": "Mr. Test Name"}, "emails": [{"value": "here@there.com"}, {"value": "there@here.com"}], "birthday": bDay}); expect(obj).toBeDefined(); expect(obj.displayName).toBe('test name'); expect(obj.note).toBe('my note'); expect(obj.name.formatted).toBe('Mr. Test Name'); expect(obj.emails.length).toBe(2); expect(obj.emails[0].value).toBe('here@there.com'); expect(obj.emails[1].value).toBe('there@here.com'); expect(obj.nickname).toBe(null); expect(obj.birthday).toBe(bDay); }); }); describe("Contact object", function () { it("contacts.spec.9 should be able to create instance", function() { var contact = new Contact("a", "b", new ContactName("a", "b", "c", "d", "e", "f"), "c", [], [], [], [], [], "f", "i", [], [], []); expect(contact).toBeDefined(); expect(contact.id).toBe("a"); expect(contact.displayName).toBe("b"); expect(contact.name.formatted).toBe("a"); expect(contact.nickname).toBe("c"); expect(contact.phoneNumbers).toBeDefined(); expect(contact.emails).toBeDefined(); expect(contact.addresses).toBeDefined(); expect(contact.ims).toBeDefined(); expect(contact.organizations).toBeDefined(); expect(contact.birthday).toBe("f"); expect(contact.note).toBe("i"); expect(contact.photos).toBeDefined(); expect(contact.categories).toBeDefined(); expect(contact.urls).toBeDefined(); }); it("contacts.spec.10 should be able to define a ContactName object", function() { var contactName = new ContactName("Dr. First Last Jr.", "Last", "First", "Middle", "Dr.", "Jr."); expect(contactName).toBeDefined(); expect(contactName.formatted).toBe("Dr. First Last Jr."); expect(contactName.familyName).toBe("Last"); expect(contactName.givenName).toBe("First"); expect(contactName.middleName).toBe("Middle"); expect(contactName.honorificPrefix).toBe("Dr."); expect(contactName.honorificSuffix).toBe("Jr."); }); it("contacts.spec.11 should be able to define a ContactField object", function() { var contactField = new ContactField("home", "8005551212", true); expect(contactField).toBeDefined(); expect(contactField.type).toBe("home"); expect(contactField.value).toBe("8005551212"); expect(contactField.pref).toBe(true); }); it("contacts.spec.12 ContactField object should coerce type and value properties to strings", function() { var contactField = new ContactField(12345678, 12345678, true); expect(contactField.type).toBe("12345678"); expect(contactField.value).toBe("12345678"); }); it("contacts.spec.13 should be able to define a ContactAddress object", function() { var contactAddress = new ContactAddress(true, "home", "a","b","c","d","e","f"); expect(contactAddress).toBeDefined(); expect(contactAddress.pref).toBe(true); expect(contactAddress.type).toBe("home"); expect(contactAddress.formatted).toBe("a"); expect(contactAddress.streetAddress).toBe("b"); expect(contactAddress.locality).toBe("c"); expect(contactAddress.region).toBe("d"); expect(contactAddress.postalCode).toBe("e"); expect(contactAddress.country).toBe("f"); }); it("contacts.spec.14 should be able to define a ContactOrganization object", function() { var contactOrg = new ContactOrganization(true, "home", "a","b","c","d","e","f","g"); expect(contactOrg).toBeDefined(); expect(contactOrg.pref).toBe(true); expect(contactOrg.type).toBe("home"); expect(contactOrg.name).toBe("a"); expect(contactOrg.department).toBe("b"); expect(contactOrg.title).toBe("c"); }); it("contacts.spec.15 should be able to define a ContactFindOptions object", function() { var contactFindOptions = new ContactFindOptions("a", true, "b"); expect(contactFindOptions).toBeDefined(); expect(contactFindOptions.filter).toBe("a"); expect(contactFindOptions.multiple).toBe(true); }); it("contacts.spec.16 should contain a clone function", function() { var contact = new Contact(); expect(contact.clone).toBeDefined(); expect(typeof contact.clone).toBe('function'); }); it("contacts.spec.17 clone function should make deep copy of Contact Object", function() { var contact = new Contact(); contact.id=1; contact.displayName="Test Name"; contact.nickname="Testy"; contact.gender="male"; contact.note="note to be cloned"; contact.name = new ContactName("Mr. Test Name"); var clonedContact = contact.clone(); expect(contact.id).toBe(1); expect(clonedContact.id).toBe(null); expect(clonedContact.displayName).toBe(contact.displayName); expect(clonedContact.nickname).toBe(contact.nickname); expect(clonedContact.gender).toBe(contact.gender); expect(clonedContact.note).toBe(contact.note); expect(clonedContact.name.formatted).toBe(contact.name.formatted); expect(clonedContact.connected).toBe(contact.connected); }); it("contacts.spec.18 should contain a save function", function() { var contact = new Contact(); expect(contact.save).toBeDefined(); expect(typeof contact.save).toBe('function'); }); it("contacts.spec.19 should contain a remove function", function() { var contact = new Contact(); expect(contact.remove).toBeDefined(); expect(typeof contact.remove).toBe('function'); }); }); describe('save method', function () { it("contacts.spec.20 should be able to save a contact", function() { var bDay = new Date(1976, 6,4); gContactObj = navigator.contacts.create({"gender": "male", "note": "my note", "name": {"familyName": "Delete", "givenName": "Test"}, "emails": [{"value": "here@there.com"}, {"value": "there@here.com"}], "birthday": bDay}); var saveSuccess = jasmine.createSpy().andCallFake(function(obj) { expect(obj).toBeDefined(); expect(obj.note).toBe('my note'); expect(obj.name.familyName).toBe('Delete'); expect(obj.name.givenName).toBe('Test'); expect(obj.emails.length).toBe(2); expect(obj.emails[0].value).toBe('here@there.com'); expect(obj.emails[1].value).toBe('there@here.com'); expect(obj.birthday.toDateString()).toBe(bDay.toDateString()); expect(obj.addresses).toBe(null); // must store returned object in order to have id for update test below gContactObj = obj; }), saveFail = jasmine.createSpy(); runs(function () { gContactObj.save(saveSuccess, saveFail); }); waitsFor(function () { return saveSuccess.wasCalled; }, "saveSuccess never called", Tests.TEST_TIMEOUT); runs(function () { expect(saveFail).not.toHaveBeenCalled(); }); }); // HACK: there is a reliance between the previous and next test. This is bad form. it("contacts.spec.21 update a contact", function() { expect(gContactObj).toBeDefined(); var bDay = new Date(1975, 5,4); var noteText = "an UPDATED note"; var win = jasmine.createSpy().andCallFake(function(obj) { expect(obj).toBeDefined(); expect(obj.id).toBe(gContactObj.id); expect(obj.note).toBe(noteText); expect(obj.birthday.toDateString()).toBe(bDay.toDateString()); expect(obj.emails.length).toBe(1); expect(obj.emails[0].value).toBe('here@there.com'); removeContact(); // Clean up contact object }), fail = jasmine.createSpy().andCallFake(removeContact); runs(function () { // remove an email gContactObj.emails[1].value = ""; // change birthday gContactObj.birthday = bDay; // update note gContactObj.note = noteText; gContactObj.save(win, fail); }); waitsFor(function () { return win.wasCalled; }, "saveSuccess never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe('Contact.remove method', function () { afterEach(removeContact); it("contacts.spec.22 calling remove on a contact has an id of null should return ContactError.UNKNOWN_ERROR", function() { var win = jasmine.createSpy(); var fail = jasmine.createSpy().andCallFake(function(result) { expect(result.code).toBe(ContactError.UNKNOWN_ERROR); }); runs(function () { var rmContact = new Contact(); rmContact.remove(win, fail); }); waitsFor(function () { return fail.wasCalled; }, Tests.TEST_TIMEOUT); runs(function () { expect(win).not.toHaveBeenCalled(); }); }); it("contacts.spec.23 calling remove on a contact that does not exist should return ContactError.UNKNOWN_ERROR", function() { var win = jasmine.createSpy(); var fail = jasmine.createSpy().andCallFake(function(result) { expect(result.code).toBe(ContactError.UNKNOWN_ERROR); }); runs(function () { var rmContact = new Contact(); // this is a bit risky as some devices may have contact ids that large var contact = new Contact("this string is supposed to be a unique identifier that will never show up on a device"); contact.remove(win, fail); }); waitsFor(function () { return fail.wasCalled; }, Tests.TEST_TIMEOUT); runs(function () { expect(win).not.toHaveBeenCalled(); }); }); }); describe("Round trip Contact tests (creating + save + delete + find).", function () { it("contacts.spec.24 Creating, saving, finding a contact should work, removing it should work, after which we should not be able to find it, and we should not be able to delete it again.", function() { var done = false; runs(function () { gContactObj = new Contact(); gContactObj.name = new ContactName(); gContactObj.name.familyName = "DeleteMe"; gContactObj.save(function(c_obj) { var findWin = function(cs) { expect(cs.length).toBe(1); // update to have proper saved id gContactObj = cs[0]; gContactObj.remove(function() { var findWinAgain = function(seas) { expect(seas.length).toBe(0); gContactObj.remove(function() { throw("success callback called after non-existent Contact object called remove(). Test failed."); }, function(e) { expect(e.code).toBe(ContactError.UNKNOWN_ERROR); done = true; }); }; var findFailAgain = function(e) { throw("find error callback invoked after delete, test failed."); }; var obj = new ContactFindOptions(); obj.filter="DeleteMe"; obj.multiple=true; navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], findWinAgain, findFailAgain, obj); }, function(e) { throw("Newly created contact's remove function invoked error callback. Test failed."); }); }; var findFail = function(e) { throw("Failure callback invoked in navigator.contacts.find call, test failed."); }; var obj = new ContactFindOptions(); obj.filter="DeleteMe"; obj.multiple=true; navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], findWin, findFail, obj); }, function(e) { throw("Contact creation failed, error callback was invoked."); }); }); waitsFor(function () { return done; }, Tests.TEST_TIMEOUT); }); }); describe('ContactError interface', function () { it("contacts.spec.25 ContactError constants should be defined", function() { expect(ContactError.UNKNOWN_ERROR).toBe(0); expect(ContactError.INVALID_ARGUMENT_ERROR).toBe(1); expect(ContactError.TIMEOUT_ERROR).toBe(2); expect(ContactError.PENDING_OPERATION_ERROR).toBe(3); expect(ContactError.IO_ERROR).toBe(4); expect(ContactError.NOT_SUPPORTED_ERROR).toBe(5); expect(ContactError.PERMISSION_DENIED_ERROR).toBe(20); }); }); describe("Contacts autotests cleanup", function () { it("contacts.spec.26 Cleanup any DeleteMe contacts from Contacts tests.", function() { var done = false; var obj = new ContactFindOptions(); obj.filter="DeleteMe"; obj.multiple=true; runs(function () { var findSuccess = function (cs) { var contactObj = new Contact(); if (cs.length>0){ contactObj = cs[0]; contactObj.remove(function(){ console.log("[CONTACTS CLEANUP] DeleteMe contact successfully removed"); navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], findSuccess, findFail, obj); },function(){ console.log("[CONTACTS CLEANUP ERROR]: failed to remove DeleteMe contact"); }); } else { done = true; } }; var findFail = function(e) { throw("Failure callback invoked in navigator.contacts.find call, test failed."); }; navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], findSuccess, findFail, obj); }); waitsFor(function () { return done; }, Tests.TEST_TIMEOUT); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/capture.tests.js0000644000015000001560000001115712272510571027245 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Capture (navigator.device.capture)', function () { it("capture.spec.1 should exist", function() { expect(navigator.device).toBeDefined(); expect(navigator.device.capture).toBeDefined(); }); it("capture.spec.2 should have the correct properties ", function() { expect(navigator.device.capture.supportedAudioModes).toBeDefined(); expect(navigator.device.capture.supportedImageModes).toBeDefined(); expect(navigator.device.capture.supportedVideoModes).toBeDefined(); }); it("capture.spec.3 should contain a captureAudio function", function() { expect(navigator.device.capture.captureAudio).toBeDefined(); expect(typeof navigator.device.capture.captureAudio == 'function').toBe(true); }); it("capture.spec.4 should contain a captureImage function", function() { expect(navigator.device.capture.captureImage).toBeDefined(); expect(typeof navigator.device.capture.captureImage == 'function').toBe(true); }); it("capture.spec.5 should contain a captureVideo function", function() { expect(navigator.device.capture.captureVideo).toBeDefined(); expect(typeof navigator.device.capture.captureVideo == 'function').toBe(true); }); describe('CaptureAudioOptions', function () { it("capture.spec.6 CaptureAudioOptions constructor should exist", function() { var options = new CaptureAudioOptions(); expect(options).toBeDefined(); expect(options.limit).toBeDefined(); expect(options.duration).toBeDefined(); }); }); describe('CaptureImageOptions', function () { it("capture.spec.7 CaptureImageOptions constructor should exist", function() { var options = new CaptureImageOptions(); expect(options).toBeDefined(); expect(options.limit).toBeDefined(); }); }); describe('CaptureVideoOptions', function () { it("capture.spec.8 CaptureVideoOptions constructor should exist", function() { var options = new CaptureVideoOptions(); expect(options).toBeDefined(); expect(options.limit).toBeDefined(); expect(options.duration).toBeDefined(); }); }); describe('CaptureError interface', function () { it("capture.spec.9 CaptureError constants should be defined", function() { expect(CaptureError.CAPTURE_INTERNAL_ERR).toBe(0); expect(CaptureError.CAPTURE_APPLICATION_BUSY).toBe(1); expect(CaptureError.CAPTURE_INVALID_ARGUMENT).toBe(2); expect(CaptureError.CAPTURE_NO_MEDIA_FILES).toBe(3); }); it("capture.spec.10 CaptureError properties should exist", function() { var error = new CaptureError(); expect(error).toBeDefined(); expect(error.code).toBeDefined(); }); }); describe('MediaFileData', function () { it("capture.spec.11 MediaFileData constructor should exist", function() { var fileData = new MediaFileData(); expect(fileData).toBeDefined(); expect(fileData.bitrate).toBeDefined(); expect(fileData.codecs).toBeDefined(); expect(fileData.duration).toBeDefined(); expect(fileData.height).toBeDefined(); expect(fileData.width).toBeDefined(); }); }); describe('MediaFile', function () { it("capture.spec.12 MediaFile constructor should exist", function() { var fileData = new MediaFile(); expect(fileData).toBeDefined(); expect(fileData.name).toBeDefined(); expect(fileData.fullPath).toBeDefined(); expect(fileData.type).toBeDefined(); expect(fileData.lastModifiedDate).toBeDefined(); expect(fileData.size).toBeDefined(); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/accelerometer.tests.js0000644000015000001560000002166212272510571030416 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Accelerometer (navigator.accelerometer)', function () { it("accelerometer.spec.1 should exist", function () { expect(navigator.accelerometer).toBeDefined(); }); describe("getCurrentAcceleration", function() { it("accelerometer.spec.2 should exist", function() { expect(typeof navigator.accelerometer.getCurrentAcceleration).toBeDefined(); expect(typeof navigator.accelerometer.getCurrentAcceleration == 'function').toBe(true); }); it("accelerometer.spec.3 success callback should be called with an Acceleration object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(a.x).toBeDefined(); expect(typeof a.x == 'number').toBe(true); expect(a.y).toBeDefined(); expect(typeof a.y == 'number').toBe(true); expect(a.z).toBeDefined(); expect(typeof a.z == 'number').toBe(true); expect(a.timestamp).toBeDefined(); expect(typeof a.timestamp).toBe('number'); }), fail = jasmine.createSpy(); runs(function () { navigator.accelerometer.getCurrentAcceleration(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("accelerometer.spec.4 success callback Acceleration object should have (reasonable) values for x, y and z expressed in m/s^2", function() { var reasonableThreshold = 15; var win = jasmine.createSpy().andCallFake(function(a) { expect(a.x).toBeLessThan(reasonableThreshold); expect(a.x).toBeGreaterThan(reasonableThreshold * -1); expect(a.y).toBeLessThan(reasonableThreshold); expect(a.y).toBeGreaterThan(reasonableThreshold * -1); expect(a.z).toBeLessThan(reasonableThreshold); expect(a.z).toBeGreaterThan(reasonableThreshold * -1); }), fail = jasmine.createSpy(); runs(function () { navigator.accelerometer.getCurrentAcceleration(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("accelerometer.spec.5 success callback Acceleration object should return a recent timestamp", function() { var veryRecently = (new Date()).getTime(); // Need to check that dates returned are not vastly greater than a recent time stamp. // In case the timestamps returned are ridiculously high var reasonableTimeLimit = veryRecently + 5000; // 5 seconds from now var win = jasmine.createSpy().andCallFake(function(a) { expect(a.timestamp).toBeGreaterThan(veryRecently); expect(a.timestamp).toBeLessThan(reasonableTimeLimit); }), fail = jasmine.createSpy(); runs(function () { navigator.accelerometer.getCurrentAcceleration(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("watchAcceleration", function() { var id; afterEach(function() { navigator.accelerometer.clearWatch(id); }); it("accelerometer.spec.2 should exist", function() { expect(navigator.accelerometer.watchAcceleration).toBeDefined(); expect(typeof navigator.accelerometer.watchAcceleration == 'function').toBe(true); }); it("accelerometer.spec.3 success callback should be called with an Acceleration object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(a.x).toBeDefined(); expect(typeof a.x == 'number').toBe(true); expect(a.y).toBeDefined(); expect(typeof a.y == 'number').toBe(true); expect(a.z).toBeDefined(); expect(typeof a.z == 'number').toBe(true); expect(a.timestamp).toBeDefined(); expect(typeof a.timestamp).toBe('number'); }), fail = jasmine.createSpy(); runs(function () { id = navigator.accelerometer.watchAcceleration(win, fail, {frequency:500}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("accelerometer.spec.4 success callback Acceleration object should have (reasonable) values for x, y and z expressed in m/s^2", function() { var reasonableThreshold = 15; var win = jasmine.createSpy().andCallFake(function(a) { expect(a.x).toBeLessThan(reasonableThreshold); expect(a.x).toBeGreaterThan(reasonableThreshold * -1); expect(a.y).toBeLessThan(reasonableThreshold); expect(a.y).toBeGreaterThan(reasonableThreshold * -1); expect(a.z).toBeLessThan(reasonableThreshold); expect(a.z).toBeGreaterThan(reasonableThreshold * -1); }), fail = jasmine.createSpy(); runs(function () { id = navigator.accelerometer.watchAcceleration(win, fail, {frequency:500}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("accelerometer.spec.5 success callback Acceleration object should return a recent timestamp", function() { var veryRecently = (new Date()).getTime(); // Need to check that dates returned are not vastly greater than a recent time stamp. // In case the timestamps returned are ridiculously high var reasonableTimeLimit = veryRecently + 5000; // 5 seconds from now var win = jasmine.createSpy().andCallFake(function(a) { expect(a.timestamp).toBeGreaterThan(veryRecently); expect(a.timestamp).toBeLessThan(reasonableTimeLimit); }), fail = jasmine.createSpy(); runs(function () { id = navigator.accelerometer.watchAcceleration(win, fail, {frequency:500}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("clearWatch", function() { it("accelerometer.spec.2 should exist", function() { expect(navigator.accelerometer.clearWatch).toBeDefined(); expect(typeof navigator.accelerometer.clearWatch == 'function').toBe(true); }); it("accelerometer.spec.11 should clear an existing watch", function() { var id, win = jasmine.createSpy(); runs(function() { id = navigator.accelerometer.watchAcceleration(win, function() {}, {frequency:100}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function() { win.reset(); navigator.accelerometer.clearWatch(id); }); waits(201); runs(function() { expect(win).not.toHaveBeenCalled(); }); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/geolocation.tests.js0000644000015000001560000001270212272510571030102 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Geolocation (navigator.geolocation)', function () { it("geolocation.spec.1 should exist", function() { expect(navigator.geolocation).toBeDefined(); }); it("geolocation.spec.2 should contain a getCurrentPosition function", function() { expect(typeof navigator.geolocation.getCurrentPosition).toBeDefined(); expect(typeof navigator.geolocation.getCurrentPosition == 'function').toBe(true); }); it("geolocation.spec.3 should contain a watchPosition function", function() { expect(typeof navigator.geolocation.watchPosition).toBeDefined(); expect(typeof navigator.geolocation.watchPosition == 'function').toBe(true); }); it("geolocation.spec.4 should contain a clearWatch function", function() { expect(typeof navigator.geolocation.clearWatch).toBeDefined(); expect(typeof navigator.geolocation.clearWatch == 'function').toBe(true); }); describe('getCurrentPosition method', function() { describe('error callback', function() { it("geolocation.spec.5 should be called if we set timeout to 0 and maximumAge to a very small number", function() { console.log("Here I am"); var win = jasmine.createSpy(), fail = jasmine.createSpy(); runs(function () { navigator.geolocation.getCurrentPosition(win, fail, { maximumAge: 0, timeout: 0 }); }); waitsFor(function () { return fail.wasCalled; }, "fail never called", 250); //small timeout as this should fire very fast runs(function () { expect(win).not.toHaveBeenCalled(); }); }); }); describe('success callback', function() { it("geolocation.spec.6 should be called with a Position object", function() { var win = jasmine.createSpy().andCallFake(function(p) { expect(p.coords).toBeDefined(); expect(p.timestamp).toBeDefined(); }), fail = jasmine.createSpy(); runs(function () { navigator.geolocation.getCurrentPosition(win, fail, { maximumAge:300000 // 5 minutes maximum age of cached position }); }); waitsFor(function () { return win.wasCalled; }, "win never called", 20000); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); }); describe('watchPosition method', function() { describe('error callback', function() { var errorWatch = null; afterEach(function() { navigator.geolocation.clearWatch(errorWatch); }); it("geolocation.spec.5 should be called if we set timeout to 0 and maximumAge to a very small number", function() { var win = jasmine.createSpy(), fail = jasmine.createSpy(); runs(function () { errorWatch = navigator.geolocation.watchPosition(win, fail, { maximumAge: 0, timeout: 0 }); }); waitsFor(function () { return fail.wasCalled; }, "fail never called", 250); // small timeout as this should fire very quickly runs(function () { expect(win).not.toHaveBeenCalled(); }); }); }); describe('success callback', function() { var successWatch = null; afterEach(function() { navigator.geolocation.clearWatch(successWatch); }); it("geolocation.spec.6 should be called with a Position object", function() { var win = jasmine.createSpy().andCallFake(function(p) { expect(p.coords).toBeDefined(); expect(p.timestamp).toBeDefined(); }), fail = jasmine.createSpy(); runs(function () { successWatch = navigator.geolocation.watchPosition(win, fail, { maximumAge:(5 * 60 * 1000) // 5 minutes maximum age of cached position }); }); waitsFor(function () { return win.wasCalled; }, "win never called", 20000); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/datauri.tests.js0000644000015000001560000000462312272510571027233 0ustar pbuserpbgroup00000000000000/* * 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. */ describe('data uris', function () { it("datauri.spec.1 should work with iframes", function() { var gotFoo = false, frame = document.createElement('iframe'); function onMessage(msg) { gotFoo = gotFoo || msg.data == 'foo'; }; this.after(function() { document.body.removeChild(frame); window.removeEventListener('message', onMessage, false); }); window.addEventListener('message', onMessage, false); frame.src = 'data:text/html;charset=utf-8,%3Chtml%3E%3Cscript%3Eparent.postMessage%28%27foo%27%2C%27%2A%27%29%3C%2Fscript%3E%3C%2Fhtml%3E' document.body.appendChild(frame); waitsFor(function() { return gotFoo; }, 'iframe did not load.', 1000); runs(function() { expect(gotFoo).toBe(true); }); }); it("datauri.spec.2 should work with images", function() { var img = new Image(); img.onload = jasmine.createSpy('onLoad'); img.onerror = jasmine.createSpy('onError'); img.src = 'data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7' waitsFor(function() { return img.onload.wasCalled || img.onerror.wasCalled; }, 'image did not load or error', 1000); runs(function() { expect(img.onload).toHaveBeenCalled(); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/platform.tests.js0000644000015000001560000000215512272510571027424 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Platform (cordova)', function () { it("platform.spec.1 should exist", function() { expect(cordova).toBeDefined(); }); it("platform.spec.2 exec method should exist", function() { expect(cordova.exec).toBeDefined(); expect(typeof cordova.exec).toBe('function'); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/globalization.tests.js0000644000015000001560000011762312272510571030445 0ustar pbuserpbgroup00000000000000/* * 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. */ describe('Globalization (navigator.globalization)', function () { it("globalization.spec.1 should exist", function() { expect(navigator.globalization).toBeDefined(); }); describe("getPreferredLanguage", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getPreferredLanguage).toBeDefined(); expect(typeof navigator.globalization.getPreferredLanguage == 'function').toBe(true); }); it("globalization.spec.3 getPreferredLanguage success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getPreferredLanguage(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("getLocaleName", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getLocaleName).toBeDefined(); expect(typeof navigator.globalization.getLocaleName == 'function').toBe(true); }); it("globalization.spec.3 getLocaleName success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getLocaleName(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe('Globalization Constants (window.Globalization)', function () { it("globalization.spec.1 should exist", function() { expect(window.GlobalizationError).toBeDefined(); expect(window.GlobalizationError.UNKNOWN_ERROR).toBe(0); expect(window.GlobalizationError.FORMATTING_ERROR).toBe(1); expect(window.GlobalizationError.PARSING_ERROR).toBe(2); expect(window.GlobalizationError.PATTERN_ERROR).toBe(3); }); }); describe("dateToString", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.dateToString).toBeDefined(); expect(typeof navigator.globalization.dateToString == 'function').toBe(true); }); it("globalization.spec.5 dateToString using default options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.dateToString(new Date(), win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.6 dateToString using formatLength=short and selector=date options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.dateToString(new Date(), win, fail, {formatLength: 'short', selector: 'date'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.7 dateToString using formatLength=full and selector=date options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.dateToString(new Date(), win, fail, {formatLength: 'full', selector: 'date'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.8 dateToString using formatLength=medium and selector=date and time(default) options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.dateToString(new Date(), win, fail, {formatLength: 'medium'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.9 dateToString using formatLength=long and selector=date and time(default) options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.dateToString(new Date(), win, fail, {formatLength: 'long'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.10 dateToString using formatLength=full and selector=date and time(default) options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.dateToString(new Date(), win, fail, {formatLength: 'full'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("stringToDate", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.stringToDate).toBeDefined(); expect(typeof navigator.globalization.stringToDate == 'function').toBe(true); }); it("globalization.spec.12 stringToDate using default options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.year).toBeDefined(); expect(typeof a.year).toBe('number'); expect(a.year >= 0 && a.year <=9999).toBe(true); expect(a.month).toBeDefined(); expect(typeof a.month).toBe('number'); expect(a.month >= 0 && a.month <=11).toBe(true); expect(a.day).toBeDefined(); expect(typeof a.day).toBe('number'); expect(a.day >= 1 && a.day <=31).toBe(true); expect(a.hour).toBeDefined(); expect(typeof a.hour).toBe('number'); expect(a.hour >= 0 && a.hour <=23).toBe(true); expect(a.minute).toBeDefined(); expect(typeof a.minute).toBe('number'); expect(a.minute >= 0 && a.minute <=59).toBe(true); expect(a.second).toBeDefined(); expect(typeof a.second).toBe('number'); expect(a.second >= 0 && a.second <=59).toBe(true); expect(a.millisecond).toBeDefined(); expect(typeof a.millisecond).toBe('number'); }), fail = jasmine.createSpy(); var win2 = function(a) { navigator.globalization.stringToDate(a.value, win, fail); }; runs(function () { navigator.globalization.dateToString(new Date(), win2, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.13 stringToDate using formatLength=short and selector=date options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.year).toBeDefined(); expect(typeof a.year).toBe('number'); expect(a.year >= 0 && a.year <=9999).toBe(true); expect(a.month).toBeDefined(); expect(typeof a.month).toBe('number'); expect(a.month >= 0 && a.month <=11).toBe(true); expect(a.day).toBeDefined(); expect(typeof a.day).toBe('number'); expect(a.day >= 1 && a.day <=31).toBe(true); expect(a.hour).toBeDefined(); expect(typeof a.hour).toBe('number'); expect(a.hour >= 0 && a.hour <=23).toBe(true); expect(a.minute).toBeDefined(); expect(typeof a.minute).toBe('number'); expect(a.minute >= 0 && a.minute <=59).toBe(true); expect(a.second).toBeDefined(); expect(typeof a.second).toBe('number'); expect(a.second >= 0 && a.second <=59).toBe(true); expect(a.millisecond).toBeDefined(); expect(typeof a.millisecond).toBe('number'); }), fail = jasmine.createSpy(); var win2 = function(a) { navigator.globalization.stringToDate(a.value, win, fail, {formatLength: 'short', selector: 'date'}); }; runs(function () { navigator.globalization.dateToString(new Date(), win2, fail, {formatLength: 'short', selector: 'date'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.14 stringToDate using formatLength=full and selector=date options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.year).toBeDefined(); expect(typeof a.year).toBe('number'); expect(a.year >= 0 && a.year <=9999).toBe(true); expect(a.month).toBeDefined(); expect(typeof a.month).toBe('number'); expect(a.month >= 0 && a.month <=11).toBe(true); expect(a.day).toBeDefined(); expect(typeof a.day).toBe('number'); expect(a.day >= 1 && a.day <=31).toBe(true); expect(a.hour).toBeDefined(); expect(typeof a.hour).toBe('number'); expect(a.hour >= 0 && a.hour <=23).toBe(true); expect(a.minute).toBeDefined(); expect(typeof a.minute).toBe('number'); expect(a.minute >= 0 && a.minute <=59).toBe(true); expect(a.second).toBeDefined(); expect(typeof a.second).toBe('number'); expect(a.second >= 0 && a.second <=59).toBe(true); expect(a.millisecond).toBeDefined(); expect(typeof a.millisecond).toBe('number'); }), fail = jasmine.createSpy(); var win2 = function(a) { navigator.globalization.stringToDate(a.value, win, fail, {formatLength: 'full', selector: 'date'}); }; runs(function () { navigator.globalization.dateToString(new Date(), win2, fail, {formatLength: 'full', selector: 'date'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.15 stringToDate using invalid date, error callback should be called with a GlobalizationError object", function() { var win = jasmine.createSpy(), fail = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.code).toBeDefined(); expect(typeof a.code).toBe('number'); expect(a.code === GlobalizationError.PARSING_ERROR).toBe(true); expect(a.message).toBeDefined(); expect(typeof a.message).toBe('string'); expect(a.message !== "").toBe(true); }); runs(function () { navigator.globalization.stringToDate('notADate', win, fail, {selector:'foobar'}); }); waitsFor(function () { return fail.wasCalled; }, "fail never called", Tests.TEST_TIMEOUT); runs(function () { expect(win).not.toHaveBeenCalled(); }); }); }); describe("getDatePattern", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getDatePattern).toBeDefined(); expect(typeof navigator.globalization.getDatePattern == 'function').toBe(true); }); it("globalization.spec.17 getDatePattern using default options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.pattern).toBeDefined(); expect(typeof a.pattern).toBe('string'); expect(a.pattern.length > 0).toBe(true); expect(a.timezone).toBeDefined(); expect(typeof a.timezone).toBe('string'); expect(a.timezone.length > 0).toBe(true); expect(a.utc_offset).toBeDefined(); expect(typeof a.utc_offset).toBe('number'); expect(a.dst_offset).toBeDefined(); expect(typeof a.dst_offset).toBe('number'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDatePattern(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.18 getDatePattern using formatLength=medium and selector=date options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.pattern).toBeDefined(); expect(typeof a.pattern).toBe('string'); expect(a.pattern.length > 0).toBe(true); expect(a.timezone).toBeDefined(); expect(typeof a.timezone).toBe('string'); expect(a.timezone.length > 0).toBe(true); expect(a.utc_offset).toBeDefined(); expect(typeof a.utc_offset).toBe('number'); expect(a.dst_offset).toBeDefined(); expect(typeof a.dst_offset).toBe('number'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDatePattern(win, fail, {formatLength: 'medium', selector: 'date'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("getDateNames", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getDateNames).toBeDefined(); expect(typeof navigator.globalization.getDateNames == 'function').toBe(true); }); it("globalization.spec.20 getDateNames using default options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(a.value instanceof Array).toBe(true); expect(a.value.length > 0).toBe(true); expect(typeof a.value[0]).toBe('string'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDateNames(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.21 getDateNames using type=narrow and item=days options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(a.value instanceof Array).toBe(true); expect(a.value.length > 0).toBe(true); expect(typeof a.value[0]).toBe('string'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDateNames(win, fail, {type: 'narrow', item: 'days'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.22 getDateNames using type=narrow and item=months options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(a.value instanceof Array).toBe(true); expect(a.value.length > 0).toBe(true); expect(typeof a.value[0]).toBe('string'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDateNames(win, fail, {type: 'narrow', item: 'months'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.23 getDateNames using type=wide and item=days options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(a.value instanceof Array).toBe(true); expect(a.value.length > 0).toBe(true); expect(typeof a.value[0]).toBe('string'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDateNames(win, fail, {type: 'wide', item: 'days'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.24 getDateNames using type=wide and item=months options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(a.value instanceof Array).toBe(true); expect(a.value.length > 0).toBe(true); expect(typeof a.value[0]).toBe('string'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getDateNames(win, fail, {type: 'wide', item: 'months'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("isDayLightSavingsTime", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.isDayLightSavingsTime).toBeDefined(); expect(typeof navigator.globalization.isDayLightSavingsTime == 'function').toBe(true); }); it("globalization.spec.26 isDayLightSavingsTime using default options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.dst).toBeDefined(); expect(typeof a.dst).toBe('boolean'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.isDayLightSavingsTime(new Date(), win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("getFirstDayOfWeek", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getFirstDayOfWeek).toBeDefined(); expect(typeof navigator.globalization.getFirstDayOfWeek == 'function').toBe(true); }); it("globalization.spec.28 getFirstDayOfWeek success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('number'); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getFirstDayOfWeek(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("numberToString", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.numberToString).toBeDefined(); expect(typeof navigator.globalization.numberToString == 'function').toBe(true); }); it("globalization.spec.30 numberToString using default options, should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.numberToString(3.25, win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.31 numberToString using type=percent options, should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.numberToString(.25, win, fail, {type: 'percent'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.32 numberToString using type=currency options, should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('string'); expect(a.value.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.numberToString(5.20, win, fail, {type: 'currency'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("stringToNumber", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.stringToNumber).toBeDefined(); expect(typeof navigator.globalization.stringToNumber == 'function').toBe(true); }); it("globalization.spec.34 stringToNumber using default options, should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('number'); expect(a.value > 0).toBe(true); }), fail = jasmine.createSpy(); var win2 = function(a) { navigator.globalization.stringToNumber(a.value, win, fail); }; runs(function () { navigator.globalization.numberToString(3.25, win2, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.35 stringToNumber using type=percent options, should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.value).toBeDefined(); expect(typeof a.value).toBe('number'); expect(a.value > 0).toBe(true); }), fail = jasmine.createSpy(); var win2 = function(a) { navigator.globalization.stringToNumber(a.value, win, fail, {type: 'percent'}); }; runs(function () { navigator.globalization.numberToString(.25, win2, fail, {type: 'percent'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("getNumberPattern", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getNumberPattern).toBeDefined(); expect(typeof navigator.globalization.getNumberPattern == 'function').toBe(true); }); it("globalization.spec.37 getNumberPattern using default options, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.pattern).toBeDefined(); expect(typeof a.pattern).toBe('string'); expect(a.pattern.length > 0).toBe(true); expect(typeof a.symbol).toBe('string'); expect(typeof a.fraction).toBe('number'); expect(typeof a.rounding).toBe('number'); expect(a.positive).toBeDefined(); expect(typeof a.positive).toBe('string'); expect(a.positive.length >= 0).toBe(true); expect(a.negative).toBeDefined(); expect(typeof a.negative).toBe('string'); expect(a.negative.length >= 0).toBe(true); expect(a.decimal).toBeDefined(); expect(typeof a.decimal).toBe('string'); expect(a.decimal.length > 0).toBe(true); expect(a.grouping).toBeDefined(); expect(typeof a.grouping).toBe('string'); expect(a.grouping.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getNumberPattern(win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.38 getNumberPattern using type=percent, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.pattern).toBeDefined(); expect(typeof a.pattern).toBe('string'); expect(a.pattern.length > 0).toBe(true); expect(typeof a.symbol).toBe('string'); expect(typeof a.fraction).toBe('number'); expect(typeof a.rounding).toBe('number'); expect(a.positive).toBeDefined(); expect(typeof a.positive).toBe('string'); expect(a.positive.length >= 0).toBe(true); expect(a.negative).toBeDefined(); expect(typeof a.negative).toBe('string'); expect(a.negative.length >= 0).toBe(true); expect(a.decimal).toBeDefined(); expect(typeof a.decimal).toBe('string'); expect(a.decimal.length > 0).toBe(true); expect(a.grouping).toBeDefined(); expect(typeof a.grouping).toBe('string'); expect(a.grouping.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getNumberPattern(win, fail, {type: 'percent'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); it("globalization.spec.39 getNumberPattern using type=currency, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.pattern).toBeDefined(); expect(typeof a.pattern).toBe('string'); expect(a.pattern.length > 0).toBe(true); expect(typeof a.symbol).toBe('string'); expect(typeof a.fraction).toBe('number'); expect(typeof a.rounding).toBe('number'); expect(a.positive).toBeDefined(); expect(typeof a.positive).toBe('string'); expect(a.positive.length >= 0).toBe(true); expect(a.negative).toBeDefined(); expect(typeof a.negative).toBe('string'); expect(a.negative.length >= 0).toBe(true); expect(a.decimal).toBeDefined(); expect(typeof a.decimal).toBe('string'); expect(a.decimal.length > 0).toBe(true); expect(a.grouping).toBeDefined(); expect(typeof a.grouping).toBe('string'); expect(a.grouping.length > 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getNumberPattern(win, fail, {type: 'currency'}); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); describe("getCurrencyPattern", function() { it("globalization.spec.1 should exist", function() { expect(typeof navigator.globalization.getCurrencyPattern).toBeDefined(); expect(typeof navigator.globalization.getCurrencyPattern == 'function').toBe(true); }); it("globalization.spec.41 getCurrencyPattern using EUR for currency, success callback should be called with a Properties object", function() { var win = jasmine.createSpy().andCallFake(function(a) { expect(a).toBeDefined(); expect(typeof a).toBe('object'); expect(a.pattern).toBeDefined(); expect(typeof a.pattern).toBe('string'); expect(a.pattern.length > 0).toBe(true); expect(a.code).toBeDefined(); expect(typeof a.code).toBe('string'); expect(a.code.length > 0).toBe(true); expect(typeof a.fraction).toBe('number'); expect(typeof a.rounding).toBe('number'); expect(a.decimal).toBeDefined(); expect(typeof a.decimal).toBe('string'); expect(a.decimal.length >= 0).toBe(true); expect(a.grouping).toBeDefined(); expect(typeof a.grouping).toBe('string'); expect(a.grouping.length >= 0).toBe(true); }), fail = jasmine.createSpy(); runs(function () { navigator.globalization.getCurrencyPattern("EUR", win, fail); }); waitsFor(function () { return win.wasCalled; }, "win never called", Tests.TEST_TIMEOUT); runs(function () { expect(fail).not.toHaveBeenCalled(); }); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/filetransfer.tests.js0000644000015000001560000007612112272510571030270 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('FileTransfer', function() { // https://github.com/apache/cordova-labs/tree/cordova-filetransfer var server = "http://cordova-filetransfer.jitsu.com"; var server_with_credentials = "http://cordova_user:cordova_password@cordova-filetransfer.jitsu.com"; // deletes and re-creates the specified content var writeFile = function(fileName, fileContent, success, error) { deleteFile(fileName, function() { root.getFile(fileName, {create: true}, function(fileEntry) { fileEntry.createWriter(function (writer) { writer.onwrite = function(evt) { success(fileEntry); }; writer.onabort = function(evt) { error(evt); }; writer.error = function(evt) { error(evt); }; writer.write(fileContent + "\n"); }, error); }, error); }); }; var readFileEntry = function(entry, success, error) { entry.file(function(file) { var reader = new FileReader(); reader.onerror = error; reader.onload = function(e) { success(reader.result); }; reader.readAsText(file); }, error); }; var getMalformedUrl = function() { if (device.platform.match(/Android/i)) { // bad protocol causes a MalformedUrlException on Android return "httpssss://example.com"; } else { // iOS doesn't care about protocol, space in hostname causes error return "httpssss://exa mple.com"; } }; // deletes file, if it exists, then invokes callback var deleteFile = function(fileName, callback) { callback = callback || function() {}; var spy = jasmine.createSpy().andCallFake(callback); root.getFile(fileName, null, // remove file system entry function(entry) { entry.remove(spy, spy); }, // doesn't exist spy); waitsFor(function() { return spy.wasCalled; }, Tests.TEST_TIMEOUT); }; it("filetransfer.spec.1 should exist and be constructable", function() { var ft = new FileTransfer(); expect(ft).toBeDefined(); }); it("filetransfer.spec.2 should contain proper functions", function() { var ft = new FileTransfer(); expect(typeof ft.upload).toBe('function'); expect(typeof ft.download).toBe('function'); }); describe('FileTransferError', function() { it("filetransfer.spec.3 FileTransferError constants should be defined", function() { expect(FileTransferError.FILE_NOT_FOUND_ERR).toBe(1); expect(FileTransferError.INVALID_URL_ERR).toBe(2); expect(FileTransferError.CONNECTION_ERR).toBe(3); }); }); describe('download method', function() { // NOTE: if download tests are failing, check the white list // // // // it("filetransfer.spec.4 should be able to download a file using http", function() { var fail = createDoNotCallSpy('downloadFail'); var remoteFile = server + "/robots.txt" var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var lastProgressEvent = null; var downloadWin = jasmine.createSpy().andCallFake(function(entry) { expect(entry.name).toBe(localFileName); expect(lastProgressEvent.loaded).toBeGreaterThan(1); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.onprogress = function(e) { lastProgressEvent = e; }; ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, fail); }); waitsForAny(downloadWin, fail); }); it("filetransfer.spec.5 should be able to download a file using http basic auth", function() { var fail = createDoNotCallSpy('downloadFail'); var remoteFile = server_with_credentials + "/download_basic_auth" var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var lastProgressEvent = null; var downloadWin = jasmine.createSpy().andCallFake(function(entry) { expect(entry.name).toBe(localFileName); expect(lastProgressEvent.loaded).toBeGreaterThan(1); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.onprogress = function(e) { lastProgressEvent = e; }; ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, fail); }); waitsForAny(downloadWin, fail); }); it("filetransfer.spec.6 should get http status on basic auth failure", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = server + "/download_basic_auth"; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var downloadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.http_status).toBe(401); expect(error.http_status).not.toBe(404, "Ensure " + remoteFile + " is in the white list"); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.7 should be able to download a file using file:// (when hosted from file://)", function() { var fail = createDoNotCallSpy('downloadFail'); var remoteFile = window.location.href.replace(/\?.*/, '').replace(/ /g, '%20'); var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var lastProgressEvent = null; if (!/^file/.exec(remoteFile)) { expect(remoteFile).toMatch(/^file:/); return; } var downloadWin = jasmine.createSpy().andCallFake(function(entry) { expect(entry.name).toBe(localFileName); expect(lastProgressEvent.loaded).toBeGreaterThan(1); }); this.after(function() { deleteFile(localFileName); }); var ft = new FileTransfer(); ft.onprogress = function(e) { lastProgressEvent = e; }; ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, fail); waitsForAny(downloadWin, fail); }); it("filetransfer.spec.8 should be able to download a file using https", function() { var remoteFile = "https://www.apache.org/licenses/"; var localFileName = 'httpstest.html'; var downloadFail = createDoNotCallSpy('downloadFail', 'Ensure ' + remoteFile + ' is in the white-list'); var fileFail = createDoNotCallSpy('fileFail'); var downloadWin = function(entry) { readFileEntry(entry, fileWin, fileFail); }; var fileWin = jasmine.createSpy().andCallFake(function(content) { expect(content).toMatch(/The Apache Software Foundation/); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(fileWin, downloadFail, fileFail); }); it("filetransfer.spec.9 should not leave partial file due to abort", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = 'http://cordova.apache.org/downloads/logos_2.zip'; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var startTime = +new Date(); var downloadFail = jasmine.createSpy().andCallFake(function(e) { expect(e.code).toBe(FileTransferError.ABORT_ERR); var didNotExistSpy = jasmine.createSpy(); var existedSpy = createDoNotCallSpy('file existed after abort'); root.getFile(localFileName, null, existedSpy, didNotExistSpy); waitsForAny(didNotExistSpy, existedSpy); }); runs(function() { var ft = new FileTransfer(); ft.onprogress = function(e) { if (e.loaded > 0) { ft.abort(); } }; ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.10 should be stopped by abort() right away", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = 'http://cordova.apache.org/downloads/BlueZedEx.mp3'; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var startTime = +new Date(); var downloadFail = jasmine.createSpy().andCallFake(function(e) { expect(e.code).toBe(FileTransferError.ABORT_ERR); expect(new Date() - startTime).toBeLessThan(300); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.abort(); // should be a no-op. ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); ft.abort(); ft.abort(); // should be a no-op. }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.11 should call the error callback on abort()", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var downloadFail = jasmine.createSpy().andCallFake(function(e) { console.log("Abort called") }); var remoteFile = 'http://cordova.apache.org/downloads/BlueZedEx.mp3'; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var startTime = +new Date(); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.abort(); // should be a no-op. ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); ft.abort(); ft.abort(); // should be a no-op. }); waitsForAny(downloadFail); }); it("filetransfer.spec.12 should get http status on failure", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = server + "/404"; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var downloadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.http_status).toBe(404); expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.13 should get response body on failure", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = server + "/404"; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var downloadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.body).toBeDefined(); expect(error.body).toMatch('You requested a 404'); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.14 should handle malformed urls", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = getMalformedUrl(); var localFileName = "download_malformed_url.txt"; var downloadFail = jasmine.createSpy().andCallFake(function(error) { // Note: Android needs the bad protocol to be added to the access list // won't match because ^https?:// is prepended to the regex // The bad protocol must begin with http to avoid automatic prefix expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); expect(error.code).toBe(FileTransferError.INVALID_URL_ERR); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.15 should handle unknown host", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = "http://foobar.apache.org/index.html"; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var downloadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.code).toBe(FileTransferError.CONNECTION_ERR); }); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.16 should handle bad file path", function() { var downloadWin = createDoNotCallSpy('downloadWin'); var remoteFile = server; var badFilePath = "c:\\54321"; var downloadFail = jasmine.createSpy(); runs(function() { var ft = new FileTransfer(); ft.download(remoteFile, badFilePath, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); it("filetransfer.spec.17 progress should work with gzip encoding", function() { var downloadFail = createDoNotCallSpy('downloadFail'); var remoteFile = "http://www.apache.org/"; var localFileName = "index.html"; var lastProgressEvent = null; var downloadWin = jasmine.createSpy().andCallFake(function(entry) { expect(entry.name).toBe(localFileName); expect(lastProgressEvent.loaded).toBeGreaterThan(1, 'loaded'); expect(lastProgressEvent.total).not.toBeLessThan(lastProgressEvent.loaded); expect(lastProgressEvent.lengthComputable).toBe(true, 'lengthComputable'); }); this.after(function() { deleteFile(localFileName); }); runs(function() { var ft = new FileTransfer(); ft.onprogress = function(e) { lastProgressEvent = e; }; ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail); }); waitsForAny(downloadWin, downloadFail); }); }); describe('upload method', function() { it("filetransfer.spec.18 should be able to upload a file", function() { var remoteFile = server + "/upload"; var localFileName = "upload.txt"; var fileContents = 'This file should upload'; var fileFail = createDoNotCallSpy('fileFail'); var uploadFail = createDoNotCallSpy('uploadFail', "Ensure " + remoteFile + " is in the white list"); var lastProgressEvent = null; var uploadWin = jasmine.createSpy().andCallFake(function(uploadResult) { expect(uploadResult.bytesSent).toBeGreaterThan(0); expect(uploadResult.responseCode).toBe(200); expect(uploadResult.response).toMatch(/fields:\s*{\s*value1.*/); }); var fileWin = function(fileEntry) { ft = new FileTransfer(); var options = new FileUploadOptions(); options.fileKey = "file"; options.fileName = localFileName; options.mimeType = "text/plain"; var params = new Object(); params.value1 = "test"; params.value2 = "param"; options.params = params; ft.onprogress = function(e) { expect(e.lengthComputable).toBe(true); expect(e.total).toBeGreaterThan(0); expect(e.loaded).toBeGreaterThan(0); lastProgressEvent = e; }; // removing options cause Android to timeout ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, fileContents, fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); runs(function() { expect(lastProgressEvent).not.toBeNull('expected progress events'); }); }); it("filetransfer.spec.19 should be able to upload a file with http basic auth", function() { var remoteFile = server_with_credentials + "/upload_basic_auth"; var localFileName = "upload.txt"; var fileContents = 'This file should upload'; var fileFail = createDoNotCallSpy('fileFail'); var uploadFail = createDoNotCallSpy('uploadFail', "Ensure " + remoteFile + " is in the white list"); var lastProgressEvent = null; var uploadWin = jasmine.createSpy().andCallFake(function(uploadResult) { expect(uploadResult.bytesSent).toBeGreaterThan(0); expect(uploadResult.responseCode).toBe(200); expect(uploadResult.response).toMatch(/fields:\s*{\s*value1.*/); }); var fileWin = function(fileEntry) { ft = new FileTransfer(); var options = new FileUploadOptions(); options.fileKey = "file"; options.fileName = localFileName; options.mimeType = "text/plain"; var params = new Object(); params.value1 = "test"; params.value2 = "param"; options.params = params; ft.onprogress = function(e) { expect(e.lengthComputable).toBe(true); expect(e.total).toBeGreaterThan(0); expect(e.loaded).toBeGreaterThan(0); lastProgressEvent = e; }; // removing options cause Android to timeout ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, fileContents, fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); runs(function() { expect(lastProgressEvent).not.toBeNull('expected progress events'); }); }); it("filetransfer.spec.6 should get http status on basic auth failure", function() { var fileFail = createDoNotCallSpy('fileFail'); var uploadWin = createDoNotCallSpy('uploadWin'); var remoteFile = server + "/upload_basic_auth"; var localFileName = "upload_expect_fail.txt"; var uploadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.http_status).toBe(401); expect(error.http_status).not.toBe(404, "Ensure " + remoteFile + " is in the white list"); }); var fileWin = function(fileEntry) { var ft = new FileTransfer(); var options = new FileUploadOptions(); options.fileKey="file"; options.fileName=fileEntry.name; options.mimeType="text/plain"; ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, "this file should fail to upload", fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); }); it("filetransfer.spec.21 should be stopped by abort() right away.", function() { var remoteFile = server + "/upload"; var localFileName = "upload.txt"; var fileFail = createDoNotCallSpy('fileFail'); var uploadWin = createDoNotCallSpy('uploadWin', 'Should have been aborted'); var startTime; var uploadFail = jasmine.createSpy().andCallFake(function(e) { expect(e.code).toBe(FileTransferError.ABORT_ERR); expect(new Date() - startTime).toBeLessThan(300); }); var fileWin = function(fileEntry) { ft = new FileTransfer(); var options = new FileUploadOptions(); options.fileKey = "file"; options.fileName = localFileName; options.mimeType = "text/plain"; startTime = +new Date(); // removing options cause Android to timeout ft.abort(); // should be a no-op. ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options); ft.abort(); ft.abort(); // should be a no-op. }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, new Array(10000).join('aborttest!'), fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); }); it("filetransfer.spec.12 should get http status on failure", function() { var fileFail = createDoNotCallSpy('fileFail'); var uploadWin = createDoNotCallSpy('uploadWin'); var remoteFile = server + "/403"; var localFileName = "upload_expect_fail.txt"; var uploadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.http_status).toBe(403); expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); }); var fileWin = function(fileEntry) { var ft = new FileTransfer(); var options = new FileUploadOptions(); options.fileKey="file"; options.fileName=fileEntry.name; options.mimeType="text/plain"; ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, "this file should fail to upload", fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); }); it("filetransfer.spec.14 should handle malformed urls", function() { var fileFail = createDoNotCallSpy('fileFail'); var uploadWin = createDoNotCallSpy('uploadWin'); var remoteFile = getMalformedUrl(); var localFileName = "malformed_url.txt"; var uploadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.code).toBe(FileTransferError.INVALID_URL_ERR); expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); }); var fileWin = function(fileEntry) { var ft = new FileTransfer(); ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, {}); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, "Some content", fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); }); it("filetransfer.spec.15 should handle unknown host", function() { var fileFail = createDoNotCallSpy('fileFail'); var uploadWin = createDoNotCallSpy('uploadWin'); var remoteFile = "http://foobar.apache.org/robots.txt"; var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); var uploadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.code).toBe(FileTransferError.CONNECTION_ERR); expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); }); var fileWin = function(fileEntry) { var ft = new FileTransfer(); ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, {}); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, "# allow all", fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail, fileFail); }); it("filetransfer.spec.25 should handle missing file", function() { var uploadWin = createDoNotCallSpy('uploadWin'); var remoteFile = server + "/upload"; var localFileName = "does_not_exist.txt"; var uploadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.code).toBe(FileTransferError.FILE_NOT_FOUND_ERR); expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); }); runs(function() { var ft = new FileTransfer(); ft.upload(root.fullPath + "/" + localFileName, remoteFile, uploadWin, uploadFail); }); waitsForAny(uploadWin, uploadFail); }); it("filetransfer.spec.16 should handle bad file path", function() { var uploadWin = createDoNotCallSpy('uploadWin'); var remoteFile = server + "/upload"; var uploadFail = jasmine.createSpy().andCallFake(function(error) { expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list"); }); runs(function() { var ft = new FileTransfer(); ft.upload("/usr/local/bad/file/path.txt", remoteFile, uploadWin, uploadFail); }); waitsForAny(uploadWin, uploadFail); }); it("filetransfer.spec.27 should be able to set custom headers", function() { var remoteFile = "http://whatheaders.com"; var localFileName = "upload.txt"; var fileFail = function() {}; var uploadFail = createDoNotCallSpy('uploadFail', "Ensure " + remoteFile + " is in the white list and that Content-Length header is being set."); var uploadWin = jasmine.createSpy().andCallFake(function(uploadResult) { expect(uploadResult.bytesSent).toBeGreaterThan(0); expect(uploadResult.responseCode).toBe(200); expect(uploadResult.response).toBeDefined(); var responseHtml = decodeURIComponent(uploadResult.response); expect(responseHtml).toMatch(/CustomHeader1[\s\S]*CustomValue1/i); expect(responseHtml).toMatch(/CustomHeader2[\s\S]*CustomValue2[\s\S]*CustomValue3/i, "Should allow array values"); }); var fileWin = function(fileEntry) { ft = new FileTransfer(); var options = new FileUploadOptions(); options.fileKey = "file"; options.fileName = localFileName; options.mimeType = "text/plain"; var params = new Object(); params.value1 = "test"; params.value2 = "param"; options.params = params; options.headers = { "CustomHeader1": "CustomValue1", "CustomHeader2": ["CustomValue2", "CustomValue3"], }; // removing options cause Android to timeout ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options); }; this.after(function() { deleteFile(localFileName); }); runs(function() { writeFile(localFileName, "this file should upload", fileWin, fileFail); }); waitsForAny(uploadWin, uploadFail); }); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/bridge.tests.js0000644000015000001560000001003212272510571027025 0ustar pbuserpbgroup00000000000000/* * * 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. * */ /* This test requires some extra code to run, because we want benchmark results */ /* It's never going to be OVER 9000 http://youtu.be/SiMHTK15Pik */ var FENCEPOST = 9000; var exec = cordova.require('cordova/exec'), echo = cordova.require('cordova/plugin/echo'), startTime, endTime, callCount, durationMs = 1000, asyncEcho, useSetTimeout, payloadSize, payload; var vanillaWin = function(result) { callCount++; if (result != payload) { console.log('Wrong echo data!'); } var elapsedMs = new Date - startTime; if (elapsedMs < durationMs) { if (useSetTimeout) { setTimeout(echoMessage, 0); } else { echoMessage(); } } else { endTime = +new Date; } } var reset = function() { endTime = null; callCount = 0; useSetTimeout = false; payloadSize = 5; callsPerSecond = 0; } var echoMessage = function() { echo(vanillaWin, fail, payload, asyncEcho); } var fail = function() { expect(false).toBe(true); }; function createTestCase(jsToNativeModeName, nativeToJsModeName, testAsyncEcho) { it(jsToNativeModeName + '+' + nativeToJsModeName, function() { expect(exec.jsToNativeModes[jsToNativeModeName]).toBeDefined(); expect(exec.nativeToJsModes[nativeToJsModeName]).toBeDefined(); reset(); payload = new Array(payloadSize * 10 + 1).join('012\n\n 6789'); asyncEcho = testAsyncEcho; exec.setJsToNativeBridgeMode(exec.jsToNativeModes[jsToNativeModeName]); exec.setNativeToJsBridgeMode(exec.nativeToJsModes[nativeToJsModeName]); waits(300); runs(function() { startTime = +new Date, echoMessage(); }); waitsFor(function() { return endTime; }, "never completed", durationMs * 2); runs(function() { var elapsedMs = endTime - startTime, callsPerSecond = callCount * 1000 / elapsedMs; expect(callsPerSecond).toBeGreaterThan(FENCEPOST); }); }); }; // Wait so that the first benchmark doesn't have contention. describe('Wait for page to load.', function() { it('waiting...', function() { waits(1000); }); }); // Before running on Android, set the following constants in NativeToJsMessagingBridge: // - ENABLE_LOCATION_CHANGE_EXEC_MODE = true // - DISABLE_EXEC_CHAINING = true describe('Android bridge with', function() { var testAsyncEcho = false; createTestCase('PROMPT', 'POLLING', testAsyncEcho); createTestCase('JS_OBJECT', 'POLLING', testAsyncEcho); createTestCase('LOCATION_CHANGE', 'ONLINE_EVENT', testAsyncEcho); testAsyncEcho = true; createTestCase('PROMPT', 'POLLING', testAsyncEcho); createTestCase('PROMPT', 'HANGING_GET', testAsyncEcho); createTestCase('PROMPT', 'LOAD_URL', testAsyncEcho); createTestCase('PROMPT', 'ONLINE_EVENT', testAsyncEcho); createTestCase('PROMPT', 'PRIVATE_API', testAsyncEcho); createTestCase('JS_OBJECT', 'POLLING', testAsyncEcho); createTestCase('JS_OBJECT', 'HANGING_GET', testAsyncEcho); createTestCase('JS_OBJECT', 'LOAD_URL', testAsyncEcho); createTestCase('JS_OBJECT', 'ONLINE_EVENT', testAsyncEcho); createTestCase('JS_OBJECT', 'PRIVATE_API', testAsyncEcho); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/tests/camera.tests.js0000644000015000001560000000573312272510571027035 0ustar pbuserpbgroup00000000000000/* * * 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. * */ describe('Camera (navigator.camera)', function () { it("should exist", function() { expect(navigator.camera).toBeDefined(); }); it("should contain a getPicture function", function() { expect(navigator.camera.getPicture).toBeDefined(); expect(typeof navigator.camera.getPicture == 'function').toBe(true); }); }); describe('Camera Constants (window.Camera + navigator.camera)', function () { it("camera.spec.1 window.Camera should exist", function() { expect(window.Camera).toBeDefined(); }); it("camera.spec.2 should contain three DestinationType constants", function() { expect(Camera.DestinationType.DATA_URL).toBe(0); expect(Camera.DestinationType.FILE_URI).toBe(1); expect(Camera.DestinationType.NATIVE_URI).toBe(2); expect(navigator.camera.DestinationType.DATA_URL).toBe(0); expect(navigator.camera.DestinationType.FILE_URI).toBe(1); expect(navigator.camera.DestinationType.NATIVE_URI).toBe(2); }); it("camera.spec.3 should contain two EncodingType constants", function() { expect(Camera.EncodingType.JPEG).toBe(0); expect(Camera.EncodingType.PNG).toBe(1); expect(navigator.camera.EncodingType.JPEG).toBe(0); expect(navigator.camera.EncodingType.PNG).toBe(1); }); it("camera.spec.4 should contain three MediaType constants", function() { expect(Camera.MediaType.PICTURE).toBe(0); expect(Camera.MediaType.VIDEO).toBe(1); expect(Camera.MediaType.ALLMEDIA).toBe(2); expect(navigator.camera.MediaType.PICTURE).toBe(0); expect(navigator.camera.MediaType.VIDEO).toBe(1); expect(navigator.camera.MediaType.ALLMEDIA).toBe(2); }); it("camera.spec.5 should contain three PictureSourceType constants", function() { expect(Camera.PictureSourceType.PHOTOLIBRARY).toBe(0); expect(Camera.PictureSourceType.CAMERA).toBe(1); expect(Camera.PictureSourceType.SAVEDPHOTOALBUM).toBe(2); expect(navigator.camera.PictureSourceType.PHOTOLIBRARY).toBe(0); expect(navigator.camera.PictureSourceType.CAMERA).toBe(1); expect(navigator.camera.PictureSourceType.SAVEDPHOTOALBUM).toBe(2); }); }); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/jasmine.js0000644000015000001560000020607312272510571024730 0ustar pbuserpbgroup00000000000000var isCommonJS = typeof window == "undefined"; /** * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. * * @namespace */ var jasmine = {}; if (isCommonJS) exports.jasmine = jasmine; /** * @private */ jasmine.unimplementedMethod_ = function() { throw new Error("unimplemented method"); }; /** * Use jasmine.undefined instead of undefined, since undefined is just * a plain old variable and may be redefined by somebody else. * * @private */ jasmine.undefined = jasmine.___undefined___; /** * Show diagnostic messages in the console if set to true * */ jasmine.VERBOSE = false; /** * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. * */ jasmine.DEFAULT_UPDATE_INTERVAL = 250; /** * Default timeout interval in milliseconds for waitsFor() blocks. */ jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; jasmine.getGlobal = function() { function getGlobal() { return this; } return getGlobal(); }; /** * Allows for bound functions to be compared. Internal use only. * * @ignore * @private * @param base {Object} bound 'this' for the function * @param name {Function} function to find */ jasmine.bindOriginal_ = function(base, name) { var original = base[name]; if (original.apply) { return function() { return original.apply(base, arguments); }; } else { // IE support return jasmine.getGlobal()[name]; } }; jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); jasmine.MessageResult = function(values) { this.type = 'log'; this.values = values; this.trace = new Error(); // todo: test better }; jasmine.MessageResult.prototype.toString = function() { var text = ""; for (var i = 0; i < this.values.length; i++) { if (i > 0) text += " "; if (jasmine.isString_(this.values[i])) { text += this.values[i]; } else { text += jasmine.pp(this.values[i]); } } return text; }; jasmine.ExpectationResult = function(params) { this.type = 'expect'; this.matcherName = params.matcherName; this.passed_ = params.passed; this.expected = params.expected; this.actual = params.actual; this.message = this.passed_ ? 'Passed.' : params.message; var trace = (params.trace || new Error(this.message)); this.trace = this.passed_ ? '' : trace; }; jasmine.ExpectationResult.prototype.toString = function () { return this.message; }; jasmine.ExpectationResult.prototype.passed = function () { return this.passed_; }; /** * Getter for the Jasmine environment. Ensures one gets created */ jasmine.getEnv = function() { var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); return env; }; /** * @ignore * @private * @param value * @returns {Boolean} */ jasmine.isArray_ = function(value) { return jasmine.isA_("Array", value); }; /** * @ignore * @private * @param value * @returns {Boolean} */ jasmine.isString_ = function(value) { return jasmine.isA_("String", value); }; /** * @ignore * @private * @param value * @returns {Boolean} */ jasmine.isNumber_ = function(value) { return jasmine.isA_("Number", value); }; /** * @ignore * @private * @param {String} typeName * @param value * @returns {Boolean} */ jasmine.isA_ = function(typeName, value) { return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; }; /** * Pretty printer for expecations. Takes any object and turns it into a human-readable string. * * @param value {Object} an object to be outputted * @returns {String} */ jasmine.pp = function(value) { var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); stringPrettyPrinter.format(value); return stringPrettyPrinter.string; }; /** * Returns true if the object is a DOM Node. * * @param {Object} obj object to check * @returns {Boolean} */ jasmine.isDomNode = function(obj) { return obj.nodeType > 0; }; /** * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. * * @example * // don't care about which function is passed in, as long as it's a function * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); * * @param {Class} clazz * @returns matchable object of the type clazz */ jasmine.any = function(clazz) { return new jasmine.Matchers.Any(clazz); }; /** * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the * attributes on the object. * * @example * // don't care about any other attributes than foo. * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); * * @param sample {Object} sample * @returns matchable object for the sample */ jasmine.objectContaining = function (sample) { return new jasmine.Matchers.ObjectContaining(sample); }; /** * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. * * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine * expectation syntax. Spies can be checked if they were called or not and what the calling params were. * * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). * * Spies are torn down at the end of every spec. * * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. * * @example * // a stub * var myStub = jasmine.createSpy('myStub'); // can be used anywhere * * // spy example * var foo = { * not: function(bool) { return !bool; } * } * * // actual foo.not will not be called, execution stops * spyOn(foo, 'not'); // foo.not spied upon, execution will continue to implementation * spyOn(foo, 'not').andCallThrough(); * * // fake example * var foo = { * not: function(bool) { return !bool; } * } * * // foo.not(val) will return val * spyOn(foo, 'not').andCallFake(function(value) {return value;}); * * // mock example * foo.not(7 == 7); * expect(foo.not).toHaveBeenCalled(); * expect(foo.not).toHaveBeenCalledWith(true); * * @constructor * @see spyOn, jasmine.createSpy, jasmine.createSpyObj * @param {String} name */ jasmine.Spy = function(name) { /** * The name of the spy, if provided. */ this.identity = name || 'unknown'; /** * Is this Object a spy? */ this.isSpy = true; /** * The actual function this spy stubs. */ this.plan = function() { }; /** * Tracking of the most recent call to the spy. * @example * var mySpy = jasmine.createSpy('foo'); * mySpy(1, 2); * mySpy.mostRecentCall.args = [1, 2]; */ this.mostRecentCall = {}; /** * Holds arguments for each call to the spy, indexed by call count * @example * var mySpy = jasmine.createSpy('foo'); * mySpy(1, 2); * mySpy(7, 8); * mySpy.mostRecentCall.args = [7, 8]; * mySpy.argsForCall[0] = [1, 2]; * mySpy.argsForCall[1] = [7, 8]; */ this.argsForCall = []; this.calls = []; }; /** * Tells a spy to call through to the actual implemenatation. * * @example * var foo = { * bar: function() { // do some stuff } * } * * // defining a spy on an existing property: foo.bar * spyOn(foo, 'bar').andCallThrough(); */ jasmine.Spy.prototype.andCallThrough = function() { this.plan = this.originalValue; return this; }; /** * For setting the return value of a spy. * * @example * // defining a spy from scratch: foo() returns 'baz' * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); * * // defining a spy on an existing property: foo.bar() returns 'baz' * spyOn(foo, 'bar').andReturn('baz'); * * @param {Object} value */ jasmine.Spy.prototype.andReturn = function(value) { this.plan = function() { return value; }; return this; }; /** * For throwing an exception when a spy is called. * * @example * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); * * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' * spyOn(foo, 'bar').andThrow('baz'); * * @param {String} exceptionMsg */ jasmine.Spy.prototype.andThrow = function(exceptionMsg) { this.plan = function() { throw exceptionMsg; }; return this; }; /** * Calls an alternate implementation when a spy is called. * * @example * var baz = function() { * // do some stuff, return something * } * // defining a spy from scratch: foo() calls the function baz * var foo = jasmine.createSpy('spy on foo').andCall(baz); * * // defining a spy on an existing property: foo.bar() calls an anonymnous function * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); * * @param {Function} fakeFunc */ jasmine.Spy.prototype.andCallFake = function(fakeFunc) { this.plan = fakeFunc; return this; }; /** * Resets all of a spy's the tracking variables so that it can be used again. * * @example * spyOn(foo, 'bar'); * * foo.bar(); * * expect(foo.bar.callCount).toEqual(1); * * foo.bar.reset(); * * expect(foo.bar.callCount).toEqual(0); */ jasmine.Spy.prototype.reset = function() { this.wasCalled = false; this.callCount = 0; this.argsForCall = []; this.calls = []; this.mostRecentCall = {}; }; jasmine.createSpy = function(name) { var spyObj = function() { spyObj.wasCalled = true; spyObj.callCount++; var args = jasmine.util.argsToArray(arguments); spyObj.mostRecentCall.object = this; spyObj.mostRecentCall.args = args; spyObj.argsForCall.push(args); spyObj.calls.push({object: this, args: args}); return spyObj.plan.apply(this, arguments); }; var spy = new jasmine.Spy(name); for (var prop in spy) { spyObj[prop] = spy[prop]; } spyObj.reset(); return spyObj; }; /** * Determines whether an object is a spy. * * @param {jasmine.Spy|Object} putativeSpy * @returns {Boolean} */ jasmine.isSpy = function(putativeSpy) { return putativeSpy && putativeSpy.isSpy; }; /** * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something * large in one call. * * @param {String} baseName name of spy class * @param {Array} methodNames array of names of methods to make spies */ jasmine.createSpyObj = function(baseName, methodNames) { if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); } var obj = {}; for (var i = 0; i < methodNames.length; i++) { obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); } return obj; }; /** * All parameters are pretty-printed and concatenated together, then written to the current spec's output. * * Be careful not to leave calls to jasmine.log in production code. */ jasmine.log = function() { var spec = jasmine.getEnv().currentSpec; spec.log.apply(spec, arguments); }; /** * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. * * @example * // spy example * var foo = { * not: function(bool) { return !bool; } * } * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops * * @see jasmine.createSpy * @param obj * @param methodName * @returns a Jasmine spy that can be chained with all spy methods */ var spyOn = function(obj, methodName) { return jasmine.getEnv().currentSpec.spyOn(obj, methodName); }; if (isCommonJS) exports.spyOn = spyOn; /** * Creates a Jasmine spec that will be added to the current suite. * * // TODO: pending tests * * @example * it('should be true', function() { * expect(true).toEqual(true); * }); * * @param {String} desc description of this specification * @param {Function} func defines the preconditions and expectations of the spec */ var it = function(desc, func) { return jasmine.getEnv().it(desc, func); }; if (isCommonJS) exports.it = it; /** * Creates a disabled Jasmine spec. * * A convenience method that allows existing specs to be disabled temporarily during development. * * @param {String} desc description of this specification * @param {Function} func defines the preconditions and expectations of the spec */ var xit = function(desc, func) { return jasmine.getEnv().xit(desc, func); }; if (isCommonJS) exports.xit = xit; /** * Starts a chain for a Jasmine expectation. * * It is passed an Object that is the actual value and should chain to one of the many * jasmine.Matchers functions. * * @param {Object} actual Actual value to test against and expected value */ var expect = function(actual) { return jasmine.getEnv().currentSpec.expect(actual); }; if (isCommonJS) exports.expect = expect; /** * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. * * @param {Function} func Function that defines part of a jasmine spec. */ var runs = function(func) { jasmine.getEnv().currentSpec.runs(func); }; if (isCommonJS) exports.runs = runs; /** * Waits a fixed time period before moving to the next block. * * @deprecated Use waitsFor() instead * @param {Number} timeout milliseconds to wait */ var waits = function(timeout) { jasmine.getEnv().currentSpec.waits(timeout); }; if (isCommonJS) exports.waits = waits; /** * Waits for the latchFunction to return true before proceeding to the next block. * * @param {Function} latchFunction * @param {String} optional_timeoutMessage * @param {Number} optional_timeout */ var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); }; if (isCommonJS) exports.waitsFor = waitsFor; /** * A function that is called before each spec in a suite. * * Used for spec setup, including validating assumptions. * * @param {Function} beforeEachFunction */ var beforeEach = function(beforeEachFunction) { jasmine.getEnv().beforeEach(beforeEachFunction); }; if (isCommonJS) exports.beforeEach = beforeEach; /** * A function that is called after each spec in a suite. * * Used for restoring any state that is hijacked during spec execution. * * @param {Function} afterEachFunction */ var afterEach = function(afterEachFunction) { jasmine.getEnv().afterEach(afterEachFunction); }; if (isCommonJS) exports.afterEach = afterEach; /** * Defines a suite of specifications. * * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization * of setup in some tests. * * @example * // TODO: a simple suite * * // TODO: a simple suite with a nested describe block * * @param {String} description A string, usually the class under test. * @param {Function} specDefinitions function that defines several specs. */ var describe = function(description, specDefinitions) { return jasmine.getEnv().describe(description, specDefinitions); }; if (isCommonJS) exports.describe = describe; /** * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. * * @param {String} description A string, usually the class under test. * @param {Function} specDefinitions function that defines several specs. */ var xdescribe = function(description, specDefinitions) { return jasmine.getEnv().xdescribe(description, specDefinitions); }; if (isCommonJS) exports.xdescribe = xdescribe; // Provide the XMLHttpRequest class for IE 5.x-6.x: jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { function tryIt(f) { try { return f(); } catch(e) { } return null; } var xhr = tryIt(function() { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }) || tryIt(function() { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }) || tryIt(function() { return new ActiveXObject("Msxml2.XMLHTTP"); }) || tryIt(function() { return new ActiveXObject("Microsoft.XMLHTTP"); }); if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); return xhr; } : XMLHttpRequest; /** * @namespace */ jasmine.util = {}; /** * Declare that a child class inherit it's prototype from the parent class. * * @private * @param {Function} childClass * @param {Function} parentClass */ jasmine.util.inherit = function(childClass, parentClass) { /** * @private */ var subclass = function() { }; subclass.prototype = parentClass.prototype; childClass.prototype = new subclass(); }; jasmine.util.formatException = function(e) { var lineNumber; if (e.line) { lineNumber = e.line; } else if (e.lineNumber) { lineNumber = e.lineNumber; } var file; if (e.sourceURL) { file = e.sourceURL; } else if (e.fileName) { file = e.fileName; } var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); if (file && lineNumber) { message += ' in ' + file + ' (line ' + lineNumber + ')'; } return message; }; jasmine.util.htmlEscape = function(str) { if (!str) return str; return str.replace(/&/g, '&') .replace(//g, '>'); }; jasmine.util.argsToArray = function(args) { var arrayOfArgs = []; for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); return arrayOfArgs; }; jasmine.util.extend = function(destination, source) { for (var property in source) destination[property] = source[property]; return destination; }; /** * Environment for Jasmine * * @constructor */ jasmine.Env = function() { this.currentSpec = null; this.currentSuite = null; this.currentRunner_ = new jasmine.Runner(this); this.reporter = new jasmine.MultiReporter(); this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; this.lastUpdate = 0; this.specFilter = function() { return true; }; this.nextSpecId_ = 0; this.nextSuiteId_ = 0; this.equalityTesters_ = []; // wrap matchers this.matchersClass = function() { jasmine.Matchers.apply(this, arguments); }; jasmine.util.inherit(this.matchersClass, jasmine.Matchers); jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); }; jasmine.Env.prototype.setTimeout = jasmine.setTimeout; jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; jasmine.Env.prototype.setInterval = jasmine.setInterval; jasmine.Env.prototype.clearInterval = jasmine.clearInterval; /** * @returns an object containing jasmine version build info, if set. */ jasmine.Env.prototype.version = function () { if (jasmine.version_) { return jasmine.version_; } else { throw new Error('Version not set'); } }; /** * @returns string containing jasmine version build info, if set. */ jasmine.Env.prototype.versionString = function() { if (!jasmine.version_) { return "version unknown"; } var version = this.version(); var versionString = version.major + "." + version.minor + "." + version.build; if (version.release_candidate) { versionString += ".rc" + version.release_candidate; } versionString += " revision " + version.revision; return versionString; }; /** * @returns a sequential integer starting at 0 */ jasmine.Env.prototype.nextSpecId = function () { return this.nextSpecId_++; }; /** * @returns a sequential integer starting at 0 */ jasmine.Env.prototype.nextSuiteId = function () { return this.nextSuiteId_++; }; /** * Register a reporter to receive status updates from Jasmine. * @param {jasmine.Reporter} reporter An object which will receive status updates. */ jasmine.Env.prototype.addReporter = function(reporter) { this.reporter.addReporter(reporter); }; jasmine.Env.prototype.execute = function() { this.currentRunner_.execute(); }; jasmine.Env.prototype.describe = function(description, specDefinitions) { var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); var parentSuite = this.currentSuite; if (parentSuite) { parentSuite.add(suite); } else { this.currentRunner_.add(suite); } this.currentSuite = suite; var declarationError = null; try { specDefinitions.call(suite); } catch(e) { declarationError = e; } if (declarationError) { this.it("encountered a declaration exception", function() { throw declarationError; }); } this.currentSuite = parentSuite; return suite; }; jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { if (this.currentSuite) { this.currentSuite.beforeEach(beforeEachFunction); } else { this.currentRunner_.beforeEach(beforeEachFunction); } }; jasmine.Env.prototype.currentRunner = function () { return this.currentRunner_; }; jasmine.Env.prototype.afterEach = function(afterEachFunction) { if (this.currentSuite) { this.currentSuite.afterEach(afterEachFunction); } else { this.currentRunner_.afterEach(afterEachFunction); } }; jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { return { execute: function() { } }; }; jasmine.Env.prototype.it = function(description, func) { var spec = new jasmine.Spec(this, this.currentSuite, description); this.currentSuite.add(spec); this.currentSpec = spec; if (func) { spec.runs(func); } return spec; }; jasmine.Env.prototype.xit = function(desc, func) { return { id: this.nextSpecId(), runs: function() { } }; }; jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { return true; } a.__Jasmine_been_here_before__ = b; b.__Jasmine_been_here_before__ = a; var hasKey = function(obj, keyName) { return obj !== null && obj[keyName] !== jasmine.undefined; }; for (var property in b) { if (!hasKey(a, property) && hasKey(b, property)) { mismatchKeys.push("expected has key '" + property + "', but missing from actual."); } } for (property in a) { if (!hasKey(b, property) && hasKey(a, property)) { mismatchKeys.push("expected missing key '" + property + "', but present in actual."); } } for (property in b) { if (property == '__Jasmine_been_here_before__') continue; if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); } } if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { mismatchValues.push("arrays were not the same length"); } delete a.__Jasmine_been_here_before__; delete b.__Jasmine_been_here_before__; return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { mismatchKeys = mismatchKeys || []; mismatchValues = mismatchValues || []; for (var i = 0; i < this.equalityTesters_.length; i++) { var equalityTester = this.equalityTesters_[i]; var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); if (result !== jasmine.undefined) return result; } if (a === b) return true; if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { return (a == jasmine.undefined && b == jasmine.undefined); } if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { return a === b; } if (a instanceof Date && b instanceof Date) { return a.getTime() == b.getTime(); } if (a.jasmineMatches) { return a.jasmineMatches(b); } if (b.jasmineMatches) { return b.jasmineMatches(a); } if (a instanceof jasmine.Matchers.ObjectContaining) { return a.matches(b); } if (b instanceof jasmine.Matchers.ObjectContaining) { return b.matches(a); } if (jasmine.isString_(a) && jasmine.isString_(b)) { return (a == b); } if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { return (a == b); } if (typeof a === "object" && typeof b === "object") { return this.compareObjects_(a, b, mismatchKeys, mismatchValues); } //Straight check return (a === b); }; jasmine.Env.prototype.contains_ = function(haystack, needle) { if (jasmine.isArray_(haystack)) { for (var i = 0; i < haystack.length; i++) { if (this.equals_(haystack[i], needle)) return true; } return false; } return haystack.indexOf(needle) >= 0; }; jasmine.Env.prototype.addEqualityTester = function(equalityTester) { this.equalityTesters_.push(equalityTester); }; /** No-op base class for Jasmine reporters. * * @constructor */ jasmine.Reporter = function() { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportRunnerResults = function(runner) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportSuiteResults = function(suite) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportSpecStarting = function(spec) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportSpecResults = function(spec) { }; //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.log = function(str) { }; /** * Blocks are functions with executable code that make up a spec. * * @constructor * @param {jasmine.Env} env * @param {Function} func * @param {jasmine.Spec} spec */ jasmine.Block = function(env, func, spec) { this.env = env; this.func = func; this.spec = spec; }; jasmine.Block.prototype.execute = function(onComplete) { try { this.func.apply(this.spec); } catch (e) { this.spec.fail(e); } onComplete(); }; /** JavaScript API reporter. * * @constructor */ jasmine.JsApiReporter = function() { this.started = false; this.finished = false; this.suites_ = []; this.results_ = {}; }; jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { this.started = true; var suites = runner.topLevelSuites(); for (var i = 0; i < suites.length; i++) { var suite = suites[i]; this.suites_.push(this.summarize_(suite)); } }; jasmine.JsApiReporter.prototype.suites = function() { return this.suites_; }; jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { var isSuite = suiteOrSpec instanceof jasmine.Suite; var summary = { id: suiteOrSpec.id, name: suiteOrSpec.description, type: isSuite ? 'suite' : 'spec', children: [] }; if (isSuite) { var children = suiteOrSpec.children(); for (var i = 0; i < children.length; i++) { summary.children.push(this.summarize_(children[i])); } } return summary; }; jasmine.JsApiReporter.prototype.results = function() { return this.results_; }; jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { return this.results_[specId]; }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { this.finished = true; }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { this.results_[spec.id] = { messages: spec.results().getItems(), result: spec.results().failedCount > 0 ? "failed" : "passed" }; }; //noinspection JSUnusedLocalSymbols jasmine.JsApiReporter.prototype.log = function(str) { }; jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ var results = {}; for (var i = 0; i < specIds.length; i++) { var specId = specIds[i]; results[specId] = this.summarizeResult_(this.results_[specId]); } return results; }; jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ var summaryMessages = []; var messagesLength = result.messages.length; for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { var resultMessage = result.messages[messageIndex]; summaryMessages.push({ text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, passed: resultMessage.passed ? resultMessage.passed() : true, type: resultMessage.type, message: resultMessage.message, trace: { stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined } }); } return { result : result.result, messages : summaryMessages }; }; /** * @constructor * @param {jasmine.Env} env * @param actual * @param {jasmine.Spec} spec */ jasmine.Matchers = function(env, actual, spec, opt_isNot) { this.env = env; this.actual = actual; this.spec = spec; this.isNot = opt_isNot || false; this.reportWasCalled_ = false; }; // todo: @deprecated as of Jasmine 0.11, remove soon [xw] jasmine.Matchers.pp = function(str) { throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); }; // todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] jasmine.Matchers.prototype.report = function(result, failing_message, details) { throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); }; jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { for (var methodName in prototype) { if (methodName == 'report') continue; var orig = prototype[methodName]; matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); } }; jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { return function() { var matcherArgs = jasmine.util.argsToArray(arguments); var result = matcherFunction.apply(this, arguments); if (this.isNot) { result = !result; } if (this.reportWasCalled_) return result; var message; if (!result) { if (this.message) { message = this.message.apply(this, arguments); if (jasmine.isArray_(message)) { message = message[this.isNot ? 1 : 0]; } } else { var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; if (matcherArgs.length > 0) { for (var i = 0; i < matcherArgs.length; i++) { if (i > 0) message += ","; message += " " + jasmine.pp(matcherArgs[i]); } } message += "."; } } var expectationResult = new jasmine.ExpectationResult({ matcherName: matcherName, passed: result, expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], actual: this.actual, message: message }); this.spec.addMatcherResult(expectationResult); return jasmine.undefined; }; }; /** * toBe: compares the actual to the expected using === * @param expected */ jasmine.Matchers.prototype.toBe = function(expected) { return this.actual === expected; }; /** * toNotBe: compares the actual to the expected using !== * @param expected * @deprecated as of 1.0. Use not.toBe() instead. */ jasmine.Matchers.prototype.toNotBe = function(expected) { return this.actual !== expected; }; /** * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. * * @param expected */ jasmine.Matchers.prototype.toEqual = function(expected) { return this.env.equals_(this.actual, expected); }; /** * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual * @param expected * @deprecated as of 1.0. Use not.toEqual() instead. */ jasmine.Matchers.prototype.toNotEqual = function(expected) { return !this.env.equals_(this.actual, expected); }; /** * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes * a pattern or a String. * * @param expected */ jasmine.Matchers.prototype.toMatch = function(expected) { return new RegExp(expected).test(this.actual); }; /** * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch * @param expected * @deprecated as of 1.0. Use not.toMatch() instead. */ jasmine.Matchers.prototype.toNotMatch = function(expected) { return !(new RegExp(expected).test(this.actual)); }; /** * Matcher that compares the actual to jasmine.undefined. */ jasmine.Matchers.prototype.toBeDefined = function() { return (this.actual !== jasmine.undefined); }; /** * Matcher that compares the actual to jasmine.undefined. */ jasmine.Matchers.prototype.toBeUndefined = function() { return (this.actual === jasmine.undefined); }; /** * Matcher that compares the actual to null. */ jasmine.Matchers.prototype.toBeNull = function() { return (this.actual === null); }; /** * Matcher that boolean not-nots the actual. */ jasmine.Matchers.prototype.toBeTruthy = function() { return !!this.actual; }; /** * Matcher that boolean nots the actual. */ jasmine.Matchers.prototype.toBeFalsy = function() { return !this.actual; }; /** * Matcher that checks to see if the actual, a Jasmine spy, was called. */ jasmine.Matchers.prototype.toHaveBeenCalled = function() { if (arguments.length > 0) { throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); } if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { return [ "Expected spy " + this.actual.identity + " to have been called.", "Expected spy " + this.actual.identity + " not to have been called." ]; }; return this.actual.wasCalled; }; /** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; /** * Matcher that checks to see if the actual, a Jasmine spy, was not called. * * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead */ jasmine.Matchers.prototype.wasNotCalled = function() { if (arguments.length > 0) { throw new Error('wasNotCalled does not take arguments'); } if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { return [ "Expected spy " + this.actual.identity + " to not have been called.", "Expected spy " + this.actual.identity + " to have been called." ]; }; return !this.actual.wasCalled; }; /** * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. * * @example * */ jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { var expectedArgs = jasmine.util.argsToArray(arguments); if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { if (this.actual.callCount === 0) { // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw] return [ "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.", "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was." ]; } else { return [ "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall), "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall) ]; } }; return this.env.contains_(this.actual.argsForCall, expectedArgs); }; /** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; /** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ jasmine.Matchers.prototype.wasNotCalledWith = function() { var expectedArgs = jasmine.util.argsToArray(arguments); if (!jasmine.isSpy(this.actual)) { throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); } this.message = function() { return [ "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" ]; }; return !this.env.contains_(this.actual.argsForCall, expectedArgs); }; /** * Matcher that checks that the expected item is an element in the actual Array. * * @param {Object} expected */ jasmine.Matchers.prototype.toContain = function(expected) { return this.env.contains_(this.actual, expected); }; /** * Matcher that checks that the expected item is NOT an element in the actual Array. * * @param {Object} expected * @deprecated as of 1.0. Use not.toContain() instead. */ jasmine.Matchers.prototype.toNotContain = function(expected) { return !this.env.contains_(this.actual, expected); }; jasmine.Matchers.prototype.toBeLessThan = function(expected) { return this.actual < expected; }; jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { return this.actual > expected; }; /** * Matcher that checks that the expected item is equal to the actual item * up to a given level of decimal precision (default 2). * * @param {Number} expected * @param {Number} precision */ jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { if (!(precision === 0)) { precision = precision || 2; } var multiplier = Math.pow(10, precision); var actual = Math.round(this.actual * multiplier); expected = Math.round(expected * multiplier); return expected == actual; }; /** * Matcher that checks that the expected exception was thrown by the actual. * * @param {String} expected */ jasmine.Matchers.prototype.toThrow = function(expected) { var result = false; var exception; if (typeof this.actual != 'function') { throw new Error('Actual is not a function'); } try { this.actual(); } catch (e) { exception = e; } if (exception) { result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); } var not = this.isNot ? "not " : ""; this.message = function() { if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); } else { return "Expected function to throw an exception."; } }; return result; }; jasmine.Matchers.Any = function(expectedClass) { this.expectedClass = expectedClass; }; jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { if (this.expectedClass == String) { return typeof other == 'string' || other instanceof String; } if (this.expectedClass == Number) { return typeof other == 'number' || other instanceof Number; } if (this.expectedClass == Function) { return typeof other == 'function' || other instanceof Function; } if (this.expectedClass == Object) { return typeof other == 'object'; } return other instanceof this.expectedClass; }; jasmine.Matchers.Any.prototype.jasmineToString = function() { return ''; }; jasmine.Matchers.ObjectContaining = function (sample) { this.sample = sample; }; jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { mismatchKeys = mismatchKeys || []; mismatchValues = mismatchValues || []; var env = jasmine.getEnv(); var hasKey = function(obj, keyName) { return obj != null && obj[keyName] !== jasmine.undefined; }; for (var property in this.sample) { if (!hasKey(other, property) && hasKey(this.sample, property)) { mismatchKeys.push("expected has key '" + property + "', but missing from actual."); } else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); } } return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { return ""; }; // Mock setTimeout, clearTimeout // Contributed by Pivotal Computer Systems, www.pivotalsf.com jasmine.FakeTimer = function() { this.reset(); var self = this; self.setTimeout = function(funcToCall, millis) { self.timeoutsMade++; self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); return self.timeoutsMade; }; self.setInterval = function(funcToCall, millis) { self.timeoutsMade++; self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); return self.timeoutsMade; }; self.clearTimeout = function(timeoutKey) { self.scheduledFunctions[timeoutKey] = jasmine.undefined; }; self.clearInterval = function(timeoutKey) { self.scheduledFunctions[timeoutKey] = jasmine.undefined; }; }; jasmine.FakeTimer.prototype.reset = function() { this.timeoutsMade = 0; this.scheduledFunctions = {}; this.nowMillis = 0; }; jasmine.FakeTimer.prototype.tick = function(millis) { var oldMillis = this.nowMillis; var newMillis = oldMillis + millis; this.runFunctionsWithinRange(oldMillis, newMillis); this.nowMillis = newMillis; }; jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { var scheduledFunc; var funcsToRun = []; for (var timeoutKey in this.scheduledFunctions) { scheduledFunc = this.scheduledFunctions[timeoutKey]; if (scheduledFunc != jasmine.undefined && scheduledFunc.runAtMillis >= oldMillis && scheduledFunc.runAtMillis <= nowMillis) { funcsToRun.push(scheduledFunc); this.scheduledFunctions[timeoutKey] = jasmine.undefined; } } if (funcsToRun.length > 0) { funcsToRun.sort(function(a, b) { return a.runAtMillis - b.runAtMillis; }); for (var i = 0; i < funcsToRun.length; ++i) { try { var funcToRun = funcsToRun[i]; this.nowMillis = funcToRun.runAtMillis; funcToRun.funcToCall(); if (funcToRun.recurring) { this.scheduleFunction(funcToRun.timeoutKey, funcToRun.funcToCall, funcToRun.millis, true); } } catch(e) { } } this.runFunctionsWithinRange(oldMillis, nowMillis); } }; jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { this.scheduledFunctions[timeoutKey] = { runAtMillis: this.nowMillis + millis, funcToCall: funcToCall, recurring: recurring, timeoutKey: timeoutKey, millis: millis }; }; /** * @namespace */ jasmine.Clock = { defaultFakeTimer: new jasmine.FakeTimer(), reset: function() { jasmine.Clock.assertInstalled(); jasmine.Clock.defaultFakeTimer.reset(); }, tick: function(millis) { jasmine.Clock.assertInstalled(); jasmine.Clock.defaultFakeTimer.tick(millis); }, runFunctionsWithinRange: function(oldMillis, nowMillis) { jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); }, scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); }, useMock: function() { if (!jasmine.Clock.isInstalled()) { var spec = jasmine.getEnv().currentSpec; spec.after(jasmine.Clock.uninstallMock); jasmine.Clock.installMock(); } }, installMock: function() { jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; }, uninstallMock: function() { jasmine.Clock.assertInstalled(); jasmine.Clock.installed = jasmine.Clock.real; }, real: { setTimeout: jasmine.getGlobal().setTimeout, clearTimeout: jasmine.getGlobal().clearTimeout, setInterval: jasmine.getGlobal().setInterval, clearInterval: jasmine.getGlobal().clearInterval }, assertInstalled: function() { if (!jasmine.Clock.isInstalled()) { throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); } }, isInstalled: function() { return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; }, installed: null }; jasmine.Clock.installed = jasmine.Clock.real; //else for IE support jasmine.getGlobal().setTimeout = function(funcToCall, millis) { if (jasmine.Clock.installed.setTimeout.apply) { return jasmine.Clock.installed.setTimeout.apply(this, arguments); } else { return jasmine.Clock.installed.setTimeout(funcToCall, millis); } }; jasmine.getGlobal().setInterval = function(funcToCall, millis) { if (jasmine.Clock.installed.setInterval.apply) { return jasmine.Clock.installed.setInterval.apply(this, arguments); } else { return jasmine.Clock.installed.setInterval(funcToCall, millis); } }; jasmine.getGlobal().clearTimeout = function(timeoutKey) { if (jasmine.Clock.installed.clearTimeout.apply) { return jasmine.Clock.installed.clearTimeout.apply(this, arguments); } else { return jasmine.Clock.installed.clearTimeout(timeoutKey); } }; jasmine.getGlobal().clearInterval = function(timeoutKey) { if (jasmine.Clock.installed.clearTimeout.apply) { return jasmine.Clock.installed.clearInterval.apply(this, arguments); } else { return jasmine.Clock.installed.clearInterval(timeoutKey); } }; /** * @constructor */ jasmine.MultiReporter = function() { this.subReporters_ = []; }; jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); jasmine.MultiReporter.prototype.addReporter = function(reporter) { this.subReporters_.push(reporter); }; (function() { var functionNames = [ "reportRunnerStarting", "reportRunnerResults", "reportSuiteResults", "reportSpecStarting", "reportSpecResults", "log" ]; for (var i = 0; i < functionNames.length; i++) { var functionName = functionNames[i]; jasmine.MultiReporter.prototype[functionName] = (function(functionName) { return function() { for (var j = 0; j < this.subReporters_.length; j++) { var subReporter = this.subReporters_[j]; if (subReporter[functionName]) { subReporter[functionName].apply(subReporter, arguments); } } }; })(functionName); } })(); /** * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults * * @constructor */ jasmine.NestedResults = function() { /** * The total count of results */ this.totalCount = 0; /** * Number of passed results */ this.passedCount = 0; /** * Number of failed results */ this.failedCount = 0; /** * Was this suite/spec skipped? */ this.skipped = false; /** * @ignore */ this.items_ = []; }; /** * Roll up the result counts. * * @param result */ jasmine.NestedResults.prototype.rollupCounts = function(result) { this.totalCount += result.totalCount; this.passedCount += result.passedCount; this.failedCount += result.failedCount; }; /** * Adds a log message. * @param values Array of message parts which will be concatenated later. */ jasmine.NestedResults.prototype.log = function(values) { this.items_.push(new jasmine.MessageResult(values)); }; /** * Getter for the results: message & results. */ jasmine.NestedResults.prototype.getItems = function() { return this.items_; }; /** * Adds a result, tracking counts (total, passed, & failed) * @param {jasmine.ExpectationResult|jasmine.NestedResults} result */ jasmine.NestedResults.prototype.addResult = function(result) { if (result.type != 'log') { if (result.items_) { this.rollupCounts(result); } else { this.totalCount++; if (result.passed()) { this.passedCount++; } else { this.failedCount++; } } } this.items_.push(result); }; /** * @returns {Boolean} True if everything below passed */ jasmine.NestedResults.prototype.passed = function() { return this.passedCount === this.totalCount; }; /** * Base class for pretty printing for expectation results. */ jasmine.PrettyPrinter = function() { this.ppNestLevel_ = 0; }; /** * Formats a value in a nice, human-readable string. * * @param value */ jasmine.PrettyPrinter.prototype.format = function(value) { if (this.ppNestLevel_ > 40) { throw new Error('jasmine.PrettyPrinter: format() nested too deeply!'); } this.ppNestLevel_++; try { if (value === jasmine.undefined) { this.emitScalar('undefined'); } else if (value === null) { this.emitScalar('null'); } else if (value === jasmine.getGlobal()) { this.emitScalar(''); } else if (value.jasmineToString) { this.emitScalar(value.jasmineToString()); } else if (typeof value === 'string') { this.emitString(value); } else if (jasmine.isSpy(value)) { this.emitScalar("spy on " + value.identity); } else if (value instanceof RegExp) { this.emitScalar(value.toString()); } else if (typeof value === 'function') { this.emitScalar('Function'); } else if (typeof value.nodeType === 'number') { this.emitScalar('HTMLNode'); } else if (value instanceof Date) { this.emitScalar('Date(' + value + ')'); } else if (value.__Jasmine_been_here_before__) { this.emitScalar(''); } else if (jasmine.isArray_(value) || typeof value == 'object') { value.__Jasmine_been_here_before__ = true; if (jasmine.isArray_(value)) { this.emitArray(value); } else { this.emitObject(value); } delete value.__Jasmine_been_here_before__; } else { this.emitScalar(value.toString()); } } finally { this.ppNestLevel_--; } }; jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { for (var property in obj) { if (property == '__Jasmine_been_here_before__') continue; fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && obj.__lookupGetter__(property) !== null) : false); } }; jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; jasmine.StringPrettyPrinter = function() { jasmine.PrettyPrinter.call(this); this.string = ''; }; jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { this.append(value); }; jasmine.StringPrettyPrinter.prototype.emitString = function(value) { this.append("'" + value + "'"); }; jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { this.append('[ '); for (var i = 0; i < array.length; i++) { if (i > 0) { this.append(', '); } this.format(array[i]); } this.append(' ]'); }; jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { var self = this; this.append('{ '); var first = true; this.iterateObject(obj, function(property, isGetter) { if (first) { first = false; } else { self.append(', '); } self.append(property); self.append(' : '); if (isGetter) { self.append(''); } else { self.format(obj[property]); } }); this.append(' }'); }; jasmine.StringPrettyPrinter.prototype.append = function(value) { this.string += value; }; jasmine.Queue = function(env) { this.env = env; this.blocks = []; this.running = false; this.index = 0; this.offset = 0; this.abort = false; }; jasmine.Queue.prototype.addBefore = function(block) { this.blocks.unshift(block); }; jasmine.Queue.prototype.add = function(block) { this.blocks.push(block); }; jasmine.Queue.prototype.insertNext = function(block) { this.blocks.splice((this.index + this.offset + 1), 0, block); this.offset++; }; jasmine.Queue.prototype.start = function(onComplete) { this.running = true; this.onComplete = onComplete; this.next_(); }; jasmine.Queue.prototype.isRunning = function() { return this.running; }; jasmine.Queue.LOOP_DONT_RECURSE = true; jasmine.Queue.prototype.next_ = function() { var self = this; var goAgain = true; while (goAgain) { goAgain = false; if (self.index < self.blocks.length && !this.abort) { var calledSynchronously = true; var completedSynchronously = false; var onComplete = function () { if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { completedSynchronously = true; return; } if (self.blocks[self.index].abort) { self.abort = true; } self.offset = 0; self.index++; var now = new Date().getTime(); if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { self.env.lastUpdate = now; self.env.setTimeout(function() { self.next_(); }, 0); } else { if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { goAgain = true; } else { self.next_(); } } }; self.blocks[self.index].execute(onComplete); calledSynchronously = false; if (completedSynchronously) { onComplete(); } } else { self.running = false; if (self.onComplete) { self.onComplete(); } } } }; jasmine.Queue.prototype.results = function() { var results = new jasmine.NestedResults(); for (var i = 0; i < this.blocks.length; i++) { if (this.blocks[i].results) { results.addResult(this.blocks[i].results()); } } return results; }; /** * Runner * * @constructor * @param {jasmine.Env} env */ jasmine.Runner = function(env) { var self = this; self.env = env; self.queue = new jasmine.Queue(env); self.before_ = []; self.after_ = []; self.suites_ = []; }; jasmine.Runner.prototype.execute = function() { var self = this; if (self.env.reporter.reportRunnerStarting) { self.env.reporter.reportRunnerStarting(this); } self.queue.start(function () { self.finishCallback(); }); }; jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { beforeEachFunction.typeName = 'beforeEach'; this.before_.splice(0,0,beforeEachFunction); }; jasmine.Runner.prototype.afterEach = function(afterEachFunction) { afterEachFunction.typeName = 'afterEach'; this.after_.splice(0,0,afterEachFunction); }; jasmine.Runner.prototype.finishCallback = function() { this.env.reporter.reportRunnerResults(this); }; jasmine.Runner.prototype.addSuite = function(suite) { this.suites_.push(suite); }; jasmine.Runner.prototype.add = function(block) { if (block instanceof jasmine.Suite) { this.addSuite(block); } this.queue.add(block); }; jasmine.Runner.prototype.specs = function () { var suites = this.suites(); var specs = []; for (var i = 0; i < suites.length; i++) { specs = specs.concat(suites[i].specs()); } return specs; }; jasmine.Runner.prototype.suites = function() { return this.suites_; }; jasmine.Runner.prototype.topLevelSuites = function() { var topLevelSuites = []; for (var i = 0; i < this.suites_.length; i++) { if (!this.suites_[i].parentSuite) { topLevelSuites.push(this.suites_[i]); } } return topLevelSuites; }; jasmine.Runner.prototype.results = function() { return this.queue.results(); }; /** * Internal representation of a Jasmine specification, or test. * * @constructor * @param {jasmine.Env} env * @param {jasmine.Suite} suite * @param {String} description */ jasmine.Spec = function(env, suite, description) { if (!env) { throw new Error('jasmine.Env() required'); } if (!suite) { throw new Error('jasmine.Suite() required'); } var spec = this; spec.id = env.nextSpecId ? env.nextSpecId() : null; spec.env = env; spec.suite = suite; spec.description = description; spec.queue = new jasmine.Queue(env); spec.afterCallbacks = []; spec.spies_ = []; spec.results_ = new jasmine.NestedResults(); spec.results_.description = description; spec.matchersClass = null; }; jasmine.Spec.prototype.getFullName = function() { return this.suite.getFullName() + ' ' + this.description + '.'; }; jasmine.Spec.prototype.results = function() { return this.results_; }; /** * All parameters are pretty-printed and concatenated together, then written to the spec's output. * * Be careful not to leave calls to jasmine.log in production code. */ jasmine.Spec.prototype.log = function() { return this.results_.log(arguments); }; jasmine.Spec.prototype.runs = function (func) { var block = new jasmine.Block(this.env, func, this); this.addToQueue(block); return this; }; jasmine.Spec.prototype.addToQueue = function (block) { if (this.queue.isRunning()) { this.queue.insertNext(block); } else { this.queue.add(block); } }; /** * @param {jasmine.ExpectationResult} result */ jasmine.Spec.prototype.addMatcherResult = function(result) { this.results_.addResult(result); }; jasmine.Spec.prototype.expect = function(actual) { var positive = new (this.getMatchersClass_())(this.env, actual, this); positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); return positive; }; /** * Waits a fixed time period before moving to the next block. * * @deprecated Use waitsFor() instead * @param {Number} timeout milliseconds to wait */ jasmine.Spec.prototype.waits = function(timeout) { var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); this.addToQueue(waitsFunc); return this; }; /** * Waits for the latchFunction to return true before proceeding to the next block. * * @param {Function} latchFunction * @param {String} optional_timeoutMessage * @param {Number} optional_timeout */ jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { var latchFunction_ = null; var optional_timeoutMessage_ = null; var optional_timeout_ = null; for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; switch (typeof arg) { case 'function': latchFunction_ = arg; break; case 'string': optional_timeoutMessage_ = arg; break; case 'number': optional_timeout_ = arg; break; } } var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); this.addToQueue(waitsForFunc); return this; }; jasmine.Spec.prototype.fail = function (e) { var expectationResult = new jasmine.ExpectationResult({ passed: false, message: e ? jasmine.util.formatException(e) : 'Exception', trace: { stack: e.stack } }); this.results_.addResult(expectationResult); }; jasmine.Spec.prototype.getMatchersClass_ = function() { return this.matchersClass || this.env.matchersClass; }; jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { var parent = this.getMatchersClass_(); var newMatchersClass = function() { parent.apply(this, arguments); }; jasmine.util.inherit(newMatchersClass, parent); jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); this.matchersClass = newMatchersClass; }; jasmine.Spec.prototype.finishCallback = function() { this.env.reporter.reportSpecResults(this); }; jasmine.Spec.prototype.finish = function(onComplete) { this.removeAllSpies(); this.finishCallback(); if (onComplete) { onComplete(); } }; jasmine.Spec.prototype.after = function(doAfter) { if (this.queue.isRunning()) { this.queue.add(new jasmine.Block(this.env, doAfter, this)); } else { this.afterCallbacks.unshift(doAfter); } }; jasmine.Spec.prototype.execute = function(onComplete) { var spec = this; if (!spec.env.specFilter(spec)) { spec.results_.skipped = true; spec.finish(onComplete); return; } this.env.reporter.reportSpecStarting(this); spec.env.currentSpec = spec; spec.addBeforesAndAftersToQueue(); spec.queue.start(function () { spec.finish(onComplete); }); }; jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { var runner = this.env.currentRunner(); var i; for (var suite = this.suite; suite; suite = suite.parentSuite) { for (i = 0; i < suite.before_.length; i++) { this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); } } for (i = 0; i < runner.before_.length; i++) { this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); } for (i = 0; i < this.afterCallbacks.length; i++) { this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); } for (suite = this.suite; suite; suite = suite.parentSuite) { for (i = 0; i < suite.after_.length; i++) { this.queue.add(new jasmine.Block(this.env, suite.after_[i], this)); } } for (i = 0; i < runner.after_.length; i++) { this.queue.add(new jasmine.Block(this.env, runner.after_[i], this)); } }; jasmine.Spec.prototype.explodes = function() { throw 'explodes function should not have been called'; }; jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { if (obj == jasmine.undefined) { throw "spyOn could not find an object to spy upon for " + methodName + "()"; } if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { throw methodName + '() method does not exist'; } if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { throw new Error(methodName + ' has already been spied upon'); } var spyObj = jasmine.createSpy(methodName); this.spies_.push(spyObj); spyObj.baseObj = obj; spyObj.methodName = methodName; spyObj.originalValue = obj[methodName]; obj[methodName] = spyObj; return spyObj; }; jasmine.Spec.prototype.removeAllSpies = function() { for (var i = 0; i < this.spies_.length; i++) { var spy = this.spies_[i]; spy.baseObj[spy.methodName] = spy.originalValue; } this.spies_ = []; }; /** * Internal representation of a Jasmine suite. * * @constructor * @param {jasmine.Env} env * @param {String} description * @param {Function} specDefinitions * @param {jasmine.Suite} parentSuite */ jasmine.Suite = function(env, description, specDefinitions, parentSuite) { var self = this; self.id = env.nextSuiteId ? env.nextSuiteId() : null; self.description = description; self.queue = new jasmine.Queue(env); self.parentSuite = parentSuite; self.env = env; self.before_ = []; self.after_ = []; self.children_ = []; self.suites_ = []; self.specs_ = []; }; jasmine.Suite.prototype.getFullName = function() { var fullName = this.description; for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { fullName = parentSuite.description + ' ' + fullName; } return fullName; }; jasmine.Suite.prototype.finish = function(onComplete) { this.env.reporter.reportSuiteResults(this); this.finished = true; if (typeof(onComplete) == 'function') { onComplete(); } }; jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { beforeEachFunction.typeName = 'beforeEach'; this.before_.unshift(beforeEachFunction); }; jasmine.Suite.prototype.afterEach = function(afterEachFunction) { afterEachFunction.typeName = 'afterEach'; this.after_.unshift(afterEachFunction); }; jasmine.Suite.prototype.results = function() { return this.queue.results(); }; jasmine.Suite.prototype.add = function(suiteOrSpec) { this.children_.push(suiteOrSpec); if (suiteOrSpec instanceof jasmine.Suite) { this.suites_.push(suiteOrSpec); this.env.currentRunner().addSuite(suiteOrSpec); } else { this.specs_.push(suiteOrSpec); } this.queue.add(suiteOrSpec); }; jasmine.Suite.prototype.specs = function() { return this.specs_; }; jasmine.Suite.prototype.suites = function() { return this.suites_; }; jasmine.Suite.prototype.children = function() { return this.children_; }; jasmine.Suite.prototype.execute = function(onComplete) { var self = this; this.queue.start(function () { self.finish(onComplete); }); }; jasmine.WaitsBlock = function(env, timeout, spec) { this.timeout = timeout; jasmine.Block.call(this, env, null, spec); }; jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); jasmine.WaitsBlock.prototype.execute = function (onComplete) { if (jasmine.VERBOSE) { this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); } this.env.setTimeout(function () { onComplete(); }, this.timeout); }; /** * A block which waits for some condition to become true, with timeout. * * @constructor * @extends jasmine.Block * @param {jasmine.Env} env The Jasmine environment. * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. * @param {Function} latchFunction A function which returns true when the desired condition has been met. * @param {String} message The message to display if the desired condition hasn't been met within the given time period. * @param {jasmine.Spec} spec The Jasmine spec. */ jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { this.timeout = timeout || env.defaultTimeoutInterval; this.latchFunction = latchFunction; this.message = message; this.totalTimeSpentWaitingForLatch = 0; jasmine.Block.call(this, env, null, spec); }; jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; jasmine.WaitsForBlock.prototype.execute = function(onComplete) { if (jasmine.VERBOSE) { this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); } var latchFunctionResult; try { latchFunctionResult = this.latchFunction.apply(this.spec); } catch (e) { this.spec.fail(e); onComplete(); return; } if (latchFunctionResult) { onComplete(); } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); this.spec.fail({ name: 'timeout', message: message }); this.abort = true; onComplete(); } else { this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; var self = this; this.env.setTimeout(function() { self.execute(onComplete); }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); } }; jasmine.version_= { "major": 1, "minor": 2, "build": 0, "revision": 1333310630, "release_candidate": 1 }; cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/0000755000015000001560000000000012272510677024042 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/compass.html0000644000015000001560000000500112272510571026362 0ustar pbuserpbgroup00000000000000 Cordova: Compass API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/whitelist.html0000644000015000001560000000500512272510571026735 0ustar pbuserpbgroup00000000000000 Cordova: Whitelist API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/file.html0000644000015000001560000000706712272510571025652 0ustar pbuserpbgroup00000000000000 Cordova: File API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/network.html0000644000015000001560000000500112272510571026406 0ustar pbuserpbgroup00000000000000 Cordova: Network API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/globalization.html0000644000015000001560000000501412272510571027557 0ustar pbuserpbgroup00000000000000 Cordova: Globalization API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/camera.html0000644000015000001560000000477712272510571026170 0ustar pbuserpbgroup00000000000000 Cordova: Camera API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/device.html0000644000015000001560000000477712272510571026177 0ustar pbuserpbgroup00000000000000 Cordova: Device API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/contacts.html0000644000015000001560000000500312272510571026535 0ustar pbuserpbgroup00000000000000 Cordova: Contacts API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/platform.html0000644000015000001560000000500312272510571026543 0ustar pbuserpbgroup00000000000000 Cordova: Platform API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/notification.html0000644000015000001560000000501312272510571027406 0ustar pbuserpbgroup00000000000000 Cordova: Notification API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/battery.html0000644000015000001560000000472612272510571026404 0ustar pbuserpbgroup00000000000000 Cordova: Battery API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/all.html0000644000015000001560000001151312272510571025472 0ustar pbuserpbgroup00000000000000 Cordova: API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/capture.html0000644000015000001560000000500112272510571026360 0ustar pbuserpbgroup00000000000000 Cordova: Capture API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/splashscreen.html0000644000015000001560000000501312272510571027412 0ustar pbuserpbgroup00000000000000 Cordova: Splashscreen API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/accelerometer.html0000644000015000001560000000501412272510571027533 0ustar pbuserpbgroup00000000000000 Cordova: Accelerometer API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/media.html0000644000015000001560000000477512272510571026015 0ustar pbuserpbgroup00000000000000 Cordova: Media API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/datauri.html0000644000015000001560000000477412272510571026366 0ustar pbuserpbgroup00000000000000 Cordova: Data URI tests Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/filetransfer.html0000644000015000001560000000710012272510571027403 0ustar pbuserpbgroup00000000000000 Cordova: File API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/geolocation.html0000644000015000001560000000501112272510571027221 0ustar pbuserpbgroup00000000000000 Cordova: Geolocation API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/storage.html0000644000015000001560000000500112272510571026361 0ustar pbuserpbgroup00000000000000 Cordova: Storage API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/pages/bridge.html0000644000015000001560000000477712272510571026174 0ustar pbuserpbgroup00000000000000 Cordova: Device API Specs Back cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/index.html0000644000015000001560000000652012272510571024734 0ustar pbuserpbgroup00000000000000 Cordova API Specs

Cordova API Specs

Run All Tests Run Accelerometer Tests Run Battery Tests Run Camera Tests Run Capture Tests Run Compass Tests Run Contacts Tests Run Data URI Tests Run Device Tests Run File Tests Run FileTransfer Tests Run Geolocation Tests Run Globalization Tests Run Media Tests Run Network Tests Run Notification Tests Run Platform Tests Run Storage Tests Run Bridge Tests Run Splashscreen Tests Run Whitelist Tests

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/0000755000015000001560000000000012272510677023707 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/ReporterView.js0000644000015000001560000001112612272510571026674 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter.ReporterView = function(dom) { this.startedAt = new Date(); this.runningSpecCount = 0; this.completeSpecCount = 0; this.passedCount = 0; this.failedCount = 0; this.skippedCount = 0; this.createResultsMenu = function() { this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), ' | ', this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); this.summaryMenuItem.onclick = function() { dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); }; this.detailsMenuItem.onclick = function() { showDetails(); }; }; this.addSpecs = function(specs, specFilter) { this.totalSpecCount = specs.length; this.views = { specs: {}, suites: {} }; for (var i = 0; i < specs.length; i++) { var spec = specs[i]; this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); if (specFilter(spec)) { this.runningSpecCount++; } } }; this.specComplete = function(spec) { this.completeSpecCount++; if (isUndefined(this.views.specs[spec.id])) { this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); } var specView = this.views.specs[spec.id]; switch (specView.status()) { case 'passed': this.passedCount++; break; case 'failed': this.failedCount++; break; case 'skipped': this.skippedCount++; break; } specView.refresh(); this.refresh(); }; this.suiteComplete = function(suite) { var suiteView = this.views.suites[suite.id]; if (isUndefined(suiteView)) { return; } suiteView.refresh(); }; this.refresh = function() { if (isUndefined(this.resultsMenu)) { this.createResultsMenu(); } // currently running UI if (isUndefined(this.runningAlert)) { this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"}); dom.alert.appendChild(this.runningAlert); } this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); // skipped specs UI if (isUndefined(this.skippedAlert)) { this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"}); } this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; if (this.skippedCount === 1 && isDefined(dom.alert)) { dom.alert.appendChild(this.skippedAlert); } // passing specs UI if (isUndefined(this.passedAlert)) { this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"}); } this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); // failing specs UI if (isUndefined(this.failedAlert)) { this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); } this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); if (this.failedCount === 1 && isDefined(dom.alert)) { dom.alert.appendChild(this.failedAlert); dom.alert.appendChild(this.resultsMenu); } // summary info this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; }; this.complete = function() { dom.alert.removeChild(this.runningAlert); this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; if (this.failedCount === 0) { dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); } else { showDetails(); } dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); }; return this; function showDetails() { if (dom.reporter.className.search(/showDetails/) === -1) { dom.reporter.className += " showDetails"; } } function isUndefined(obj) { return typeof obj === 'undefined'; } function isDefined(obj) { return !isUndefined(obj); } function specPluralizedFor(count) { var str = count + " spec"; if (count > 1) { str += "s" } return str; } }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/JUnitXmlReporter.js0000644000015000001560000002501312272510571027474 0ustar pbuserpbgroup00000000000000/* The MIT License Copyright (c) 2010 Larry Myers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ (function() { if (typeof jasmine == 'undefined') { throw new Error("jasmine library does not exist in global namespace!"); } function elapsed(startTime, endTime) { return (endTime - startTime)/1000; } function ISODateString(d) { function pad(n) { return n < 10 ? '0'+n : n; } return d.getFullYear() + '-' + pad(d.getMonth()+1) + '-' + pad(d.getDate()) + 'T' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds()); } function trim(str) { return str.replace(/^\s+/, "" ).replace(/\s+$/, "" ); } function escapeInvalidXmlChars(str) { return str.replace(/\&/g, "&") .replace(//g, ">") .replace(/\"/g, """) .replace(/\'/g, "'"); } /** * Generates JUnit XML for the given spec run. * Allows the test results to be used in java based CI * systems like CruiseControl and Hudson. * * @param {string} savePath where to save the files * @param {boolean} consolidate whether to save nested describes within the * same file as their parent; default: true * @param {boolean} useDotNotation whether to separate suite names with * dots rather than spaces (ie "Class.init" not * "Class init"); default: true */ var JUnitXmlReporter = function(savePath, consolidate, useDotNotation) { this.savePath = savePath || ''; this.consolidate = consolidate === jasmine.undefined ? true : consolidate; this.useDotNotation = useDotNotation === jasmine.undefined ? true : useDotNotation; }; JUnitXmlReporter.finished_at = null; // will be updated after all files have been written JUnitXmlReporter.prototype = { reportSpecStarting: function(spec) { spec.startTime = new Date(); if (!spec.suite.startTime) { spec.suite.startTime = spec.startTime; } }, reportSpecResults: function(spec) { var results = spec.results(); spec.didFail = !results.passed(); spec.duration = elapsed(spec.startTime, new Date()); spec.output = ''; if(results.skipped) { spec.output = spec.output + ""; } var failure = ""; var failures = 0; var resultItems = results.getItems(); for (var i = 0; i < resultItems.length; i++) { var result = resultItems[i]; if (result.type == 'expect' && result.passed && !result.passed()) { failures += 1; failure += ''; failure += escapeInvalidXmlChars(result.trace.stack || result.message); failure += ""; } } if (failure) { spec.output += failure; } spec.output += ""; }, reportSuiteResults: function(suite) { var results = suite.results(); var specs = suite.specs(); var specOutput = ""; // for JUnit results, let's only include directly failed tests (not nested suites') var failedCount = 0; suite.status = results.passed() ? 'Passed.' : 'Failed.'; if (results.totalCount === 0) { // todo: change this to check results.skipped suite.status = 'Skipped.'; } // if a suite has no (active?) specs, reportSpecStarting is never called // and thus the suite has no startTime -- account for that here suite.startTime = suite.startTime || new Date(); suite.duration = elapsed(suite.startTime, new Date()); for (var i = 0; i < specs.length; i++) { failedCount += specs[i].didFail ? 1 : 0; specOutput += "\n " + specs[i].output; } suite.output = '\n'; suite.output += specOutput; suite.output += "\n"; }, reportRunnerResults: function(runner) { var suites = runner.suites(); for (var i = 0; i < suites.length; i++) { var suite = suites[i]; var fileName = 'TEST-' + this.getFullName(suite, true) + '.xml'; var output = ''; // if we are consolidating, only write out top-level suites if (this.consolidate && suite.parentSuite) { continue; } else if (this.consolidate) { output += "\n"; output += this.getNestedOutput(suite); output += "\n"; this.writeFile(this.savePath, fileName, output); } else { output += suite.output; this.writeFile(this.savePath, fileName, output); } } // When all done, make it known on JUnitXmlReporter JUnitXmlReporter.finished_at = (new Date()).getTime(); // FIXME: Avoid using setTimeout. Waits until all files have been written setTimeout(function() { var event = new Event('junitxml-finished'); document.dispatchEvent(event); }, 1000); }, getNestedOutput: function(suite) { var output = suite.output; for (var i = 0; i < suite.suites().length; i++) { output += this.getNestedOutput(suite.suites()[i]); } return output; }, writeFile: function(path, filename, text) { function getQualifiedFilename(separator) { if (path && path.substr(-1) !== separator && filename.substr(0) !== separator) { path += separator; } return path + filename; } // Cordova try { filename = getQualifiedFilename('/'); persistent_root.getFile(filename, {create: true, exclusive: false}, gotFileEntry, fail); function gotFileEntry(fileEntry) { fileEntry.createWriter(gotFileWriter, fail); } function gotFileWriter(writer) { writer.write(text); } function fail(error) { console.log("getFail error"); } return; } catch (h) {} // Rhino try { // turn filename into a qualified path if (path) { filename = getQualifiedFilename(java.lang.System.getProperty("file.separator")); // create parent dir and ancestors if necessary var file = java.io.File(filename); var parentDir = file.getParentFile(); if (!parentDir.exists()) { parentDir.mkdirs(); } } // finally write the file var out = new java.io.BufferedWriter(new java.io.FileWriter(filename)); out.write(text); out.close(); return; } catch (e) {} // PhantomJS, via a method injected by phantomjs-testrunner.js try { // turn filename into a qualified path filename = getQualifiedFilename(window.fs_path_separator); __phantom_writeFile(filename, text); return; } catch (f) {} // Node.js try { var fs = require("fs"); var nodejs_path = require("path"); var fd = fs.openSync(nodejs_path.join(path, filename), "w"); fs.writeSync(fd, text, 0); fs.closeSync(fd); return; } catch (g) {} }, getFullName: function(suite, isFilename) { var fullName; if (this.useDotNotation) { fullName = suite.description; for (var parentSuite = suite.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { fullName = parentSuite.description + '.' + fullName; } } else { fullName = suite.getFullName(); } // Either remove or escape invalid XML characters if (isFilename) { return fullName.replace(/[^\w]/g, ""); } return escapeInvalidXmlChars(fullName); }, log: function(str) { var console = jasmine.getGlobal().console; if (console && console.log) { console.log(str); } } }; // export public jasmine.JUnitXmlReporter = JUnitXmlReporter; })(); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/SuiteView.js0000644000015000001560000000126212272510571026163 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { this.suite = suite; this.dom = dom; this.views = views; this.element = this.createDom('div', { className: 'suite' }, this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description) ); this.appendToSummary(this.suite, this.element); }; jasmine.HtmlReporter.SuiteView.prototype.status = function() { return this.getSpecStatus(this.suite); }; jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { this.element.className += " " + this.status(); }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/SpecView.js0000644000015000001560000000462412272510571025771 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter.SpecView = function(spec, dom, views) { this.spec = spec; this.dom = dom; this.views = views; this.symbol = this.createDom('li', { className: 'pending' }); this.dom.symbolSummary.appendChild(this.symbol); this.summary = this.createDom('div', { className: 'specSummary' }, this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.spec.getFullName()), title: this.spec.getFullName() }, this.spec.description) ); this.detail = this.createDom('div', { className: 'specDetail' }, this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.spec.getFullName()), title: this.spec.getFullName() }, this.spec.getFullName()) ); }; jasmine.HtmlReporter.SpecView.prototype.status = function() { return this.getSpecStatus(this.spec); }; jasmine.HtmlReporter.SpecView.prototype.refresh = function() { this.symbol.className = this.status(); switch (this.status()) { case 'skipped': break; case 'passed': this.appendSummaryToSuiteDiv(); break; case 'failed': this.appendSummaryToSuiteDiv(); this.appendFailureDetail(); break; } }; jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { this.summary.className += ' ' + this.status(); this.appendToSummary(this.spec, this.summary); }; jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { this.detail.className += ' ' + this.status(); var resultItems = this.spec.results().getItems(); var messagesDiv = this.createDom('div', { className: 'messages' }); for (var i = 0; i < resultItems.length; i++) { var result = resultItems[i]; if (result.type == 'log') { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); } else if (result.type == 'expect' && result.passed && !result.passed()) { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); if (result.trace.stack) { messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); } } } if (messagesDiv.childNodes.length > 0) { this.detail.appendChild(messagesDiv); this.dom.details.appendChild(this.detail); } }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/HtmlReporterHelpers.js0000644000015000001560000000274212272510571030215 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporterHelpers = {}; jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { var el = document.createElement(type); for (var i = 2; i < arguments.length; i++) { var child = arguments[i]; if (typeof child === 'string') { el.appendChild(document.createTextNode(child)); } else { if (child) { el.appendChild(child); } } } for (var attr in attrs) { if (attr == "className") { el[attr] = attrs[attr]; } else { el.setAttribute(attr, attrs[attr]); } } return el; }; jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { var results = child.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.skipped) { status = 'skipped'; } return status; }; jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { var parentDiv = this.dom.summary; var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; var parent = child[parentSuite]; if (parent) { if (typeof this.views.suites[parent.id] == 'undefined') { this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); } parentDiv = this.views.suites[parent.id].element; } parentDiv.appendChild(childElement); }; jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { for(var fn in jasmine.HtmlReporterHelpers) { ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; } }; cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/TrivialReporter.js0000644000015000001560000001554112272510571027401 0ustar pbuserpbgroup00000000000000/* @deprecated Use jasmine.HtmlReporter instead */ jasmine.TrivialReporter = function(doc) { this.document = doc || document; this.suiteDivs = {}; this.logRunningSpecs = false; }; jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { var el = document.createElement(type); for (var i = 2; i < arguments.length; i++) { var child = arguments[i]; if (typeof child === 'string') { el.appendChild(document.createTextNode(child)); } else { if (child) { el.appendChild(child); } } } for (var attr in attrs) { if (attr == "className") { el[attr] = attrs[attr]; } else { el.setAttribute(attr, attrs[attr]); } } return el; }; jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { var showPassed, showSkipped; this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, this.createDom('div', { className: 'banner' }, this.createDom('div', { className: 'logo' }, this.createDom('span', { className: 'title' }, "Jasmine"), this.createDom('span', { className: 'version' }, runner.env.versionString())), this.createDom('div', { className: 'options' }, "Show ", showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") ) ), this.runnerDiv = this.createDom('div', { className: 'runner running' }, this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), this.runnerMessageSpan = this.createDom('span', {}, "Running..."), this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) ); this.document.body.appendChild(this.outerDiv); var suites = runner.suites(); for (var i = 0; i < suites.length; i++) { var suite = suites[i]; var suiteDiv = this.createDom('div', { className: 'suite' }, this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); this.suiteDivs[suite.id] = suiteDiv; var parentDiv = this.outerDiv; if (suite.parentSuite) { parentDiv = this.suiteDivs[suite.parentSuite.id]; } parentDiv.appendChild(suiteDiv); } this.startedAt = new Date(); var self = this; showPassed.onclick = function(evt) { if (showPassed.checked) { self.outerDiv.className += ' show-passed'; } else { self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); } }; showSkipped.onclick = function(evt) { if (showSkipped.checked) { self.outerDiv.className += ' show-skipped'; } else { self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); } }; }; jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { var results = runner.results(); var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; this.runnerDiv.setAttribute("class", className); //do it twice for IE this.runnerDiv.setAttribute("className", className); var specs = runner.specs(); var specCount = 0; for (var i = 0; i < specs.length; i++) { if (this.specFilter(specs[i])) { specCount++; } } var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); }; jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { var results = suite.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.totalCount === 0) { // todo: change this to check results.skipped status = 'skipped'; } this.suiteDivs[suite.id].className += " " + status; }; jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { if (this.logRunningSpecs) { this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); } }; jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { var results = spec.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.skipped) { status = 'skipped'; } var specDiv = this.createDom('div', { className: 'spec ' + status }, this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(spec.getFullName()), title: spec.getFullName() }, spec.description)); var resultItems = results.getItems(); var messagesDiv = this.createDom('div', { className: 'messages' }); for (var i = 0; i < resultItems.length; i++) { var result = resultItems[i]; if (result.type == 'log') { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); } else if (result.type == 'expect' && result.passed && !result.passed()) { messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); if (result.trace.stack) { messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); } } } if (messagesDiv.childNodes.length > 0) { specDiv.appendChild(messagesDiv); } this.suiteDivs[spec.suite.id].appendChild(specDiv); }; jasmine.TrivialReporter.prototype.log = function() { var console = jasmine.getGlobal().console; if (console && console.log) { if (console.log.apply) { console.log.apply(console, arguments); } else { console.log(arguments); // ie fix: console.log.apply doesn't exist on ie } } }; jasmine.TrivialReporter.prototype.getLocation = function() { return this.document.location; }; jasmine.TrivialReporter.prototype.specFilter = function(spec) { var paramMap = {}; var params = this.getLocation().search.substring(1).split('&'); for (var i = 0; i < params.length; i++) { var p = params[i].split('='); paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); } if (!paramMap.spec) { return true; } return spec.getFullName().indexOf(paramMap.spec) === 0; }; cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/html/HtmlReporter.js0000644000015000001560000000523412272510571026671 0ustar pbuserpbgroup00000000000000jasmine.HtmlReporter = function(_doc) { var self = this; var doc = _doc || window.document; var reporterView; var dom = {}; // Jasmine Reporter Public Interface self.logRunningSpecs = false; self.reportRunnerStarting = function(runner) { var specs = runner.specs() || []; if (specs.length == 0) { return; } createReporterDom(runner.env.versionString()); doc.body.appendChild(dom.reporter); reporterView = new jasmine.HtmlReporter.ReporterView(dom); reporterView.addSpecs(specs, self.specFilter); }; self.reportRunnerResults = function(runner) { reporterView && reporterView.complete(); }; self.reportSuiteResults = function(suite) { reporterView.suiteComplete(suite); }; self.reportSpecStarting = function(spec) { if (self.logRunningSpecs) { self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); } }; self.reportSpecResults = function(spec) { reporterView.specComplete(spec); }; self.log = function() { var console = jasmine.getGlobal().console; if (console && console.log) { if (console.log.apply) { console.log.apply(console, arguments); } else { console.log(arguments); // ie fix: console.log.apply doesn't exist on ie } } }; self.specFilter = function(spec) { if (!focusedSpecName()) { return true; } return spec.getFullName().indexOf(focusedSpecName()) === 0; }; return self; function focusedSpecName() { var specName; (function memoizeFocusedSpec() { if (specName) { return; } var paramMap = []; var params = doc.location.search.substring(1).split('&'); for (var i = 0; i < params.length; i++) { var p = params[i].split('='); paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); } specName = paramMap.spec; })(); return specName; } function createReporterDom(version) { dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, dom.banner = self.createDom('div', { className: 'banner' }, self.createDom('span', { className: 'title' }, "Jasmine "), self.createDom('span', { className: 'version' }, version)), dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), dom.alert = self.createDom('div', {className: 'alert'}), dom.results = self.createDom('div', {className: 'results'}, dom.summary = self.createDom('div', { className: 'summary' }), dom.details = self.createDom('div', { id: 'details' })) ); } }; jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter); cordova-ubuntu-tests-2.11+14.04.20140130.3/www/autotest/test-runner.js0000644000015000001560000000675412272510571025574 0ustar pbuserpbgroup00000000000000/* * * 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. * */ if (window.sessionStorage != null) { window.sessionStorage.clear(); } // Timeout is 2 seconds to allow physical devices enough // time to query the response. This is important for some // Android devices. var Tests = function() {}; Tests.TEST_TIMEOUT = 7500; // Creates a spy that will fail if called. function createDoNotCallSpy(name, opt_extraMessage) { return jasmine.createSpy().andCallFake(function() { var errorMessage = name + ' should not have been called.'; if (arguments.length) { errorMessage += ' Got args: ' + JSON.stringify(arguments); } if (opt_extraMessage) { errorMessage += '\n' + opt_extraMessage; } expect(false).toBe(true, errorMessage); }); } // Waits for any of the given spys to be called. // Last param may be a custom timeout duration. function waitsForAny() { var spys = [].slice.call(arguments); var timeout = Tests.TEST_TIMEOUT; if (typeof spys[spys.length - 1] == 'number') { timeout = spys.pop(); } waitsFor(function() { for (var i = 0; i < spys.length; ++i) { if (spys[i].wasCalled) { return true; } } return false; }, "Expecting callbacks to be called.", timeout); } // Expects session storage to be available and executes the tests var root, temp_root, persistent_root; document.addEventListener('deviceready', function () { // one-time retrieval of the root file system entry var onError = function(e) { console.log('[ERROR] Problem setting up root filesystem for test running! Error to follow.'); console.log(JSON.stringify(e)); }; window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) { console.log('File API test Init: Setting PERSISTENT FS.'); root = fileSystem.root; // set in file.tests.js persistent_root = root; // Once root is set up, fire off tests var jasmineEnv = jasmine.getEnv(); jasmineEnv.updateInterval = 1000; var htmlReporter = new jasmine.HtmlReporter(); var jUnitXmlReporter = new jasmine.JUnitXmlReporter(); jasmineEnv.addReporter(htmlReporter); jasmineEnv.addReporter(jUnitXmlReporter); jasmineEnv.specFilter = function(spec) { return htmlReporter.specFilter(spec); }; jasmineEnv.execute(); }, onError); window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, function(fileSystem) { console.log('File API test Init: Setting TEMPORARY FS.'); temp_root = fileSystem.root; // set in file.tests.js }, onError); }, false);cordova-ubuntu-tests-2.11+14.04.20140130.3/www/config.xml0000644000015000001560000000114612272510571023055 0ustar pbuserpbgroup00000000000000 mobilespec Cordova test suite. cordova-ubuntu-tests-2.11+14.04.20140130.3/www/compass/0000755000015000001560000000000012272510677022540 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/www/compass/index.html0000644000015000001560000001107212272510571024527 0ustar pbuserpbgroup00000000000000 Cordova Mobile Spec

Compass

Status: Stopped
Heading:

Action

Get Compass
Start Watching Compass
Stop Watching Compass

Back
cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/0000755000015000001560000000000012272510677021411 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/0000755000015000001560000000000012272510677023431 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/cordova_ubuntu/0000755000015000001560000000000012272510677026470 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/cordova_ubuntu/__init__.py0000644000015000001560000000055412272510571030576 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """ Cordova Ubuntu Autopilot tests and emulators - Top level package. """ cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/cordova_ubuntu/tests/0000755000015000001560000000000012272510677027632 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/cordova_ubuntu/tests/__init__.py0000644000015000001560000000737212272510571031745 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. """ Cordova Ubuntu Autopilot Test Base Class. """ import os import os.path import subprocess from xml.dom import minidom from testtools.matchers import Contains, Equals from autopilot.input import Mouse, Touch, Pointer from autopilot.matchers import Eventually from autopilot.platform import model from autopilot.testcase import AutopilotTestCase class CordovaUbuntuTestCase(AutopilotTestCase): """ Base class for Cordova Ubuntu Test Cases """ pointer = Pointer(Touch.create()) LOCAL_CORDOVA_CONTAINER_PATH = os.path.abspath("%s/%s" % (os.path.dirname(os.path.realpath(__file__)), '../../tools/qml/main-local.qml')) INSTALLED_CORDOVA_CONTAINER_PATH = '/usr/share/cordova-ubuntu-tests/autopilot-tests/qml/main.qml' arch = subprocess.check_output(["dpkg-architecture", "-qDEB_HOST_MULTIARCH"]).strip() QML_LAUNCHER = "/usr/lib/" + arch + "/qt5/bin/qmlscene" PERSISTENT_PATH= os.path.join(os.environ['HOME'], '.local/share/cordova-ubuntu/persistent/L3Vzci9zaGFyZS9jb3Jkb3ZhLXVidW50dS10ZXN0cy9jb3Jkb3ZhbW9iaWxlc3BlYy93d3c=/') LOCAL_PERSISTENT_PATH= os.path.join(os.environ['HOME'], '.local/share/cordova-ubuntu/persistent/L2hvbWUvdnJydWl6L3dlYmFwcHMvbHAvY29yZG92YS11YnVudHUtdGVzdHMvd3d3') def get_cordova_container_path(self): if (os.path.exists(self.LOCAL_CORDOVA_CONTAINER_PATH)): return self.LOCAL_CORDOVA_CONTAINER_PATH return self.INSTALLED_CORDOVA_CONTAINER_PATH def get_persistent_path(self): if (os.path.exists(self.LOCAL_CORDOVA_CONTAINER_PATH)): return self.LOCAL_PERSISTENT_PATH return self.PERSISTENT_PATH def setUp(self): params = [self.QML_LAUNCHER, self.get_cordova_container_path()] if (model() != 'Desktop'): params.append('--desktop_file_hint=/usr/share/applications/cordova-ubuntu-tests.desktop') self.app = self.launch_test_application( *params, app_type='qt') print(params) super(CordovaUbuntuTestCase, self).setUp() def tearDown(self): super(CordovaUbuntuTestCase, self).tearDown() # Twiddle the mouse to keep the screen awake during testing. self.pointer.move(150,150) self.pointer.click() def pick_app_launcher(self, app_path): """ Force Qt app introspection """ from autopilot.introspection.qt import QtApplicationLauncher return QtApplicationLauncher() def get_cordovaview(self): return self.app.select_single(objectName="cordovaView") def get_webview(self): return self.app.select_single(objectName="webView") def get_junitxml_path(self, junitxml_filename): """ Return the absolute path of a JUnit XML file """ return os.path.join(self.get_persistent_path(), junitxml_filename) def junitxml_remove(self, junitxml_filename): """ Remove, if exists the JUnit XML file """ file_path = self.get_junitxml_path(junitxml_filename) if (os.path.exists(file_path)): os.unlink(file_path) def assert_junitxml_failures(self, junitxml_filename): """ Open a JUnit XML file and search errors """ file_path = self.get_junitxml_path(junitxml_filename) self.assertThat(os.path.exists(file_path), Equals(True)) xml = minidom.parse(file_path) testsuites = xml.getElementsByTagName('testsuite') for testsuite in testsuites: failures = testsuite.attributes['failures'] self.assertThat(failures.value, Equals('0')) cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/cordova_ubuntu/tests/test_mobilespec.py0000644000015000001560000001223212272510571033356 0ustar pbuserpbgroup00000000000000# -*- coding: utf-8 -*- # # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. from __future__ import absolute_import import signal, subprocess from testtools.matchers import Equals from autopilot.matchers import Eventually from cordova_ubuntu.tests import CordovaUbuntuTestCase from unittest import skipIf from time import sleep class Alarm(Exception): pass def alarm_handler(signum, frame): raise Alarm ARCH = subprocess.check_output('uname -p', shell=True).lower() TIMEOUT = 120 class TestMobileSpec(CordovaUbuntuTestCase): def run_mobilespec(self, test_page='all', junitxml_file=''): """ Executes Cordova to run a Mobile Spec Suite's automated test """ sleep(1) if (junitxml_file): self.junitxml_remove(junitxml_file) web_view = self.get_webview() self.assertThat(web_view.loadProgress, Eventually(Equals(100))) # Click on "Automated tests" (index.html) web_view.slots.evalInPageUnsafe('document.getElementById("__automated").click();') self.assertThat(web_view.loadProgress, Eventually(Equals(100))) # Click on test (autotest/index.html) web_view.slots.evalInPageUnsafe('document.evaluate(\'//a[contains(@href, "%s.html")]\', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();' % test_page) self.assertThat(web_view.loadProgress, Eventually(Equals(100))) # Wait until finished (autotest/pages/all.html) web_view.slots.evalInPageUnsafe("document.addEventListener('junitxml-finished', function (e) { setTimeout(navigator.app.closeApp, 1000); }, false);") # Detect window closed signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(TIMEOUT) # Setup timeout finished = False try: while (self.app.process.poll() is None): # Process still running, sleep a bit signal.alarm(0) finished = True if (junitxml_file): self.assert_junitxml_failures(junitxml_file) except Alarm: # Timeout reached pass self.assertThat(finished, Equals(True)) @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_accelerometer(self): self.run_mobilespec('accelerometer', 'TEST-Accelerometernavigatoraccelerometer.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_battery(self): self.run_mobilespec('battery', 'TEST-Batterynavigatorbattery.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_camera(self): self.run_mobilespec('camera', 'TEST-CameraConstantswindowCameranavigatorcamera.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_capture(self): self.run_mobilespec('capture', 'TEST-Capturenavigatordevicecapture.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_compass(self): self.run_mobilespec('compass', 'TEST-Compassnavigatorcompass.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_contacts(self): self.run_mobilespec('contacts', 'TEST-Contactsnavigatorcontacts.xml') def test_datauri(self): self.run_mobilespec('datauri', 'TEST-datauris.xml') def test_device(self): self.run_mobilespec('device', 'TEST-DeviceInformationwindowdevice.xml') def test_file(self): self.run_mobilespec('file', 'TEST-FileAPI.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_filetransfer(self): self.run_mobilespec('filetransfer', 'TEST-FileTransfer.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_geolocation(self): self.run_mobilespec('geolocation', 'TEST-Geolocationnavigatorgeolocation.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_globalization(self): self.run_mobilespec('globalization', 'TEST-Globalizationnavigatorglobalization.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_media(self): self.run_mobilespec('media', 'TEST-Media.xml') def test_network(self): self.run_mobilespec('network', 'TEST-Networknavigatorconnection.xml') def test_notification(self): self.run_mobilespec('notification', 'TEST-Notificationnavigatornotification.xml') def test_platform(self): self.run_mobilespec('platform', 'TEST-Platformcordova.xml') def test_storage(self): self.run_mobilespec('storage', 'TEST-SessionStorage.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_bridge(self): self.run_mobilespec('bridge', 'TEST-bridge.xml') def test_splashscreen(self): self.run_mobilespec('splashscreen', 'TEST-Splashscreencordova.xml') @skipIf('arm' in ARCH, 'This feature not yet supported on ARM.') def test_whitelist(self): self.run_mobilespec('whitelist', 'TEST-whitelist.xml') cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/setup.py0000644000015000001560000000113212272510571025131 0ustar pbuserpbgroup00000000000000#!/usr/bin/python # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. from distutils.core import setup from setuptools import find_packages setup( name='cordova-ubuntu-autopilot', version='0.1', description='Cordova Ubuntu Autopilot Tests.', url='https://launchpad.net/cordova-ubuntu-tests', license='GPLv3', packages=find_packages(), ) cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/tools/0000755000015000001560000000000012272510677024571 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/tools/qml/0000755000015000001560000000000012272510677025362 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/tools/qml/main.qml0000644000015000001560000000032612272510571027013 0ustar pbuserpbgroup00000000000000import QtQuick 2.0 import CordovaUbuntu 2.8 CordovaView { id: cordovaView objectName: "cordovaView" width: 640 height: 640 wwwDir: '/usr/share/cordova-ubuntu-tests/cordovamobilespec/www/' } cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/tools/qml/main-local.qml0000644000015000001560000000025212272510571030101 0ustar pbuserpbgroup00000000000000import QtQuick 2.0 import CordovaUbuntu 2.8 CordovaView { id: cordovaView objectName: "cordovaView" width: 640 height: 640 wwwDir: '../../www/' } cordova-ubuntu-tests-2.11+14.04.20140130.3/tests/autopilot/tools/qml/CordovaView.qml0000644000015000001560000000142012272510571030313 0ustar pbuserpbgroup00000000000000import QtQuick 2.0 import CordovaUbuntu 2.8 Item { id: root property string wwwDir Cordova { id: cordova wwwDir: root.wwwDir } Image { id: splashscreen anchors.fill: parent } Loader { id: loader asynchronous: true visible: false anchors.fill: parent onLoaded: { cordova.parent = loader.item loader.item.completed.connect(function(){ loader.item.visible = true loader.visible = true splashscreen.visible = false }); } } Component.onCompleted: { splashscreen.source = cordova.getSplashscreenPath(cordova, root.wwwDir) loader.source = "CordovaViewInternal.qml" } } cordova-ubuntu-tests-2.11+14.04.20140130.3/cordova-ubuntu-tests.desktop0000644000015000001560000000044512272510571025753 0ustar pbuserpbgroup00000000000000[Desktop Entry] Name=cordova-ubuntu-tests Type=Application Exec=/usr/bin/cordova-ubuntu-2.8 /usr/share/cordova-ubuntu-tests/cordovamobilespec/www/ --desktop_file_hint=/usr/share/applications/cordova-ubuntu-tests.desktop Icon=/usr/share/cordova-ubuntu-tests/cordovaqt64.png X-Ubuntu-Touch=true cordova-ubuntu-tests-2.11+14.04.20140130.3/CMakeLists.txt0000644000015000001560000000113412272510571022777 0ustar pbuserpbgroup00000000000000cmake_minimum_required(VERSION 2.8.8) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}") project(cordova-ubuntu-tests) install (DIRECTORY ${CMAKE_SOURCE_DIR}/www DESTINATION share/cordova-ubuntu-tests/cordovamobilespec) install (FILES ${CMAKE_SOURCE_DIR}/cordova-ubuntu-tests.desktop DESTINATION share/applications/) install (FILES ${CMAKE_SOURCE_DIR}/cordovaqt64.png DESTINATION share/cordova-ubuntu-tests) add_custom_target(autopilot ALL COMMAND cd $(CMAKE_SOURCE_DIR)/tests/autopilot && python setup.py install --root=$(CMAKE_SOURCE_DIR)/debian/tmp/ --install-layout=deb) cordova-ubuntu-tests-2.11+14.04.20140130.3/COPYING0000644000015000001560000002613612272510571021303 0ustar pbuserpbgroup00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed 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. cordova-ubuntu-tests-2.11+14.04.20140130.3/.pc/0000755000015000001560000000000012272510677020727 5ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/.pc/applied-patches0000644000015000001560000000000012272510571023674 0ustar pbuserpbgroup00000000000000cordova-ubuntu-tests-2.11+14.04.20140130.3/.pc/.quilt_series0000644000015000001560000000000712272510571023426 0ustar pbuserpbgroup00000000000000series cordova-ubuntu-tests-2.11+14.04.20140130.3/.pc/.version0000644000015000001560000000000212272510571022376 0ustar pbuserpbgroup000000000000002 cordova-ubuntu-tests-2.11+14.04.20140130.3/.pc/.quilt_patches0000644000015000001560000000001712272510571023564 0ustar pbuserpbgroup00000000000000debian/patches cordova-ubuntu-tests-2.11+14.04.20140130.3/cordovaqt64.png0000644000015000001560000001302112272510571023117 0ustar pbuserpbgroup00000000000000PNG  IHDR@@iqsRGBbKGD pHYs B(xtIME  ;5IDATx[{dW]~gtfvgvwaBleǹKD "!'A~Mg "r ӣ n Mh ~0FI,5 )(wF!"qA9-"Cԝv6~ھ ])˿(YEd/5lvͷ}܅[n%"G+`F 2煲FeSX˽$xdx~hc|%[owsy-"oD\衃?cfYz2ߐdnG63'E6 puNhDծ.L8΍^v$)% `zY=;y YЗt,`K¾G ' $xǬ RKwwKa'!hߤsJ9`)9'J)zpu8n;kt@ WW]s tLВfݞ={e k,ѣǼÇeS'|̌A&&)$a$LLZ&[I"33X_Еj}K%߷Q*7"`2vO^=Sev&r4c%J`w/r#"*LЭV I$Ij5$jZH ?|3{zz[jy_}j}[$M@T*q, h$Ν;l.a m(uEhrwUmwURnؿR4HHDsIs#]v:S+8v?jG[OO4y@ MbŲ/IR/jIdJ7zMNNj۶aF]BNK!='ozBg]C!H*|/|ySzj]0zf s0-[yy(lٺ[nÇ!A|ļdӹ%n+_YcZkuZ(摏bݓRA C&ie{"00J. PeHbM$Kpw.TsJR,|Rg68I~ժ!IBv}`2L^LNNBX&h(@EvW0 C! `Ⱦǒ(E!0BXc#?Z+ZtΆ!$`&ڋ|S U:a%J5nDS;q%k!l͔RŖq=m3A9EƕjD@Sm@_@~>^S)ՊhZN՞vAH0t)ɴW 5,\e l㐜{UXZ,%qgDz}9109?[o@_ߦ78gcGM7{IEqI97&f, :7gp@0Rڽbc-^x52' &"\<%)FaXU'ȑIYDQf8rxK^q+̼ yB1/Ȉu?.ue6o `ûXb3ֺR~nYe%w8*:YXB.ZkeV0m?;|!9XFi2y"dE%\,c SP*^XXxww{)"~ H'0Q%*^g@ŨV,>Ju΅4EJw]|ghN\ VZI%J;o%IFI[IT,( 3\ ؑl Y(驩P \xiK}IRcm`p$3-c3{>/ gs~$OvmDd̜۵kםǎUtnI "t1Ơ(:QDw3O۪H=˯ K9EdȌf} IFFO ԖޢbG?ruw/ϫ"6?}q5Yf2c-LfPJ_L>88gs.+EDH۳,i;nĭ~4lx~EQA<_uYp]B`35[=Zr O ;OyA$/XgQVvROߏfs-]ͦ4[NU/ WJ]TT.}M"K<ľA")"-l>v1MFPptjxQw2jb !Ζֺѱ圃u9 PɁbGm>fV޼]$In2S$EAEf$"f&p8FNkd5dFmZOD"3, lٺODZH}Mn pm#qǵɜ9us."ι_4&CdY,ggfY:ʌ&ckg]s;uރHS;v씏}شyr3"NxZ PJ4Z{L5MY"MSdY4~9;vܚԘTԌzQeXh6Ѫ:l]+z)(@~`$k( [)(%4 BQe9YĥB̀L & y#^^i1V 'N@޿s+qLc~~i9mۢ(=Z, 20 oLYELQ *P/%9JiqbǎW;O](0S>dPTP;lE_v_܉,3Gɋ6 H}Z{ei}k_yޗ hX4e&-. I9msE4M 7"ؿcc$BZEZELj+q۶y硷#h,0tY#B9ъg }$_E@k22eH4Os4Yl=1|/9@vN _p>.ǰmp(BRA\ ]]]О΃(Qо={>Cx c_/O̺*%ptуr*R{@\/GHE@F'p&D$cFVM (!y%kؾж۔Ro l7щ=CHU@*r8}uć]Ӡ- >61>?