| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| import QtQuick 2.0 |
| import QtTest 1.0 |
| import QtLocation 5.3 |
| import QtPositioning 5.2 |
| import "utils.js" as Utils |
| |
| TestCase { |
| id: testCase |
| |
| name: "Place" |
| |
| Plugin { |
| id: testPlugin |
| name: "qmlgeo.test.plugin" |
| allowExperimental: true |
| } |
| |
| Place { |
| id: favoritePlace |
| name: "Favorite Place" |
| } |
| |
| Place { id: emptyPlace } |
| |
| Place { id: emptyPlace2 } |
| |
| Place { id: testPlace } |
| |
| Place { |
| id: savePlace |
| |
| name: "Test place" |
| |
| visibility: Place.DeviceVisibility |
| |
| location: Location { |
| address: Address { |
| country: "country" |
| countryCode: "cc" |
| state: "state" |
| county: "county" |
| city: "city" |
| district: "district" |
| street: "123 Fake Street" |
| postalCode: "1234" |
| } |
| |
| coordinate { |
| latitude: 10 |
| longitude: 10 |
| altitude: 100 |
| } |
| |
| boundingBox { |
| center: QtPositioning.coordinate(10, 10, 100) |
| width: 100 |
| height: 100 |
| } |
| } |
| |
| ratings: Ratings { |
| average: 3.5 |
| count: 10 |
| } |
| |
| supplier: Supplier { |
| name: "Supplier 1" |
| supplierId: "supplier-id-1" |
| url: "http://www.example.com/supplier-id-1/" |
| icon: Icon{ |
| plugin: testPlugin |
| Component.onCompleted: { |
| parameters.singleUrl = "http://www.example.com/supplier-id-1/icon" |
| } |
| } |
| } |
| |
| categories: [ |
| Category { |
| name: "Category 1" |
| categoryId: "category-id-1" |
| plugin: testPlugin |
| }, |
| Category { |
| name: "Category 2" |
| categoryId: "category-id-2" |
| plugin: testPlugin |
| } |
| ] |
| |
| icon: Icon { |
| Component.onCompleted: { |
| savePlace.icon.parameters.singleUrl = "http://example.com/test-place.png"; |
| } |
| } |
| } |
| |
| Place { |
| id: dummyPlace |
| placeId: "487" |
| name: "dummyPlace" |
| visibility: Place.PublicVisibility |
| } |
| |
| // compares two places property by property |
| function compare_place(place1, place2) { |
| // check simple properties |
| var simpleProperties = ["name", "placeId", "primaryPhone", "primaryFax", "primaryEmail", |
| "primaryWebsite", "visibility"]; |
| for (x in simpleProperties) { |
| if (place1[simpleProperties[x]] !== place2[simpleProperties[x]]) |
| return false; |
| } |
| |
| // check categories |
| if (place1.categories.length !== place2.categories.length) |
| return false; |
| for (var i = 0; i < place1.categories.length; ++i) { |
| // fixme, what if the order of the two lists are not the same |
| if (place1.categories[i].categoryId !== place2.categories[i].categoryId) |
| return false; |
| if (place1.categories[i].name !== place2.categories[i].name) |
| return false; |
| } |
| |
| // check supplier |
| if (place1.supplier === null && place2.supplier !== null) |
| return false; |
| if (place1.supplier !== null && place2.supplier === null) |
| return false; |
| if (place1.supplier !== null && place2.supplier !== null) { |
| if (place1.supplier.supplierId !== place2.supplier.supplierId) |
| return false; |
| if (place1.supplier.name !== place2.supplier.name) |
| return false; |
| if (place1.supplier.url !== place2.supplier.url) |
| return false; |
| |
| // check supplier icon |
| if (place1.supplier.icon === null && place2.supplier.icon !== null) |
| return false; |
| if (place1.supplier.icon !== null && place2.supplier.icon === null) |
| return false; |
| if (place1.supplier.icon !== null && place2.supplier.icon !== null) { |
| if (place1.supplier.icon.parameters.keys().length !== place2.supplier.icon.parameters.keys().length) { |
| return false; |
| } |
| |
| var keys = place1.supplier.icon.parameters.keys() + place2.supplier.icon.parameters.keys(); |
| for (var i = 0; i < keys.length; ++i) { |
| if (place1.supplier.icon.parameters[keys[i]] != place2.supplier.icon.parameters[keys[i]]) { |
| return false; |
| } |
| } |
| |
| if (place1.supplier.icon.plugin !== place2.supplier.icon.plugin) |
| return false; |
| } |
| } |
| |
| // check ratings |
| if (place1. ratings === null && place2.ratings !== null) |
| return false; |
| if (place1.ratings !== null && place2.ratings === null) |
| return false; |
| if (place1.ratings !== null && place2.ratings !== null) { |
| if (place1.ratings.average !== place2.ratings.average) |
| return false; |
| if (place1.ratings.count !== place2.ratings.count) |
| return false; |
| } |
| |
| // check location |
| if (place1.location === null && place2.location !== null) |
| return false; |
| if (place1.location !== null && place2.location === null) |
| return false; |
| if (place1.location !== null && place2.location !== null) { |
| if (place1.location.address.country !== place2.location.address.country) |
| return false; |
| if (place1.location.address.countryCode !== place2.location.address.countryCode) |
| return false; |
| if (place1.location.address.state !== place2.location.address.state) |
| return false; |
| if (place1.location.address.county !== place2.location.address.county) |
| return false; |
| if (place1.location.address.city !== place2.location.address.city) |
| return false; |
| if (place1.location.address.district !== place2.location.address.district) |
| return false; |
| if (place1.location.address.street !== place2.location.address.street) |
| return false; |
| if (place1.location.address.postalCode !== place2.location.address.postalCode) |
| return false; |
| |
| if (place1.location.coordinate !== place2.location.coordinate) |
| return false; |
| if (place1.location.boundingBox !== place2.location.boundingBox) |
| return false; |
| } |
| |
| // check icon |
| if (place1.icon === null && place2.icon !== null) { |
| return false; |
| } |
| if (place1.icon !== null && place2.icon === null) { |
| return false; |
| } |
| if (place1.icon !== null && place2.icon !== null) { |
| if (place1.icon.plugin !== place2.icon.plugin) { |
| console.log(place1.icon.plugin + " " + place2.icon.plugin); |
| return false; |
| } |
| |
| if (place1.icon.parameters.keys().length !== place2.icon.parameters.keys().length) { |
| return false; |
| } |
| |
| var keys = place1.icon.parameters.keys() + place2.icon.parameters.keys(); |
| for (var i = 0; i < keys.length; ++i) { |
| if (place1.icon.parameters[keys[i]] |
| != place2.icon.parameters[keys[i]]) { |
| return false; |
| } |
| } |
| } |
| |
| // check extended attributes |
| |
| return true; |
| } |
| |
| function test_emptyPlace() { |
| // basic properties |
| compare(emptyPlace.plugin, null); |
| compare(emptyPlace.categories.length, 0); |
| compare(emptyPlace.name, ""); |
| compare(emptyPlace.placeId, ""); |
| compare(emptyPlace.detailsFetched, false); |
| compare(emptyPlace.status, Place.Ready); |
| compare(emptyPlace.primaryPhone, ""); |
| compare(emptyPlace.primaryFax, ""); |
| compare(emptyPlace.primaryEmail, ""); |
| compare(emptyPlace.primaryWebsite, ""); |
| compare(emptyPlace.visibility, Place.UnspecifiedVisibility); |
| compare(emptyPlace.attribution, ""); |
| |
| // complex properties |
| compare(emptyPlace.ratings.average, 0); |
| compare(emptyPlace.location.address.street, ''); |
| compare(emptyPlace.location.address.district, ''); |
| compare(emptyPlace.location.address.city, ''); |
| compare(emptyPlace.location.address.county, ''); |
| compare(emptyPlace.location.address.state, ''); |
| compare(emptyPlace.location.address.country, ''); |
| |
| compare(emptyPlace.icon.plugin, null); |
| |
| compare(emptyPlace.supplier.name, ''); |
| compare(emptyPlace.supplier.supplierId, ''); |
| compare(emptyPlace.supplier.url, ''); |
| |
| compare(emptyPlace.supplier.icon.plugin, null); |
| |
| compare(emptyPlace.reviewModel.totalCount, -1); |
| compare(emptyPlace.imageModel.totalCount, -1); |
| compare(emptyPlace.editorialModel.totalCount, -1); |
| compare(emptyPlace.categories.length, 0); |
| |
| verify(compare_place(emptyPlace, emptyPlace)); |
| verify(compare_place(emptyPlace, emptyPlace2)); |
| } |
| |
| function test_setAndGet_data() { |
| return [ |
| { tag: "name", property: "name", signal: "nameChanged", value: "Test Place", reset: "" }, |
| { tag: "placeId", property: "placeId", signal: "placeIdChanged", value: "test-place-id-1", reset: "" }, |
| { tag: "visibility", property: "visibility", signal: "visibilityChanged", value: Place.PublicVisibility, reset: Place.UnspecifiedVisibility }, |
| { tag: "attribution", property: "attribution", signal: "attributionChanged", value: "Place data from...", reset: "" }, |
| { tag: "favorite", property: "favorite", signal: "favoriteChanged", value: favoritePlace } |
| ]; |
| } |
| |
| function test_setAndGet(data) { |
| Utils.testObjectProperties(testCase, testPlace, data); |
| } |
| |
| function test_categories() { |
| var categories = new Array(2); |
| categories[0] = Qt.createQmlObject('import QtLocation 5.3; Category { categoryId: "cat-id-1"; name: "Category 1" }', testCase, "Category1"); |
| categories[1] = Qt.createQmlObject('import QtLocation 5.3; Category { categoryId: "cat-id-2"; name: "Category 2" }', testCase, "Category2"); |
| |
| var signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = testPlace; |
| signalSpy.signalName = "categoriesChanged"; |
| |
| // set categories to something new |
| testPlace.categories = categories; |
| compare(testPlace.categories.length, categories.length); |
| |
| for (var i = 0; i < categories.length; ++i) { |
| compare(testPlace.categories[i].categoryId, categories[i].categoryId); |
| compare(testPlace.categories[i].name, categories[i].name); |
| } |
| |
| compare(signalSpy.count, 2); |
| |
| // set categories to the same (signal spy should not increase?) |
| testPlace.categories = categories; |
| compare(testPlace.categories.length, categories.length); |
| |
| for (var i = 0; i < categories.length; ++i) { |
| compare(testPlace.categories[i].categoryId, categories[i].categoryId); |
| compare(testPlace.categories[i].name, categories[i].name); |
| } |
| |
| compare(signalSpy.count, 5); // clear + append + append |
| |
| // reset by assignment |
| testPlace.categories = new Array(0); |
| compare(testPlace.categories.length, 0); |
| compare(signalSpy.count, 6); |
| |
| signalSpy.destroy(); |
| } |
| |
| function test_supplier() { |
| var supplier = Qt.createQmlObject('import QtLocation 5.3; Supplier { supplierId: "sup-id-1"; name: "Category 1" }', testCase, "Supplier1"); |
| |
| var signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = testPlace; |
| signalSpy.signalName = "supplierChanged"; |
| |
| // set supplier to something new |
| testPlace.supplier = supplier; |
| compare(testPlace.supplier, supplier); |
| |
| compare(testPlace.supplier.supplierId, supplier.supplierId); |
| compare(testPlace.supplier.name, supplier.name); |
| |
| compare(signalSpy.count, 1); |
| |
| // set supplier to the same |
| testPlace.supplier = supplier; |
| compare(testPlace.supplier, supplier); |
| |
| compare(testPlace.supplier.supplierId, supplier.supplierId); |
| compare(testPlace.supplier.name, supplier.name); |
| |
| compare(signalSpy.count, 1); |
| |
| // reset by assignment |
| testPlace.supplier = null; |
| compare(testPlace.supplier, null); |
| compare(signalSpy.count, 2); |
| |
| signalSpy.destroy(); |
| } |
| |
| function test_location() { |
| var location = Qt.createQmlObject('import QtPositioning 5.2; Location { coordinate: QtPositioning.coordinate(10.0, 20.0) }', testCase, "Location1"); |
| |
| var signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = testPlace; |
| signalSpy.signalName = "locationChanged"; |
| |
| testPlace.location = location; |
| compare(testPlace.location.coordinate.latitude, 10.0); |
| compare(signalSpy.count, 1); |
| |
| testPlace.location = location; |
| compare(testPlace.location.coordinate.latitude, 10.0); |
| compare(signalSpy.count, 1); |
| |
| testPlace.location = null; |
| compare(testPlace.location, null); |
| compare(signalSpy.count, 2); |
| |
| location.destroy(); |
| signalSpy.destroy(); |
| } |
| |
| function test_ratings() { |
| var ratings = Qt.createQmlObject('import QtLocation 5.3; Ratings { average: 3; count: 100 }', testCase, "Rating1"); |
| |
| var signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = testPlace; |
| signalSpy.signalName = "ratingsChanged"; |
| |
| testPlace.ratings = ratings; |
| compare(testPlace.ratings.average, 3); |
| compare(testPlace.ratings.count, 100); |
| compare(signalSpy.count, 1); |
| |
| testPlace.ratings = ratings; |
| compare(testPlace.ratings.average, 3); |
| compare(testPlace.ratings.count, 100); |
| compare(signalSpy.count, 1); |
| |
| testPlace.ratings = null; |
| compare(testPlace.ratings, null); |
| compare(signalSpy.count, 2); |
| |
| ratings.destroy(); |
| signalSpy.destroy(); |
| } |
| |
| function test_extendedAttributes() { |
| verify(testPlace.extendedAttributes); |
| |
| testPlace.extendedAttributes["foo"] = Qt.createQmlObject('import QtLocation 5.3; PlaceAttribute { text: "Foo"; label: "Foo label" }', testCase, 'PlaceAttribute'); |
| |
| verify(testPlace.extendedAttributes.foo); |
| compare(testPlace.extendedAttributes.foo.text, "Foo"); |
| compare(testPlace.extendedAttributes.foo.label, "Foo label"); |
| |
| testPlace.extendedAttributes["foo"] = null; |
| verify(!testPlace.extendedAttributes.foo); |
| } |
| |
| function test_contactDetailsProperty() { |
| verify(testPlace.contactDetails); |
| |
| testPlace.contactDetails["phone"] = Qt.createQmlObject('import QtLocation 5.3; ContactDetail { label: "Test Label"; value: "Detail Value" }', testCase, 'ContactDetail'); |
| |
| verify(testPlace.contactDetails.phone); |
| compare(testPlace.contactDetails.phone[0].label, "Test Label"); |
| compare(testPlace.contactDetails.phone[0].value, "Detail Value"); |
| |
| testPlace.contactDetails["phone"] = null; |
| verify(!testPlace.contactDetails.phone); |
| } |
| |
| function test_saveload() { |
| // Save a place |
| var signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = savePlace; |
| signalSpy.signalName = "statusChanged"; |
| |
| savePlace.plugin = testPlugin; |
| savePlace.icon.plugin = testPlugin; |
| savePlace.placeId = "invalid-place-id"; |
| |
| savePlace.save(); |
| |
| compare(savePlace.status, Place.Saving); |
| |
| tryCompare(savePlace, "status", Place.Error); |
| |
| // try again without an invalid placeId |
| savePlace.placeId = ""; |
| savePlace.save(); |
| |
| compare(savePlace.status, Place.Saving); |
| |
| tryCompare(savePlace, "status", Place.Ready); |
| |
| verify(savePlace.placeId !== ""); |
| |
| signalSpy.destroy(); |
| |
| |
| // Read a place |
| var readPlace = Qt.createQmlObject('import QtLocation 5.3; Place { }', testCase, "test_saveload"); |
| |
| signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = readPlace; |
| signalSpy.signalName = "statusChanged"; |
| |
| readPlace.plugin = testPlugin; |
| |
| readPlace.getDetails(); |
| |
| compare(readPlace.status, Place.Fetching); |
| tryCompare(readPlace, "status", Place.Error); |
| |
| readPlace.placeId = "invalid-id"; |
| |
| readPlace.getDetails(); |
| |
| compare(readPlace.status, Place.Fetching); |
| tryCompare(readPlace, "status", Place.Error); |
| |
| readPlace.placeId = savePlace.placeId; |
| |
| // verify that read place is not currently the same as what we saved |
| verify(!compare_place(readPlace, savePlace)); |
| |
| readPlace.getDetails(); |
| |
| compare(readPlace.status, Place.Fetching); |
| tryCompare(readPlace, "status", Place.Ready); |
| |
| // verify that read place is the same as what we saved |
| verify(compare_place(readPlace, savePlace)); |
| |
| signalSpy.destroy(); |
| |
| |
| // Remove a place |
| var removePlace = Qt.createQmlObject('import QtLocation 5.3; Place { }', testCase, "test_saveload"); |
| |
| signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = removePlace; |
| signalSpy.signalName = "statusChanged"; |
| |
| removePlace.plugin = testPlugin; |
| |
| removePlace.remove(); |
| |
| compare(removePlace.status, Place.Removing); |
| tryCompare(removePlace, "status", Place.Error); |
| |
| removePlace.placeId = "invalid-id"; |
| |
| removePlace.remove(); |
| |
| compare(removePlace.status, Place.Removing); |
| tryCompare(removePlace, "status", Place.Error); |
| |
| removePlace.placeId = savePlace.placeId; |
| |
| removePlace.remove(); |
| |
| compare(removePlace.status, Place.Removing); |
| tryCompare(removePlace, "status", Place.Ready); |
| |
| removePlace.getDetails(); |
| |
| compare(removePlace.status, Place.Fetching); |
| tryCompare(removePlace, "status", Place.Error); |
| |
| signalSpy.destroy(); |
| } |
| |
| function test_copy() { |
| var place = Qt.createQmlObject('import QtLocation 5.3; Place { }', this); |
| place.plugin = testPlugin; |
| place.copyFrom(dummyPlace); |
| compare(place.placeId, ""); |
| compare(place.name, "dummyPlace"); |
| compare(place.visibility, Place.UnspecifiedVisibility); |
| } |
| |
| function test_contactDetails(data) { |
| var place = Qt.createQmlObject('import QtLocation 5.3; Place {}', this); |
| |
| var signalSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); |
| signalSpy.target = place; |
| signalSpy.signalName = data.signalName; |
| |
| var detail1 = Qt.createQmlObject('import QtLocation 5.3; ContactDetail {}', this); |
| detail1.label = "Detail1"; |
| detail1.value = "555-detail1"; |
| |
| place.contactDetails[data.contactType] = detail1; |
| compare(place.contactDetails[data.contactType].length, 1); |
| compare(place.contactDetails[data.contactType][0].label, "Detail1"); |
| compare(place.contactDetails[data.contactType][0].value, "555-detail1"); |
| |
| compare(place[data.primaryValue], "555-detail1"); |
| compare(signalSpy.count, 1); |
| signalSpy.clear(); |
| |
| var listView = Qt.createQmlObject('import QtQuick 2.0; ListView { delegate:Text{text:modelData.label + ":" + modelData.value } }', this); |
| listView.model = place.contactDetails[data.contactType]; |
| compare(listView.count, 1); |
| |
| var detail2 = Qt.createQmlObject('import QtLocation 5.3; ContactDetail {}', this); |
| detail2.label = "Detail2"; |
| detail2.value = "555-detail2"; |
| |
| var details = new Array(); |
| details.push(detail2); |
| details.push(detail1); |
| |
| place.contactDetails[data.contactType] = details; |
| compare(place.contactDetails[data.contactType].length, 2); |
| compare(place.contactDetails[data.contactType][0].label, "Detail2"); |
| compare(place.contactDetails[data.contactType][0].value, "555-detail2"); |
| compare(place.contactDetails[data.contactType][1].label, "Detail1"); |
| compare(place.contactDetails[data.contactType][1].value, "555-detail1"); |
| |
| compare(place[data.primaryValue], "555-detail2"); |
| compare(signalSpy.count, 1); |
| signalSpy.clear(); |
| listView.model = place.contactDetails[data.contactType]; |
| compare(listView.count, 2); |
| } |
| |
| function test_contactDetails_data() { |
| return [ |
| { tag: "phone", contactType: "phone", signalName: "primaryPhoneChanged", primaryValue: "primaryPhone"}, |
| { tag: "fax", contactType: "fax", signalName: "primaryFaxChanged", primaryValue: "primaryFax"}, |
| { tag: "email", contactType: "email", signalName: "primaryEmailChanged", primaryValue: "primaryEmail"}, |
| { tag: "website", contactType: "website", signalName: "primaryWebsiteChanged", primaryValue: "primaryWebsite"} |
| ]; |
| } |
| } |