You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by bo...@apache.org on 2012/03/23 23:01:16 UTC

[10/17] Adding the tests from the GitHub Prototype

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/accelerometer.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/accelerometer.tests.js b/test/assets/www/autotest/tests/accelerometer.tests.js
new file mode 100644
index 0000000..a99d459
--- /dev/null
+++ b/test/assets/www/autotest/tests/accelerometer.tests.js
@@ -0,0 +1,55 @@
+Tests.prototype.AccelerometerTests = function() {
+	module('Accelerometer (navigator.accelerometer)');
+	test("should exist", function() {
+  		expect(1);
+  		ok(navigator.accelerometer != null, "navigator.accelerometer should not be null.");
+	});
+	test("should contain a getCurrentAcceleration function", function() {
+		expect(2);
+		ok(typeof navigator.accelerometer.getCurrentAcceleration != 'undefined' && navigator.accelerometer.getCurrentAcceleration != null, "navigator.accelerometer.getCurrentAcceleration should not be null.");
+		ok(typeof navigator.accelerometer.getCurrentAcceleration == 'function', "navigator.accelerometer.getCurrentAcceleration should be a function.");
+	});
+	test("getCurrentAcceleration success callback should be called with an Acceleration object", function() {
+		expect(7);
+		QUnit.stop(Tests.TEST_TIMEOUT);
+		var win = function(a) {
+			ok(typeof a == 'object', "Acceleration object returned in getCurrentAcceleration success callback should be of type 'object'.");
+			ok(a.x != null, "Acceleration object returned in getCurrentAcceleration success callback should have an 'x' property.");
+			ok(typeof a.x == 'number', "Acceleration object's 'x' property returned in getCurrentAcceleration success callback should be of type 'number'.");
+			ok(a.y != null, "Acceleration object returned in getCurrentAcceleration success callback should have a 'y' property.");
+			ok(typeof a.y == 'number', "Acceleration object's 'y' property returned in getCurrentAcceleration success callback should be of type 'number'.");
+			ok(a.z != null, "Acceleration object returned in getCurrentAcceleration success callback should have a 'z' property.");
+			ok(typeof a.z == 'number', "Acceleration object's 'z' property returned in getCurrentAcceleration success callback should be of type 'number'.");
+			start();
+		};
+		var fail = function() { start(); };
+		navigator.accelerometer.getCurrentAcceleration(win, fail);
+	});
+	test("should contain a watchAcceleration function", function() {
+		expect(2);
+		ok(typeof navigator.accelerometer.watchAcceleration != 'undefined' && navigator.accelerometer.watchAcceleration != null, "navigator.accelerometer.watchAcceleration should not be null.");
+		ok(typeof navigator.accelerometer.watchAcceleration == 'function', "navigator.accelerometer.watchAcceleration should be a function.");
+	});
+	test("should contain a clearWatch function", function() {
+		expect(2);
+		ok(typeof navigator.accelerometer.clearWatch != 'undefined' && navigator.accelerometer.clearWatch != null, "navigator.accelerometer.clearWatch should not be null.");
+		ok(typeof navigator.accelerometer.clearWatch == 'function', "navigator.accelerometer.clearWatch should be a function!");
+	});
+	module('Acceleration model');
+	test("should be able to define a new Acceleration object with x, y, z and timestamp properties.", function () {
+		expect(9);
+		var x = 1;
+		var y = 2;
+		var z = 3;
+		var a = new Acceleration(x, y, z);
+		ok(a != null, "new Acceleration object should not be null.");
+		ok(typeof a == 'object', "new Acceleration object should be of type 'object'.");
+		ok(a.x != null, "new Acceleration object should have an 'x' property.");
+		equals(a.x, x, "new Acceleration object should have 'x' property equal to first parameter passed in Acceleration constructor.");
+		ok(a.y != null, "new Acceleration object should have a 'y' property.");
+		equals(a.y, y, "new Acceleration object should have 'y' property equal to second parameter passed in Acceleration constructor.");
+		ok(a.z != null, "new Acceleration object should have a 'z' property.");
+		equals(a.z, z, "new Acceleration object should have 'z' property equal to third parameter passed in Acceleration constructor.");
+		ok(a.timestamp != null, "new Acceleration object should have a 'timestamp' property.");
+	});
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/battery.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/battery.tests.js b/test/assets/www/autotest/tests/battery.tests.js
new file mode 100644
index 0000000..bce3079
--- /dev/null
+++ b/test/assets/www/autotest/tests/battery.tests.js
@@ -0,0 +1,18 @@
+Tests.prototype.BatteryTests = function() {  
+    module('Battery (navigator.battery)');
+    test("should exist", function() {
+        expect(1);
+        ok(navigator.battery != null, "navigator.battery should not be null.");
+    });
+    /**
+     * Tests add for Battery Status API spec
+     * http://www.w3.org/TR/2011/WD-battery-status-20111129/
+     */
+    test("should have properties", function() {
+        expect(4);
+        ok(typeof navigator.battery.charging != 'undefined' && navigator.battery.charging != null, "navigator.battery.charging should be a boolean value.");
+        ok(typeof navigator.battery.chargingTime != 'undefined' && navigator.battery.chargingTime != null, "navigator.battery.chargingTime should be a double value.");
+        ok(typeof navigator.battery.level != 'undefined' && navigator.battery.level != null, "navigator.battery.level should be a double value.");
+        ok(typeof navigator.battery.dischargingTime != 'undefined' && navigator.battery.dischargingTime != null, "navigator.battery.dischargingTime should be a double value.");
+    });
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/camera.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/camera.tests.js b/test/assets/www/autotest/tests/camera.tests.js
new file mode 100644
index 0000000..c52b7f5
--- /dev/null
+++ b/test/assets/www/autotest/tests/camera.tests.js
@@ -0,0 +1,40 @@
+Tests.prototype.CameraTests = function() {	
+	module('Camera (navigator.camera)');
+	test("should exist", function() {
+      expect(1);
+      ok(navigator.camera !== null, "navigator.camera should not be null.");
+	});
+	test("should contain a getPicture function", function() {
+		expect(2);
+		ok(typeof navigator.camera.getPicture != 'undefined' && navigator.camera.getPicture !== null, "navigator.camera.getPicture should not be null.");
+		ok(typeof navigator.camera.getPicture == 'function', "navigator.camera.getPicture should be a function.");
+	});
+
+  module('Camera Constants (window.Camera)');
+  test("should exist", function() {
+    expect(1);
+    ok(window.Camera !== null, "window.Camera should not be null.");
+  });
+  test("should contain two DestinationType constants", function() {
+    expect(2);
+    equals(Camera.DestinationType.DATA_URL, 0, "DestinationType.DATA_URL should equal to 0");
+    equals(Camera.DestinationType.FILE_URI, 1, "DestinationType.DATA_URL should equal to 1");
+  });
+  test("should contain two EncodingType constants", function() {
+    expect(2);
+    equals(Camera.EncodingType.JPEG, 0, "EncodingType.JPEG should equal to 0");
+    equals(Camera.EncodingType.PNG, 1, "EncodingType.PNG should equal to 1");
+  });
+  test("should contain three MediaType constants", function() {
+    expect(3);
+    equals(Camera.MediaType.PICTURE, 0, 'MediaType.PICTURE should equal to 0');
+    equals(Camera.MediaType.VIDEO, 1, 'MediaType.VIDEO should equal to 1');
+    equals(Camera.MediaType.ALLMEDIA, 2, 'MediaType.ALLMEDIA should equal to 2');
+  });
+  test("should contain three PictureSourceType constants", function() {
+    expect(3);
+    equals(Camera.PictureSourceType.PHOTOLIBRARY, 0, 'PictureSourceType.PHOTOLIBRARY should equal to 0');
+    equals(Camera.PictureSourceType.CAMERA, 1, 'PictureSourceType.CAMERA should equal to 1');
+    equals(Camera.PictureSourceType.SAVEDPHOTOALBUM, 2, 'PictureSourceType.SAVEDPHOTOALBUM should equal to 2');
+  });
+};

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/capture.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/capture.tests.js b/test/assets/www/autotest/tests/capture.tests.js
new file mode 100644
index 0000000..746b6f9
--- /dev/null
+++ b/test/assets/www/autotest/tests/capture.tests.js
@@ -0,0 +1,97 @@
+Tests.prototype.CaptureTests = function() {  
+    module('Capture (navigator.device.capture)');
+    test("should exist", function() {
+        expect(2);
+        ok(navigator.device !== null, "navigator.device should not be null.");
+        ok(navigator.device.capture !== null, "navigator.device.capture should not be null.");
+    });
+    test("should have the correct properties ", function() {
+        expect(3);
+        ok(typeof navigator.device.capture.supportedAudioModes != 'undefined' && navigator.device.capture.supportedAudioModes !== null , "there should be a supported audio modes property");
+        ok(typeof navigator.device.capture.supportedImageModes != 'undefined' && navigator.device.capture.supportedImageModes !== null , "there should be a supported image modes property");
+        ok(typeof navigator.device.capture.supportedVideoModes != 'undefined' && navigator.device.capture.supportedVideoModes !== null , "there should be a supported video modes property");
+    });
+    test("should contain a captureAudio function", function() {
+        expect(2);
+        ok(typeof navigator.device.capture.captureAudio != 'undefined' && navigator.device.capture.captureAudio !== null, "navigator.device.capture.captureAudio should not be null.");
+        ok(typeof navigator.device.capture.captureAudio == 'function', "navigator.device.capture.captureAudio should be a function.");
+    });
+    test("should contain a captureImage function", function() {
+        expect(2);
+        ok(typeof navigator.device.capture.captureImage != 'undefined' && navigator.device.capture.captureImage !== null, "navigator.device.capture.captureImage should not be null.");
+        ok(typeof navigator.device.capture.captureImage == 'function', "navigator.device.capture.captureImage should be a function.");
+    });
+    test("should contain a captureVideo function", function() {
+        expect(2);
+        ok(typeof navigator.device.capture.captureVideo != 'undefined' && navigator.device.capture.captureVideo !== null, "navigator.device.capture.captureVideo should not be null.");
+        ok(typeof navigator.device.capture.captureVideo == 'function', "navigator.device.capture.captureVideo should be a function.");
+    });
+
+    module('CaptureAudioOptions');
+    test("CaptureAudioOptions constructor should exist", function() {
+        expect(4);
+        var options = new CaptureAudioOptions();
+        ok(options !== null, "CaptureAudioOptions object should not be null.");
+        ok(typeof options.limit !== 'undefined', "CaptureAudioOptions object should have a 'limit' property.");
+        ok(typeof options.duration !== 'undefined', "CaptureAudioOptions object should have a 'duration' property.");
+        ok(typeof options.mode !== 'undefined', "CaptureAudioOptions object should have a 'mode' property.");
+    });
+
+    module('CaptureImageOptions');
+    test("CaptureImageOptions constructor should exist", function() {
+        expect(3);
+        var options = new CaptureImageOptions();
+        ok(options !== null, "CaptureImageOptions object should not be null.");
+        ok(typeof options.limit !== 'undefined', "CaptureImageOptions object should have a 'limit' property.");
+        ok(typeof options.mode !== 'undefined', "CaptureImageOptions object should have a 'mode' property.");
+    });
+
+    module('CaptureVideoOptions');
+    test("CaptureVideoOptions constructor should exist", function() {
+        expect(4);
+        var options = new CaptureVideoOptions();
+        ok(options !== null, "CaptureVideoOptions object should not be null.");
+        ok(typeof options.limit !== 'undefined', "CaptureVideoOptions object should have a 'limit' property.");
+        ok(typeof options.duration !== 'undefined', "CaptureVideoOptions object should have a 'duration' property.");
+        ok(typeof options.mode !== 'undefined', "CaptureVideoOptions object should have a 'mode' property.");
+    });
+
+    module('CaptureError interface');
+    test("CaptureError constants should be defined", function() {
+        expect(4);
+        equal(CaptureError.CAPTURE_INTERNAL_ERR, 0, "CaptureError.CAPTURE_INTERNAL_ERR should be defined");
+        equal(CaptureError.CAPTURE_APPLICATION_BUSY, 1, "CaptureError.CAPTURE_APPLICATION_BUSY should be defined");
+        equal(CaptureError.CAPTURE_INVALID_ARGUMENT, 2, "CaptureError.CAPTURE_INVALID_ARGUMENT should be defined");
+        equal(CaptureError.CAPTURE_NO_MEDIA_FILES, 3, "CaptureError.CAPTURE_NO_MEDIA_FILES should be defined");
+    });
+    test("CaptureError properties should exist", function() {
+        expect(2);
+        var error = new CaptureError();
+        ok(error !== null, "CaptureError object should not be null.");
+        ok(typeof error.code !== 'undefined', "CaptureError object should have a 'code' property.");
+    });
+
+    module('MediaFileData');
+    test("MediaFileData constructor should exist", function() {
+        expect(6);
+        var fileData = new MediaFileData();
+        ok(fileData !== null, "MediaFileData object should not be null.");
+        ok(typeof fileData.bitrate !== 'undefined', "MediaFileData object should have a 'bitrate' property.");
+        ok(typeof fileData.codecs !== 'undefined', "MediaFileData object should have a 'codecs' property.");
+        ok(typeof fileData.duration !== 'undefined', "MediaFileData object should have a 'duration' property.");
+        ok(typeof fileData.height !== 'undefined', "MediaFileData object should have a 'height' property.");
+        ok(typeof fileData.width !== 'undefined', "MediaFileData object should have a 'width' property.");
+    });
+
+    module('MediaFile');
+    test("MediaFile constructor should exist", function() {
+        expect(6);
+        var fileData = new MediaFileData();
+        ok(fileData !== null, "MediaFileData object should not be null.");
+        ok(typeof fileData.name !== 'undefined', "MediaFile object should have a 'name' property.");
+        ok(typeof fileData.fullPath !== 'undefined', "MediaFile object should have a 'fullPath' property.");
+        ok(typeof fileData.type !== 'undefined', "MediaFile object should have a 'type' property.");
+        ok(typeof fileData.lastModifiedDate !== 'undefined', "MediaFile object should have a 'lastModifiedDate' property.");
+        ok(typeof fileData.size !== 'undefined', "MediaFile object should have a 'size' property.");
+    });
+};

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/compass.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/compass.tests.js b/test/assets/www/autotest/tests/compass.tests.js
new file mode 100644
index 0000000..e0b1fa6
--- /dev/null
+++ b/test/assets/www/autotest/tests/compass.tests.js
@@ -0,0 +1,62 @@
+Tests.prototype.CompassTests = function() {
+  module('Compass (navigator.compass)');
+	test("should exist", function() {
+      expect(1);
+      ok(navigator.compass !== null, "navigator.compass should not be null.");
+	});
+	test("should contain a getCurrentHeading function", function() {
+		expect(2);
+		ok(typeof navigator.compass.getCurrentHeading != 'undefined' && navigator.compass.getCurrentHeading !== null, "navigator.compass.getCurrentHeading should not be null.");
+		ok(typeof navigator.compass.getCurrentHeading == 'function', "navigator.compass.getCurrentHeading should be a function.");
+	});
+	test("getCurrentHeading success callback should be called with a Heading object", function() {
+		expect(9);
+		QUnit.stop(Tests.TEST_TIMEOUT);
+		var win = function(a) {
+			ok(typeof a == 'object', "Heading object returned in getCurrentHeading success callback should be of type 'object'.");
+			ok(a.magneticHeading !== null, "Heading object returned in getCurrentHeading success callback should have an 'magneticHeading' property.");
+			ok(typeof a.magneticHeading == 'number', "Heading object's 'magneticHeading' property returned in getCurrentHeading success callback should be of type 'number'.");
+			ok(a.trueHeading !== null, "Heading object returned in getCurrentHeading success callback should have a 'trueHeading' property.");
+			ok(typeof a.trueHeading == 'number', "Heading object's 'trueHeading' property returned in getCurrentHeading success callback should be of type 'number'.");
+			ok(a.headingAccuracy !== null, "Heading object returned in getCurrentHeading success callback should have a 'headingAccuracy' property.");
+			ok(typeof a.headingAccuracy == 'number', "Heading object's 'headingAccuracy' property returned in getCurrentHeading success callback should be of type 'number'.");
+			ok(a.timestamp !== null, "Heading object returned in getCurrentHeading success callback should have a 'timestamp' property.");
+			ok(a.timestamp instanceof Date, "Heading object's 'timestamp' property returned in getCurrentHeading success callback should be an instance of Date.");
+			QUnit.start();
+		};
+		var fail = function() { QUnit.start(); };
+		navigator.compass.getCurrentHeading(win, fail);
+	});
+	test("should contain a watchHeading function", function() {
+		expect(2);
+		ok(typeof navigator.compass.watchHeading != 'undefined' && navigator.compass.watchHeading !== null, "navigator.compass.watchHeading should not be null.");
+		ok(typeof navigator.compass.watchHeading == 'function', "navigator.compass.watchHeading should be a function.");
+	});
+	test("should contain a clearWatch function", function() {
+		expect(2);
+		ok(typeof navigator.compass.clearWatch != 'undefined' && navigator.compass.clearWatch !== null, "navigator.compass.clearWatch should not be null.");
+		ok(typeof navigator.compass.clearWatch == 'function', "navigator.compass.clearWatch should be a function!");
+	});
+
+  module('Compass Constants (window.CompassError)');
+  test("CompassError globals should exist", function() {
+    expect(3);
+    ok(window.CompassError !== null, 'window.CompassError should not be null');
+    equals(window.CompassError.COMPASS_INTERNAL_ERR, 0, 'window.CompassError.COMPASS_INTERNAL_ERR should be 0');
+    equals(window.CompassError.COMPASS_NOT_SUPPORTED, 20, 'window.CompassError.COMPASS_NOT_SUPPORTED should be 20');
+  });
+
+  module('Compass Heading model (CompassHeading)');
+  test("CompassHeading function should exist", function() {
+    expect(1);
+    ok(typeof CompassHeading != 'undefined' && CompassHeading !== null, 'CompassHeading should not be null');
+  });
+  test("Creating a new CompassHeading instance", function() {
+    expect(4);
+    var h = new CompassHeading();
+    equals(h.magneticHeading, null, "CompassHeading instance should have null magneticHeading property by default");
+    equals(h.trueHeading, null, "CompassHeading instance should have null trueHeading property by default");
+    equals(h.headingAccuracy, null, "CompassHeading instance should have null headingAccuracy property by default");
+    ok(h.timestamp !== null, "CompassHeading instance should have timestamp that is not null by default");
+  });
+};

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/contacts.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/contacts.tests.js b/test/assets/www/autotest/tests/contacts.tests.js
new file mode 100644
index 0000000..b13eec3
--- /dev/null
+++ b/test/assets/www/autotest/tests/contacts.tests.js
@@ -0,0 +1,219 @@
+Tests.prototype.ContactsTests = function() {
+	module("Contacts (navigator.contacts)");
+	test("should exist", function() {
+  		expect(1);
+  		ok(navigator.contacts != null, "navigator.contacts should not be null.");
+	});	
+	test("should contain a find function", function() {
+		expect(2);
+		ok(typeof navigator.contacts.find != 'undefined' && navigator.contacts.find != null, "navigator.contacts.find should not be null.");
+		ok(typeof navigator.contacts.find == 'function', "navigator.contacts.find should be a function.");
+	});
+    test("contacts.find success callback should be called with an array", function() {
+        expect(2);
+        QUnit.stop(Tests.TEST_TIMEOUT);
+        var win = function(result) {
+            ok(typeof result == 'object', "Object returned in contacts.find success callback is of type 'object' (actually array).");
+            ok(typeof result.length == 'number', "Object returned in contacts.find success callback has a length property which is numerical.");
+            QUnit.start();
+        };
+        var fail = function() { QUnit.start(); };
+        var obj = new ContactFindOptions();
+        obj.filter="";
+        obj.multiple=true;
+        navigator.contacts.find(["displayName", "name", "phoneNumbers", "emails"], win, fail, obj);
+    }); 
+    test("contacts.find success callback should not be null", function() {
+        expect(1);
+        var fail = function() {};
+        var obj = new ContactFindOptions();
+        obj.filter="";
+        obj.multiple=true;
+        try {
+            navigator.contacts.find(["displayName", "name", "emails", "phoneNumbers"], null, fail, obj);
+        } catch(e) {
+            ok(true, "Trying to find with a null success call back should throw TypeError.");
+        }
+    }); 
+    test("contacts.find error callback should be called when no fields are specified", function() {
+        expect(2);
+        QUnit.stop(Tests.TEST_TIMEOUT);
+        var win = function(result) {
+            QUnit.start();
+        };
+        var fail = function(result) { 
+            ok(typeof result == 'object', "Object returned in contact.find failure callback is of type 'object' (actually ContactError).");
+            ok(result.code == ContactError.INVALID_ARGUMENT_ERROR, "Object returned in contacts.find failure callback has a code property which equal to ContactError.INVALID_ARGUMENT_ERROR.");
+            QUnit.start(); 
+        };
+        var obj = new ContactFindOptions();
+        obj.filter="";
+        obj.multiple=true;
+        navigator.contacts.find([], win, fail, obj);
+    }); 
+	test("should contain a create function", function() {
+		expect(2);
+		ok(typeof navigator.contacts.create != 'undefined' && navigator.contacts.create != null, "navigator.contacts.create should not be null.");
+		ok(typeof navigator.contacts.create == 'function', "navigator.contacts.create should be a function.");
+	});
+	test("contacts.create should return a Contact object", function() {
+		expect(9);
+		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"}]});		
+		ok(obj != 'undefined' && obj != null, "navigator.contacts.create should return a Contact object.");
+		ok(obj.displayName == 'test name', "Contact should contain a displayName property.");
+		ok(obj.gender == 'male', "Contact should contain a gender property.");
+		ok(obj.note == 'my note', "Contact should contain a note property.");
+		ok(obj.name.formatted == 'Mr. Test Name', "Contact should contain a name.formatted property.");
+		ok(obj.emails.length == 2, "Contact should contain and array of emails with 2 entries");
+		ok(obj.emails[0].value == 'here@there.com', "Contact.emails[1] should contain a value.");
+		ok(obj.emails[1].value == 'there@here.com', "Contact.emails[2] should contain a value.");	
+		ok(obj.birthday == null, "Contact object should not contain a birthday property.");
+	});
+	module("Contact model");
+	test("should be able to define a Contact object", function() {
+		expect(15);
+		var contact = new Contact("a", "b", new ContactName("a", "b", "c", "d", "e", "f"), "c", [], [], [], [], [], "f", "i",  
+				[], [], []);
+		ok(contact != null, "new Contact() should not be null.");
+		ok(typeof contact.id != 'undefined' && contact.id != null && contact.id == "a", "new Contact() should include a 'id' property.");
+		ok(typeof contact.displayName != 'undefined' && contact.displayName != null && contact.displayName == "b", "new Contact() should include a 'displayName' property.");
+		ok(typeof contact.name != 'undefined' && contact.name != null && contact.name.formatted == "a", "new Contact() should include a 'name' property.");
+		ok(typeof contact.nickname != 'undefined' && contact.nickname != null && contact.nickname == "c", "new Contact() should include a 'nickname' property.");
+		ok(typeof contact.phoneNumbers != 'undefined' && contact.phoneNumbers != null, "new Contact() should include a 'phoneNumbers' property.");
+		ok(typeof contact.emails != 'undefined' && contact.emails != null, "new Contact() should include a 'emails' property.");
+		ok(typeof contact.addresses != 'undefined' && contact.addresses != null, "new Contact() should include a 'addresses' property.");
+		ok(typeof contact.ims != 'undefined' && contact.ims != null, "new Contact() should include a 'ims' property.");
+		ok(typeof contact.organizations != 'undefined' && contact.organizations != null, "new Contact() should include a 'organizations' property.");
+		ok(typeof contact.birthday != 'undefined' && contact.birthday != null && contact.birthday == "f", "new Contact() should include a 'birthday' property.");
+		ok(typeof contact.note != 'undefined' && contact.note != null && contact.note == "i", "new Contact() should include a 'note' property.");
+		ok(typeof contact.photos != 'undefined' && contact.photos != null, "new Contact() should include a 'photos' property.");
+		ok(typeof contact.categories != 'undefined' && contact.categories != null, "new Contact() should include a 'categories' property.");
+		ok(typeof contact.urls != 'undefined' && contact.urls != null, "new Contact() should include a 'urls' property.");
+	});	
+	test("should be able to define a ContactName object", function() {
+		expect(7);
+		var contactName = new ContactName("Dr. First Last Jr.", "Last", "First", "Middle", "Dr.", "Jr.");
+		ok(contactName != null, "new ContactName() should not be null.");
+		ok(typeof contactName.formatted != 'undefined' && contactName.formatted != null && contactName.formatted == "Dr. First Last Jr.", "new ContactName() should include a 'formatted' property.");
+		ok(typeof contactName.familyName != 'undefined' && contactName.familyName != null && contactName.familyName == "Last", "new ContactName() should include a 'familyName' property.");
+		ok(typeof contactName.givenName != 'undefined' && contactName.givenName != null && contactName.givenName == "First", "new ContactName() should include a 'givenName' property.");
+		ok(typeof contactName.middleName != 'undefined' && contactName.middleName != null && contactName.middleName == "Middle", "new ContactName() should include a 'middleName' property.");
+		ok(typeof contactName.honorificPrefix != 'undefined' && contactName.honorificPrefix != null && contactName.honorificPrefix == "Dr.", "new ContactName() should include a 'honorificPrefix' property.");
+		ok(typeof contactName.honorificSuffix != 'undefined' && contactName.honorificSuffix != null && contactName.honorificSuffix == "Jr.", "new ContactName() should include a 'honorificSuffix' property.");
+	});	
+	test("should be able to define a ContactField object", function() {
+		expect(4);
+		var contactField = new ContactField("home", "8005551212", true);
+		ok(contactField != null, "new ContactField() should not be null.");
+		ok(typeof contactField.type != 'undefined' && contactField.type != null && contactField.type == "home", "new ContactField() should include a 'type' property.");
+		ok(typeof contactField.value != 'undefined' && contactField.value != null && contactField.value == "8005551212", "new ContactField() should include a 'value' property.");
+		ok(typeof contactField.pref != 'undefined' && contactField.pref != null && contactField.pref == true, "new ContactField() should include a 'pref' property.");
+	});	
+	test("should be able to define a ContactAddress object", function() {
+		expect(9);
+		var contactAddress = new ContactAddress(true, "home", "a","b","c","d","e","f");
+		ok(contactAddress != null, "new ContactAddress() should not be null.");
+        ok(typeof contactAddress.pref != 'undefined' && contactAddress.pref != null && contactAddress.pref == true, "new ContactAddress() should include a 'pref' property.");
+        ok(typeof contactAddress.type != 'undefined' && contactAddress.type != null && contactAddress.type == "home", "new ContactAddress() should include a 'type' property.");
+		ok(typeof contactAddress.formatted != 'undefined' && contactAddress.formatted != null && contactAddress.formatted == "a", "new ContactAddress() should include a 'formatted' property.");
+		ok(typeof contactAddress.streetAddress != 'undefined' && contactAddress.streetAddress != null && contactAddress.streetAddress == "b", "new ContactAddress() should include a 'streetAddress' property.");
+		ok(typeof contactAddress.locality != 'undefined' && contactAddress.locality != null && contactAddress.locality == "c", "new ContactAddress() should include a 'locality' property.");
+		ok(typeof contactAddress.region != 'undefined' && contactAddress.region != null && contactAddress.region == "d", "new ContactAddress() should include a 'region' property.");
+		ok(typeof contactAddress.postalCode != 'undefined' && contactAddress.postalCode != null && contactAddress.postalCode == "e", "new ContactAddress() should include a 'postalCode' property.");
+		ok(typeof contactAddress.country != 'undefined' && contactAddress.country != null && contactAddress.country == "f", "new ContactAddress() should include a 'country' property.");
+	});	
+	test("should be able to define a ContactOrganization object", function() {
+		expect(6);
+		var contactOrg = new ContactOrganization(true, "home", "a","b","c","d","e","f","g");
+		ok(contactOrg != null, "new ContactOrganization() should not be null.");
+        ok(typeof contactOrg.pref != 'undefined' && contactOrg.pref != null && contactOrg.pref == true, "new ContactOrganization() should include a 'pref' property.");
+        ok(typeof contactOrg.type != 'undefined' && contactOrg.type != null && contactOrg.type == "home", "new ContactOrganization() should include a 'type' property.");
+		ok(typeof contactOrg.name != 'undefined' && contactOrg.name != null && contactOrg.name == "a", "new ContactOrganization() should include a 'name' property.");
+		ok(typeof contactOrg.department != 'undefined' && contactOrg.department != null && contactOrg.department == "b", "new ContactOrganization() should include a 'department' property.");
+		ok(typeof contactOrg.title != 'undefined' && contactOrg.title != null && contactOrg.title == "c", "new ContactOrganization() should include a 'title' property.");
+	});	
+	test("should be able to define a ContactFindOptions object", function() {
+		expect(3);
+		var contactFindOptions = new ContactFindOptions("a", true, "b");
+		ok(contactFindOptions != null, "new ContactFindOptions() should not be null.");
+		ok(typeof contactFindOptions.filter != 'undefined' && contactFindOptions.filter != null && contactFindOptions.filter == "a", "new ContactFindOptions() should include a 'filter' property.");
+		ok(typeof contactFindOptions.multiple != 'undefined' && contactFindOptions.multiple != null && contactFindOptions.multiple == true, "new ContactFindOptions() should include a 'multiple' property.");
+	});	
+	module("Contact Object");
+	test("should contain a clone function", function() {
+		expect(2);
+		var contact = new Contact();
+		ok(typeof contact.clone != 'undefined' && contact.clone != null, "contact.clone should not be null.");
+		ok(typeof contact.clone == 'function', "contact.clone should be a function.");
+	});
+	test("clone function should make deep copy of Contact Object", function() {
+		expect(8);
+		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();
+		
+		ok(contact.id == 1, "contact.id should be 1.");
+		ok(clonedContact.id == null, "clonedContact.id should be null.");
+		ok(clonedContact.displayName == contact.displayName, "displayName's should be equal");
+		ok(clonedContact.nickname == contact.nickname, "nickname's should be equal");
+		ok(clonedContact.gender == contact.gender, "gender's should be equal");
+		ok(clonedContact.note == contact.note, "note's should be equal");
+		ok(clonedContact.name.formatted == contact.name.formatted, "name.formatted's should be equal");
+		ok(clonedContact.connected == contact.connected, "connected's should be equal (null)");
+	});
+	test("should contain a remove function", function() {
+		expect(2);
+		var contact = new Contact();
+		ok(typeof contact.remove != 'undefined' && contact.remove != null, "contact.remove should not be null.");
+		ok(typeof contact.remove == 'function', "contact.remove should be a function.");
+	});
+	test("calling remove on a contact has an id of null should return ContactError.UNKNOWN_ERROR", function() {
+        QUnit.stop(Tests.TEST_TIMEOUT);
+		expect(2);
+		var win = function(result) {
+		};
+		var fail = function(result) {
+			ok(typeof result == 'object', "Object returned in contact.remove failure callback is of type 'object' (actually ContactError).");
+			ok(result.code == ContactError.UNKNOWN_ERROR, "Object returned in contacts.remove failure callback has a code property which equal to ContactError.UNKNOWN_ERROR.");
+			QUnit.start();
+		};
+		var rmContact = new Contact();
+		rmContact.remove(win, fail);
+	});
+	test("calling remove on a contact that does not exist should return ContactError.UNKNOWN_ERROR", function() {
+        QUnit.stop(Tests.TEST_TIMEOUT);
+		expect(2);
+		var win = function(result) {
+		};
+		var fail = function(result) {
+			ok(typeof result == 'object', "Object returned in contact.remove failure callback is of type 'object' (actually ContactError).");
+			ok(result.code == ContactError.UNKNOWN_ERROR, "Object returned in contacts.remove failure callback has a code property which equal to ContactError.UNKNOWN_ERROR.");
+			QUnit.start();
+		};
+		var contact = new Contact(99);
+		contact.remove(win, fail);		
+	});
+	test("should contain a save function", function() {
+		expect(2);
+		var contact = new Contact();
+		ok(typeof contact.save != 'undefined' && contact.save != null, "contact.save should not be null.");
+		ok(typeof contact.save == 'function', "contact.save should be a function.");
+	});
+    module('ContactError interface');
+    test("ContactError constants should be defined", function() {
+        expect(7);
+        equal(ContactError.UNKNOWN_ERROR, 0, "ContactError.UNKNOWN_ERROR should be defined");
+        equal(ContactError.INVALID_ARGUMENT_ERROR, 1, "ContactError.INVALID_ARGUMENT_ERROR should be defined");
+        equal(ContactError.TIMEOUT_ERROR, 2, "ContactError.TIMEOUT_ERROR should be defined");
+        equal(ContactError.PENDING_OPERATION_ERROR, 3, "ContactError.PENDING_OPERATION_ERROR should be defined");
+        equal(ContactError.IO_ERROR, 4, "ContactError.IO_ERROR should be defined");
+        equal(ContactError.NOT_SUPPORTED_ERROR, 5, "ContactError.NOT_SUPPORTED_ERROR should be defined");
+        equal(ContactError.PERMISSION_DENIED_ERROR, 20, "ContactError.PERMISSION_DENIED_ERROR should be defined");
+    });
+};

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/ae8bc77e/test/assets/www/autotest/tests/device.tests.js
----------------------------------------------------------------------
diff --git a/test/assets/www/autotest/tests/device.tests.js b/test/assets/www/autotest/tests/device.tests.js
new file mode 100644
index 0000000..537aeda
--- /dev/null
+++ b/test/assets/www/autotest/tests/device.tests.js
@@ -0,0 +1,36 @@
+Tests.prototype.DeviceTests = function() {
+	module('Device Information (window.device)');
+	test("should exist", function() {
+  		expect(1);
+  		ok(window.device != null, "window.device should not be null.");
+	});
+	test("should contain a platform specification that is a string", function() {
+		expect(2);
+		ok(typeof window.device.platform != 'undefined' && window.device.platform != null, "window.device.platform should not be null.")
+		ok((new String(window.device.platform)).length > 0, "window.device.platform should contain some sort of description.")
+	});
+	test("should contain a version specification that is a string", function() {
+		expect(2);
+		ok(typeof window.device.version != 'undefined' && window.device.version != null, "window.device.version should not be null.")
+		ok((new String(window.device.version)).length > 0, "window.device.version should contain some kind of description.")
+	});
+	test("should contain a name specification that is a string", function() {
+		expect(2);
+		ok(typeof window.device.name != 'undefined' && window.device.name != null, "window.device.name should not be null.")
+		ok((new String(window.device.name)).length > 0, "window.device.name should contain some kind of description.")
+	});
+	test("should contain a UUID specification that is a string or a number", function() {
+		expect(2);
+		ok(typeof window.device.uuid != 'undefined' && window.device.uuid != null, "window.device.uuid should not be null.")
+		if (typeof window.device.uuid == 'string' || typeof window.device.uuid == 'object') {
+			ok((new String(window.device.uuid)).length > 0, "window.device.uuid, as a string, should have at least one character.")
+		} else {
+			ok(window.device.uuid > 0, "window.device.uuid, as a number, should be greater than 0. (should it, even?)")
+		}
+	});
+	test("should contain a phonegap specification that is a string", function() {
+		expect(2);
+		ok(typeof window.device.phonegap != 'undefined' && window.device.phonegap != null, "window.device.phonegap should not be null.")
+		ok((new String(window.device.phonegap)).length > 0, "window.device.phonegap should contain some kind of description.")
+	});
+};
\ No newline at end of file