Screen reader unit tests case
authorMichal Jagiello <m.jagiello@samsung.com>
Mon, 2 Mar 2015 11:21:52 +0000 (12:21 +0100)
committerMichal Jagiello <m.jagiello@samsung.com>
Tue, 17 Mar 2015 13:27:00 +0000 (14:27 +0100)
Change-Id: Ic28c30a7c1305c316c284b7a725cf08699e59aa9

14 files changed:
CMakeLists.txt
include/screen_reader.h
include/screen_reader_spi.h
include/screen_reader_vconf.h
packaging/org.tizen.smart-navigator.spec
src/navigator.c
src/screen_reader_spi.c
src/screen_reader_tts.c
src/screen_reader_vconf.c
tests/CMakeLists.sub [new file with mode: 0755]
tests/CMakeLists.txt [new file with mode: 0644]
tests/atspi/atspi.c [new file with mode: 0644]
tests/atspi/atspi.h [new file with mode: 0644]
tests/screen_reader_test_suite.c [new file with mode: 0644]

index b79df0c..691f1fd 100755 (executable)
@@ -1,4 +1,5 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+enable_testing()
 
 # FIND ALL SOURCE IN A SOURCE DIRECTORY
 AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/src SRCS)
@@ -27,7 +28,8 @@ FOREACH(flag ${pkgs_CFLAGS})
        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}")
 
@@ -43,4 +45,6 @@ INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
 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
index 7f86170..3428c2d 100644 (file)
@@ -71,7 +71,6 @@ typedef struct _Service_Data
        char **available_apps;
 
        const char *text_from_dbus;
-
 } Service_Data;
 
 Service_Data *get_pointer_to_service_data_struct();
index e1f6506..3047284 100644 (file)
@@ -12,9 +12,7 @@
 #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_ */
index fda47cc..831dd3a 100644 (file)
@@ -9,6 +9,7 @@
 #define SCREEN_READER_VCONF_H_
 
 #include "screen_reader.h"
+#include "logger.h"
 
 bool vconf_init(Service_Data *service_data);
 
index c53616f..b1c4c1d 100755 (executable)
@@ -22,6 +22,7 @@ BuildRequires:  pkgconfig(bundle)
 BuildRequires:  tts
 BuildRequires:  tts-devel
 BuildRequires:  vconf
+BuildRequires:  pkgconfig(check)
 
 %define AppInstallPath /usr/apps/%{name}
 %define Exec smart-navigator
@@ -39,6 +40,8 @@ make %{?jobs:-j%jobs} \
 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}
index 2b31dbf..7b6e4c1 100644 (file)
@@ -1,6 +1,7 @@
 #include <Ecore_X.h>
 #include <Ecore.h>
 #include <math.h>
+#include <atspi/atspi.h>
 #include "logger.h"
 #include "navigator.h"
 #include "window_tracker.h"
index 2f065d8..339809d 100644 (file)
@@ -210,6 +210,12 @@ static void spi_object_append_relations_to_text_to_read(AtspiAccessible *obj,
         return;
     }
 
+    if(!relations)
+    {
+        ERROR("No relations array");
+        return;
+    }
+
     int i = 0;
     for(; i < relations->len; ++i)
     {
index 72baaf7..62bba94 100644 (file)
@@ -242,6 +242,12 @@ void state_changed_cb(tts_h tts, tts_state_e previous, tts_state_e current, void
 
 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);
index c0826e8..6fd6948 100644 (file)
@@ -94,15 +94,8 @@ bool set_tracking_listener(Service_Data *sd, const char *signal_name)
                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)
        {
@@ -132,7 +125,7 @@ void information_level_cb(keynode_t *node, void *user_data)
 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);
diff --git a/tests/CMakeLists.sub b/tests/CMakeLists.sub
new file mode 100755 (executable)
index 0000000..47fcac2
--- /dev/null
@@ -0,0 +1,26 @@
+## 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 "")
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7e0d71a
--- /dev/null
@@ -0,0 +1,41 @@
+
+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})
diff --git a/tests/atspi/atspi.c b/tests/atspi/atspi.c
new file mode 100644 (file)
index 0000000..14e4962
--- /dev/null
@@ -0,0 +1,170 @@
+
+#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;
+}
diff --git a/tests/atspi/atspi.h b/tests/atspi/atspi.h
new file mode 100644 (file)
index 0000000..3538506
--- /dev/null
@@ -0,0 +1,330 @@
+
+
+#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__*/
diff --git a/tests/screen_reader_test_suite.c b/tests/screen_reader_test_suite.c
new file mode 100644 (file)
index 0000000..3ebaf38
--- /dev/null
@@ -0,0 +1,176 @@
+
+#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;
+}