/**************************************************************************** ** ** 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"} ]; } }