Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordnarvaez <dwnarvaez@gmail.com>2013-04-09 12:10:28 (GMT)
committer dnarvaez <dwnarvaez@gmail.com>2013-04-09 12:10:28 (GMT)
commit7ac2cae7c6a422f3c1deda6e45388a75d08640a5 (patch)
treecf25a72c297c8129de5887e03a29c0d37eb87085
parenta776c72d46ac09a2791e75a7edbcbc534b158ab5 (diff)
parent6202d4d5cc0d0872bc6989ddbff1f2be652504cd (diff)
Merge pull request #3 from dnarvaez/unit-tests2
Initial bits of unit tests
-rw-r--r--Makefile.am12
-rw-r--r--configure.ac6
-rw-r--r--examples/buttons.py (renamed from tests/graphics/buttons.py)0
-rw-r--r--examples/cellrenderericon.py (renamed from tests/graphics/cellrenderericon.py)0
-rw-r--r--examples/common.py (renamed from tests/graphics/common.py)0
-rw-r--r--examples/customdestroy.py (renamed from tests/graphics/customdestroy.py)0
-rw-r--r--examples/gtktreesensitive.py (renamed from tests/graphics/gtktreesensitive.py)0
-rw-r--r--examples/iconbadges.py (renamed from tests/graphics/iconbadges.py)0
-rw-r--r--examples/iconcache.py (renamed from tests/graphics/iconcache.py)0
-rw-r--r--examples/iconwidget.py (renamed from tests/graphics/iconwidget.py)0
-rw-r--r--examples/intro.py (renamed from tests/graphics/intro.py)0
-rw-r--r--examples/progress.py (renamed from tests/graphics/progress.py)0
-rw-r--r--examples/tabs.py (renamed from tests/graphics/tabs.py)0
-rw-r--r--examples/ticket2855.py (renamed from tests/graphics/ticket2855.py)0
-rw-r--r--examples/ticket2999.py (renamed from tests/graphics/ticket2999.py)0
-rw-r--r--examples/ticket3000.py (renamed from tests/graphics/ticket3000.py)0
-rw-r--r--examples/toolbarpalettes.py (renamed from tests/graphics/toolbarpalettes.py)0
-rw-r--r--examples/toolbuttons.py (renamed from tests/graphics/toolbuttons.py)0
-rw-r--r--examples/tray.py (renamed from tests/graphics/tray.py)0
-rw-r--r--po/POTFILES.skip1
-rw-r--r--src/sugar3/Makefile.am84
-rw-r--r--src/sugar3/_sugarbaseext.defs33
-rw-r--r--src/sugar3/_sugarbaseext.override88
-rw-r--r--src/sugar3/_sugarbaseextmodule.c40
-rw-r--r--src/sugar3/activity/bundlebuilder.py75
-rw-r--r--src/sugar3/env.py4
-rw-r--r--src/sugar3/mime.py11
-rw-r--r--src/sugar3/test/Makefile.am4
-rw-r--r--src/sugar3/test/__init__.py0
-rw-r--r--src/sugar3/test/uitree.py153
-rw-r--r--src/sugar3/xdgmime.c12
-rw-r--r--tests/data/mime.svg3
-rw-r--r--tests/data/sample.activity/activity.py8
-rw-r--r--tests/data/sample.activity/activity/activity-sample.svg26
-rw-r--r--tests/data/sample.activity/activity/activity.info7
-rw-r--r--tests/data/sample.activity/po/Sample.pot26
-rw-r--r--tests/data/sample.activity/po/es.po26
-rwxr-xr-xtests/data/sample.activity/setup.py5
-rw-r--r--tests/lib/runall.py28
-rw-r--r--tests/test_bundlebuilder.py244
-rw-r--r--tests/test_mime.py (renamed from tests/lib/test_mime.py)21
-rw-r--r--tests/test_uitree.py52
42 files changed, 675 insertions, 294 deletions
diff --git a/Makefile.am b/Makefile.am
index 86a095c..2240471 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,9 @@
ACLOCAL_AMFLAGS = -I m4
DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
+TESTS_TMPDIR=$(abs_builddir)/tests-tmp
+TESTS_PYTHONPATH=$(abs_srcdir)/src:$(PYTHONPATH)
+
DISTCLEANFILES = \
intltool-extract \
intltool-merge \
@@ -12,3 +15,12 @@ EXTRA_DIST = \
intltool-extract.in
SUBDIRS = bin src po
+
+check: test
+
+test:
+ cd $(top_srcdir)/tests && \
+ mkdir -p $(TESTS_TMPDIR) && \
+ TMPDIR=$(TESTS_TMPDIR) PYTHONPATH=$(TESTS_PYTHONPATH) \
+ python -m unittest discover && \
+ rm -rf $(TESTS_TMPDIR)
diff --git a/configure.ac b/configure.ac
index fefb8e8..d7efc06 100644
--- a/configure.ac
+++ b/configure.ac
@@ -18,14 +18,9 @@ AC_PATH_PROG([GLIB_GENMARSHAL], [glib-genmarshal])
AM_PATH_PYTHON
AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
-AC_PATH_PROG(PYGTK_CODEGEN, pygtk-codegen-2.0, no)
-
PKG_CHECK_MODULES(EXT, gtk+-3.0 gdk-3.0 gdk-pixbuf-2.0 sm ice alsa
librsvg-2.0 xfixes xi x11)
-PYGTK_DEFSDIR=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
-AC_SUBST(PYGTK_DEFSDIR)
-
GLIB_MKENUMS=`$PKG_CONFIG glib-2.0 --variable=glib_mkenums`
AC_SUBST(GLIB_MKENUMS)
@@ -53,5 +48,6 @@ src/sugar3/event-controller/Makefile
src/sugar3/presence/Makefile
src/sugar3/datastore/Makefile
src/sugar3/dispatch/Makefile
+src/sugar3/test/Makefile
po/Makefile.in
])
diff --git a/tests/graphics/buttons.py b/examples/buttons.py
index a222215..a222215 100644
--- a/tests/graphics/buttons.py
+++ b/examples/buttons.py
diff --git a/tests/graphics/cellrenderericon.py b/examples/cellrenderericon.py
index 1f87552..1f87552 100644
--- a/tests/graphics/cellrenderericon.py
+++ b/examples/cellrenderericon.py
diff --git a/tests/graphics/common.py b/examples/common.py
index 8d516ad..8d516ad 100644
--- a/tests/graphics/common.py
+++ b/examples/common.py
diff --git a/tests/graphics/customdestroy.py b/examples/customdestroy.py
index 72156a8..72156a8 100644
--- a/tests/graphics/customdestroy.py
+++ b/examples/customdestroy.py
diff --git a/tests/graphics/gtktreesensitive.py b/examples/gtktreesensitive.py
index 875612f..875612f 100644
--- a/tests/graphics/gtktreesensitive.py
+++ b/examples/gtktreesensitive.py
diff --git a/tests/graphics/iconbadges.py b/examples/iconbadges.py
index f72dfe3..f72dfe3 100644
--- a/tests/graphics/iconbadges.py
+++ b/examples/iconbadges.py
diff --git a/tests/graphics/iconcache.py b/examples/iconcache.py
index 5a027d9..5a027d9 100644
--- a/tests/graphics/iconcache.py
+++ b/examples/iconcache.py
diff --git a/tests/graphics/iconwidget.py b/examples/iconwidget.py
index e4d7f26..e4d7f26 100644
--- a/tests/graphics/iconwidget.py
+++ b/examples/iconwidget.py
diff --git a/tests/graphics/intro.py b/examples/intro.py
index 05c5b5a..05c5b5a 100644
--- a/tests/graphics/intro.py
+++ b/examples/intro.py
diff --git a/tests/graphics/progress.py b/examples/progress.py
index bc176a8..bc176a8 100644
--- a/tests/graphics/progress.py
+++ b/examples/progress.py
diff --git a/tests/graphics/tabs.py b/examples/tabs.py
index fbc4bac..fbc4bac 100644
--- a/tests/graphics/tabs.py
+++ b/examples/tabs.py
diff --git a/tests/graphics/ticket2855.py b/examples/ticket2855.py
index 0de36a3..0de36a3 100644
--- a/tests/graphics/ticket2855.py
+++ b/examples/ticket2855.py
diff --git a/tests/graphics/ticket2999.py b/examples/ticket2999.py
index 0d42297..0d42297 100644
--- a/tests/graphics/ticket2999.py
+++ b/examples/ticket2999.py
diff --git a/tests/graphics/ticket3000.py b/examples/ticket3000.py
index 295d796..295d796 100644
--- a/tests/graphics/ticket3000.py
+++ b/examples/ticket3000.py
diff --git a/tests/graphics/toolbarpalettes.py b/examples/toolbarpalettes.py
index 93177c1..93177c1 100644
--- a/tests/graphics/toolbarpalettes.py
+++ b/examples/toolbarpalettes.py
diff --git a/tests/graphics/toolbuttons.py b/examples/toolbuttons.py
index e189406..e189406 100644
--- a/tests/graphics/toolbuttons.py
+++ b/examples/toolbuttons.py
diff --git a/tests/graphics/tray.py b/examples/tray.py
index 3da60e3..3da60e3 100644
--- a/tests/graphics/tray.py
+++ b/examples/tray.py
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index 8dd3dfe..3eea371 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -4,3 +4,4 @@
src/sugar3/eggdesktopfile.c
src/sugar3/eggsmclient.c
src/sugar3/gsm-xsmp.c
+tests/data/sample.activity/activity.py
diff --git a/src/sugar3/Makefile.am b/src/sugar3/Makefile.am
index ddea9c8..650bf8e 100644
--- a/src/sugar3/Makefile.am
+++ b/src/sugar3/Makefile.am
@@ -1,4 +1,11 @@
-SUBDIRS = activity bundle event-controller graphics presence datastore dispatch
+SUBDIRS = activity \
+ bundle \
+ event-controller \
+ graphics \
+ presence \
+ datastore \
+ dispatch \
+ test
sugardir = $(pythondir)/sugar3
sugar_PYTHON = \
@@ -11,11 +18,28 @@ sugar_PYTHON = \
session.py \
util.py
+XDG_MIME_SOURCES = \
+ xdgmime.c \
+ xdgmime.h \
+ xdgmimealias.c \
+ xdgmimealias.h \
+ xdgmimecache.c \
+ xdgmimecache.h \
+ xdgmimeglob.c \
+ xdgmimeglob.h \
+ xdgmimeint.c \
+ xdgmimeint.h \
+ xdgmimemagic.c \
+ xdgmimemagic.h \
+ xdgmimeparent.c \
+ xdgmimeparent.h
+
lib_LTLIBRARIES = libsugarext.la
-libsugarext_la_CFLAGS = \
- -DHAVE_ALSA \
- $(EXT_CFLAGS) \
+libsugarext_la_CFLAGS = \
+ -DHAVE_ALSA \
+ -DXDG_PREFIX=sugar_mime \
+ $(EXT_CFLAGS) \
$(WARN_CFLAGS)
libsugarext_la_LDFLAGS = $(LDADD)
@@ -55,51 +79,12 @@ libsugarext_la_SOURCES = \
sugar-key-grabber.c \
sugar-key-grabber.h \
sugar-wm.c \
- sugar-wm.h
-
-sugar_LTLIBRARIES = _sugarbaseext.la
-
-_sugarbaseext_la_CFLAGS = \
- -DXDG_PREFIX=sugar_mime \
- $(WARN_CFLAGS) \
- $(EXT_CFLAGS) \
- $(PYTHON_INCLUDES)
+ $(XDG_MIME_SOURCES)
BUILT_SOURCES = \
sugar-marshal.c \
sugar-marshal.h
-_sugarbaseext_la_LDFLAGS = -module -avoid-version
-_sugarbaseext_la_LIBADD = $(EXT_LIBS)
-_sugarbaseext_la_SOURCES = \
- _sugarbaseextmodule.c \
- xdgmime.c \
- xdgmime.h \
- xdgmimealias.c \
- xdgmimealias.h \
- xdgmimecache.c \
- xdgmimecache.h \
- xdgmimeglob.c \
- xdgmimeglob.h \
- xdgmimeint.c \
- xdgmimeint.h \
- xdgmimemagic.c \
- xdgmimemagic.h \
- xdgmimeparent.c \
- xdgmimeparent.h
-
-nodist__sugarbaseext_la_SOURCES = _sugarbaseext.c
-
-_sugarbaseext.c: _sugarbaseext.defs _sugarbaseext.override
-
-.defs.c:
- (cd $(srcdir)\
- && $(PYGTK_CODEGEN) \
- --override $*.override \
- --prefix py$* $*.defs) > gen-$*.c \
- && cp gen-$*.c $*.c \
- && rm -f gen-$*.c
-
sugar-marshal.c: sugar-marshal.list
$(GLIB_GENMARSHAL) --prefix=sugar_marshal \
$(srcdir)/sugar-marshal.list --header --body > sugar-marshal.c
@@ -108,12 +93,14 @@ sugar-marshal.h: sugar-marshal.list
$(GLIB_GENMARSHAL) --prefix=sugar_marshal \
$(srcdir)/sugar-marshal.list --header > sugar-marshal.h
-CLEANFILES = $(BUILT_SOURCES) _sugarbaseext.c
-EXTRA_DIST = sugar-marshal.list _sugarbaseext.override _sugarbaseext.defs
+CLEANFILES = $(BUILT_SOURCES)
+EXTRA_DIST = sugar-marshal.list
-include $(INTROSPECTION_MAKEFILE)
INTROSPECTION_GIRS = SugarExt-1.0.gir
-INTROSPECTION_SCANNER_ARGS = --identifier-prefix=Sugar --symbol-prefix=sugar \
+INTROSPECTION_SCANNER_ARGS = \
+ -D XDG_PREFIX=sugar_mime \
+ --identifier-prefix=Sugar --symbol-prefix=sugar \
--identifier-prefix=EggSM --symbol-prefix=egg_sm \
--identifier-prefix=Gsm --symbol-prefix=gsm \
--identifier-prefix=Acme --symbol-prefix=acme \
@@ -142,7 +129,8 @@ SugarExt_1_0_gir_FILES = \
sugar-grid.c \
sugar-grid.h \
sugar-wm.c \
- sugar-wm.h
+ sugar-wm.h \
+ $(XDG_MIME_SOURCES)
SugarExt_1_0_gir_INCLUDES = Gtk-3.0 Gdk-3.0
SugarExt_1_0_gir_PACKAGES = gtk+-3.0 gdk-3.0
diff --git a/src/sugar3/_sugarbaseext.defs b/src/sugar3/_sugarbaseext.defs
deleted file mode 100644
index 893219a..0000000
--- a/src/sugar3/_sugarbaseext.defs
+++ /dev/null
@@ -1,33 +0,0 @@
-; functions
-
-(define-function get_mime_type_from_file_name
- (c-name "sugar_mime_get_mime_type_from_file_name")
- (return-type "const-char*")
- (parameters
- '("const-char*" "filename")
- )
-)
-
-(define-function get_mime_type_for_file
- (c-name "sugar_mime_get_mime_type_for_file")
- (return-type "const-char*")
- (parameters
- '("const-char*" "filename")
- )
-)
-
-(define-function list_mime_parents
- (c-name "sugar_mime_list_mime_parents")
- (return-type "char**")
- (parameters
- '("const-char*" "mime")
- )
-)
-
-(define-function uri_list_extract_uris
- (c-name "g_uri_list_extract_uris")
- (return-type "gchar**")
- (parameters
- '("const-char*" "uri_list")
- )
-)
diff --git a/src/sugar3/_sugarbaseext.override b/src/sugar3/_sugarbaseext.override
deleted file mode 100644
index 18356a9..0000000
--- a/src/sugar3/_sugarbaseext.override
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4 -*- */
-%%
-headers
-#include <Python.h>
-#include <glib.h>
-#include "xdgmime.h"
-%%
-modulename _sugarext
-%%
-ignore-glob
- *_get_type
- _*
-%%
-override sugar_mime_get_mime_type_for_file kwargs
-static PyObject *
-_wrap_sugar_mime_get_mime_type_for_file(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "filename", NULL };
- char *filename;
- const char *ret;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,"s:get_mime_type_for_file", kwlist, &filename))
- return NULL;
-
- ret = sugar_mime_get_mime_type_for_file(filename, NULL);
-
- if (ret)
- return PyString_FromString(ret);
- Py_INCREF(Py_None);
- return Py_None;
-}
-%%
-override sugar_mime_list_mime_parents kwargs
-static PyObject *
-_wrap_sugar_mime_list_mime_parents(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "mime_type", NULL };
- char *mime_type;
- char **parents, **tmp;
- int i = 0, j;
- PyObject *ret;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,"s:list_mime_parents", kwlist, &mime_type))
- return NULL;
-
- parents = (char **)sugar_mime_list_mime_parents(mime_type);
- if (!parents)
- return PyTuple_New(0);
-
- tmp = parents;
- while (*tmp)
- tmp++, i++;
-
- ret = PyTuple_New(i);
- for (j = 0; j < i; j++)
- PyTuple_SetItem(ret, j, PyString_FromString(parents[j]));
-
- return ret;
-}
-%%
-override g_uri_list_extract_uris kwargs
-static PyObject *
-_wrap_g_uri_list_extract_uris(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "uri_list", NULL };
- char *uri_list;
- char **uris, **tmp;
- int i = 0, j;
- PyObject *ret;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,"s:uri_list_extract_uris", kwlist, &uri_list))
- return NULL;
-
- uris = (char **)g_uri_list_extract_uris(uri_list);
- if (!uris)
- return PyTuple_New(0);
-
- tmp = uris;
- while (*tmp)
- tmp++, i++;
-
- ret = PyTuple_New(i);
- for (j = 0; j < i; j++)
- PyTuple_SetItem(ret, j, PyString_FromString(uris[j]));
-
- return ret;
-}
-%%
diff --git a/src/sugar3/_sugarbaseextmodule.c b/src/sugar3/_sugarbaseextmodule.c
deleted file mode 100644
index 57fb139..0000000
--- a/src/sugar3/_sugarbaseextmodule.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2006-2007, Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* include this first, before NO_IMPORT_PYGOBJECT is defined */
-#include <Python.h>
-
-extern PyMethodDef py_sugarbaseext_functions[];
-
-DL_EXPORT(void)
-init_sugarbaseext(void)
-{
- PyObject *m, *d;
-
- m = Py_InitModule ("_sugarbaseext", py_sugarbaseext_functions);
- d = PyModule_GetDict (m);
-
- if (PyErr_Occurred ()) {
- Py_FatalError ("can't initialise module _sugarext");
- }
-}
diff --git a/src/sugar3/activity/bundlebuilder.py b/src/sugar3/activity/bundlebuilder.py
index 1450ec2..995b0ad 100644
--- a/src/sugar3/activity/bundlebuilder.py
+++ b/src/sugar3/activity/bundlebuilder.py
@@ -64,10 +64,10 @@ def list_files(base_dir, ignore_dirs=None, ignore_files=None):
class Config(object):
- def __init__(self, source_dir=None, dist_dir=None, dist_name=None):
- self.source_dir = source_dir or os.getcwd()
- self.dist_dir = dist_dir or os.path.join(self.source_dir, 'dist')
- self.dist_name = dist_name
+ def __init__(self, source_dir):
+ self.source_dir = source_dir
+ self.build_dir = os.getcwd()
+ self.dist_dir = os.path.join(self.build_dir, 'dist')
self.bundle = None
self.version = None
self.activity_name = None
@@ -90,18 +90,15 @@ class Config(object):
self.bundle_name = reduce(operator.add, self.activity_name.split())
self.bundle_root_dir = self.bundle_name + '.activity'
self.tar_root_dir = '%s-%s' % (self.bundle_name, self.version)
-
- if self.dist_name:
- self.xo_name = self.tar_name = self.dist_name
- else:
- self.xo_name = '%s-%s.xo' % (self.bundle_name, self.version)
- self.tar_name = '%s-%s.tar.bz2' % (self.bundle_name, self.version)
+ self.xo_name = '%s-%s.xo' % (self.bundle_name, self.version)
+ self.tar_name = '%s-%s.tar.bz2' % (self.bundle_name, self.version)
class Builder(object):
def __init__(self, config):
self.config = config
+ self.locale_dir = os.path.join(self.config.build_dir, 'locale')
def build(self):
self.build_locale()
@@ -113,10 +110,8 @@ class Builder(object):
logging.warn('Missing po/ dir, cannot build_locale')
return
- locale_dir = os.path.join(self.config.source_dir, 'locale')
-
- if os.path.exists(locale_dir):
- shutil.rmtree(locale_dir)
+ if os.path.exists(self.locale_dir):
+ shutil.rmtree(self.locale_dir)
for f in os.listdir(po_dir):
if not f.endswith('.po') or f == 'pseudo.po':
@@ -125,7 +120,7 @@ class Builder(object):
file_name = os.path.join(po_dir, f)
lang = f[:-3]
- localedir = os.path.join(self.config.source_dir, 'locale', lang)
+ localedir = os.path.join(self.config.build_dir, 'locale', lang)
mo_path = os.path.join(localedir, 'LC_MESSAGES')
if not os.path.isdir(mo_path):
os.makedirs(mo_path)
@@ -145,10 +140,8 @@ class Builder(object):
f.write('summary = %s\n' % translated_summary)
f.close()
- def get_files(self):
- allfiles = list_files(self.config.source_dir,
- IGNORE_DIRS, IGNORE_FILES)
- return allfiles
+ def get_locale_files(self):
+ return list_files(self.locale_dir, IGNORE_DIRS, IGNORE_FILES)
class Packager(object):
@@ -200,10 +193,9 @@ class XOPackager(Packager):
for f in self.get_files_in_git():
bundle_zip.write(os.path.join(self.config.source_dir, f),
os.path.join(self.config.bundle_root_dir, f))
- locale_dir = os.path.join(self.config.source_dir, 'locale')
- locale_files = list_files(locale_dir, IGNORE_DIRS, IGNORE_FILES)
- for f in locale_files:
- bundle_zip.write(os.path.join(locale_dir, f),
+
+ for f in self.builder.get_locale_files():
+ bundle_zip.write(os.path.join(self.builder.locale_dir, f),
os.path.join(self.config.bundle_root_dir,
'locale', f))
@@ -225,19 +217,11 @@ class SourcePackager(Packager):
tar.close()
-class Installer(object):
- IGNORES = ['po/*', 'MANIFEST', 'AUTHORS']
-
+class Installer(Packager):
def __init__(self, builder):
- self.config = builder.config
+ Packager.__init__(self, builder.config)
self.builder = builder
- def should_ignore(self, f):
- for pattern in self.IGNORES:
- if fnmatch(f, pattern):
- return True
- return False
-
def install(self, prefix):
self.builder.build()
@@ -245,13 +229,21 @@ class Installer(object):
self.config.bundle_root_dir)
source_to_dest = {}
- for f in self.builder.get_files():
- if self.should_ignore(f):
- pass
- elif f.startswith('locale/') and f.endswith('.mo'):
- source_to_dest[f] = os.path.join(prefix, 'share', f)
+
+ for f in self.get_files_in_git():
+ source_path = os.path.join(self.config.source_dir, f)
+ dest_path = os.path.join(activity_path, f)
+ source_to_dest[source_path] = dest_path
+
+ for f in self.builder.get_locale_files():
+ source_path = os.path.join(self.builder.locale_dir, f)
+
+ if source_path.endswith(".mo"):
+ dest_path = os.path.join(prefix, 'share', 'locale', f)
else:
- source_to_dest[f] = os.path.join(activity_path, f)
+ dest_path = os.path.join(activity_path, 'locale', f)
+
+ source_to_dest[source_path] = dest_path
for source, dest in source_to_dest.items():
print 'Install %s to %s.' % (source, dest)
@@ -337,6 +329,8 @@ def cmd_genpot(config, args):
print 'Usage: %prog genpot'
return
+ os.chdir(config.source_dir)
+
po_path = os.path.join(config.source_dir, 'po')
if not os.path.isdir(po_path):
os.mkdir(po_path)
@@ -403,7 +397,8 @@ def start():
parser.disable_interspersed_args()
(options_, args) = parser.parse_args()
- config = Config()
+ source_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
+ config = Config(source_dir)
try:
globals()['cmd_' + args[0]](config, args[1:])
diff --git a/src/sugar3/env.py b/src/sugar3/env.py
index e681f4f..23bb0ab 100644
--- a/src/sugar3/env.py
+++ b/src/sugar3/env.py
@@ -51,8 +51,8 @@ def get_logs_path(path=None):
def get_user_activities_path():
- return os.path.expanduser('~/Activities')
-
+ return os.environ.get("SUGAR_ACTIVITIES_PATH",
+ os.path.expanduser('~/Activities'))
def get_user_library_path():
return os.path.expanduser('~/Library')
diff --git a/src/sugar3/mime.py b/src/sugar3/mime.py
index be9b5eb..a9046e7 100644
--- a/src/sugar3/mime.py
+++ b/src/sugar3/mime.py
@@ -25,10 +25,11 @@ import os
import logging
import gettext
+from gi.repository import GLib
from gi.repository import GdkPixbuf
from gi.repository import Gio
-from sugar3 import _sugarbaseext
+from gi.repository import SugarExt
_ = lambda msg: gettext.dgettext('sugar-base', msg)
@@ -123,7 +124,7 @@ def get_for_file(file_name):
file_name = os.path.realpath(file_name)
- mime_type = _sugarbaseext.get_mime_type_for_file(file_name)
+ mime_type = SugarExt.mime_get_mime_type_for_file(file_name, None)
if mime_type == 'application/octet-stream':
if _file_looks_like_text(file_name):
return 'text/plain'
@@ -134,7 +135,7 @@ def get_for_file(file_name):
def get_from_file_name(file_name):
- return _sugarbaseext.get_mime_type_from_file_name(file_name)
+ return SugarExt.mime_get_mime_type_from_file_name(file_name)
def get_mime_icon(mime_type):
@@ -154,7 +155,7 @@ def get_mime_description(mime_type):
def get_mime_parents(mime_type):
- return _sugarbaseext.list_mime_parents(mime_type)
+ return SugarExt.mime_list_mime_parents(mime_type)
def get_primary_extension(mime_type):
@@ -254,7 +255,7 @@ def choose_most_significant(mime_types):
def split_uri_list(uri_list):
- return _sugarbaseext.uri_list_extract_uris(uri_list)
+ return GLib.uri_list_extract_uris(uri_list)
def _file_looks_like_text(file_name):
diff --git a/src/sugar3/test/Makefile.am b/src/sugar3/test/Makefile.am
new file mode 100644
index 0000000..0748c13
--- /dev/null
+++ b/src/sugar3/test/Makefile.am
@@ -0,0 +1,4 @@
+sugardir = $(pythondir)/sugar3/test
+sugar_PYTHON = \
+ __init__.py \
+ uitree.py
diff --git a/src/sugar3/test/__init__.py b/src/sugar3/test/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/sugar3/test/__init__.py
diff --git a/src/sugar3/test/uitree.py b/src/sugar3/test/uitree.py
new file mode 100644
index 0000000..34611a4
--- /dev/null
+++ b/src/sugar3/test/uitree.py
@@ -0,0 +1,153 @@
+# Copyright (C) 2012, Daniel Narvaez
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+"""
+UNSTABLE.
+"""
+
+import time
+
+from gi.repository import Atspi
+
+Atspi.set_timeout(-1, -1)
+
+def get_root():
+ return Node(Atspi.get_desktop(0))
+
+def _retry_find(func):
+ def wrapped(*args, **kwargs):
+ result = None
+ n_retries = 1
+
+ while n_retries <= 10:
+ print "Try %d, name=%s role_name=%s" % \
+ (n_retries,
+ kwargs.get("name", None),
+ kwargs.get("role_name", None))
+
+ result = func(*args, **kwargs)
+ expect_none = kwargs.get("expect_none", False)
+ if (not expect_none and result) or \
+ (expect_none and not result):
+ return result
+
+ time.sleep(5)
+ n_retries = n_retries + 1
+
+ get_root().dump()
+
+ return result
+
+ return wrapped
+
+class Node:
+ def __init__(self, accessible):
+ self._accessible = accessible
+
+ def dump(self):
+ self._crawl_accessible(self, 0)
+
+ def do_action(self, name):
+ for i in range(self._accessible.get_n_actions()):
+ if Atspi.Action.get_name(self._accessible, i) == name:
+ self._accessible.do_action(i)
+
+ def click(self, button=1):
+ point = self._accessible.get_position(Atspi.CoordType.SCREEN)
+ Atspi.generate_mouse_event(point.x, point.y, "b%sc" % button)
+
+ @property
+ def name(self):
+ return self._accessible.get_name()
+
+ @property
+ def role_name(self):
+ return self._accessible.get_role_name()
+
+ @property
+ def text(self):
+ return Atspi.Text.get_text(self._accessible, 0, -1)
+
+ def get_children(self):
+ children = []
+
+ for i in range(self._accessible.get_child_count()):
+ child = self._accessible.get_child_at_index(i)
+
+ # We sometimes get none children from atspi
+ if child is not None:
+ children.append(Node(child))
+
+ return children
+
+ @_retry_find
+ def find_children(self, name=None, role_name=None):
+ def predicate(node):
+ return self._predicate(node, name, role_name)
+
+ descendants = []
+ self._find_all_descendants(self, predicate, descendants)
+ if not descendants:
+ return []
+
+ return descendants
+
+ @_retry_find
+ def find_child(self, name=None, role_name=None, expect_none=False):
+ def predicate(node):
+ return self._predicate(node, name, role_name)
+
+ node = self._find_descendant(self, predicate)
+ if node is None:
+ return None
+
+ return node
+
+ def __str__(self):
+ return "[%s | %s]" % (self.name, self.role_name)
+
+ def _predicate(self, node, name, role_name):
+ if name is not None and name != node.name:
+ return False
+
+ if role_name is not None and role_name != node.role_name:
+ return False
+
+ return True
+
+ def _find_descendant(self, node, predicate):
+ if predicate(node):
+ return node
+
+ for child in node.get_children():
+ descendant = self._find_descendant(child, predicate)
+ if descendant is not None:
+ return descendant
+
+ return None
+
+ def _find_all_descendants(self, node, predicate, matches):
+ if predicate(node):
+ matches.append(node)
+
+ for child in node.get_children():
+ self._find_all_descendants(child, predicate, matches)
+
+ def _crawl_accessible(self, node, depth):
+ print " " * depth + str(node)
+
+ for child in node.get_children():
+ self._crawl_accessible(child, depth + 1)
diff --git a/src/sugar3/xdgmime.c b/src/sugar3/xdgmime.c
index 1d2007c..ec8a6a3 100644
--- a/src/sugar3/xdgmime.c
+++ b/src/sugar3/xdgmime.c
@@ -457,6 +457,13 @@ xdg_mime_get_mime_type_for_data (const void *data,
return XDG_MIME_TYPE_UNKNOWN;
}
+/**
+ * sugar_mime_get_mime_type_for_file:
+ * @file_name: the file path
+ * @statbuf: (allow-none)
+ *
+ * Returns: (transfer none): the mime type.
+ */
const char *
xdg_mime_get_mime_type_for_file (const char *file_name,
struct stat *statbuf)
@@ -752,6 +759,11 @@ xdg_mime_mime_type_subclass (const char *mime,
return _xdg_mime_mime_type_subclass (mime, base);
}
+/**
+ * sugar_mime_list_mime_parents:
+ *
+ * Return value: (array zero-terminated=1) (transfer full):
+ **/
char **
xdg_mime_list_mime_parents (const char *mime)
{
diff --git a/tests/data/mime.svg b/tests/data/mime.svg
new file mode 100644
index 0000000..d4e6db3
--- /dev/null
+++ b/tests/data/mime.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" version="2.0">
+</svg>
diff --git a/tests/data/sample.activity/activity.py b/tests/data/sample.activity/activity.py
new file mode 100644
index 0000000..97d3c98
--- /dev/null
+++ b/tests/data/sample.activity/activity.py
@@ -0,0 +1,8 @@
+from gettext import gettext as _
+
+from sugar3.activity import activity
+
+class SampleActivity(activity.Activity):
+ def __init__(self, handle):
+ activity.Activity.__init__(self, handle)
+ self._text = _("Text string")
diff --git a/tests/data/sample.activity/activity/activity-sample.svg b/tests/data/sample.activity/activity/activity-sample.svg
new file mode 100644
index 0000000..8da7c63
--- /dev/null
+++ b/tests/data/sample.activity/activity/activity-sample.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]>
+<svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px">
+ <g display="block" id="activity-helloworld">
+ <path d="M9.263,48.396c0.682,1.152,6.027,0.059,8.246-1.463 c2.102-1.432,3.207-2.596,4.336-2.596c1.133,0,12.54,0.92,20.935-5.715c7.225-5.707,9.773-13.788,4.52-21.437 c-5.252-7.644-13.832-9.08-20.878-8.56C16.806,9.342,4.224,16.91,4.677,28.313c0.264,6.711,3.357,9.143,4.922,10.703 c1.562,1.566,4.545,1.566,2.992,5.588C11.981,46.183,8.753,47.522,9.263,48.396z" display="inline" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5"/>
+ </g>
+ <circle cx="27.375" cy="27.5" r="19.903"
+ transform="matrix(0.6,0,0,0.6,10.95,11)"
+ id="circle4" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" display="inline" />
+ <g transform="matrix(0.6,0,0,0.6,10.95,11)" id="g6" style="display:inline">
+ <path d="m 27.376,7.598 c 0,0 -11.205,8.394 -11.205,19.976 0,11.583 11.205,19.829 11.205,19.829"
+ id="path8" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" />
+ <path d="m 27.376,7.598 c 0,0 11.066,9.141 11.066,19.976 0,10.839 -11.066,19.829 -11.066,19.829"
+ id="path10" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" />
+ <line x1="27.375999" x2="27.375999" y1="7.598" y2="47.402"
+ id="line12" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" />
+ <line x1="27.375999" x2="27.375999" y1="7.598" y2="47.402"
+ id="line14" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" />
+ <line x1="27.375999" x2="27.375999" y1="7.598" y2="47.402"
+ id="line16" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" />
+ <line x1="7.4720001" x2="47.278" y1="27.5" y2="27.5"
+ id="line18" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" />
+ </g>
+</svg>
diff --git a/tests/data/sample.activity/activity/activity.info b/tests/data/sample.activity/activity/activity.info
new file mode 100644
index 0000000..4cf7f75
--- /dev/null
+++ b/tests/data/sample.activity/activity/activity.info
@@ -0,0 +1,7 @@
+[Activity]
+name = Sample
+activity_version = 1
+bundle_id = org.sugarlabs.Sample
+exec = sugar-activity activity.SampleActivity
+icon = activity-sample
+license = GPLv2+
diff --git a/tests/data/sample.activity/po/Sample.pot b/tests/data/sample.activity/po/Sample.pot
new file mode 100644
index 0000000..0cee357
--- /dev/null
+++ b/tests/data/sample.activity/po/Sample.pot
@@ -0,0 +1,26 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-06 20:10+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2
+msgid "Sample"
+msgstr ""
+
+#: activity.py:8
+msgid "Text string"
+msgstr ""
diff --git a/tests/data/sample.activity/po/es.po b/tests/data/sample.activity/po/es.po
new file mode 100644
index 0000000..a1a6adb
--- /dev/null
+++ b/tests/data/sample.activity/po/es.po
@@ -0,0 +1,26 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-06 20:10+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2
+msgid "Sample"
+msgstr ""
+
+#: activity.py:8
+msgid "Text string"
+msgstr ""
diff --git a/tests/data/sample.activity/setup.py b/tests/data/sample.activity/setup.py
new file mode 100755
index 0000000..ad218b2
--- /dev/null
+++ b/tests/data/sample.activity/setup.py
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+from sugar3.activity import bundlebuilder
+
+bundlebuilder.start()
diff --git a/tests/lib/runall.py b/tests/lib/runall.py
deleted file mode 100644
index ae1bb3a..0000000
--- a/tests/lib/runall.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (C) 2007, Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import unittest
-
-import test_mime
-
-runner = unittest.TextTestRunner()
-loader = unittest.TestLoader()
-
-suite = unittest.TestSuite()
-suite.addTest(loader.loadTestsFromModule(test_mime))
-
-runner.run(suite)
diff --git a/tests/test_bundlebuilder.py b/tests/test_bundlebuilder.py
new file mode 100644
index 0000000..46a02a1
--- /dev/null
+++ b/tests/test_bundlebuilder.py
@@ -0,0 +1,244 @@
+# Copyright (C) 2012, Daniel Narvaez
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import os
+import unittest
+import shutil
+import subprocess
+import tempfile
+import tarfile
+import zipfile
+
+tests_dir = os.path.dirname(__file__)
+data_dir = os.path.join(tests_dir, "data")
+
+class TestGit(unittest.TestCase):
+ _source_files = ["activity.py",
+ "setup.py",
+ "po/Sample.pot",
+ "po/es.po",
+ "activity/activity.info",
+ "activity/activity-sample.svg"]
+
+ _activity_locale_files = ["locale/es/activity.linfo"]
+
+ _share_locale_files = ["locale/es/LC_MESSAGES/org.sugarlabs.Sample.mo"]
+
+ def _get_all_locale_files(self):
+ expected = self._share_locale_files[:]
+ expected.extend(self._activity_locale_files)
+ return expected
+
+ def _create_repo(self):
+ cwd = os.getcwd()
+ path = tempfile.mkdtemp()
+ os.chdir(path)
+
+ subprocess.check_call(["git", "init"])
+ subprocess.check_call(["git", "config", "user.name", "Test Test"])
+ subprocess.check_call(["git", "config", "user.email", "test@test.org"])
+
+ for source in self._source_files:
+ source_path = os.path.join(data_dir, "sample.activity", source)
+ dest_path = os.path.join(path, source)
+
+ try:
+ os.makedirs(os.path.dirname(dest_path))
+ except OSError:
+ pass
+
+ shutil.copyfile(source_path, dest_path)
+ shutil.copymode(source_path, dest_path)
+
+ subprocess.check_call(["git", "add", source])
+
+ subprocess.check_call(["git", "commit", "-m", "Initial commit", "-a"])
+
+ os.chdir(cwd)
+
+ return path
+
+ def _strip_root_dir(self, paths):
+ return [path[path.find("/") + 1:] for path in paths]
+
+ def _test_dist_xo(self, source_path, build_path):
+ cwd = os.getcwd()
+ os.chdir(build_path)
+
+ setup_path = os.path.join(source_path, "setup.py")
+ subprocess.call([setup_path, "dist_xo"])
+
+ xo_path = os.path.join(build_path, "dist", "Sample-1.xo")
+ filenames = zipfile.ZipFile(xo_path).namelist()
+
+ stripped_filenames = self._strip_root_dir(filenames)
+ expected = self._source_files[:]
+ expected.extend(self._get_all_locale_files())
+ self.assertItemsEqual(stripped_filenames, expected)
+
+ os.chdir(cwd)
+
+ def _test_dist_source(self, source_path, build_path):
+ cwd = os.getcwd()
+ os.chdir(build_path)
+
+ setup_path = os.path.join(source_path, "setup.py")
+ subprocess.call([setup_path, "dist_source"])
+
+ xo_path = os.path.join(build_path, "dist", "Sample-1.tar.bz2")
+ filenames = tarfile.open(name=xo_path, mode="r:bz2").getnames()
+
+ stripped_filenames = self._strip_root_dir(filenames)
+ self.assertItemsEqual(stripped_filenames, self._source_files)
+
+ os.chdir(cwd)
+
+ def _test_build(self, source_path, build_path):
+ cwd = os.getcwd()
+ os.chdir(build_path)
+
+ setup_path = os.path.join(source_path, "setup.py")
+ subprocess.call([setup_path, "build"])
+
+ locale_path = os.path.join(build_path, "locale")
+
+ filenames = []
+ for root, dirs, files in os.walk(locale_path):
+ rel_root = root[len(build_path) + 1:]
+ filenames.extend([os.path.join(rel_root, name) for name in files])
+
+ self.assertItemsEqual(filenames, self._get_all_locale_files())
+
+ os.chdir(cwd)
+
+ def _test_dev(self, source_path, build_path):
+ activities_path = tempfile.mkdtemp()
+
+ cwd = os.getcwd()
+ os.chdir(build_path)
+
+ os.environ["SUGAR_ACTIVITIES_PATH"] = activities_path
+
+ setup_path = os.path.join(source_path, "setup.py")
+ subprocess.call([setup_path, "dev"])
+
+ activity_py_path = os.path.join(activities_path, "Sample.activity",
+ "activity.py")
+ self.assertTrue(os.path.exists(activity_py_path))
+
+ os.chdir(cwd)
+
+ def _test_genpot(self, source_path, build_path):
+ cwd = os.getcwd()
+ os.chdir(build_path)
+
+ pot_path = os.path.join(source_path, "po", "Sample.pot")
+ os.unlink(pot_path)
+
+ setup_path = os.path.join(source_path, "setup.py")
+ subprocess.call([setup_path, "genpot"])
+
+ self.assertTrue(os.path.exists(pot_path))
+
+ os.chdir(cwd)
+
+ def _test_install(self, source_path, build_path):
+ install_path = tempfile.mkdtemp()
+
+ cwd = os.getcwd()
+ os.chdir(build_path)
+
+ setup_path = os.path.join(source_path, "setup.py")
+ subprocess.call([setup_path, "install", "--prefix", install_path])
+
+ filenames = []
+ activity_dir = os.path.join(install_path, "share",
+ "sugar", "activities", "Sample.activity")
+ for root, dirs, files in os.walk(activity_dir):
+ rel_root = root[len(activity_dir) + 1:]
+ filenames.extend([os.path.join(rel_root, name) for name in files])
+
+ expected = self._source_files[:]
+ expected.extend(self._activity_locale_files)
+
+ self.assertItemsEqual(filenames, expected)
+
+ filenames = []
+ share_dir = os.path.join(install_path, "share")
+ locale_dir = os.path.join(share_dir, "locale")
+ for root, dirs, files in os.walk(locale_dir):
+ rel_root = root[len(share_dir) + 1:]
+ for name in files:
+ if "org.sugarlabs.Sample" in name:
+ filenames.append(os.path.join(rel_root, name))
+
+ self.assertItemsEqual(filenames, self._share_locale_files)
+
+ os.chdir(cwd)
+
+ def test_dist_xo_in_source(self):
+ repo_path = self._create_repo()
+ self._test_dist_xo(repo_path, repo_path)
+
+ def test_dist_xo_out_of_source(self):
+ repo_path = self._create_repo()
+ build_path = tempfile.mkdtemp()
+ self._test_dist_xo(repo_path, build_path)
+
+ def test_dist_source_in_source(self):
+ repo_path = self._create_repo()
+ self._test_dist_source(repo_path, repo_path)
+
+ def test_dist_source_out_of_source(self):
+ repo_path = self._create_repo()
+ build_path = tempfile.mkdtemp()
+ self._test_dist_source(repo_path, build_path)
+
+ def test_install_in_source(self):
+ repo_path = self._create_repo()
+ self._test_install(repo_path, repo_path)
+
+ def test_install_out_of_source(self):
+ repo_path = self._create_repo()
+ build_path = tempfile.mkdtemp()
+ self._test_install(repo_path, build_path)
+
+ def test_build_in_source(self):
+ repo_path = self._create_repo()
+ self._test_build(repo_path, repo_path)
+
+ def test_build_out_of_source(self):
+ repo_path = self._create_repo()
+ build_path = tempfile.mkdtemp()
+ self._test_build(repo_path, build_path)
+
+ def test_dev_in_source(self):
+ repo_path = self._create_repo()
+ self._test_genpot(repo_path, repo_path)
+
+ def test_dev_out_of_source(self):
+ repo_path = self._create_repo()
+ build_path = tempfile.mkdtemp()
+ self._test_dev(repo_path, build_path)
+
+ def test_genpot_in_source(self):
+ repo_path = self._create_repo()
+ self._test_genpot(repo_path, repo_path)
+
+ def test_genpot_out_of_source(self):
+ repo_path = self._create_repo()
+ build_path = tempfile.mkdtemp()
+ self._test_genpot(repo_path, build_path)
diff --git a/tests/lib/test_mime.py b/tests/test_mime.py
index 417a320..1f96046 100644
--- a/tests/lib/test_mime.py
+++ b/tests/test_mime.py
@@ -17,12 +17,27 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import os
import unittest
-from sugar import mime
+from sugar3 import mime
+tests_dir = os.path.dirname(__file__)
+data_dir = os.path.join(tests_dir, "data")
class TestMime(unittest.TestCase):
+ def test_split_uri_list(self):
+ self.assertSequenceEqual(mime.split_uri_list("http://one\nhttp://two"),
+ ("http://one", "http://two"))
+
+ def test_get_mime_parents(self):
+ self.assertListEqual(mime.get_mime_parents("image/svg+xml"),
+ ["application/xml"])
+
+ def test_get_for_file(self):
+ self.assertEqual(mime.get_for_file(os.path.join(data_dir, "mime.svg")),
+ 'image/svg+xml')
+
def test_from_file_name(self):
self.assertEqual(mime.get_from_file_name('test.pdf'),
'application/pdf')
@@ -77,7 +92,3 @@ class TestMime(unittest.TestCase):
'text/plain;charset=utf-8', 'text/plain;charset=UTF-8',
'text/plain'])
self.assertEqual(mime_type, 'text/plain')
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/tests/test_uitree.py b/tests/test_uitree.py
new file mode 100644
index 0000000..d640e10
--- /dev/null
+++ b/tests/test_uitree.py
@@ -0,0 +1,52 @@
+# Copyright (C) 2012, Daniel Narvaez
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import sys
+import subprocess
+import unittest
+
+from sugar3.test import uitree
+
+class TestUITree(unittest.TestCase):
+ def test_tree(self):
+ process = subprocess.Popen(["python", __file__, "show_window1"])
+
+ try:
+ root = uitree.get_root()
+ window = root.find_child(name="window1", role_name="frame")
+ button = window.find_child(name="button1", role_name="push button")
+ finally:
+ process.terminate()
+
+ self.assertIsNotNone(button)
+
+def show_window1():
+ from gi.repository import Gtk
+ from gi.repository import GLib
+
+ window = Gtk.Window()
+ window.set_title("window1")
+
+ button = Gtk.Button(label="button1")
+ window.add(button)
+ button.show()
+
+ window.show()
+
+ Gtk.main()
+
+if __name__ == '__main__':
+ globals()[sys.argv[1]]()