summaryrefslogtreecommitdiff
path: root/src/components/qt_hmi
diff options
context:
space:
mode:
authorJustin Dickow <jjdickow@gmail.com>2015-02-20 09:11:18 -0500
committerJustin Dickow <jjdickow@gmail.com>2015-02-20 09:11:18 -0500
commita7c5d752cb75485baa0ded5226335d0f8eb10321 (patch)
treefbfd9251ada2cdcd5cf6a03a79887d08f6b496d7 /src/components/qt_hmi
parentb2b2233d866f102d3de339afa8ccaf37d3cf2570 (diff)
downloadsdl_core-a7c5d752cb75485baa0ded5226335d0f8eb10321.tar.gz
Bug Fixes and ImprovementsSynchronizationCommit
Fix Empty perform iteration request Fix type of name from string to enum SendLocation implemented on HTML5 HMI Fixed PI response on VR rejection due to high priority. Fix Apps not responsive/not able to start app/apps remain listed on SYNC even after USB disconnect Mobile API change and processing capabilities Change perform interaction request conditions. Fix SDL must always start 3sec timer before resuming the HMILevel of the app Remove redundant StartSavePersistentDataTimer() call. Change wrong predicate name to right. Added stream request handling feature Made streaming timeout in media manager configurable Put navi app in LIMITED in case of phone call Handling of audio state for applications Add stop streaming timeout into ini file Implement HMILevel resumption for job-1 Fix result code ABORTED when interrupts it by Voice recognition activation Fix incorrect value parameter unexpectedDisconnect in BCOnAppUnregistered Fix SDL send BC.OnAppUnregistered with "unexpectedDisconnect" set to "true" in case received from HMI OnExitAllApplications {"reason":"MASTER_RESET"} Fix Update ini file for iAP1 support Current working directory added to image path Fix helpers to make it workable with more then 2 parameters DCHECK() for ManageMobileCommand() replaced with log message because the latter returns false in some regular situations (e.g. TOO_MANY_PENDING_REQUESTS, see SDLAQ-CRS-10) Remove connection after closing. Signed-off-by: Justin Dickow <jjdickow@gmail.com>
Diffstat (limited to 'src/components/qt_hmi')
-rw-r--r--src/components/qt_hmi/CMakeLists.txt6
-rw-r--r--src/components/qt_hmi/References/Work/bananasnacks/qtquick2applicationviewer/qtquick2applicationviewer.h2
-rw-r--r--src/components/qt_hmi/qml_model_qt5/controls/SoftButton.qml8
-rw-r--r--src/components/qt_hmi/qml_model_qt5/hmi_api/UI.qml15
-rw-r--r--src/components/qt_hmi/qml_model_qt5/hmi_api/VR.qml64
-rw-r--r--src/components/qt_hmi/qml_model_qt5/models/DataStorage.qml3
-rw-r--r--src/components/qt_hmi/qml_model_qt5/models/MediaClockModel.qml37
-rw-r--r--src/components/qt_hmi/qml_model_qt5/popups/InteractionPopup.qml22
-rw-r--r--src/components/qt_hmi/qml_model_qt5/popups/TTSPopUp.qml8
-rw-r--r--src/components/qt_hmi/qml_model_qt5/popups/VRPopUp.qml66
-rw-r--r--src/components/qt_hmi/qml_model_qt5/views/SDLPlayerOptionsListView.qml1
-rw-r--r--src/components/qt_hmi/qml_model_qt5/views/ScrollableMessageView.qml4
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/metatype.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/optional_argument.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus_common.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/qt_version.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/hw_buttons/qt_version.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.cc2
-rw-r--r--src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.h2
-rw-r--r--src/components/qt_hmi/qml_plugins/named_pipe_notifier/qt_version.h2
-rw-r--r--src/components/qt_hmi/test/CMakeLists.txt70
-rw-r--r--src/components/qt_hmi/test/qt_hmi_test.cc33
-rw-r--r--src/components/qt_hmi/test/readme.txt14
-rw-r--r--src/components/qt_hmi/test/src/tst_AddCommand.qml320
-rw-r--r--src/components/qt_hmi/test/src/tst_AddSubMenu.qml328
-rw-r--r--src/components/qt_hmi/test/src/tst_DeleteCommand.qml210
-rw-r--r--src/components/qt_hmi/test/src/tst_ScrollableMessage.qml421
-rw-r--r--src/components/qt_hmi/test/src/tst_SetMediaClockTimer.qml292
-rw-r--r--src/components/qt_hmi/test/src/tst_Show.qml363
-rw-r--r--src/components/qt_hmi/test/src/tst_Slider.qml204
48 files changed, 2474 insertions, 69 deletions
diff --git a/src/components/qt_hmi/CMakeLists.txt b/src/components/qt_hmi/CMakeLists.txt
index e77a1e23b8..ee30f2b468 100644
--- a/src/components/qt_hmi/CMakeLists.txt
+++ b/src/components/qt_hmi/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2013, Ford Motor Company
+# Copyright (c) 2014, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -36,3 +36,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
else ()
add_subdirectory(./qml_model_qt5)
endif ()
+
+if(HMI STREQUAL "qt" AND BUILD_TESTS)
+ add_subdirectory(test)
+endif() \ No newline at end of file
diff --git a/src/components/qt_hmi/References/Work/bananasnacks/qtquick2applicationviewer/qtquick2applicationviewer.h b/src/components/qt_hmi/References/Work/bananasnacks/qtquick2applicationviewer/qtquick2applicationviewer.h
index baf67f2479..bd6c50f54f 100644
--- a/src/components/qt_hmi/References/Work/bananasnacks/qtquick2applicationviewer/qtquick2applicationviewer.h
+++ b/src/components/qt_hmi/References/Work/bananasnacks/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -6,7 +6,7 @@
handled here.
It is recommended not to modify this file, since newer versions of Qt Creator
may offer an updated version of it.
-*/
+ */
#ifndef QTQUICK2APPLICATIONVIEWER_H
#define QTQUICK2APPLICATIONVIEWER_H
diff --git a/src/components/qt_hmi/qml_model_qt5/controls/SoftButton.qml b/src/components/qt_hmi/qml_model_qt5/controls/SoftButton.qml
index 0f3cfd7140..b1b7f71799 100644
--- a/src/components/qt_hmi/qml_model_qt5/controls/SoftButton.qml
+++ b/src/components/qt_hmi/qml_model_qt5/controls/SoftButton.qml
@@ -49,7 +49,7 @@ OvalButton {
highlighted: button ? button.isHighlighted : false
onPressed: {
actionOrder = SoftButton.Action.doOnClicked
- sdlButtons.onButtonEvent(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonEventMode.BUTTONDOWN, button.softButtonID)
+ sdlButtons.onButtonEvent(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonEventMode.BUTTONDOWN, button.softButtonID, appId)
}
onReleased: {
@@ -67,11 +67,11 @@ OvalButton {
}
}
- sdlButtons.onButtonEvent(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonEventMode.BUTTONUP, button.softButtonID)
+ sdlButtons.onButtonEvent(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonEventMode.BUTTONUP, button.softButtonID, appId)
}
onClicked: {
- sdlButtons.onButtonPress(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonPressMode.SHORT, button.softButtonID);
+ sdlButtons.onButtonPress(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonPressMode.SHORT, button.softButtonID, appId);
switch (button.systemAction) {
case Common.SystemAction.DEFAULT_ACTION:
defaultAction();
@@ -87,7 +87,7 @@ OvalButton {
onPressAndHold: {
actionOrder = SoftButton.Action.doOnReleased; // action should be triggered on release
- sdlButtons.onButtonPress(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonPressMode.LONG, button.softButtonID);
+ sdlButtons.onButtonPress(Common.ButtonName.CUSTOM_BUTTON, Common.ButtonPressMode.LONG, button.softButtonID, appId);
}
onButtonChanged: {
diff --git a/src/components/qt_hmi/qml_model_qt5/hmi_api/UI.qml b/src/components/qt_hmi/qml_model_qt5/hmi_api/UI.qml
index d89747c3c0..659b7842c6 100644
--- a/src/components/qt_hmi/qml_model_qt5/hmi_api/UI.qml
+++ b/src/components/qt_hmi/qml_model_qt5/hmi_api/UI.qml
@@ -203,6 +203,7 @@ Item {
"updateMode": Internal.MediaClockUpdateMode.MCU_COUNTUP,
"runningMode": Internal.MediaClockRunningMode.MCR_STOPPED,
"magic": Internal.stringToHmsTime(fieldSubstrings[Common.TextFieldName.mediaClock]),
+ "startTime": Internal.stringToHmsTime(fieldSubstrings[Common.TextFieldName.mediaClock]),
"startTimeForProgress": -1
}
}
@@ -339,7 +340,11 @@ Item {
break
}
newStartTime = Internal.hmsTime(startTime.hours, startTime.minutes, startTime.seconds)
- newEndTime = endTime ? Internal.hmsTime(endTime.hours, endTime.minutes, endTime.seconds) : -1
+ newEndTime = endTime ? Internal.hmsTime(endTime.hours,
+ endTime.minutes,
+ endTime.seconds)
+ : dataContainer.currentApplication.mediaClock.upperTimeLimit
+
newUpdateMode = Internal.MediaClockUpdateMode.MCU_COUNTUP
newRunningMode = Internal.MediaClockRunningMode.MCR_RUNNING
newStartTimeForProgress = Internal.hmsTime(startTime.hours, startTime.minutes, startTime.seconds)
@@ -353,7 +358,7 @@ Item {
break
}
newStartTime = Internal.hmsTime(startTime.hours, startTime.minutes, startTime.seconds)
- newEndTime = endTime ? Internal.hmsTime(endTime.hours, endTime.minutes, endTime.seconds) : -1
+ newEndTime = endTime ? Internal.hmsTime(endTime.hours, endTime.minutes, endTime.seconds) : 0
newUpdateMode = Internal.MediaClockUpdateMode.MCU_COUNTDOWN
newRunningMode = Internal.MediaClockRunningMode.MCR_RUNNING
newStartTimeForProgress = Internal.hmsTime(startTime.hours, startTime.minutes, startTime.seconds)
@@ -372,7 +377,7 @@ Item {
newEndTime = app.mediaClock.endTime
newRunningMode = Internal.MediaClockRunningMode.MCR_STOPPED
newUpdateMode = app.mediaClock.updateMode
- newStartTimeForProgress = app.mediaClock.startTime
+ newStartTimeForProgress = app.mediaClock.startTimeForProgress
resultCode = Common.Result.SUCCESS
break
@@ -387,7 +392,7 @@ Item {
newStartTime = app.mediaClock.startTime
newEndTime = app.mediaClock.endTime
newRunningMode = Internal.MediaClockRunningMode.MCR_RUNNING
- newStartTimeForProgress = app.mediaClock.startTime
+ newStartTimeForProgress = app.mediaClock.startTimeForProgress
newUpdateMode = app.mediaClock.updateMode
resultCode = Common.Result.SUCCESS
break
@@ -631,7 +636,7 @@ Item {
}
}
- function performAudioPassThru (audioPassThruDisplayTexts, timeout, appID) {
+ function performAudioPassThru (appID, audioPassThruDisplayTexts, timeout) {
var displayTextsLog = "";
if (audioPassThruDisplayTexts) {
for (var i = 0; i < audioPassThruDisplayTexts.length; i++) {
diff --git a/src/components/qt_hmi/qml_model_qt5/hmi_api/VR.qml b/src/components/qt_hmi/qml_model_qt5/hmi_api/VR.qml
index 8a426197e2..8158b3271e 100644
--- a/src/components/qt_hmi/qml_model_qt5/hmi_api/VR.qml
+++ b/src/components/qt_hmi/qml_model_qt5/hmi_api/VR.qml
@@ -34,7 +34,6 @@
import QtQuick 2.0
import "Common.js" as Common
-
Item {
function isReady() {
console.log("Message Received - {method: 'VR.IsReady'}")
@@ -43,7 +42,7 @@ Item {
}
}
- function addCommand(cmdID, vrCommands, appID) {
+ function addCommand(cmdID, vrCommands, type, grammarID, appID) {
var vrCommandsLog = "";
if (vrCommands) {
for (var i = 0; i < vrCommands.length; i++) {
@@ -53,14 +52,29 @@ Item {
console.log("Message Received - {method: 'VR.AddCommand', params:{ " +
"vrCommands: [" + vrCommandsLog + "], " +
"cmdID: " + cmdID + ", " +
- "appID: " + appID +
+ "appID: " + appID + ", " +
+ "type: " + type + ", " +
+ "grammarID: " + grammarID +
"}}")
for (var i = 0; i < vrCommands.length; ++i) {
- dataContainer.vrCommands.append({
+ if (type === Common.VRCommandType.Command) {
+ dataContainer.vrCommands.append({
cmdID: cmdID,
command: vrCommands[i],
appID: appID === undefined ? 0 : appID,
+ type: type,
+ grammarID: grammarID,
});
+ }
+ else {
+ dataContainer.choicesVrCommands.append({
+ cmdID: cmdID,
+ command: vrCommands[i],
+ appID: appID === undefined ? 0 : appID,
+ type: type,
+ grammarID: grammarID,
+ });
+ }
}
console.log("exit")
}
@@ -111,4 +125,46 @@ Item {
dataContainer.changeRegistrationTTSVR(language, appID);
console.debug("exit");
}
+ function ttsChunksToString(ttsChunks){
+ return ttsChunks.map(function(str) { return str.text }).join('\n')
+ }
+ function performInteraction(helpPrompt, initialPrompt, timeoutPrompt, timeout, grammarID) {
+ console.debug("enter");
+ var helpttsChunksLog = "",
+ initialttsChunkLog = "",
+ timeoutttsChunkLog = "",
+ grammarIDLog ="";
+
+ if (helpPrompt) {
+ for (var i = 0; i < helpPrompt.length; i++) {
+ helpttsChunksLog += "{type: " + helpPrompt[i].type + ", " +
+ "text: '" + helpPrompt[i].text + "'}, ";
+ }
+ }
+ if (initialPrompt) {
+ for (var i = 0; i < initialPrompt.length; i++) {
+ initialttsChunkLog += "{type: " + initialPrompt[i].type + ", " +
+ "text: '" + initialPrompt[i].text + "'}, ";
+ }
+ }
+ if (timeoutPrompt) {
+ for (var i = 0; i < timeoutPrompt.length; i++) {
+ timeoutttsChunkLog += "{type: " + timeoutPrompt[i].type + ", " +
+ "text: '" + timeoutPrompt[i].text + "'}, ";
+ }
+ }
+ console.log("Message Received - {method: 'TTS.PerformInteraction', params:{ " +
+ "helpPrompt: [" + helpttsChunksLog + "], " +
+ "initialPrompt: [" + initialttsChunkLog + "], " +
+ "timeoutPrompt: [" + timeoutttsChunkLog + "], " +
+ "timeout: " + timeout +
+ "}}")
+
+ ttsPopUp.performInteraction(ttsChunksToString(helpPrompt),
+ ttsChunksToString(initialPrompt),
+ ttsChunksToString(timeoutPrompt),
+ timeout)
+ interactionPopup.grammarID = grammarID
+ console.debug("exit");
+ }
}
diff --git a/src/components/qt_hmi/qml_model_qt5/models/DataStorage.qml b/src/components/qt_hmi/qml_model_qt5/models/DataStorage.qml
index 659a8eabd7..e3785bdf19 100644
--- a/src/components/qt_hmi/qml_model_qt5/models/DataStorage.qml
+++ b/src/components/qt_hmi/qml_model_qt5/models/DataStorage.qml
@@ -442,7 +442,8 @@ QtObject {
property ListModel deviceList: ListModel { }
property ListModel applicationList: ListModel { }
property ListModel stashedApplicationsList: ListModel { }
- property ListModel vrCommands: ListModel {}
+ property ListModel vrCommands: ListModel { }
+ property ListModel choicesVrCommands: ListModel { }
function reset () {
console.log("dataContainer reset enter");
diff --git a/src/components/qt_hmi/qml_model_qt5/models/MediaClockModel.qml b/src/components/qt_hmi/qml_model_qt5/models/MediaClockModel.qml
index cae82c36f1..3712ca4c31 100644
--- a/src/components/qt_hmi/qml_model_qt5/models/MediaClockModel.qml
+++ b/src/components/qt_hmi/qml_model_qt5/models/MediaClockModel.qml
@@ -73,28 +73,22 @@ QtObject {
function onTimer () {
switch (updateMode) {
case Internal.MediaClockUpdateMode.MCU_COUNTUP:
- if (endTime !== -1) {
- if (startTime < endTime) {
- startTime++
- } else {
- timer.stop()
- runningMode = Internal.MediaClockRunningMode.MCR_STOPPED
- console.debug("count Up timer stopped")
- }
+ console.debug("count up")
+ if (startTime < endTime) {
+ startTime++
} else {
- if (startTime < upperTimeLimit) {
- startTime++
- } else {
- startTime = 0
- }
+ timer.stop()
+ runningMode = Internal.MediaClockRunningMode.MCR_STOPPED
+ console.debug("count Up timer stopped")
}
break
case Internal.MediaClockUpdateMode.MCU_COUNTDOWN:
console.debug("count down")
- if (--startTime === 0) {
+ if (startTime > endTime) {
+ startTime--
+ } else {
timer.stop()
runningMode = Internal.MediaClockRunningMode.MCR_STOPPED
- startTime = endTime = -1
console.debug("count Down timer stopped")
}
break
@@ -112,13 +106,12 @@ QtObject {
function onProgress () {
if (startTime === -1) {
progress = 0
- } else {
- if (updateMode === Internal.MediaClockUpdateMode.MCU_COUNTUP) {
- progress = (endTime !== -1) ? (startTime / endTime) : (startTime / upperTimeLimit)
- } else {
- progress = (endTime !== -1) ? ( (startTime - endTime) / (startTimeForProgress - endTime) )
- : (startTime / startTimeForProgress)
- }
+ }
+ else if (endTime != -1 && endTime === startTimeForProgress) {
+ progress = 1
+ }
+ else {
+ progress = (startTime - startTimeForProgress) / (endTime - startTimeForProgress)
}
}
}
diff --git a/src/components/qt_hmi/qml_model_qt5/popups/InteractionPopup.qml b/src/components/qt_hmi/qml_model_qt5/popups/InteractionPopup.qml
index 782fd76c18..a6fc4d7107 100644
--- a/src/components/qt_hmi/qml_model_qt5/popups/InteractionPopup.qml
+++ b/src/components/qt_hmi/qml_model_qt5/popups/InteractionPopup.qml
@@ -46,6 +46,7 @@ ContextPopup {
property int appID
property int interactionLayout
property var async
+ property var grammarID
property bool performInteractionIsActiveNow
Text {
@@ -84,13 +85,15 @@ ContextPopup {
}
}
- function performInteraction(initialText, choiceSet, vrHelpTitle, vrHelp, timeout, interactionLayout, appID) {
+ function performInteraction(initialTextArg, choiceSet, vrHelpTitle, vrHelp, timeout, interactionLayout, appID) {
console.debug("enter")
var app = dataContainer.getApplication(appID)
var dataToUpdate = {}
performInteractionIsActiveNow = true
- initialText.text = initialText.fieldText
+ if (initialTextArg !== undefined){
+ initialText.text = initialTextArg.fieldText
+ }
this.timeout = timeout
this.appID = appID
@@ -123,6 +126,8 @@ ContextPopup {
async = new Async.AsyncCall()
if (piPopUp.choiceSet.count !== 0) {
activate()
+ }else if (grammarID) {
+ vrActivate()
}
console.debug("exit")
return async
@@ -132,9 +137,21 @@ ContextPopup {
console.debug("enter")
timer.interval = timeout
timer.start()
+ if (grammarID) {
+ vrPopUp.sortModelforPerformInteraction()
+ }
show()
console.debug("exit")
}
+ function vrActivate () {
+ console.debug("enter")
+ timer.interval = timeout
+ timer.start()
+ vrPopUp.sortModelforPerformInteraction()
+ vrPopUp.show()
+ vrHelpPopup.show()
+ console.debug("exit")
+ }
function complete (reason, data) {
console.debug("enter")
@@ -150,6 +167,7 @@ ContextPopup {
break
}
timer.stop()
+ grammarID = ""
hide()
performInteractionIsActiveNow = false
console.debug("exit")
diff --git a/src/components/qt_hmi/qml_model_qt5/popups/TTSPopUp.qml b/src/components/qt_hmi/qml_model_qt5/popups/TTSPopUp.qml
index 33f82013b2..d16015ec56 100644
--- a/src/components/qt_hmi/qml_model_qt5/popups/TTSPopUp.qml
+++ b/src/components/qt_hmi/qml_model_qt5/popups/TTSPopUp.qml
@@ -42,6 +42,7 @@ PopUp {
width: Constants.ttsPopUpWidth
padding: Constants.ttsPopUpPadding
property var async
+ property string helpPromptstr
ScrollView {
anchors.fill: parent
@@ -50,6 +51,7 @@ PopUp {
anchors.fill: parent
color: Constants.popUpBorderColor
font.pixelSize: Constants.ttsFontSize
+ text:""
}
}
@@ -63,12 +65,16 @@ PopUp {
Timer {
id: ttsPerformInteractionTimer
interval: Constants.ttsSpeakTime
- onTriggered: activate(message)
+ onTriggered:
+ if(interactionPopup.performInteractionIsActiveNow)
+ activate(message)
property var message: undefined
}
]
function performInteraction(helpPrompt, initialPrompt, timeoutPrompt, timeout) {
+ console.debug("Activate TTS popup:", "message");
+ helpPromptstr = helpPrompt
activate(initialPrompt);
if (timeout * 2 - Constants.ttsSpeakTime > 0) {
ttsPerformInteractionTimer.message = timeoutPrompt;
diff --git a/src/components/qt_hmi/qml_model_qt5/popups/VRPopUp.qml b/src/components/qt_hmi/qml_model_qt5/popups/VRPopUp.qml
index 2acf4f0651..ed33e5ca8d 100644
--- a/src/components/qt_hmi/qml_model_qt5/popups/VRPopUp.qml
+++ b/src/components/qt_hmi/qml_model_qt5/popups/VRPopUp.qml
@@ -57,22 +57,47 @@ PopUp {
anchors.right: parent.right
source: "../res/controlButtons/vrImage.png"
}
+ OvalButton{
+ id:helpButton
+ anchors.rightMargin: Constants.popupMargin
+ anchors.leftMargin: Constants.popupMargin
+ anchors.top: voice.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ text: "Help"
+ onClicked:{
+ if (interactionPopup.performInteractionIsActiveNow)
+ ttsPopUp.activate(ttsPopUp.helpPromptstr)
+ if (dataContainer.activeVR) {
+ vrPopUp.complete();
+ vrHelpPopup.hide()
+ }
+ }
+ }
ScrollableListView {
anchors.bottomMargin: Constants.popupMargin
anchors.rightMargin: Constants.popupMargin
anchors.leftMargin: Constants.popupMargin
- anchors.top: voice.bottom
+ anchors.top: helpButton.bottom
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.left: parent.left
- model: dataContainer.vrCommands
+ model: if (interactionPopup.grammarID) {
+ dataContainer.choicesVrCommands
+ }
+ else {
+ dataContainer.vrCommands
+ }
delegate: OvalButton {
width: parent.width
text: command
+ visible: visibleButtons(grammarID,type)
onClicked: {
+ if (interactionPopup.performInteractionIsActiveNow && type === Common.VRCommandType.Choice)
+ interactionPopup.complete(Common.Result.SUCCESS, {"choiceID": cmdID})
sdlVR.onCommand(cmdID, appID === 0 ? undefined : appID);
if (dataContainer.activeVR) {
vrPopUp.complete();
@@ -93,4 +118,41 @@ PopUp {
sdlVR.stopped();
hide();
}
+
+ function sortModelforPerformInteraction() {
+ var n,
+ i,
+ j;
+ for (n = 0; n < dataContainer.choicesVrCommands.count; n++) {
+ for (i = n + 1; i < dataContainer.choicesVrCommands.count; i++) {
+ if (dataContainer.choicesVrCommands.get(n).type === Common.VRCommandType.Command &&
+ dataContainer.choicesVrCommands.get(i).type === Common.VRCommandType.Choice) {
+ dataContainer.choicesVrCommands.move(i, n, 1);
+ n = 0;
+ }
+ }
+ }
+ for (j = interactionPopup.grammarID.length; j > 0; j--) {
+ for (n = 0; n < dataContainer.choicesVrCommands.count &&
+ dataContainer.choicesVrCommands.get(n).type === Common.VRCommandType.Choice; n++) {
+ for (i = n + 1; i < dataContainer.choicesVrCommands.count &&
+ dataContainer.choicesVrCommands.get(i).type === Common.VRCommandType.Choice; i++) {
+ if (dataContainer.choicesVrCommands.get(n).grammarID !== interactionPopup.grammarID[j-1]
+ && dataContainer.choicesVrCommands.get(i).grammarID === interactionPopup.grammarID[j-1]) {
+ dataContainer.choicesVrCommands.move(i, n, 1);
+ n = 0;
+ }
+ }
+ }
+ }
+ }
+
+ function visibleButtons(grammarID, type) {
+ if (interactionPopup.grammarID) {
+ return interactionPopup.grammarID.indexOf(grammarID) !== -1
+ }
+ else {
+ return type === Common.VRCommandType.Command
+ }
+ }
}
diff --git a/src/components/qt_hmi/qml_model_qt5/views/SDLPlayerOptionsListView.qml b/src/components/qt_hmi/qml_model_qt5/views/SDLPlayerOptionsListView.qml
index 8f3a0a17b6..e249a5eb76 100644
--- a/src/components/qt_hmi/qml_model_qt5/views/SDLPlayerOptionsListView.qml
+++ b/src/components/qt_hmi/qml_model_qt5/views/SDLPlayerOptionsListView.qml
@@ -94,6 +94,7 @@ GeneralView {
case Internal.MenuItemType.MI_NODE:
sdlUI.onCommand(model.id, dataContainer.currentApplication.appId)
contentLoader.back()
+ dataContainer.currentApplication.currentSubMenu = dataContainer.currentApplication.options
break;
case Internal.MenuItemType.MI_SUBMENU:
case Internal.MenuItemType.MI_PARENT:
diff --git a/src/components/qt_hmi/qml_model_qt5/views/ScrollableMessageView.qml b/src/components/qt_hmi/qml_model_qt5/views/ScrollableMessageView.qml
index 895ebbf879..0dcb7a3b32 100644
--- a/src/components/qt_hmi/qml_model_qt5/views/ScrollableMessageView.qml
+++ b/src/components/qt_hmi/qml_model_qt5/views/ScrollableMessageView.qml
@@ -94,6 +94,10 @@ GeneralView {
dataContainer.scrollableMessageModel.result = Common.Result.ABORTED
contentLoader.back()
}
+ onStealFocus: {
+ dataContainer.scrollableMessageModel.result = Common.Result.SUCCESS
+ contentLoader.back()
+ }
}
}
}
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.cc b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.cc
index abfe712398..d026f4bbb5 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.cc
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file dbus_controller.cpp
* \brief DbusController class.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.h
index 45b6a4e7fe..ecda598670 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_controller.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file dbus_controller.h
* \brief DbusController class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.cc b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.cc
index c264a42a8b..0f41a28e73 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.cc
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file dbus_plugin.cpp
* \brief DbusPlugin class source file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.h
index 4d145d09b4..ef2a925956 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/dbus_plugin.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file dbus_plugin.h
* \brief DbusPlugin class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.cc b/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.cc
index bd9e6efea9..8b6cfd57d4 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.cc
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file hmiproxy.cpp
* \brief HmiProxy class source file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.h
index 7fa0e49bf8..886d523157 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/hmi_proxy.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file hmiproxy.h
* \brief HmiProxy class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/metatype.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/metatype.h
index 6f2b54fc57..5224da7f55 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/metatype.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/metatype.h
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2013, Ford Motor Company
* All rights reserved.
*
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/optional_argument.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/optional_argument.h
index 79dfdd1838..b9360c3eb4 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/optional_argument.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/optional_argument.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file optional_argument.h
* \brief OptionalArgument struct header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus_common.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus_common.h
index 6148da71f5..eb9b93929f 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus_common.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus_common.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file qml_dbus_common.h
* \brief Contain utilities for DBus plugin.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/qt_version.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/qt_version.h
index cbad38ed5e..4eff83bd5b 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/qt_version.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/qt_version.h
@@ -1,4 +1,4 @@
-/**
+/*
* @file qt_version.h
* @brief Defines for check Qt version.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.cc b/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.cc
index a1ae3402c4..b60f5226c4 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.cc
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.cc
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2013, Ford Motor Company
* All rights reserved.
*
diff --git a/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.h b/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.h
index 675b6d069e..0d0e279b87 100644
--- a/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.h
+++ b/src/components/qt_hmi/qml_plugins/dbus_adapter/stream_qvariant.h
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2013, Ford Motor Company
* All rights reserved.
*
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.cc b/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.cc
index 42e2e4f370..bcde90930f 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.cc
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file attributed_mouse_event.cpp
* \brief AttributedMouseEvent class source file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.h b/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.h
index b058e28f28..2d2babc29f 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.h
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/attributed_mouse_event.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file attributed_mouse_event.h
* \brief AttributedMouseEvent class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.cc b/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.cc
index 9f4f3b611c..bf63c12cb1 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.cc
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file hmi_hwbuttons.cpp
* \brief HmiHWButtons class source file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.h b/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.h
index ee5fa53021..cf8f0b5f4b 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.h
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/hmi_hwbuttons.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file hmi_hwbuttons.h
* \brief HmiHWButtons class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.cc b/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.cc
index aee3afbbdf..0d144ff84c 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.cc
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file masked_container.cpp
* \brief MaskedContainer class source file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.h b/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.h
index 30e145aa35..0048bdda2a 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.h
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/masked_container.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file masked_container.h
* \brief MaskedContainer class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/hw_buttons/qt_version.h b/src/components/qt_hmi/qml_plugins/hw_buttons/qt_version.h
index 6a277e3867..fb2751504d 100644
--- a/src/components/qt_hmi/qml_plugins/hw_buttons/qt_version.h
+++ b/src/components/qt_hmi/qml_plugins/hw_buttons/qt_version.h
@@ -1,4 +1,4 @@
-/**
+/*
* @file qt_version.h
* @brief Defines for check Qt version.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.cc b/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.cc
index 19eec36651..da863e2e26 100644
--- a/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.cc
+++ b/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.cc
@@ -1,4 +1,4 @@
-/**
+/*
* @file log4cxx_plugin.cpp
* @brief Log4cxxPlugin class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.h b/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.h
index 00e136cf76..fc82352f0c 100644
--- a/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.h
+++ b/src/components/qt_hmi/qml_plugins/log4cxx/log4cxx_plugin.h
@@ -1,4 +1,4 @@
-/**
+/*
* @file log4cxx_plugin.h
* @brief Log4cxxPlugin class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.cc b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.cc
index e231124fe8..f51db76b99 100644
--- a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.cc
+++ b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.cc
@@ -1,4 +1,4 @@
-/**
+/*
* @file named_pipe_notifier.cc
* @brief NamedPipeNotifier class implementation file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.h b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.h
index 14bacd9b6f..993bb3cb31 100644
--- a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.h
+++ b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file named_pipe_notifier.h
* \brief NamedPipeNotifier class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.cc b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.cc
index a423434c17..8aa2b4cf76 100644
--- a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.cc
+++ b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file named_pipe_notifier_plugin.cc
* \brief NamedPipeNotifierPlugin class implementation file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.h b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.h
index 36513aa931..6c64d531ac 100644
--- a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.h
+++ b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/named_pipe_notifier_plugin.h
@@ -1,4 +1,4 @@
-/**
+/*
* \file named_pipe_notifier_plugin.h
* \brief NamedPipeNotifierPlugin class header file.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/qt_version.h b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/qt_version.h
index 42b4bcb9d6..91533346c0 100644
--- a/src/components/qt_hmi/qml_plugins/named_pipe_notifier/qt_version.h
+++ b/src/components/qt_hmi/qml_plugins/named_pipe_notifier/qt_version.h
@@ -1,4 +1,4 @@
-/**
+/*
* @file qt_version.h
* @brief Defines for check Qt version.
* Copyright (c) 2013, Ford Motor Company
diff --git a/src/components/qt_hmi/test/CMakeLists.txt b/src/components/qt_hmi/test/CMakeLists.txt
new file mode 100644
index 0000000000..b0c48a4348
--- /dev/null
+++ b/src/components/qt_hmi/test/CMakeLists.txt
@@ -0,0 +1,70 @@
+# Copyright (c) 2014, Ford Motor Company
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided with the
+# distribution.
+#
+# Neither the name of the Ford Motor Company nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+
+if(BUILD_TESTS)
+
+cmake_minimum_required(VERSION 2.8.11)
+
+set(QT_HMI_TESTS_LIST
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_AddCommand.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_AddSubMenu.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_DeleteCommand.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_ScrollableMessage.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_SetMediaClockTimer.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_Show.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/src/tst_Slider.qml
+ ${COMPONENTS_DIR}/qt_hmi/test/readme.txt
+)
+
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+set(CONFIG
+ warn_on
+ qmltestcase
+)
+
+set(SOURCES
+ qt_hmi_test.cc
+)
+
+set(target qt_hmi_test)
+
+create_test("qt_hmi_test" "${SOURCES}" "")
+qt5_use_modules(${target} Core Qml Quick QuickTest)
+
+foreach( file_i ${QT_HMI_TESTS_LIST})
+ file(COPY ${file_i} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+endforeach( file_i )
+
+endif() \ No newline at end of file
diff --git a/src/components/qt_hmi/test/qt_hmi_test.cc b/src/components/qt_hmi/test/qt_hmi_test.cc
new file mode 100644
index 0000000000..0241549ca5
--- /dev/null
+++ b/src/components/qt_hmi/test/qt_hmi_test.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (c) 2014, Ford Motor Company
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided with the
+ distribution.
+
+ Neither the name of the Ford Motor Company nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <QtQuickTest/quicktest.h>
+QUICK_TEST_MAIN(QtHMI)
diff --git a/src/components/qt_hmi/test/readme.txt b/src/components/qt_hmi/test/readme.txt
new file mode 100644
index 0000000000..e169a4eb87
--- /dev/null
+++ b/src/components/qt_hmi/test/readme.txt
@@ -0,0 +1,14 @@
+A few comments on test writting for QML Unit Testing
+
+- set TestCase inside Item - this allows to send Mouse and keyboard events to controls
+- content of QML is reachable directly from tests. It is necessary to add getters into
+ source QML file to handle internal items
+- test execution order is alfabetical. If you need manage this order use numbers in test function names
+- all functions that starts with "test_" prefix is treated as test case
+- all files that starts with "tst_" prefix will be executed as test set
+- for async testing use timer
+- each system's entity that changes during RPC must be tested
+- test incoming arguments is not necessary as it will be verified by Qt abstraction layer
+- run test with following command:
+ "./qt_hmi_test -import ../git push qml_model_qt5/"
+
diff --git a/src/components/qt_hmi/test/src/tst_AddCommand.qml b/src/components/qt_hmi/test/src/tst_AddCommand.qml
new file mode 100644
index 0000000000..e71fb66b11
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_AddCommand.qml
@@ -0,0 +1,320 @@
+/**
+ * @file tst_AddSubMenu.qml
+ * @brief Test Case for OptionsView.
+ * Copyright (c) 2014, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item {
+ width : mainWindowLoader.width
+ height: mainWindowLoader.height
+
+ Loader {
+ id: mainWindowLoader
+ asynchronous : false
+ }
+
+ TestCase {
+ name: "AddCommand"
+ when: windowShown
+ property var dataContainer
+ property var sdlUIProxy
+ property var contentLoader
+ property var messageModel
+
+ function createView(appID) {
+ mainWindowLoader.source = "../qml_model_qt5/MainWindow.qml"
+ var mainWindowObject = mainWindowLoader.item
+ sdlUIProxy = mainWindowObject.getUIProxy()
+ dataContainer = mainWindowObject.getDataStorage()
+ dataContainer.addApplication({appName:"TestAppName", appId:appID})
+ }
+
+ function destroyView() {
+ mainWindowLoader.source = ""
+ }
+
+ /*
+ * Test Cases
+ */
+
+ function test_01_addCommand_Command_Positive() {
+ console.debug("enter")
+
+ var initData = {
+ cmdID: 1,
+ cmdIcon: {
+ value: "123.jpg",
+ imageType: "DYNAMIC"
+ },
+ menuParams: {
+ position: 500,
+ menuName: "Command positive"
+ },
+ appID: 1
+ }
+
+ createView(initData.appID)
+ sdlUIProxy.addCommand(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.cmdID, "Command id")
+ compare(app.options.get(0).position, initData.menuParams.position, "Command position")
+ compare(app.options.get(0).name, initData.menuParams.menuName, "Command name")
+ compare(app.options.get(0).icon.value, initData.cmdIcon.value, "Image path")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_02_addCommand_Without_Position() {
+ console.debug("enter")
+ var initData = {
+ appID: 1,
+ Commands: []
+ }
+ initData.Commands.push({
+ cmdID:1,
+ comIcon: {
+ value: "123.jpg",
+ imageType: "DYNAMIC"
+ },
+ menuParams: {
+ menuName: "Command 1"
+ },
+ appID: 1
+ })
+ initData.Commands.push({
+ cmdID:2,
+ cmdIcon: {
+ value: "345.jpg",
+ imageType: "DYNAMIC"
+ },
+ menuParams: {
+ position: 500,
+ menuName: "Command 1"
+ },
+ appID: 1
+ })
+ createView(initData.appID)
+ sdlUIProxy.addCommand(initData.Commands[0])
+ sdlUIProxy.addCommand(initData.Commands[1])
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(1).id, initData.Commands[0].cmdID, "Command id")
+ compare(app.options.get(1).name, initData.Commands[0].menuParams.menuName, "Command name")
+ compare(app.options.get(0).id, initData.Commands[1].cmdID, "Command id")
+ compare(app.options.get(0).name, initData.Commands[1].menuParams.menuName, "Command name")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_03_1010_addCommands() {
+ console.debug("enter")
+ var initData = {
+ appID: 1,
+ Commands: []
+ }
+
+ for (var i = 0; i < 1010; i++) {
+ initData.Commands.push({
+ cmdID: i,
+ cmdIcon: {
+ value: "",
+ imageType: ""
+ },
+ menuParams: {
+ position: i,
+ menuName: "Command " + i
+ },
+ appID: 1
+ })
+ }
+
+ createView(initData.appID)
+ for (var i = 0; i < initData.Commands.length; i++) {
+ sdlUIProxy.addCommand(initData.Commands[i])
+ }
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.count, 1000, "Command count")
+
+ for (var i = 0; i < 1000; i++) {
+ compare(app.options.get(i).id, initData.Commands[i].cmdID, "Command id")
+ compare(app.options.get(i).position, initData.Commands[i].menuParams.position, "Command position")
+ compare(app.options.get(i).name, initData.Commands[i].menuParams.menuName, "Command name")
+ }
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_04_Command_Upper_Bound() {
+ console.debug("enter")
+ var initData = {
+ cmdID: 2000000000,
+ cmdIcon: {
+ value: "00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890aAaaaaaaaaaaaaaa",
+ imageType: ""
+ },
+ menuParams: {
+ position: 100000,
+ menuName: "00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890aAaaaaaaaaaaaaaa"
+ },
+ appID: 1
+ }
+
+ createView(initData.appID)
+ sdlUIProxy.addCommand(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.cmdID, "Command id")
+ compare(app.options.get(0).position, initData.menuParams.position, "Command position")
+ compare(app.options.get(0).name.length, initData.menuParams.menuName.length, "Command name")
+ compare(app.options.get(0).icon.value.length, initData.cmdIcon.value.length, "Image path")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_05_addCommand_Lower_Bound() {
+ console.debug("enter")
+ var initData = {
+ cmdID: 0,
+ cmdIcon: {
+ value: "",
+ imageType: ""
+ },
+ menuParams: {
+ position: 0,
+ menuName: "0",
+ parentID: 0
+ },
+ appID: 0
+ }
+
+ createView(initData.appID)
+ sdlUIProxy.addCommand(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.cmdID, "Command id")
+ compare(app.options.get(0).position, initData.menuParams.position, "Command position")
+ compare(app.options.get(0).name, initData.menuParams.menuName, "Command name")
+ compare(app.options.get(0).icon.value, initData.cmdIcon.value, "Image path")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_06_addCommand_With_Fake_Parameter() {
+ console.debug("enter")
+ var initData = {
+ cmdID: 1,
+ cmdIcon: {
+ value: "345.jpg",
+ imageType: "DYNAMIC"
+ },
+ menuParams: {
+ menuName: "Command fake param",
+ position: 1,
+ fakeParam: "fakeParam"
+ },
+ appID: 1
+ }
+
+ createView(initData.appID)
+ sdlUIProxy.addCommand(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.cmdID, "Command id")
+ compare(app.options.get(0).position, initData.menuParams.position, "Command position")
+ compare(app.options.get(0).name, initData.menuParams.menuName, "Command name")
+ compare(app.options.get(0).icon.value, initData.cmdIcon.value, "Image path")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_07_addCommand_No_Menu_Params() {
+ console.debug("enter")
+
+ var initData = {
+ appID: 1,
+ Commands:[]
+ }
+
+ var n = 10;
+ initData.Commands.push({
+ cmdID: 123,
+ menuParams: {},
+ appID: 1
+ })
+ for (var i = 0; i < n; i++) {
+ initData.Commands.push({
+ cmdID: i,
+ menuParams: {
+ position: i,
+ menuName: "Command " + i
+ },
+ appID: 1
+ })
+ }
+
+ createView(initData.appID)
+ for (var i = 0; i < initData.Commands.length; i++) {
+ sdlUIProxy.addCommand(initData.Commands[i])
+ }
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.count, initData.Commands.length, "Command count")
+ compare(app.options.get(n).id, initData.Commands[0].cmdID, "Command 11 id")
+ compare(app.options.get(0).id, initData.Commands[1].cmdID, "Command 12 id")
+
+ destroyView()
+ console.debug("exit")
+ }
+ }
+}
diff --git a/src/components/qt_hmi/test/src/tst_AddSubMenu.qml b/src/components/qt_hmi/test/src/tst_AddSubMenu.qml
new file mode 100644
index 0000000000..7f9477cab1
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_AddSubMenu.qml
@@ -0,0 +1,328 @@
+/**
+ * @file tst_AddSubMenu.qml
+ * @brief Test Case for OptionsView.
+ * Copyright (c) 2014, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item {
+ width : mainWindowLoader.width
+ height: mainWindowLoader.height
+
+ Loader {
+ id: mainWindowLoader
+ asynchronous : false
+ }
+
+ TestCase {
+ name: "AddSubMenu"
+ when: windowShown
+ property var dataContainer
+ property var sdlUIProxy
+ property var contentLoader
+ property var messageModel
+
+ //initialization for each test
+ function createMessageView(appID) {
+ mainWindowLoader.source = ""
+ mainWindowLoader.source = "../qml_model_qt5/MainWindow.qml"
+ var mainWindowObject = mainWindowLoader.item
+ if(!mainWindowObject)
+ qtest_fail("mainWindowObject is undefined");
+ var mainScreen = mainWindowObject.getMainScreen()
+ mainScreen.visible = true
+ var warningInfo = mainWindowObject.getWarningInfo()
+ warningInfo.visible = false
+ contentLoader = mainWindowObject.getContentLoader()
+ contentLoader.asynchronous = false
+ sdlUIProxy = mainWindowObject.getUIProxy()
+ dataContainer = mainWindowObject.getDataStorage()
+ dataContainer.addApplication({appName:"TestAppName", appId:appID})
+ }
+
+ //cleanup for each test
+ function destroyView() {
+ //Clear Loader with MainWindow, which delete own models and views
+ mainWindowLoader.source = ""
+ }
+
+ /*
+ * Test Cases
+ */
+
+ //Positive case and in boundary conditions
+ function test_01_addSubMenu() {
+ console.debug("enter")
+ var initData = {
+ menuID: 1000,
+ menuParams: {
+ position: 500,
+ menuName: "SubMenu positive"
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.menuID, "SubMenu id")
+ compare(app.options.get(0).position, initData.menuParams.position, "SubMenu position")
+ compare(app.options.get(0).name, initData.menuParams.menuName, "SubMenu name")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ // Only mandatory - without Position
+ function test_02_addSubMenu_WithoutPosition() {
+ console.debug("enter")
+ var initData = {
+ menuID: 1001,
+ menuParams: {
+ menuName: "SubMenu mandatory only"
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.menuID, "SubMenu id")
+ //How to verify if value was not set?
+ //compare(app.options.get(0).position, initData.menuParams.position, "SubMenu position")
+ compare(app.options.get(0).name, initData.menuParams.menuName, "SubMenu name")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ //Create AddSubMenu and check data
+ function test_03_1000_SubMenu() {
+ console.debug("enter")
+ var initData = {
+ appID: 1,
+ subMenus: []
+ }
+
+ for (var i = 0; i < 1010; i++) {
+
+ initData.subMenus.push({
+ menuID: i,
+ menuParams: {
+ position: i,
+ menuName: "Submenu" + i
+ },
+ appID: 1
+ })
+ }
+
+ createMessageView(initData.appID)
+ for (var i = 0; i < initData.subMenus.length; i++) {
+ sdlUIProxy.addSubMenu(initData.subMenus[i])
+ }
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.count, 1000, "SubMenus count")
+
+ for (var i = 0; i < 1000; i++) {
+ compare(app.options.get(i).id, initData.subMenus[i].menuID, "SubMenu id")
+ compare(app.options.get(i).position, initData.subMenus[i].menuParams.position, "SubMenu position")
+ compare(app.options.get(i).name, initData.subMenus[i].menuParams.menuName, "SubMenu name")
+ }
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ //Create AddSubMenu and check data
+ function test_04_addSubMenu_UpperBound() {
+ console.debug("enter")
+ var initData = {
+ menuID: 2000000000,
+ menuParams: {
+ position: 1000,
+ menuName: "00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012å/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHI=JKL+MNO|PQR~STU{}WXY[]Z,01234567890aAaaaaaaaaaaaaaa"
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.menuID, "SubMenu id")
+ compare(app.options.get(0).position, initData.menuParams.position, "SubMenu position")
+ compare(app.options.get(0).name.length, 500, "SubMenu name")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ //Create AddSubMenu and check data
+ function test_05_addSubMenu_LowerBound() {
+ console.debug("enter")
+ var initData = {
+ menuID: 0,
+ menuParams: {
+ position: 0,
+ menuName: "0"
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.menuID, "SubMenu id")
+ compare(app.options.get(0).position, initData.menuParams.position, "SubMenu position")
+ compare(app.options.get(0).name.length, 1, "SubMenu name")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ // With fake parameter
+ function test_06_addSubMenu_With_Fake_Parameter() {
+ console.debug("enter")
+ var initData = {
+ menuID: 1001,
+ menuParams: {
+ menuName: "SubMenu fake param",
+ position: 1,
+ fakeParam: "fakeParam"
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.get(0).id, initData.menuID, "SubMenu id")
+ compare(app.options.get(0).position, initData.menuParams.position, "SubMenu position")
+ compare(app.options.get(0).name, initData.menuParams.menuName, "SubMenu name")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ // With fake parameter
+ function test_07_addSubMenu_menuIDOutLowerBound() {
+ console.debug("enter")
+ var initData = {
+ menuID: -1,
+ menuParams: {
+ menuName: "100",
+ position: 1,
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.count, 0, "SubMenus count")
+
+ compare(app.options.get(1), !undefined, "SubMenu duplicated")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ // With fake parameter
+ function test_08_addSubMenu_menuIDOutUpperBound() {
+ console.debug("enter")
+ var initData = {
+ menuID: 2000000001,
+ menuParams: {
+ menuName: "100",
+ position: 1,
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.count, 0, "SubMenus count")
+
+ compare(app.options.get(1), !undefined, "SubMenu duplicated")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ // With fake parameter
+ function test_09_addSubMenu_duplicatedSubMenus() {
+ console.debug("enter")
+ var initData = {
+ menuID: 2000000001,
+ menuParams: {
+ menuName: "100",
+ position: 1,
+ },
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ sdlUIProxy.addSubMenu(initData)
+ sdlUIProxy.addSubMenu(initData)
+ var app = dataContainer.getApplication(initData.appID)
+
+ compare(app.options.count, 1, "SubMenus count")
+
+ compare(app.options.get(1), undefined, "SubMenu duplicated")
+
+ destroyView()
+ console.debug("exit")
+ }
+ }
+}
diff --git a/src/components/qt_hmi/test/src/tst_DeleteCommand.qml b/src/components/qt_hmi/test/src/tst_DeleteCommand.qml
new file mode 100644
index 0000000000..bf28be0282
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_DeleteCommand.qml
@@ -0,0 +1,210 @@
+/**
+ * @file tst_ScrollableMessage.qml
+ * @brief Test Case for ScrollableMessageView.
+ * Copyright (c) 2014, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item
+{
+ width : mainWindowLoader.width
+ height: mainWindowLoader.height
+
+ Loader
+ {
+ id: mainWindowLoader
+ asynchronous : false
+ }
+
+ TestCase
+ {
+ name: "DeleteCommand"
+ when: windowShown
+ property var dataContainer
+ property var sdlUIProxy
+ property var contentLoader
+ property var messageModel
+
+
+ //initialization for each test
+ function createMessageView(appID)
+ {
+ mainWindowLoader.source = ""
+ mainWindowLoader.source = "../qml_model_qt5/MainWindow.qml"
+ var mainWindowObject = mainWindowLoader.item
+ if(!mainWindowObject)
+ qtest_fail("mainWindowObject is undefined");
+ var mainScreen = mainWindowObject.getMainScreen()
+ mainScreen.visible = true
+ var warningInfo = mainWindowObject.getWarningInfo()
+ warningInfo.visible = false
+ contentLoader = mainWindowObject.getContentLoader()
+ contentLoader.asynchronous = false
+ sdlUIProxy = mainWindowObject.getUIProxy()
+ dataContainer = mainWindowObject.getDataStorage()
+ dataContainer.addApplication({appName:"TestAppName", appId:appID})
+ }
+
+ //cleanup for each test
+ function destroyView()
+ {
+ //Clear Loader with MainWindow, which delete own models and views
+ mainWindowLoader.source = ""
+ }
+
+ /*
+ * Test Cases
+ */
+
+ function test_01_deleteCommand()
+ {
+ console.debug("enter")
+ var initData = {
+ cmdID: 1,
+ menuParams:
+ {
+ menuName:"",
+ },
+ cmdIcon:"",
+ appID: 1
+ }
+ var initData2 = {
+ cmdID: 2,
+ menuParams:
+ {
+ menuName:"",
+ },
+ cmdIcon:"",
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ var app = dataContainer.getApplication(initData.appID)
+ var MenuCount = app.options.count
+ app.options.append(
+ { id: initData.cmdID,
+ name: initData.menuParams.menuName,
+ type: Internal.MenuItemType.MI_NODE,
+ position: Constants.positionOfElementWithoutPosition,
+ icon: initData.cmdIcon ? cmdIcon : {},
+ subMenu: []
+ }
+ )
+
+ compare(app.options.count, MenuCount+1, "Command into menu not added")
+ sdlUIProxy.deleteCommand(initData2)
+
+ var a = 0
+ for(var i = 0;((a === 0) && ( i < app.options.count)); i++)
+ {
+ if (app.options.get(i).id===initData2.menuID)
+ {
+ a = 1
+ }
+ }
+ compare (a, 0, "Command in menu isn't removed")
+
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ function test_02_deleteCommand() {
+ console.debug("enter")
+ var initData = {
+ menuID: 1000,
+ menuParams: {
+ position: 1,
+ menuName: "SubMenu"
+ },
+ appID: 1
+ }
+
+ var initData2 = {
+ cmdID: 1,
+ menuParams: {
+ menuName:"",
+ },
+ cmdIcon:"",
+ appID: 1
+ }
+
+ createMessageView(initData.appID)
+ var app = dataContainer.getApplication(initData.appID)
+ var MenuCount = app.options.count
+ app.options.append ({
+ "id": initData.menuID,
+ "name": initData.menuParams.menuName,
+ "position": initData.menuParams.position,
+ "type": Internal.MenuItemType.MI_SUBMENU,
+ "icon": undefined,
+ "subMenu":[{
+ "id":initData2.cmdID,
+ "name": initData2.menuParams.menuName,
+ "position": Constants.positionOfElementWithoutPosition,
+ "type": Internal.MenuItemType.MI_PARENT,
+ "icon": {
+ "imageType": Common.ImageType.DYNAMIC,
+ "value": "../res/nav/turnArrow.png"
+ },
+
+ "subMenu": []
+ }]
+ })
+
+ compare(app.options.count, MenuCount+1, "SubMenu into added")
+ var SubMenuCount = app.options.get(0).subMenu.count
+ compare( SubMenuCount, 1, "Command is not added into SubMenu")
+
+ sdlUIProxy.deleteCommand(initData2)
+
+ compare(app.options.count , MenuCount+1, "Menu is changed")
+ compare(app.options.get(0).subMenu.count, SubMenuCount-1, "Command into SubMenu is not removed")
+
+ destroyView()
+ console.debug("exit")
+ }
+ }
+}
diff --git a/src/components/qt_hmi/test/src/tst_ScrollableMessage.qml b/src/components/qt_hmi/test/src/tst_ScrollableMessage.qml
new file mode 100644
index 0000000000..abf3105b1a
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_ScrollableMessage.qml
@@ -0,0 +1,421 @@
+/**
+ * @file tst_ScrollableMessage.qml
+ * @brief Test Case for ScrollableMessageView.
+ * Copyright (c) 2014, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item {
+ width : mainWindowLoader.width
+ height: mainWindowLoader.height
+
+ Loader {
+ id: mainWindowLoader
+ asynchronous : false
+ }
+
+ TestCase {
+ name: "ScrollableMessageView"
+ when: windowShown
+ property var dataContainer
+ property var sdlUIProxy
+ property var contentLoader
+ property var messageModel
+ property var messageView
+ property var timer
+
+ property var softButtonsListExample : [
+ {softButtonID:0, isHighlighted:true, systemAction:Common.SystemAction.DEFAULT_ACTION,
+ type:Common.SoftButtonType.SBT_TEXT, text:"Default Action"},
+ {softButtonID:1, isHighlighted:false, systemAction:Common.SystemAction.STEAL_FOCUS,
+ type:Common.SoftButtonType.SBT_IMAGE, text:"Steal Focus"},
+ {softButtonID:2, isHighlighted:false, systemAction:Common.SystemAction.KEEP_CONTEXT,
+ type:Common.SoftButtonType.SBT_BOTH, text:"Keep context"}]
+
+ //initialization for each test
+ function createMessageView(appID) {
+ mainWindowLoader.source = ""
+ mainWindowLoader.source = "../qml_model_qt5/MainWindow.qml"
+ var mainWindowObject = mainWindowLoader.item
+ if(!mainWindowObject)
+ qtest_fail("mainWindowObject is undefined");
+ var mainScreen = mainWindowObject.getMainScreen()
+ mainScreen.visible = true
+ var warningInfo = mainWindowObject.getWarningInfo()
+ warningInfo.visible = false
+ contentLoader = mainWindowObject.getContentLoader()
+ contentLoader.asynchronous = false
+ sdlUIProxy = mainWindowObject.getUIProxy()
+ dataContainer = mainWindowObject.getDataStorage()
+ dataContainer.addApplication({appName:"TestAppName", appId:appID})
+ }
+
+ //get messageModel and messageView after call @scrollableMessage
+ function getMessageViewModel() {
+ messageModel = dataContainer.scrollableMessageModel
+ if(!messageModel)
+ qtest_fail("messageModel is undefined");
+ messageView = contentLoader.item
+ if(!messageView)
+ qtest_fail("messageView is undefined");
+ }
+
+ //cleanup for each test
+ function destroyView() {
+ //Clear Loader with MainWindow, which delete own models and views
+ mainWindowLoader.source = ""
+ }
+
+ //return button from messageView by ommon.SystemAction
+ function findButtonByAction(systemAction){
+ var listViewItems = messageView.getSoftButtonsListView()
+ for (var i = 0, len = listViewItems.count; i < len; i++) {
+ //get SoftButton by setting current item (ListView has no getter)
+ listViewItems.currentIndex = i
+ var buttonItem = listViewItems.currentItem
+ if (buttonItem.button.systemAction === systemAction) {
+ return buttonItem
+ }
+ }
+ }
+
+ /*
+ * Test Cases
+ */
+
+ //Create ScrollableMessageView and check data
+ function test_01_create() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:2000,
+ messageText:{fieldText:"Simple ScrollableMessage text"},
+ softButtons:softButtonsListExample}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+ timer = messageView.getTimer()
+ if(!timer)
+ qtest_fail("timer is undefined");
+ //check button equals to init data
+ compare(messageModel.softButtons.count, initData.softButtons.length, "wrong buttons count created")
+ for (var i = 0, len = messageModel.softButtons.count; i < len; i++) {
+ var act = messageModel.softButtons.get(i)
+ var exp = initData.softButtons[i]
+ compare(act.softButtonID, exp.softButtonID, "wrong softButtonID in button")
+ compare(act.isHighlighted, exp.isHighlighted, "wrong isHighlighted in button")
+ compare(act.systemAction, exp.systemAction, "wrong systemAction in button")
+ compare(act.text, exp.text, "wrong text in button")
+ }
+ //check model data equals to init data
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ compare(messageModel.longMessageText, initData.messageText.fieldText, "wrong messageText")
+ compare(messageModel.appId, initData.appID, "wrong application ID")
+ compare(messageModel.timeout, initData.timeout, "wrong timeout")
+ verify(messageModel.async !== undefined, "async in undefined")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //Create ScrollableMessageView with empty data
+ function test_02_emptyInit() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:0, messageText:{fieldText:""}, softButtons:[]}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+ //NOTE: don't check timer - it has been triggered immediately (timeout is 0)
+ //MessageView call @complete immediately
+ compare(messageModel.running, false, "ScrollableMessage didn't stop")
+ compare(messageModel.softButtons.count, initData.softButtons.length, "wrong buttons count")
+ compare(messageModel.longMessageText, initData.messageText.fieldText, "wrong messageText")
+ compare(messageModel.timeout, initData.timeout, "wrong timeout")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //call @scrollableMessage twice (after first view has closed)
+ function test_03_doubleCreate() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:0, messageText:{fieldText:"Simple text"},
+ softButtons:softButtonsListExample}
+ var initData2 = {appID:1, timeout:10000, messageText:{fieldText:"Simple text 2"},
+ softButtons:[]}
+ createMessageView(initData.appID)
+
+ //create view
+ var actualResult = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ //create new view
+ var actualResult2 = sdlUIProxy.scrollableMessage(initData2)
+ getMessageViewModel()
+
+ verify(actualResult.__errno === undefined, "ScrollableMessage return error state")
+ verify(actualResult2.__errno === undefined, "ScrollableMessage return error state")
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ compare(messageModel.longMessageText, initData2.messageText.fieldText, "wrong messageText")
+ compare(messageModel.timeout, initData2.timeout, "wrong timeout")
+ compare(messageModel.appId, initData2.appID, "wrong application ID")
+ verify(messageModel.async !== undefined, "async in undefined")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //call @scrollableMessage twice (before first view is closed)
+ function test_04_doubleCreateError() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:20000, messageText:{fieldText:"Simple text"},
+ softButtons:softButtonsListExample}
+ var initData2 = {appID:1, timeout:10000, messageText:{fieldText:"Simple text 2"},
+ softButtons:[]}
+ createMessageView(initData.appID)
+
+ //create view
+ var actualResult = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+ var firstView = messageView;
+
+ //create new view
+ var actualResult2 = sdlUIProxy.scrollableMessage(initData2)
+ getMessageViewModel()
+ verify(actualResult.__errno === undefined, "ScrollableMessage return error state")
+ verify(actualResult2.__errno !== undefined, "ScrollableMessage don't return error state")
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ compare(messageView, firstView, "creating new view insteed stay first")
+ compare(messageModel.longMessageText, initData.messageText.fieldText, "wrong messageText")
+ compare(messageModel.timeout, initData.timeout, "wrong timeout")
+ compare(messageModel.appId, initData.appID, "wrong application ID")
+ verify(messageModel.async !== undefined, "async in undefined")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //call @scrollableMessage and check close
+ function test_05_ClickBackButton() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:20000,
+ messageText:{fieldText:"Simple ScrollableMessage text"},
+ softButtons:softButtonsListExample}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+ //look for back button
+ var backButton = messageView.getBackButton()
+ verify(backButton !== undefined, "Not created back button")
+ //wait rendering for correct click position
+ waitForRendering(mainWindowLoader)
+ //Press back button
+ mouseClick(backButton, backButton.width/2, backButton.height/2,
+ Qt.LeftButton, Qt.NoModifier, 0)
+ //check that MessageView (in contentLoader) is unloaded and deleted
+ var isLoaded = (contentLoader.source.toString().indexOf("ScrollableMessageView.qml") > 0)
+ verify(!isLoaded, "MessageView should be unloaded")
+ //wait for delete messageView by GC
+ wait(0);
+ verify(messageView === null, "MessageView should be deleted")
+ destroyView()
+ console.debug("exit")
+ }
+ //call @scrollableMessage and check close
+ function test_06_ClickDefaultAction() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:20000,
+ messageText:{fieldText:"Simple ScrollableMessage text"},
+ softButtons:softButtonsListExample}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+ //look for DEFAULT_ACTION button
+ var defaultActionButton = findButtonByAction(Common.SystemAction.DEFAULT_ACTION)
+ verify(defaultActionButton !== undefined, "Not created button with DEFAULT_ACTION")
+ //wait rendering for correct click position
+ waitForRendering(mainWindowLoader)
+ //Press default button
+ mouseClick(defaultActionButton, defaultActionButton.width/2, defaultActionButton.height/2,
+ Qt.LeftButton, Qt.NoModifier, 0)
+ //check that MessageView (in contentLoader) is unloaded and deleted
+ var isLoaded = (contentLoader.source.toString().indexOf("ScrollableMessageView.qml") > 0)
+ verify(!isLoaded, "MessageView should be unloaded")
+ //wait for delete messageView by GC
+ wait(0);
+ verify(messageView === null, "MessageView should be deleted")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //call @scrollableMessage and check restart timer
+ function test_07_ClickStealFocus() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:20000, messageText:{fieldText:"Simple ScrollableMessage text"},
+ softButtons:softButtonsListExample}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ //check
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+ //look for STEAL_FOCUS button
+ var stealFocusButton = findButtonByAction(Common.SystemAction.STEAL_FOCUS)
+ verify(stealFocusButton !== undefined, "Not created button with STEAL_FOCUS")
+ //wait rendering for correct buttons size for correct click position
+ waitForRendering(mainWindowLoader)
+ mouseClick(stealFocusButton, stealFocusButton.width/2, stealFocusButton.height/2,
+ Qt.LeftButton, Qt.NoModifier, 0)
+ //check that MediaView loaded in loade
+ var viewQMlFileName = dataContainer.currentApplication.isMediaApplication ?
+ "SDLPlayerView.qml" : "SDLNonMediaView.qml"
+ var isLoaded = (contentLoader.source.toString().indexOf(viewQMlFileName) > 0)
+ verify(isLoaded, "SDLPlayerView/SDLNonMediaView should be loaded")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //call @scrollableMessage and check restart timer
+ function test_08_ClickKeepContex() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:20000, messageText:{fieldText:"Simple ScrollableMessage text"},
+ softButtons:softButtonsListExample}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ //check
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+ //look for KEEP_CONTEXT button
+ var keepContexButton = findButtonByAction(Common.SystemAction.KEEP_CONTEXT)
+ verify(keepContexButton !== undefined, "Not created button with KEEP_CONTEXT")
+ //wait rendering for correct click position
+ waitForRendering(mainWindowLoader)
+ //Press button
+ mouseClick(keepContexButton, keepContexButton.width/2, keepContexButton.height/2,
+ Qt.LeftButton, Qt.NoModifier, 0)
+ //check that MessageView is still unloaded loaded
+ var isLoaded = (contentLoader.source.toString().indexOf("ScrollableMessageView.qml") > 0)
+ verify(isLoaded, "MessageView should be loaded")
+ //verify restarted timer
+ timer = messageView.getTimer()
+ verify(timer.running === true, "Timer is not restarted by KEEP_CONTEXT button")
+ destroyView()
+ console.debug("exit")
+ }
+
+ //add long text to model and check scrollBar visibility
+ function test_09_ScrollBarShown() {
+ console.debug("enter")
+ //generate string with (10!) lines
+ var longText = "It is very long text!\n"
+ for(var i = 1; i < 10; ++i)
+ longText += longText
+ var initData = {appID:1, timeout:20000, messageText:{fieldText:longText}, softButtons:[]}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ //check
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+
+ //wait rendering
+ waitForRendering(mainWindowLoader)
+ var scrollBar = messageView.getScrollbar()
+ verify(scrollBar.visible === true, "ScrollBar is not shown for long text")
+
+ destroyView()
+ console.debug("exit")
+ }
+
+ //compare text width with and without buttons at top of SrollableMessage
+ function test_10_MessageTextHeight() {
+ console.debug("enter")
+ var initData = {appID:1, timeout:500, messageText:{fieldText:"Simple text"}, softButtons:[]}
+ createMessageView(initData.appID)
+
+ var result = sdlUIProxy.scrollableMessage(initData)
+ getMessageViewModel()
+
+ //check
+ compare(messageModel.running, true, "ScrollableMessage didn't start")
+ verify(result.__errno === undefined, "ScrollableMessage return error state")
+
+ var textAreaHeight = messageView.getTextArea().height
+ wait(initData.timeout)
+
+ var initData2 = {appID:1, timeout:20000, messageText:{fieldText:"Simple text"},
+ softButtons:softButtonsListExample}
+ createMessageView(initData.appID)
+
+ var result2 = sdlUIProxy.scrollableMessage(initData2)
+ getMessageViewModel()
+
+ //wait rendering
+ waitForRendering(mainWindowLoader)
+ var textAreaHeight2 = messageView.getTextArea().height
+ console.debug("messageTextH", textAreaHeight, textAreaHeight2)
+ verify(textAreaHeight2 <= textAreaHeight, "Height of text area shoud be less with buttons")
+
+ destroyView()
+ console.debug("exit")
+ }
+ }
+}
diff --git a/src/components/qt_hmi/test/src/tst_SetMediaClockTimer.qml b/src/components/qt_hmi/test/src/tst_SetMediaClockTimer.qml
new file mode 100644
index 0000000000..212cdfc143
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_SetMediaClockTimer.qml
@@ -0,0 +1,292 @@
+/**
+ * @file tst_Slider.qml
+ * @brief Test Case for Slider.
+ * Copyright (c) 2013, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item {
+ id:item123
+ TestCase {
+ name: "time"
+ property var mainWindowComponent : Qt.createComponent("../qml_model_qt5/MainWindow.qml")
+ property var mainObject
+ property var sdlUI
+ property var dataContainer
+
+ function createTime() {
+ mainObject = mainWindowComponent.createObject(parent)
+ sdlUI = mainObject.getUIProxy()
+ dataContainer = mainObject.getDataStorage()
+ }
+
+ function destroyTime() {
+ mainObject.destroy()
+ }
+
+ //No end time, works like a timer
+ function test_01_noEndTimeInCountUp() {
+ console.debug("enter")
+
+ var initData = {startTime:{hours: 4, minutes: 0, seconds: 0}, endTime:undefined , updateMode: 0, appID: 1}
+
+ var expectedResult = {endTimeResult:-1, resultCode : Common.Result.SUCCESS}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+
+ try {
+ compare(dataContainer.getApplication(initData.appID).mediaClock.endTime, expectedResult.endTimeResult, "time position")
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ //No start time. Function process error
+ function test_02_noStartTime() {
+ console.debug("enter")
+
+ var initData = {startTime:undefined, endTime:{hours: 4, minutes: 0, seconds: 0} , updateMode: 1, appID: 1}
+ var expectedResult = {resultCode : Common.Result.INVALID_DATA}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+
+ try {
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ //Receive "pause", when onready paused
+ function test_03_pauseAfterPause() {
+ console.debug("enter")
+
+ var initData = {startTime:{hours: 4, minutes: 0, seconds: 0}, endTime:{hours: 12, minutes: 00, seconds: 00}, updateMode: 0, appID: 1}
+ var expectedResult = {resultCode : Common.Result.IGNORED}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ sdlUI.setMediaClockTimer(initData)
+
+ initData.updateMode=2
+ sdlUI.setMediaClockTimer(initData)
+
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+
+ try {
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ //Receive "RESUME" after "CLEAR"
+ function test_04_resumeAfterClear() {
+ console.debug("enter")
+
+ var initData = {startTime:{hours: 10, minutes: 0, seconds: 0},endTime:{ }, updateMode:0, appID:1}
+
+ var expectedResult = {resultCode : Common.Result.IGNORED}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ sdlUI.setMediaClockTimer(initData)
+
+ initData.updateMode=4
+ sdlUI.setMediaClockTimer(initData)
+
+ initData.updateMode=3
+ sdlUI.setMediaClockTimer(initData)
+
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+ try {
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ function test_05_resumeAfterEnd() {
+ console.debug("enter")
+
+ var initData = {startTime:{hours: 0, minutes: 12, seconds: 33},endTime:{hours: 0, minutes: 12, seconds: 33}, updateMode:0, appID:1}
+
+ var expectedResult = {resultCode : Common.Result.IGNORED}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ sdlUI.setMediaClockTimer(initData)
+
+ dataContainer.setApplicationProperties(initData.appID, {
+ "mediaClock": {
+ "updateMode": 0,
+ "runningMode": 1,
+ "startTime": initData.StartTime,
+ "endTime": initData.EndTime,
+ "startTimeForProgress": 753
+ }
+ })
+ initData.updateMode=3
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+
+ try {
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ //Launch "COUNTUP" twice
+ function test_06_twoCountUp() {
+ console.debug("enter")
+
+ var initData1 = {startTime:{hours: 4, minutes: 0, seconds: 0}, endTime:{hours: 12, minutes: 00, seconds: 00}, updateMode: 0, appID: 1}
+ var initData2 = {startTime:{hours: 5, minutes: 0, seconds: 0}, endTime:{hours: 18, minutes: 00, seconds: 00}, updateMode: 0, appID: 1}
+ var expectedResult = {startTime:18000, endTime: 64800, updateMode: 0, resultCode : Common.Result.SUCCESS}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData1.appID})
+
+ sdlUI.setMediaClockTimer(initData1)
+
+ var actualResult = sdlUI.setMediaClockTimer(initData2)
+
+ try {
+ compare(dataContainer.getApplication(initData1.appID).mediaClock.startTime, expectedResult.startTime, "startTime")
+ compare(dataContainer.getApplication(initData1.appID).mediaClock.endTime, expectedResult.endTime, "endTime")
+ compare(dataContainer.getApplication(initData1.appID).mediaClock.updateMode, expectedResult.updateMode, "updateMode")
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ //Get "RESUME", when clock is paused
+ function test_07_resumeAfterResume() {
+ console.debug("enter")
+
+ var initData = {startTime:{hours: 4, minutes: 0, seconds: 0}, endTime:{hours: 12, minutes: 00, seconds: 00}, updateMode: 0, appID: 1}
+ var expectedResult = {resultCode : Common.Result.IGNORED}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ sdlUI.setMediaClockTimer(initData)
+
+ initData.updateMode=3
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+
+ try {
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+
+ function test_08_countDownAfterCountUp() {
+ console.debug("enter")
+
+ var initData1 = {startTime:{hours: 4, minutes: 0, seconds: 0}, endTime:{hours: 12, minutes: 00, seconds: 00}, updateMode: 0, appID: 1}
+ var initData2 = {startTime:{hours: 18, minutes: 0, seconds: 0}, endTime:{hours: 5, minutes: 00, seconds: 00}, updateMode: 1, appID: 1}
+ var expectedResult = {startTime:64800, endTime: 18000, updateMode: 1, resultCode : Common.Result.SUCCESS}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData1.appID})
+
+ sdlUI.setMediaClockTimer(initData1)
+
+ var actualResult = sdlUI.setMediaClockTimer(initData2)
+
+ try {
+ compare(dataContainer.getApplication(initData1.appID).mediaClock.startTime, expectedResult.startTime, "startTime")
+ compare(dataContainer.getApplication(initData1.appID).mediaClock.endTime, expectedResult.endTime, "endTime")
+ compare(dataContainer.getApplication(initData1.appID).mediaClock.updateMode, expectedResult.updateMode, "updateMode")
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+
+ function test_09_noEndTimeInCountDown() {
+ console.debug("enter")
+
+ var initData = {startTime:{hours: 4, minutes: 0, seconds: 0}, endTime:undefined, updateMode: 0, appID: 1}
+
+ var expectedResult = {startTimeForProgress:14400, resultCode : Common.Result.SUCCESS}
+
+ createTime()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ var actualResult = sdlUI.setMediaClockTimer(initData)
+
+ try {
+ compare(dataContainer.getApplication(initData.appID).mediaClock.startTimeForProgress, expectedResult.startTimeForProgress, "time position")
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+
+ destroyTime()
+ console.debug("exit")
+ }
+ }
+}
diff --git a/src/components/qt_hmi/test/src/tst_Show.qml b/src/components/qt_hmi/test/src/tst_Show.qml
new file mode 100644
index 0000000000..cce2e7de49
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_Show.qml
@@ -0,0 +1,363 @@
+/**
+ * @file tst_Slider.qml
+ * @brief Test Case for Slider.
+ * Copyright (c) 2013, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item {
+ width : mainWindowLoader.width
+ height: mainWindowLoader.height
+ Loader {
+ id: mainWindowLoader
+ asynchronous : false
+ }
+
+ TestCase {
+ name: "Show"
+ when: windowShown
+ property var mainWindowComponent : Qt.createComponent("../qml_model_qt5/MainWindow.qml")
+ property var mainObject
+ property var sldUI
+ property var dataContainer
+ property var contentLoader
+
+ property var softButtonsListExample : [
+ {softButtonID:0, isHighlighted:true, systemAction:Common.SystemAction.DEFAULT_ACTION,
+ type:Common.SoftButtonType.SBT_TEXT, text:"Default Action"},
+ {softButtonID:1, isHighlighted:false, systemAction:Common.SystemAction.STEAL_FOCUS,
+ type:Common.SoftButtonType.SBT_IMAGE, text:"Steal Focus"},
+ {softButtonID:2, isHighlighted:false, systemAction:Common.SystemAction.KEEP_CONTEXT,
+ type:Common.SoftButtonType.SBT_BOTH, text:"Keep context"}]
+
+
+ //initialization for each test
+ function createShow(appID) {
+ mainWindowLoader.source = ""
+ mainWindowLoader.source = "../../../../src/components/qt_hmi/qml_model_qt5/MainWindow.qml"
+ var mainWindowObject = mainWindowLoader.item
+ if(!mainWindowObject)
+ qtest_fail("mainWindowObject is undefined");
+ var mainScreen = mainWindowObject.getMainScreen()
+ mainScreen.visible = true
+ var warningInfo = mainWindowObject.getWarningInfo()
+ warningInfo.visible = false
+ contentLoader = mainWindowObject.getContentLoader()
+ contentLoader.asynchronous = false
+ sldUI = mainWindowObject.getUIProxy()
+ dataContainer = mainWindowObject.getDataStorage()
+ dataContainer.addApplication({appName:"TestAppName", appId:appID})
+ }
+
+
+
+ //cleanup for each test
+ function destroyShow() {
+ //Clear Loader with MainWindow, which delete own models and views
+ mainWindowLoader.source = ""
+ }
+
+
+ //Fill up all fields, check save process to dataContainer
+ function test_01_create() {
+ console.debug("enter")
+ var initData = {
+ appID:1,
+ showStrings:[
+ {fieldName:Common.TextFieldName.mainField1 ,fieldText:"showString1"},
+ {fieldName:Common.TextFieldName.mainField2,fieldText:"showString2"},
+ {fieldName:Common.TextFieldName.mainField3,fieldText:"showString3"},
+ {fieldName:Common.TextFieldName.mainField4,fieldText:"showString4"},
+ {fieldName:Common.TextFieldName.mediaTrack,fieldText:"mediaTrack"},
+ {fieldName:Common.TextFieldName.statusBar,fieldText:"StatusBar"},
+ {fieldName:Common.TextFieldName.mediaClock,fieldText:"12:34"}
+ ],
+ softButtons:softButtonsListExample,
+ alignment:2,
+ graphic:{value:"/home/user/applink/bin/SPTAlice9675308/action.png",imageType: "DYNAMIC"},
+ secondaryGraphic:{value:"/home/user/applink/bin/SPTAlice9675308/action.png",imageType: "DYNAMIC"},
+ customPresets:["GEN0","GEN1","GEN2","GEN3"]
+ }
+
+ createShow(1)
+ var app = dataContainer.getApplication(initData.appID)
+ sldUI.show (initData)
+
+ try {
+
+ compare(app.hmiUIText.mainField1 , initData.showStrings[0].fieldText, "mainField1")
+ compare(app.hmiUIText.mainField2 , initData.showStrings[1].fieldText, "mainField2")
+ compare(app.hmiUIText.mainField3 , initData.showStrings[2].fieldText, "mainField3")
+ compare(app.hmiUIText.mainField4 , initData.showStrings[3].fieldText, "mainField4")
+ compare(app.hmiUIText.mediaTrack , initData.showStrings[4].fieldText, "mediaTrack")
+ compare(app.hmiUIText.statusBar , initData.showStrings[5].fieldText, "StatusBar" )
+ compare(app.hmiUIText.mediaClock , initData.showStrings[6].fieldText, "mediaClock")
+ var a;
+ if(app.hmiUITextAlignment === 1) a=0;
+ if(app.hmiUITextAlignment === 2) a=1;
+ if(app.hmiUITextAlignment === 4) a=2;
+ compare(initData.alignment, a, "Alignment")
+ compare(app.hmiUIText.image, initData.graphic.value, "image")
+ compare(app.hmiUIText.secondaryImage, initData.secondaryGraphic.value, "secdondImage")
+ compare(app.softButtons.count, initData.softButtons.length, "wrong buttons count created")
+ for (var i = 0, len = app.softButtons.count; i < len; i++)
+ {
+ var act = app.softButtons.get(i)
+ var exp = initData.softButtons[i]
+ compare(act.softButtonID, exp.softButtonID, "wrong softButtonID in button")
+ compare(act.isHighlighted, exp.isHighlighted, "wrong isHighlighted in button")
+ compare(act.systemAction, exp.systemAction, "wrong systemAction in button")
+ compare(act.text, exp.text, "wrong text in button")
+ }
+ compare(app.customPresets.count, initData.customPresets.length, "wrong buttons count created")
+ for (var j = 0, len2 = app.customPresets.count; j < len; j++)
+ {
+ var act2 = app.customPresets.get(j)
+ var exp2 = initData.customPresets[j]
+ compare(act2.text, exp2, "wrong text in button")
+ }
+ }
+ catch (e) {}
+ destroyShow()
+ console.debug("exit")
+ }
+ //All fields are empty
+ function test_02_emptyInit()
+ {
+ console.debug("enter")
+ var initData = {
+ appID:1,
+ showStrings:[
+ {fieldName:Common.TextFieldName.mainField1 ,fieldText:""},
+ {fieldName:Common.TextFieldName.mainField2,fieldText:""},
+ {fieldName:Common.TextFieldName.mainField3,fieldText:""},
+ {fieldName:Common.TextFieldName.mainField4,fieldText:""},
+ {fieldName:Common.TextFieldName.mediaTrack,fieldText:""},
+ {fieldName:Common.TextFieldName.statusBar,fieldText:""},
+ {fieldName:Common.TextFieldName.mediaClock,fieldText:""}
+ ],
+ softButtons:[],
+ alignment:0,
+ graphic:{value:"",imageType: "DYNAMIC"},
+ secondaryGraphic:{value:"",imageType: "DYNAMIC"},
+ customPresets:[]
+ }
+
+ createShow(1)
+ var app = dataContainer.getApplication(initData.appID)
+ sldUI.show (initData)
+
+ try {
+
+ compare(app.hmiUIText.mainField1 , initData.showStrings[0].fieldText, "mainField1")
+ compare(app.hmiUIText.mainField2 , initData.showStrings[1].fieldText, "mainField2")
+ compare(app.hmiUIText.mainField3 , initData.showStrings[2].fieldText, "mainField3")
+ compare(app.hmiUIText.mainField4 , initData.showStrings[3].fieldText, "mainField4")
+ compare(app.hmiUIText.mediaTrack , initData.showStrings[4].fieldText, "mediaTrack")
+ compare(app.hmiUIText.statusBar , initData.showStrings[5].fieldText, "StatusBar" )
+ compare(app.hmiUIText.mediaClock , initData.showStrings[6].fieldText, "mediaClock")
+ var a;
+ if(app.hmiUITextAlignment === 1) a=0;
+ if(app.hmiUITextAlignment === 2) a=1;
+ if(app.hmiUITextAlignment === 4) a=2;
+ compare(initData.alignment, a, "Alignment")
+ compare(app.hmiUIText.image, initData.graphic.value, "image")
+ compare(app.hmiUIText.secondaryImage, initData.secondaryGraphic.value, "secdondImage")
+ compare(app.softButtons.count, initData.softButtons.length, "wrong buttons count created")
+ for (var i = 0, len = app.softButtons.count; i < len; i++)
+ {
+ var act = app.softButtons.get(i)
+ var exp = initData.softButtons[i]
+ compare(act.softButtonID, exp.softButtonID, "wrong softButtonID in button")
+ compare(act.isHighlighted, exp.isHighlighted, "wrong isHighlighted in button")
+ compare(act.systemAction, exp.systemAction, "wrong systemAction in button")
+ compare(act.text, exp.text, "wrong text in button")
+ }
+ compare(app.customPresets.count, initData.customPresets.length, "wrong buttons count created")
+ for (var j = 0, len2 = app.customPresets.count; j < len; j++)
+ {
+ var act2 = app.customPresets.get(j)
+ var exp2 = initData.customPresets[j]
+ compare(act2.text, exp2, "wrong text in button")
+ }
+ }
+ catch (e) {}
+ destroyShow()
+ console.debug("exit")
+ }
+
+ //Mandatory fields only
+ function test_03_create_mandatory_only() {
+ console.debug("enter")
+ var initData = {
+ appID:1,
+ showStrings:[
+ {fieldName:Common.TextFieldName.mainField1 ,fieldText:"showString1"},
+ {fieldName:Common.TextFieldName.mainField2,fieldText:"showString2"},
+ {fieldName:Common.TextFieldName.mainField3,fieldText:"showString3"},
+ {fieldName:Common.TextFieldName.mainField4,fieldText:"showString4"},
+ {fieldName:Common.TextFieldName.mediaTrack,fieldText:"mediaTrack"},
+ {fieldName:Common.TextFieldName.statusBar,fieldText:"StatusBar"},
+ {fieldName:Common.TextFieldName.mediaClock,fieldText:"12:34"}
+ ]
+ }
+
+ createShow(1)
+ var app = dataContainer.getApplication(initData.appID)
+ sldUI.show (initData)
+
+ try {
+
+ compare(app.hmiUIText.mainField1 , initData.showStrings[0].fieldText, "mainField1")
+ compare(app.hmiUIText.mainField2 , initData.showStrings[1].fieldText, "mainField2")
+ compare(app.hmiUIText.mainField3 , initData.showStrings[2].fieldText, "mainField3")
+ compare(app.hmiUIText.mainField4 , initData.showStrings[3].fieldText, "mainField4")
+ compare(app.hmiUIText.mediaTrack , initData.showStrings[4].fieldText, "mediaTrack")
+ compare(app.hmiUIText.statusBar , initData.showStrings[5].fieldText, "StatusBar" )
+ compare(app.hmiUIText.mediaClock , initData.showStrings[6].fieldText, "mediaClock")
+
+ }
+ catch (e) {}
+ destroyShow()
+ console.debug("exit")
+ }
+ //Field with extra param
+ function test_04_fake_param() {
+ console.debug("enter")
+ var initData = {
+ appID:1,
+ showStrings:[
+ {fieldName:Common.TextFieldName.mainField1 ,fieldText:"showString1"},
+ {fieldName:Common.TextFieldName.mainField2,fieldText:"showString2"},
+ {fieldName:Common.TextFieldName.mainField3,fieldText:"showString3"},
+ {fieldName:Common.TextFieldName.mainField4,fieldText:"showString4"},
+ {fieldName:Common.TextFieldName.mediaTrack,fieldText:"mediaTrack"},
+ {fieldName:Common.TextFieldName.statusBar,fieldText:"StatusBar",fakeParam:"FakeParam"},
+ {fieldName:Common.TextFieldName.mediaClock,fieldText:"12:34"}
+ ]
+ }
+
+ createShow(1)
+ var app = dataContainer.getApplication(initData.appID)
+ sldUI.show (initData)
+
+ try {
+
+ compare(app.hmiUIText.mainField1 , initData.showStrings[0].fieldText, "mainField1")
+ compare(app.hmiUIText.mainField2 , initData.showStrings[1].fieldText, "mainField2")
+ compare(app.hmiUIText.mainField3 , initData.showStrings[2].fieldText, "mainField3")
+ compare(app.hmiUIText.mainField4 , initData.showStrings[3].fieldText, "mainField4")
+ compare(app.hmiUIText.mediaTrack , initData.showStrings[4].fieldText, "mediaTrack")
+ compare(app.hmiUIText.statusBar , initData.showStrings[5].fieldText, "StatusBar" )
+ compare(app.hmiUIText.mediaClock , initData.showStrings[6].fieldText, "mediaClock")
+
+ }
+ catch (e) {}
+ destroyShow()
+ console.debug("exit")
+ }
+ //aligment of mainField1, mainField2
+ function test_05_alignment() {
+ console.debug("enter")
+ var initData = {
+ appID:1,
+ showStrings:[],
+ alignment:0,
+ }
+
+ createShow(1)
+ var app = dataContainer.getApplication(initData.appID)
+ sldUI.show (initData)
+
+ try {
+ //Magic with digits - because enum of text.Alighnment enum and sdl alignment doesn't match
+ var a;
+ if(app.hmiUITextAlignment === 1) a=0;
+ if(app.hmiUITextAlignment === 2) a=1;
+ if(app.hmiUITextAlignment === 4) a=2;
+ compare(initData.alignment, a, "Alignment")
+ initData.alignment=1
+ sldUI.show (initData)
+ var b;
+ if(app.hmiUITextAlignment === 1) b=0;
+ if(app.hmiUITextAlignment === 2) b=1;
+ if(app.hmiUITextAlignment === 4) b=2;
+ compare(initData.alignment, b, "Alignment")
+ initData.alignment=2
+ sldUI.show (initData)
+ var c;
+ if(app.hmiUITextAlignment === 1) c=0;
+ if(app.hmiUITextAlignment === 2) c=1;
+ if(app.hmiUITextAlignment === 4) c=2;
+ compare(initData.alignment, c, "Alignment")
+ }
+ catch (e) {}
+ destroyShow()
+ console.debug("exit")
+ }
+ //pole bez parametra
+ function test_06_no_param() {
+ console.debug("enter")
+ var initData = {
+ appID:1,
+ showStrings:[],
+ graphic:{imageType: "DYNAMIC"},
+ }
+
+ createShow(1)
+ var app = dataContainer.getApplication(initData.appID)
+ sldUI.show (initData)
+
+ try {
+
+ compare(app.hmiUIText.image, undefined, "image")
+
+ }
+ catch (e) {}
+ destroyShow()
+ console.debug("exit")
+ }
+}
+}
diff --git a/src/components/qt_hmi/test/src/tst_Slider.qml b/src/components/qt_hmi/test/src/tst_Slider.qml
new file mode 100644
index 0000000000..0e6acef078
--- /dev/null
+++ b/src/components/qt_hmi/test/src/tst_Slider.qml
@@ -0,0 +1,204 @@
+/**
+ * @file tst_Slider.qml
+ * @brief Test Case for Slider.
+ * Copyright (c) 2013, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import QtTest 1.0
+import QtQuick 2.0
+import QtMultimedia 5.0
+import com.ford.sdl.hmi.dbus_adapter 1.0
+import com.ford.sdl.hmi.hw_buttons 1.0
+import com.ford.sdl.hmi.log4cxx 1.0
+import "../qml_model_qt5/controls"
+import "../qml_model_qt5/views"
+import "../qml_model_qt5/hmi_api" as HmiApi
+import "../qml_model_qt5/models"
+import "../qml_model_qt5/popups"
+import "../qml_model_qt5/hmi_api/Common.js" as Common
+import "../qml_model_qt5/models/Constants.js" as Constants
+import "../qml_model_qt5/models/Internal.js" as Internal
+
+Item {
+ TestCase {
+ name: "Slider"
+ when: windowShown
+ property var mainWindowComponent : Qt.createComponent("../qml_model_qt5/MainWindow.qml")
+ property var mainObject
+ property var sldUI
+ property var dataContainer
+ property var sliderPopup
+ property var timer
+
+ function createSlider() {
+ mainObject = mainWindowComponent.createObject(parent)
+ var mainScreen = mainObject.getMainScreen()
+ mainScreen.visible = true
+ sldUI = mainObject.getUIProxy()
+ dataContainer = mainObject.getDataStorage()
+ sliderPopup = mainObject.getSlider()
+ timer = sliderPopup.getTimer()
+ }
+
+
+ function destroySlider() {
+ mainObject.destroy()
+ }
+
+ function test_01_timeoutZero() {
+ console.debug("enter")
+ var initData = {numTicks:9, position:4, sliderHeader:"header", sliderFooter:["footer"], timeout:0, appID:1}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+ var actualResult = sldUI.slider(initData)
+ try {
+ compare(actualResult.sliderPosition, initData.position, "slider position")
+ } catch(e){}
+ destroySlider()
+ console.debug("exit")
+ }
+
+ function test_02_changePosition() {
+ console.debug("enter")
+ var initData = {numTicks:9, position:4, sliderHeader:"header", sliderFooter:["footer"], timeout:1, appID:1}
+ var expectedResult = {position : 2, resultCode : Common.Result.SUCCESS}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+ sliderPopup.onReady.connect(function simulateUserAction(){sliderPopup.position = expectedResult.position})
+
+ sldUI.slider(initData)
+
+ timer.onTriggered()
+ try {
+ compare(dataContainer.uiSlider.position, expectedResult.position, "slider position")
+ compare(sliderPopup.resultCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+ destroySlider()
+ console.debug("exit")
+ }
+
+ function test_03_unChangedPosition() {
+ console.debug("enter")
+ var initData = {numTicks:9, position:4, sliderHeader:"header", sliderFooter:["footer"], timeout:1, appID:1}
+ var expectedResult = {position : 4, resultCode : Common.Result.SUCCESS}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ sldUI.slider(initData)
+
+ timer.onTriggered()
+ try {
+ compare(dataContainer.uiSlider.position, expectedResult.position, "slider position")
+ compare(sliderPopup.resultCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+ destroySlider()
+ console.debug("exit")
+ }
+
+
+ function test_04_changePositionBackPressed() {
+ console.debug("enter")
+ var initData = {numTicks:9, position:4, sliderHeader:"header", sliderFooter:["footer"], timeout:1, appID:1}
+ var expectedResult = {position : 4, resultCode : Common.Result.ABORTED}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+ sliderPopup.onReady.connect(function simulateUserAction(){sliderPopup.position = expectedResult.position})
+
+ sldUI.slider(initData)
+ sliderPopup.getBackButton().clicked()
+
+ try {
+ compare(dataContainer.uiSlider.position, expectedResult.position, "slider position")
+ compare(sliderPopup.resultCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+ destroySlider()
+ console.debug("exit")
+ }
+
+ function test_05_secondCall() {
+ console.debug("enter")
+ var initData = {numTicks:9, position:4, sliderHeader:"header", sliderFooter:["footer"], timeout:1, appID:1}
+ var expectedResult = {position : 5, resultCode : Common.Result.ABORTED}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+ sliderPopup.onReady.connect(function simulateUserAction(){sliderPopup.position = expectedResult.position})
+
+ sldUI.slider(initData)
+ initData.position = 5
+ var actualResult = sldUI.slider(initData)
+
+ try {
+ compare(actualResult.sliderPosition, expectedResult.position, "slider position")
+ compare(actualResult.__retCode, expectedResult.resultCode, "result code")
+ } catch (e) {}
+ destroySlider()
+ console.debug("exit")
+ }
+
+ function test_06_footerValueNoChange() {
+ console.debug("enter")
+ var initData = {numTicks:4, position:3, sliderHeader:"header", sliderFooter:["footer1", "footer2", "footer3", "footer4"], timeout:1, appID:1}
+ var expectedResult = {position: 3, footers:["footer1", "footer2", "footer3", "footer4"]}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+
+ sldUI.slider(initData)
+
+ try {
+ compare(sliderPopup.getFooterText().text, expectedResult.footers[expectedResult.position - 1], "current footer")
+ } catch (e) {}
+ destroySlider()
+ console.debug("exit")
+ }
+
+ function test_07_footerValueChange() {
+ console.debug("enter")
+ var initData = {numTicks:4, position:2, sliderHeader:"header", sliderFooter:["footer1", "footer2", "footer3", "footer4"], timeout:1, appID:1}
+ var expectedResult = {position: 3, footers:["footer1", "footer2", "footer3", "footer4"]}
+ createSlider()
+ dataContainer.addApplication({appName:"TestAppName", appId:initData.appID})
+ sliderPopup.onReady.connect(function simulateUserAction(){
+ var rect = sliderPopup.getBorderRectangle()
+ console.debug("visible", sliderPopup.visible)
+ mouseClick(rect, rect.width / initData.numTicks * expectedResult.position, 1)
+ })
+
+ sldUI.slider(initData)
+
+ try {
+ compare(sliderPopup.getFooterText().text, expectedResult.footers[expectedResult.position - 1], "current footer")
+ } catch (e) {}
+ destroySlider()
+ console.debug("exit")
+ }
+
+ }
+}