/*
* Software Name : ATK
*
* Copyright (C) 2007 - 2012 France Télécom
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ------------------------------------------------------------------
* File Name : FunctionDictionnary.java
*
* Created : 27/10/2009
* Author(s) : France Telecom
*/
package com.orange.atk.interpreter.ast;
import java.util.ArrayList;
import java.util.List;
/**
* This class contains all function signatures recognized by the interpreter.
*
* There are commonly used in syntax Verification or Auto-completion.
* @author Moreau Fabien - GFI - FMOREAU@gfi.fr
*
*The function signature are represented by a String[].
*String[0] is name of the function
*String[1] ..String[n] are the parameters of the functions
*/
public class FunctionDictionnary {
private List<String[]> functionDictionnary;
public FunctionDictionnary() {
functionDictionnary = new ArrayList<String[]>();
functionDictionnary.add( new String[]{"Beep"} );
functionDictionnary.add( new String[]{"DisableUSBCharge"} );
functionDictionnary.add( new String[]{"Include","STRING"} );
// TODO implement these features in at least one phone
// WinMobile implement it, so uncomment when tested and update documentation
//functionDictionnary.add( new String[]{"FreeStorage"} );
//functionDictionnary.add( new String[]{"FillStorage", "INTEGER"} );
functionDictionnary.add( new String[]{"Key","STRING"} );
functionDictionnary.add( new String[]{"Key","STRING", "INTEGER"} );
functionDictionnary.add( new String[]{"Key","STRING", "INTEGER", "INTEGER"} );
functionDictionnary.add( new String[]{"KeyDown","STRING"} );
functionDictionnary.add( new String[]{"KeyUp","STRING"} );
functionDictionnary.add( new String[]{"Kill","STRING"} );
functionDictionnary.add( new String[]{"Log","STRING"} );
functionDictionnary.add( new String[]{"Run","STRING"} );
functionDictionnary.add( new String[]{"Screenshot"} );
functionDictionnary.add( new String[]{"Screenshot","STRING"} );
// TODO implement this feature in at least one phone
//functionDictionnary.add( new String[]{"SendEmail","STRING","STRING","STRING","STRING","STRING","STRING"} );
functionDictionnary.add( new String[]{"SendSMS","STRING","STRING"} );
functionDictionnary.add( new String[]{"SetFlightMode","STRING"} );
functionDictionnary.add( new String[]{"SetVar","STRING","STRING"} );
functionDictionnary.add( new String[]{"SetVar","STRING","INTEGER"} );
// TODO implement these features in at least one phone
//functionDictionnary.add( new String[]{"SetOrientation","INTEGER"} );
//functionDictionnary.add( new String[]{"Reset"} ); // reset phone to homescreen ? not clear
//functionDictionnary.add( new String[]{"Sign", "INTEGER"} ); // Actually, check application signature
functionDictionnary.add( new String[]{"Sleep","INTEGER"} );
functionDictionnary.add( new String[]{"StartMainLog"} );
functionDictionnary.add( new String[]{"StartMainLog","INTEGER"} );
functionDictionnary.add( new String[]{"StopMainLog"} );
functionDictionnary.add( new String[]{"TouchScreenDragnDrop","TABLE"} );
functionDictionnary.add( new String[]{"TouchScreenPress","INTEGER","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"TouchScreenSlide","TABLE"} );
// TODO implement these features in at least one phone
//functionDictionnary.add( new String[]{"UseCPU","INTEGER"} );
//functionDictionnary.add( new String[]{"WaitWindow"} );
//functionDictionnary.add( new String[]{"WaitWindow","STRING","INTEGER"} );
//TODO implement these features in at least one phone
/**
* solo methods
*/
functionDictionnary.add( new String[]{"ExitSolo"} );
functionDictionnary.add( new String[]{"AssertCurrentActivity","STRING","Class"} );
functionDictionnary.add( new String[]{"AssertCurrentActivity","STRING","Class","BOOLEAN"} );
functionDictionnary.add( new String[]{"AssertCurrentActivity","STRING","String"} );
functionDictionnary.add( new String[]{"AssertCurrentActivity","STRING","String","BOOLEAN"} );
functionDictionnary.add( new String[]{"AssertMemoryNotLow"} );
functionDictionnary.add( new String[]{"ClearEditText","INTEGER"} );
functionDictionnary.add( new String[]{"ClickInList","INTEGER"} );
functionDictionnary.add( new String[]{"ClickInList","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongInList","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongInList","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongInList","INTEGER","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongOnScreen","FLOAT","FLOAT"} );
functionDictionnary.add( new String[]{"ClickLongOnScreen","FLOAT","FLOAT","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongOnText","STRING"} );
functionDictionnary.add( new String[]{"ClickLongOnText","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongOnText","STRING","INTEGER","BOOLEAN"} );
functionDictionnary.add( new String[]{"ClickLongOnText","STRING","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"ClickLongOnTextAndPress","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnActionBarHomeButtom"} );
functionDictionnary.add( new String[]{"ClickOnActionBarItem","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnButton","STRING"});
functionDictionnary.add( new String[]{"ClickOnButton","INTEGER"});
functionDictionnary.add( new String[]{"ClickOnCheckBox","INTEGER"});
functionDictionnary.add( new String[]{"ClickOnEditText","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnImage","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnImageButton","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnMenuItem","STRING"} );
functionDictionnary.add( new String[]{"ClickOnMenuItem","STRING","BOOLEAN"} );
functionDictionnary.add( new String[]{"ClickOnRadioButton","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnScreen","FLOAT","FLOAT"} );
functionDictionnary.add( new String[]{"ClickOnText","STRING"} );
functionDictionnary.add( new String[]{"ClickOnText","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"ClickOnText","STRING","INTEGER","BOOLEAN"} );
functionDictionnary.add( new String[]{"ClickOnToggleButton","STRING"} );
functionDictionnary.add( new String[]{"Drag","FLOAT","FLOAT","FLOAT","FLOAT","INTEGER"} );
functionDictionnary.add( new String[]{"EnterText","INTEGER","STRING"} );
functionDictionnary.add( new String[]{"Finalize"} );
functionDictionnary.add( new String[]{"FinishOpenedActivities"} );
functionDictionnary.add( new String[]{"GetActivityMonitor"} );
functionDictionnary.add( new String[]{"GetButton","INTEGER"} );
functionDictionnary.add( new String[]{"GetButton","STRING"} );
functionDictionnary.add( new String[]{"GetButton","STRING","BOOLEAN"} );
functionDictionnary.add( new String[]{"GetCurrentActivity"} );
functionDictionnary.add( new String[]{"GetCurrentViews"} );
functionDictionnary.add( new String[]{"GetCurrentViews","Class"} );
functionDictionnary.add( new String[]{"GetEditText","INTEGER"} );
functionDictionnary.add( new String[]{"GetEditText","STRING"} );
functionDictionnary.add( new String[]{"GetEditText","STRING","BOOLEAN"} );
functionDictionnary.add( new String[]{"GetImage","INTEGER"} );
functionDictionnary.add( new String[]{"GetImageButton","INTEGER"} );
functionDictionnary.add( new String[]{"GetString","INTEGER"} );
functionDictionnary.add( new String[]{"GetText","INTEGER"} );
functionDictionnary.add( new String[]{"GetText","STRING"} );
functionDictionnary.add( new String[]{"GetText","STRING","BOOLEAN"} );
functionDictionnary.add( new String[]{"GetView","Class","INTEGER"} );
functionDictionnary.add( new String[]{"GetView","INTEGER"} );
functionDictionnary.add( new String[]{"GetViews"} );
functionDictionnary.add( new String[]{"GoBack"} );
functionDictionnary.add( new String[]{"GoBackToActivity","STRING"} );
functionDictionnary.add( new String[]{"IsCheckBoxChecked","INTEGER"} );
functionDictionnary.add( new String[]{"IsCheckBoxChecked","STRING"} );
functionDictionnary.add( new String[]{"IsRadioButtonChecked","INTEGER"} );
functionDictionnary.add( new String[]{"IsRadioButtonChecked","STRING"} );
functionDictionnary.add( new String[]{"IsSpinnerTextSelected","INTEGER","STRING"} );
functionDictionnary.add( new String[]{"IsSpinnerTextSelected","STRING"} );
functionDictionnary.add( new String[]{"IsTextChecked","STRING"} );
functionDictionnary.add( new String[]{"IstoggleButtonChecked","INTEGER"} );
functionDictionnary.add( new String[]{"IstoggleButtonChecked","STRING"} );
functionDictionnary.add( new String[]{"PressMenuItem","INTEGER"} );
functionDictionnary.add( new String[]{"PressMenuItem","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"PressSpinnerItem","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"ScrollDown"} );
functionDictionnary.add( new String[]{"ScrollDownList","INTEGER"} );
functionDictionnary.add( new String[]{"ScrollListToBottom","INTEGER"} );
functionDictionnary.add( new String[]{"ScrollListToLine","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"ScrollListToTop","INTEGER"} );
functionDictionnary.add( new String[]{"ScrollToBottom"} );
functionDictionnary.add( new String[]{"ScrollToSide","INTEGER"} );
functionDictionnary.add( new String[]{"ScrollToTop"} );
functionDictionnary.add( new String[]{"ScrollToUp"} );
functionDictionnary.add( new String[]{"ScrollUpList","INTEGER"} );
functionDictionnary.add( new String[]{"SearchButton","STRING"} );
functionDictionnary.add( new String[]{"SearchButton","STRING","BOOLEAN"} );
functionDictionnary.add( new String[]{"SearchButton","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"SearchButton","STRING","INTEGER","BOOLEAN"} );
functionDictionnary.add( new String[]{"SearchEditText","STRING"} );
functionDictionnary.add( new String[]{"SearchText","STRING"} );
functionDictionnary.add( new String[]{"SearchText","STRING","BOOLEAN"} );
functionDictionnary.add( new String[]{"SearchText","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"SearchText","STRING","INTEGER","BOOLEAN"} );
functionDictionnary.add( new String[]{"SearchText","STRING","INTEGER","BOOLEAN","BOOLEAN"} );
functionDictionnary.add( new String[]{"SearchToggleButton","STRING"} );
functionDictionnary.add( new String[]{"SearchToggleButton","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"SendKey","INTEGER"} );
functionDictionnary.add( new String[]{"SetActivityOrientation","INTEGER"} );
functionDictionnary.add( new String[]{"SetDataPicker","INTEGER","INTEGER","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"SetProgressBar","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"SetSlidingDrawer","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"SetTimePicker","INTEGER","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"SleepSolo","INTEGER"} );
functionDictionnary.add( new String[]{"TakeScreenshot"} );
functionDictionnary.add( new String[]{"TakeScreenshot","STRING"} );
functionDictionnary.add( new String[]{"TakeScreenshot","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"TypeText","INTEGER","STRING"} );
functionDictionnary.add( new String[]{"WaitForActivity","STRING"} );
functionDictionnary.add( new String[]{"WaitForActivity","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"WaitForDialogToClose","INTEGER"} );//LONG
functionDictionnary.add( new String[]{"WaitForDialogToOpen","INTEGER"} );//LONG
functionDictionnary.add( new String[]{"WaitForLogMessage","STRING"} );
functionDictionnary.add( new String[]{"WaitForLogMessage","STRING","INTEGER"} );
functionDictionnary.add( new String[]{"WaitForText","STRING"} );
functionDictionnary.add( new String[]{"WaitForText","STRING","INTEGER","INTEGER"} );//LONG
functionDictionnary.add( new String[]{"WaitForText","STRING","INTEGER","INTEGER","STRING"} );//LONG
functionDictionnary.add( new String[]{"WaitForText","STRING","INTEGER","INTEGER","STRING","STRING"} );
functionDictionnary.add( new String[]{"WaitForView","Class","INTEGER","INTEGER"} );
functionDictionnary.add( new String[]{"WaitForView","Class","INTEGER","INTEGER","STRING"} );
functionDictionnary.add( new String[]{"WaitForView","Class","INTEGER","STRING"} );
functionDictionnary.add( new String[]{"StartRobotiumTestOn","STRING","STRING","STRING","INTEGER"} );
}
/**
*
* @param signature String[0] is name of the signature
* String[0] is name of the signature
* String[1] ..String[n] are the parameters
* which could have value "UNKNOWN" "STRING" "INTEGER" "TABLE"
* @return true if signature correspond to a existing one
*/
public boolean isExist (List<String> signature) {
//if parameter are "unknown" , verify without them.
List<Integer> unknow_parameter_position = new ArrayList<Integer>();
for (int i=1; i<signature.size() ; i++)
if (signature.get(i).equals("UNKNOWN"))
unknow_parameter_position.add(i);
List<String[]> nearlymethod = getSignatures(signature);
//return empty list if name doesn't correspond
for(String[] nm : nearlymethod) {
//special case of function with table in signature
if(nm.length>1 &&
"TABLE".equals(nm[1]) )
return true;
if (nm.length != signature.size())
continue;
boolean is_good = true;
for (int i=1 ; i<signature.size() ; i++) {
if (unknow_parameter_position.contains(i))
continue;
if( ! nm[i].startsWith(signature.get(i) ))
is_good=false;
}
if(is_good ==true)
return true;
}
return false;
}
/**
*
* @param signature
* String[0] is name of the signature
* String[1] ..String[n] are the parameters
* which could have value "UNKNOWN" "STRING" "NUMBER"
* @return
*/
//TODO : improve?
public List<String[]> getSignatures(List<String> signature) {
return getSignatures(signature.get(0) );
}
/**
*
* @param Methodname
* @returna List which contains all signature equal to method name
*/
public List<String[]> getSignatures(String Methodname) {
List<String[] > result = new ArrayList<String[]>();
for(String[] signature : functionDictionnary) {
//compare name of the function
if( !signature[0].toLowerCase().equals(Methodname.toLowerCase()) )
continue;
result.add(signature);
}
return result;
}
/**
* specific to autocompletion
* @param Methodname
* @returna List which contains all signature equal to method name
*/
public List<String> getSignaturesforautocopmpletion(String Methodname) {
List<String > result = new ArrayList<String>();
for(String[] signature : functionDictionnary) {
//compare name of the function
if( !signature[0].toUpperCase().startsWith(Methodname.toUpperCase()) )
continue;
result.add(toString(signature) );
}
return result;
}
/**
* specific to autocompletion
* @param Methodname
* @returna List which contains all signature equal to method name
*/
public String toString(String[] signature) {
if (signature.length <1)
return "";
StringBuffer buf = new StringBuffer();
buf.append(signature[0]);
if (signature.length >1) {
buf.append("( "+signature[1]);
if ( signature.length >2)
for(int i=2 ; i<signature.length ;i++)
buf.append(" , "+signature[i]);
buf.append(" )");
}
String s = buf.toString();
return s;
}
}