CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+enable_testing()
# FIND ALL SOURCE IN A SOURCE DIRECTORY
AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/src SRCS)
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)
-
+SET(CMAKE_C_FLAGS_DUMP "${CMAKE_C_FLAGS}")
+SET(CMAKE_CXX_FLAGS_DUMP "${CMAKE_CXX_FLAGS}")
SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
INSTALL(DIRECTORY ${RESOURCE_DIR}/icons DESTINATION res)
# Install Manifest File
INSTALL(FILES org.tizen.smart-navigator.xml DESTINATION /usr/share/packages)
+ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/tests)
+ADD_TEST(NAME screen_reader_test_suite COMMAND ${CMAKE_SOURCE_DIR}/tests/screen_reader_test_suite)
# End of a file
char **available_apps;
const char *text_from_dbus;
-
} Service_Data;
Service_Data *get_pointer_to_service_data_struct();
#include "screen_reader.h"
void spi_init(Service_Data *sd);
-void spi_on_state_changed_cb(AtspiEvent *event, void *user_data);
-void spi_on_caret_move_cb(AtspiEvent *event, void *user_data);
-void spi_on_access_value_changed_cb(AtspiEvent *event, void *user_data);
void spi_event_listener_cb(AtspiEvent *event, void *user_data);
+char *spi_event_get_text_to_read(AtspiEvent *event, void *user_data);
#endif /* SCREEN_READER_SPI_H_ */
#define SCREEN_READER_VCONF_H_
#include "screen_reader.h"
+#include "logger.h"
bool vconf_init(Service_Data *service_data);
BuildRequires: tts
BuildRequires: tts-devel
BuildRequires: vconf
+BuildRequires: pkgconfig(check)
%define AppInstallPath /usr/apps/%{name}
%define Exec smart-navigator
2>&1 | sed \
-e 's%^.*: error: .*$%\x1b[37;41m&\x1b[m%' \
-e 's%^.*: warning: .*$%\x1b[30;43m&\x1b[m%'
+export LD_LIBRARY_PATH=/emul/ia32-linux/lib:/emul/ia32-linux/usr/lib:$LD_LIBRARY_PATH
+make test
%install
rm -rf %{buildroot}
#include <Ecore_X.h>
#include <Ecore.h>
#include <math.h>
+#include <atspi/atspi.h>
#include "logger.h"
#include "navigator.h"
#include "window_tracker.h"
return;
}
+ if(!relations)
+ {
+ ERROR("No relations array");
+ return;
+ }
+
int i = 0;
for(; i < relations->len; ++i)
{
void spi_stop( void *data)
{
+ if(!data)
+ {
+ ERROR("Invalid parameter");
+ return;
+ }
+
Service_Data *sd = data;
sd->update_language_list = false;
free((char*)sd->text_from_dbus);
DEBUG("Tracking signal listerner deregister successful");
}
- sd->spi_listener = NULL;
sd->tracking_signal_name = strdup(new_tracking_signal);
- sd->spi_listener = atspi_event_listener_new(spi_event_listener_cb, sd, NULL);
- if(sd->spi_listener == NULL)
- {
- DEBUG("FAILED TO CREATE spi state changed listener")
- }
-
gboolean ret1 = atspi_event_listener_register(sd->spi_listener, sd->tracking_signal_name, NULL);
if(ret1 == false)
{
void app_termination_cb(keynode_t *node, void *user_data)
{
DEBUG("START");
- DEBUG("Application terminate %d", !(vconf_keynode_get_int(node)));
+ DEBUG("Application terminate %d", !vconf_keynode_get_int(node));
Service_Data *service_data = user_data;
service_data->run_service = vconf_keynode_get_int(node);
--- /dev/null
+## PROJECT NAME
+PROJECT(smart-navigator-tests C)
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-Wall -Wunused")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "")
--- /dev/null
+
+INCLUDE_DIRECTORIES(.)
+add_library(atspi
+ atspi/atspi.h
+ atspi/atspi.c
+ )
+
+INCLUDE(CMakeLists.sub)
+set_target_properties(atspi PROPERTIES
+ LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/atspi)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(tests REQUIRED
+ gobject-2.0
+ dlog
+ dbus-1
+ ecore
+ eldbus
+ eina
+ tts
+ check
+ vconf
+ elementary
+)
+
+FOREACH(flag ${tests_CFLAGS})
+ SET(EXTRA_CFLAGS_TESTS "${EXTRA_CFLAGS_TESTS} ${flag}")
+ENDFOREACH(flag)
+
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS_DUMP} ${EXTRA_CFLAGS_TESTS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS_DUMP} ${EXTRA_CFLAGS_TESTS} ${SLP_COMPILER_FLAGS}")
+
+SET(TESTED_SRCS ${CMAKE_SOURCE_DIR}/src/screen_reader.c
+ ${CMAKE_SOURCE_DIR}/src/screen_reader_vconf.c
+ ${CMAKE_SOURCE_DIR}/src/screen_reader_spi.c
+ ${CMAKE_SOURCE_DIR}/src/screen_reader_tts.c
+ ${CMAKE_SOURCE_DIR}/src/logger.c)
+
+ADD_EXECUTABLE(screen_reader_test_suite screen_reader_test_suite.c ${TESTED_SRCS})
+TARGET_LINK_LIBRARIES(screen_reader_test_suite atspi ${tests_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS})
--- /dev/null
+
+#include "atspi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static AtspiValue *value = NULL;
+static AtspiText *text = NULL;
+static AtspiEditableText *editable_text = NULL;
+
+void atspi_alloc_memory()
+{
+ value = (AtspiValue*)malloc(sizeof(AtspiValue));
+ text = (AtspiText*)malloc(sizeof(AtspiText));
+ editable_text = (AtspiEditableText*)malloc(sizeof(AtspiEditableText));
+}
+
+void atspi_free_memory(void)
+{
+ free(editable_text);
+ free(value);
+ free(text);
+}
+
+gchar * atspi_accessible_get_name (AtspiAccessible *obj, GError **error)
+{
+ if(!obj || !obj->name) return strdup("\0");
+
+ return strdup(obj->name);
+}
+
+gchar * atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error)
+{
+ if(!obj) return strdup("\0");
+ AtspiRole role = obj->role;
+ switch(role)
+ {
+ case ATSPI_ROLE_IMAGE:
+ return strdup("Image");
+ default:
+ return strdup("\0");
+ }
+}
+
+gchar * atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error)
+{
+ return "fake atspi";
+}
+
+gchar * atspi_accessible_get_description (AtspiAccessible *obj, GError **error)
+{
+ if(!obj || !obj->description) return strdup("\0");
+ return strdup(obj->description);
+}
+
+AtspiText * atspi_accessible_get_text (AtspiAccessible *obj)
+{
+ if(!obj) return NULL;
+ return text;
+}
+
+gint atspi_text_get_character_count (AtspiText *obj, GError **error)
+{
+ if(!obj) return -1;
+ return 6;
+}
+
+gint atspi_text_get_caret_offset (AtspiText *obj, GError **error)
+{
+ if(!obj) return -1;
+ return 5;
+}
+
+gchar * atspi_text_get_text (AtspiText *obj, gint start_offset, gint end_offset, GError **error)
+{
+ if(!obj) return NULL;
+ return "AtspiText text";
+}
+
+AtspiValue * atspi_accessible_get_value (AtspiAccessible *obj)
+{
+ if(!obj) return NULL;
+ return value;
+}
+
+gdouble atspi_value_get_current_value (AtspiValue *obj, GError **error)
+{
+ return 1.0;
+}
+
+gdouble atspi_value_get_maximum_value (AtspiValue *obj, GError **error)
+{
+ return 2.0;
+}
+
+gdouble atspi_value_get_minimum_value (AtspiValue *obj, GError **error)
+{
+ return 0.0;
+}
+
+AtspiEventListener *atspi_event_listener_new (AtspiEventListenerCB callback,
+ gpointer user_data,
+ GDestroyNotify callback_destroyed)
+{
+ return NULL;
+}
+
+gboolean atspi_event_listener_register (AtspiEventListener *listener,
+ const gchar *event_type,
+ GError **error)
+{
+ return FALSE;
+}
+
+gboolean atspi_event_listener_deregister (AtspiEventListener *listener,
+ const gchar *event_type,
+ GError **error)
+{
+ return FALSE;
+}
+
+AtspiStateSet * atspi_accessible_get_state_set (AtspiAccessible *obj)
+{
+ return NULL;
+}
+
+gboolean atspi_state_set_contains (AtspiStateSet *set, AtspiStateType state)
+{
+ return FALSE;
+}
+
+gboolean atspi_component_grab_highlight (AtspiComponent *obj, GError **error)
+{
+ return FALSE;
+}
+
+AtspiScrollable *atspi_accessible_get_scrollable (AtspiAccessible *accessible)
+{
+ return NULL;
+}
+
+gboolean atspi_component_clear_highlight (AtspiComponent *obj, GError **error)
+{
+ return FALSE;
+}
+
+AtspiEditableText * atspi_accessible_get_editable_text (AtspiAccessible *obj)
+{
+ return editable_text;
+}
+
+GArray * atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error)
+{
+ return NULL;
+}
+
+AtspiRelationType atspi_relation_get_relation_type (AtspiRelation *obj)
+{
+ return ATSPI_RELATION_NULL;
+}
+
+gint atspi_relation_get_n_targets (AtspiRelation *obj)
+{
+ return 0;
+}
+
+AtspiAccessible * atspi_relation_get_target (AtspiRelation *obj, gint i)
+{
+ return NULL;
+}
--- /dev/null
+
+
+#ifndef __ATSPI_H__
+#define __ATSPI_H__
+
+#include <glib-2.0/glib.h>
+#include <glib-2.0/glib-object.h>
+#include <dbus/dbus.h>
+
+typedef struct _AtspiApplication AtspiApplication;
+typedef struct _AtspiObject AtspiObject;
+typedef struct _AtspiAccessible AtspiAccessible;
+typedef struct _AtspiEvent AtspiEvent;
+typedef struct _AtspiStateSet AtspiStateSet;
+typedef struct _AtspiEventListener AtspiEventListener;
+typedef struct _AtspiText AtspiText;
+typedef struct _AtspiValue AtspiValue;
+typedef struct _AtspiComponent AtspiComponent;
+typedef struct _AtspiScrollable AtspiScrollable;
+typedef struct _AtspiEditableText AtspiEditableText;
+typedef struct _AtspiRelation AtspiRelation;
+
+typedef void (*AtspiEventListenerCB) (const AtspiEvent *event, void *user_data);
+
+
+typedef enum
+{
+ ATSPI_CACHE_NONE = 0,
+ ATSPI_CACHE_PARENT = 1 << 0,
+ ATSPI_CACHE_CHILDREN = 1 << 1,
+ ATSPI_CACHE_NAME = 1 << 2,
+ ATSPI_CACHE_DESCRIPTION = 1 << 3,
+ ATSPI_CACHE_STATES = 1 << 4,
+ ATSPI_CACHE_ROLE = 1 << 5,
+ ATSPI_CACHE_INTERFACES = 1 << 6,
+ ATSPI_CACHE_ATTRIBUTES = 1 << 7,
+ ATSPI_CACHE_ALL = 0x3fffffff,
+ ATSPI_CACHE_DEFAULT = ATSPI_CACHE_PARENT | ATSPI_CACHE_CHILDREN |
+ ATSPI_CACHE_NAME | ATSPI_CACHE_DESCRIPTION |
+ ATSPI_CACHE_STATES | ATSPI_CACHE_ROLE |
+ ATSPI_CACHE_INTERFACES,
+ ATSPI_CACHE_UNDEFINED = 0x40000000,
+} AtspiCache;
+
+typedef enum {
+ ATSPI_ROLE_INVALID,
+ ATSPI_ROLE_ACCELERATOR_LABEL,
+ ATSPI_ROLE_ALERT,
+ ATSPI_ROLE_ANIMATION,
+ ATSPI_ROLE_ARROW,
+ ATSPI_ROLE_CALENDAR,
+ ATSPI_ROLE_CANVAS,
+ ATSPI_ROLE_CHECK_BOX,
+ ATSPI_ROLE_CHECK_MENU_ITEM,
+ ATSPI_ROLE_COLOR_CHOOSER,
+ ATSPI_ROLE_COLUMN_HEADER,
+ ATSPI_ROLE_COMBO_BOX,
+ ATSPI_ROLE_DATE_EDITOR,
+ ATSPI_ROLE_DESKTOP_ICON,
+ ATSPI_ROLE_DESKTOP_FRAME,
+ ATSPI_ROLE_DIAL,
+ ATSPI_ROLE_DIALOG,
+ ATSPI_ROLE_DIRECTORY_PANE,
+ ATSPI_ROLE_DRAWING_AREA,
+ ATSPI_ROLE_FILE_CHOOSER,
+ ATSPI_ROLE_FILLER,
+ ATSPI_ROLE_FOCUS_TRAVERSABLE,
+ ATSPI_ROLE_FONT_CHOOSER,
+ ATSPI_ROLE_FRAME,
+ ATSPI_ROLE_GLASS_PANE,
+ ATSPI_ROLE_HTML_CONTAINER,
+ ATSPI_ROLE_ICON,
+ ATSPI_ROLE_IMAGE,
+ ATSPI_ROLE_INTERNAL_FRAME,
+ ATSPI_ROLE_LABEL,
+ ATSPI_ROLE_LAYERED_PANE,
+ ATSPI_ROLE_LIST,
+ ATSPI_ROLE_LIST_ITEM,
+ ATSPI_ROLE_MENU,
+ ATSPI_ROLE_MENU_BAR,
+ ATSPI_ROLE_MENU_ITEM,
+ ATSPI_ROLE_OPTION_PANE,
+ ATSPI_ROLE_PAGE_TAB,
+ ATSPI_ROLE_PAGE_TAB_LIST,
+ ATSPI_ROLE_PANEL,
+ ATSPI_ROLE_PASSWORD_TEXT,
+ ATSPI_ROLE_POPUP_MENU,
+ ATSPI_ROLE_PROGRESS_BAR,
+ ATSPI_ROLE_PUSH_BUTTON,
+ ATSPI_ROLE_RADIO_BUTTON,
+ ATSPI_ROLE_RADIO_MENU_ITEM,
+ ATSPI_ROLE_ROOT_PANE,
+ ATSPI_ROLE_ROW_HEADER,
+ ATSPI_ROLE_SCROLL_BAR,
+ ATSPI_ROLE_SCROLL_PANE,
+ ATSPI_ROLE_SEPARATOR,
+ ATSPI_ROLE_SLIDER,
+ ATSPI_ROLE_SPIN_BUTTON,
+ ATSPI_ROLE_SPLIT_PANE,
+ ATSPI_ROLE_STATUS_BAR,
+ ATSPI_ROLE_TABLE,
+ ATSPI_ROLE_TABLE_CELL,
+ ATSPI_ROLE_TABLE_COLUMN_HEADER,
+ ATSPI_ROLE_TABLE_ROW_HEADER,
+ ATSPI_ROLE_TEAROFF_MENU_ITEM,
+ ATSPI_ROLE_TERMINAL,
+ ATSPI_ROLE_TEXT,
+ ATSPI_ROLE_TOGGLE_BUTTON,
+ ATSPI_ROLE_TOOL_BAR,
+ ATSPI_ROLE_TOOL_TIP,
+ ATSPI_ROLE_TREE,
+ ATSPI_ROLE_TREE_TABLE,
+ ATSPI_ROLE_UNKNOWN,
+ ATSPI_ROLE_VIEWPORT,
+ ATSPI_ROLE_WINDOW,
+ ATSPI_ROLE_EXTENDED,
+ ATSPI_ROLE_HEADER,
+ ATSPI_ROLE_FOOTER,
+ ATSPI_ROLE_PARAGRAPH,
+ ATSPI_ROLE_RULER,
+ ATSPI_ROLE_APPLICATION,
+ ATSPI_ROLE_AUTOCOMPLETE,
+ ATSPI_ROLE_EDITBAR,
+ ATSPI_ROLE_EMBEDDED,
+ ATSPI_ROLE_ENTRY,
+ ATSPI_ROLE_CHART,
+ ATSPI_ROLE_CAPTION,
+ ATSPI_ROLE_DOCUMENT_FRAME,
+ ATSPI_ROLE_HEADING,
+ ATSPI_ROLE_PAGE,
+ ATSPI_ROLE_SECTION,
+ ATSPI_ROLE_REDUNDANT_OBJECT,
+ ATSPI_ROLE_FORM,
+ ATSPI_ROLE_LINK,
+ ATSPI_ROLE_INPUT_METHOD_WINDOW,
+ ATSPI_ROLE_TABLE_ROW,
+ ATSPI_ROLE_TREE_ITEM,
+ ATSPI_ROLE_DOCUMENT_SPREADSHEET,
+ ATSPI_ROLE_DOCUMENT_PRESENTATION,
+ ATSPI_ROLE_DOCUMENT_TEXT,
+ ATSPI_ROLE_DOCUMENT_WEB,
+ ATSPI_ROLE_DOCUMENT_EMAIL,
+ ATSPI_ROLE_COMMENT,
+ ATSPI_ROLE_LIST_BOX,
+ ATSPI_ROLE_GROUPING,
+ ATSPI_ROLE_IMAGE_MAP,
+ ATSPI_ROLE_NOTIFICATION,
+ ATSPI_ROLE_INFO_BAR,
+ ATSPI_ROLE_LEVEL_BAR,
+ ATSPI_ROLE_LAST_DEFINED,
+} AtspiRole;
+
+typedef enum {
+ ATSPI_STATE_INVALID,
+ ATSPI_STATE_ACTIVE,
+ ATSPI_STATE_ARMED,
+ ATSPI_STATE_BUSY,
+ ATSPI_STATE_CHECKED,
+ ATSPI_STATE_COLLAPSED,
+ ATSPI_STATE_DEFUNCT,
+ ATSPI_STATE_EDITABLE,
+ ATSPI_STATE_ENABLED,
+ ATSPI_STATE_EXPANDABLE,
+ ATSPI_STATE_EXPANDED,
+ ATSPI_STATE_FOCUSABLE,
+ ATSPI_STATE_FOCUSED,
+ ATSPI_STATE_HAS_TOOLTIP,
+ ATSPI_STATE_HORIZONTAL,
+ ATSPI_STATE_ICONIFIED,
+ ATSPI_STATE_MODAL,
+ ATSPI_STATE_MULTI_LINE,
+ ATSPI_STATE_MULTISELECTABLE,
+ ATSPI_STATE_OPAQUE,
+ ATSPI_STATE_PRESSED,
+ ATSPI_STATE_RESIZABLE,
+ ATSPI_STATE_SELECTABLE,
+ ATSPI_STATE_SELECTED,
+ ATSPI_STATE_SENSITIVE,
+ ATSPI_STATE_SHOWING,
+ ATSPI_STATE_SINGLE_LINE,
+ ATSPI_STATE_STALE,
+ ATSPI_STATE_TRANSIENT,
+ ATSPI_STATE_VERTICAL,
+ ATSPI_STATE_VISIBLE,
+ ATSPI_STATE_MANAGES_DESCENDANTS,
+ ATSPI_STATE_INDETERMINATE,
+ ATSPI_STATE_REQUIRED,
+ ATSPI_STATE_TRUNCATED,
+ ATSPI_STATE_ANIMATED,
+ ATSPI_STATE_INVALID_ENTRY,
+ ATSPI_STATE_SUPPORTS_AUTOCOMPLETION,
+ ATSPI_STATE_SELECTABLE_TEXT,
+ ATSPI_STATE_IS_DEFAULT,
+ ATSPI_STATE_VISITED,
+ ATSPI_STATE_HIGHLIGHTED,
+ ATSPI_STATE_LAST_DEFINED,
+} AtspiStateType;
+
+typedef enum
+{
+ ATSPI_RELATION_NULL,
+ ATSPI_RELATION_LABEL_FOR,
+ ATSPI_RELATION_LABELLED_BY,
+} AtspiRelationType;
+
+struct _AtspiApplication
+{
+ GObject parent;
+ GHashTable *hash;
+ char *bus_name;
+ DBusConnection *bus;
+ AtspiAccessible *root;
+ AtspiCache cache;
+ gchar *toolkit_name;
+ gchar *toolkit_version;
+ gchar *atspi_version;
+ struct timeval time_added;
+};
+
+struct _AtspiObject
+{
+ GObject parent;
+ AtspiApplication *app;
+ char *path;
+};
+
+struct _AtspiAccessible
+{
+ AtspiObject parent;
+ AtspiAccessible *accessible_parent;
+ GList *children;
+ AtspiRole role;
+ gint interfaces;
+ char *name;
+ char *description;
+ AtspiStateSet *states;
+ GHashTable *attributes;
+ guint cached_properties;
+};
+
+struct _AtspiEvent
+{
+ gchar *type;
+ AtspiAccessible *source;
+ gint detail1;
+ gint detail2;
+ GValue any_data;
+};
+
+struct _AtspiStateSet
+{
+ GObject parent;
+ struct _AtspiAccessible *accessible;
+ gint64 states;
+};
+
+struct _AtspiEventListener
+{
+ GObject parent;
+ AtspiEventListenerCB callback;
+ void *user_data;
+ GDestroyNotify cb_destroyed;
+};
+
+struct _AtspiText
+{
+ GTypeInterface parent;
+};
+
+struct _AtspiEditableText
+{
+ GTypeInterface parent;
+};
+
+struct _AtspiValue
+{
+ GTypeInterface parent;
+};
+
+struct _AtspiComponent
+{
+ GTypeInterface parent;
+};
+
+struct _AtspiScrollable
+{
+ GTypeInterface parent;
+};
+
+struct _AtspiRelation
+{
+ GTypeInterface parent;
+};
+
+gchar * atspi_accessible_get_name (AtspiAccessible *obj, GError **error);
+gchar * atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error);
+gchar * atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error);
+gchar * atspi_accessible_get_description (AtspiAccessible *obj, GError **error);
+AtspiText * atspi_accessible_get_text (AtspiAccessible *obj);
+gint atspi_text_get_character_count (AtspiText *obj, GError **error);
+gint atspi_text_get_caret_offset (AtspiText *obj, GError **error);
+gchar * atspi_text_get_text (AtspiText *obj, gint start_offset, gint end_offset, GError **error);
+AtspiValue * atspi_accessible_get_value (AtspiAccessible *obj);
+gdouble atspi_value_get_current_value (AtspiValue *obj, GError **error);
+gdouble atspi_value_get_maximum_value (AtspiValue *obj, GError **error);
+gdouble atspi_value_get_minimum_value (AtspiValue *obj, GError **error);
+AtspiEventListener *atspi_event_listener_new (AtspiEventListenerCB callback,
+ gpointer user_data,
+ GDestroyNotify callback_destroyed);
+gboolean atspi_event_listener_register (AtspiEventListener *listener,
+ const gchar *event_type,
+ GError **error);
+gboolean atspi_event_listener_deregister (AtspiEventListener *listener,
+ const gchar *event_type,
+ GError **error);
+AtspiStateSet * atspi_accessible_get_state_set (AtspiAccessible *obj);
+gboolean atspi_state_set_contains (AtspiStateSet *set, AtspiStateType state);
+
+void atspi_alloc_memory(void);
+
+void atspi_free_memory(void);
+gboolean atspi_component_grab_highlight (AtspiComponent *obj, GError **error);
+AtspiScrollable *atspi_accessible_get_scrollable (AtspiAccessible *accessible);
+gboolean atspi_component_clear_highlight (AtspiComponent *obj, GError **error);
+AtspiEditableText * atspi_accessible_get_editable_text (AtspiAccessible *obj);
+GArray * atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error);
+AtspiRelationType atspi_relation_get_relation_type (AtspiRelation *obj);
+gint atspi_relation_get_n_targets (AtspiRelation *obj);
+AtspiAccessible * atspi_relation_get_target (AtspiRelation *obj, gint i);
+#endif /*__ATSPI_H__*/
--- /dev/null
+
+#include "screen_reader_spi.h"
+#include <check.h>
+#include <stdio.h>
+#include <atspi/atspi.h>
+
+void setup(void)
+{
+ Service_Data *data = get_pointer_to_service_data_struct();
+ data->information_level = 1;
+ data->run_service = 1;
+ data->voice_type = TTS_VOICE_TYPE_FEMALE;
+ data->reading_speed = 2;
+ data->tracking_signal_name = "test_event";
+
+ //Set by tts
+ data->tts = NULL;
+ data->available_languages = NULL;
+
+ //Actions to do when tts state is 'ready'
+ data->say_text = false;
+ data->update_language_list = false;
+
+ data->text_to_say_info = NULL;
+}
+
+void teardown(void)
+{
+}
+
+START_TEST(spi_init_null_parameter)
+{
+ spi_init(NULL);
+}
+END_TEST
+
+START_TEST(spi_init_service_data_parameter)
+{
+ Service_Data *data = get_pointer_to_service_data_struct();
+ spi_init(data);
+}
+END_TEST
+
+START_TEST(spi_on_state_change_name)
+{
+ Service_Data *sd = get_pointer_to_service_data_struct();
+ AtspiEvent event;
+ AtspiAccessible accessible;
+ event.type = "test_event";
+ sd->tracking_signal_name = "test_event";
+ event.detail1 = 1;
+ accessible.name = "test_name";
+ accessible.description = NULL;
+ event.source = &accessible;
+ char *return_value = spi_event_get_text_to_read(&event, sd);
+ fail_if(!return_value || strcmp(return_value, "test_name"));
+ free(return_value);
+}
+END_TEST
+
+START_TEST(spi_on_state_change_description)
+{
+ Service_Data *sd = get_pointer_to_service_data_struct();
+ AtspiEvent event;
+ AtspiAccessible accessible;
+ event.type = "test_event";
+ sd->tracking_signal_name = "test_event";
+ event.detail1 = 1;
+ accessible.name = "test_name";
+ accessible.description = "test description";
+ event.source = &accessible;
+ char *return_value = spi_event_get_text_to_read(&event, sd);
+ fail_if(!return_value || strcmp(return_value, "test description"));
+ free(return_value);
+}
+END_TEST
+
+START_TEST(spi_on_state_change_role)
+{
+ Service_Data *sd = get_pointer_to_service_data_struct();
+ AtspiEvent event;
+ AtspiAccessible accessible;
+ event.type = "test_event";
+ sd->tracking_signal_name = "test_event";
+ event.detail1 = 1;
+ accessible.role = ATSPI_ROLE_IMAGE;
+ accessible.name = NULL;
+ accessible.description = NULL;
+ event.source = &accessible;
+ char *return_value = spi_event_get_text_to_read(&event, sd);
+ fail_if(!return_value || strcmp(return_value, "Image"));
+ free(return_value);
+}
+END_TEST
+
+START_TEST(spi_on_caret_move)
+{
+ Service_Data *sd = get_pointer_to_service_data_struct();
+ AtspiEvent event;
+ AtspiAccessible accessible;
+ event.type = "object:text-caret-moved";
+ accessible.name = "test_name";
+ event.source = &accessible;
+ atspi_alloc_memory();
+ char *return_value = spi_event_get_text_to_read(&event, sd);
+ atspi_free_memory();
+ fail_if(!return_value || strcmp(return_value, "AtspiText text"));
+ free(return_value);
+}
+END_TEST
+
+START_TEST(spi_on_value_changed)
+{
+Service_Data *sd = get_pointer_to_service_data_struct();
+ AtspiEvent event;
+ AtspiAccessible accessible;
+ event.type = VALUE_CHANGED_SIG;
+ accessible.name = "test_name";
+ event.source = &accessible;
+ atspi_alloc_memory();
+ char *return_value = spi_event_get_text_to_read(&event, sd);
+ atspi_free_memory();
+ fail_if(!return_value || strcmp(return_value, "1.00"));
+ free(return_value);
+}
+END_TEST
+
+Suite *screen_reader_suite(void)
+{
+ Suite *s;
+ TCase *tc_spi_screen_reader_init;
+ TCase *tc_spi_screen_reader_on_state_changed;
+ TCase *tc_spi_screen_reader_on_caret_move;
+ TCase *tc_spi_screen_reader_on_access_value;
+
+ s = suite_create("Screen reader");
+ tc_spi_screen_reader_init = tcase_create("tc_spi_screen_reader_init");
+ tc_spi_screen_reader_on_state_changed = tcase_create("tc_spi_screen_reader_on_state_changed");
+ tc_spi_screen_reader_on_caret_move = tcase_create("tc_spi_screen_reader_on_caret_move");
+ tc_spi_screen_reader_on_access_value = tcase_create("tc_spi_screen_reader_on_access_value");
+
+ tcase_add_checked_fixture(tc_spi_screen_reader_init, setup, teardown);
+ tcase_add_checked_fixture(tc_spi_screen_reader_on_state_changed, setup, teardown);
+ tcase_add_checked_fixture(tc_spi_screen_reader_on_caret_move, setup, teardown);
+ tcase_add_checked_fixture(tc_spi_screen_reader_on_access_value, setup, teardown);
+
+ tcase_add_test(tc_spi_screen_reader_init, spi_init_null_parameter);
+ tcase_add_test(tc_spi_screen_reader_init, spi_init_service_data_parameter);
+ tcase_add_test(tc_spi_screen_reader_on_state_changed, spi_on_state_change_name);
+ tcase_add_test(tc_spi_screen_reader_on_state_changed, spi_on_state_change_description);
+ tcase_add_test(tc_spi_screen_reader_on_state_changed, spi_on_state_change_role);
+ tcase_add_test(tc_spi_screen_reader_on_caret_move, spi_on_caret_move);
+ tcase_add_test(tc_spi_screen_reader_on_access_value, spi_on_value_changed);
+
+ suite_add_tcase(s, tc_spi_screen_reader_init);
+ suite_add_tcase(s, tc_spi_screen_reader_on_state_changed);
+ suite_add_tcase(s, tc_spi_screen_reader_on_caret_move);
+ suite_add_tcase(s, tc_spi_screen_reader_on_access_value);
+
+ return s;
+}
+
+int main()
+{
+ int number_failed;
+ Suite *s;
+ SRunner *sr;
+
+ s = screen_reader_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ number_failed = srunner_ntests_failed(sr);
+ srunner_free(sr);
+ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}