[geany/geany] 746697: Merge pull request #2262 from kugel-/fix-1445

Thomas Martitz git-noreply at xxxxx
Fri Sep 20 21:11:49 UTC 2019


Branch:      refs/heads/master
Author:      Thomas Martitz <kugel at rockbox.org>
Committer:   GitHub <noreply at github.com>
Date:        Fri, 20 Sep 2019 21:11:49 UTC
Commit:      746697ab07e87077758c0b71280cf90cd01a5146
             https://github.com/geany/geany/commit/746697ab07e87077758c0b71280cf90cd01a5146

Log Message:
-----------
Merge pull request #2262 from kugel-/fix-1445

Fixes and refactorings to utils_strv_shorten_file_list() and friends.

Also, initial unit tests using Glibs testing framework.


Modified Paths:
--------------
    src/utils.c
    src/utils.h
    tests/Makefile.am
    tests/test_utils.c

Modified: src/utils.c
129 lines changed, 62 insertions(+), 67 deletions(-)
===================================================================
@@ -1308,12 +1308,10 @@ void utils_free_pointers(gsize arg_count, ...)
 }
 
 
-/* currently unused */
-#if 0
 /* Creates a string array deep copy of a series of non-NULL strings.
- * The first argument is nothing special.
- * The list must be ended with NULL.
- * If first is NULL, NULL is returned. */
+ * The first argument is nothing special and must not be NULL.
+ * The list must be terminated with NULL. */
+GEANY_EXPORT_SYMBOL
 gchar **utils_strv_new(const gchar *first, ...)
 {
 	gsize strvlen, i;
@@ -1343,7 +1341,6 @@ gchar **utils_strv_new(const gchar *first, ...)
 	strv[i] = NULL;
 	return strv;
 }
-#endif
 
 
 /**
@@ -2053,11 +2050,12 @@ gchar **utils_strv_join(gchar **first, gchar **second)
  * @return The common prefix that is part of all strings (maybe empty), or NULL if an empty list
  *         was passed in.
  */
-static gchar *utils_strv_find_common_prefix(gchar **strv, gssize strv_len)
+GEANY_EXPORT_SYMBOL
+gchar *utils_strv_find_common_prefix(gchar **strv, gssize strv_len)
 {
 	gsize num;
 
-	if (!NZV(strv))
+	if (strv_len == 0)
 		return NULL;
 
 	num = (strv_len == -1) ? g_strv_length(strv) : (gsize) strv_len;
@@ -2087,7 +2085,8 @@ static gchar *utils_strv_find_common_prefix(gchar **strv, gssize strv_len)
  *
  * @return The common prefix that is part of all strings.
  */
-static gchar *utils_strv_find_lcs(gchar **strv, gssize strv_len)
+GEANY_EXPORT_SYMBOL
+gchar *utils_strv_find_lcs(gchar **strv, gssize strv_len, const gchar *delim)
 {
 	gchar *first, *_sub, *sub;
 	gsize num;
@@ -2097,10 +2096,11 @@ static gchar *utils_strv_find_lcs(gchar **strv, gssize strv_len)
 	char *lcs;
 	gsize found;
 
-	num = (strv_len == -1) ? g_strv_length(strv) : (gsize) strv_len;
-	if (num < 1)
+	if (strv_len == 0)
 		return NULL;
 
+	num = (strv_len == -1) ? g_strv_length(strv) : (gsize) strv_len;
+
 	first = strv[0];
 	len = strlen(first);
 
@@ -2113,8 +2113,18 @@ static gchar *utils_strv_find_lcs(gchar **strv, gssize strv_len)
 		/* No point in continuing if the remainder is too short */
 		if (max > chars_left)
 			break;
+		/* If delimiters are given, we only need to compare substrings which start and
+		 * end with one of them, so skip any non-delim chars at front ... */
+		if (NZV(delim) && (strchr(delim, _sub[0]) == NULL))
+			continue;
 		for (n_chars = 1; n_chars <= chars_left; n_chars++)
 		{
+			if (NZV(delim))
+			{	/* ... and advance to the next delim char at the end, if any */
+				if (!_sub[n_chars] || strchr(delim, _sub[n_chars]) == NULL)
+					continue;
+				n_chars += 1;
+			}
 			g_strlcpy(sub, _sub, n_chars+1);
 			found = 1;
 			for (gsize i = 1; i < num; i++)
@@ -2159,86 +2169,71 @@ gchar **utils_strv_shorten_file_list(gchar **file_names, gssize file_names_len)
 {
 	gsize num;
 	gsize i;
-	gchar *prefix, *substring, *lcs;
-	gchar *start, *end;
+	gchar *prefix, *lcs, *end;
 	gchar **names;
-	gsize prefix_len, lcs_len;
+	gsize prefix_len = 0, lcs_len = 0;
+
+	if (file_names_len == 0)
+		return g_new0(gchar *, 1);
 
-	/* We don't dereference file_names if file_names_len == 0. */
-	g_return_val_if_fail(file_names_len == 0 || file_names != NULL, NULL);
+	g_return_val_if_fail(file_names != NULL, NULL);
 
-	/* The return value shall have exactly the same size as the input. If the input is a
-	 * GStrv (last element is NULL), the output will follow suit. */
 	num = (file_names_len == -1) ? g_strv_length(file_names) : (gsize) file_names_len;
+	/* Always include a terminating NULL, enables easy freeing with g_strfreev()
+	 * We just copy the pointers so we can advance them here. But don't
+	 * forget to duplicate the strings before returning.
+	 */
+	names = g_new(gchar *, num + 1);
+	memcpy(names, file_names, num * sizeof(gchar *));
 	/* Always include a terminating NULL, enables easy freeing with g_strfreev() */
-	names = g_new0(gchar *, num + 1);
+	names[num] = NULL;
 
-	prefix = utils_strv_find_common_prefix(file_names, num);
 	/* First: determine the common prefix, that will be stripped.
-	 * Don't strip single-letter prefixes, such as '/' */
-	prefix_len = 0;
-	if (NZV(prefix) && prefix[1])
+	/* We only want to strip full path components, including the trailing slash.
+	 * Except if the component is just "/".
+	 */
+	prefix = utils_strv_find_common_prefix(names, num);
+	end = strrchr(prefix, G_DIR_SEPARATOR);
+	if (end && end > prefix)
 	{
-		/* Only strip directory components, include trailing '/' */
-		start = strrchr(prefix, G_DIR_SEPARATOR);
-		if (start)
-			prefix_len = start - prefix + 1;
+		prefix_len = end - prefix + 1; /* prefix_len includes the trailing slash */
+		for (i = 0; i < num; i++)
+			names[i] += prefix_len;
 	}
 
-	/* Second: determine the longest common substring (lcs), that will be ellipsized. Look
-	 * only at the directory parts since we don't want the file name to be detected as the lcs.
-	 * Also, the first component cannot be common (since it would be part of the common prefix),
-	 * so ignore that as well.
-	 * Surround with dir separators so that we can easily determine the boundaries for ellipsizing. */
-	for (i = 0; i < num; i++) {
-		start = strchr(file_names[i] + prefix_len, G_DIR_SEPARATOR);
-		end = start ? strrchr(start+1, G_DIR_SEPARATOR) : NULL;
-		/* Breaking out early will also skip looking for lcs (wouldn't succeed anyway). */
-		if (!start || !end)
-			break;
-		names[i] = g_strndup(start, end-start+1);
-	}
-
-	lcs_len = 0;
-	substring = (i == num) ? utils_strv_find_lcs(names, num) : NULL;
-	if (NZV(substring))
+	/* Second: determine the longest common substring (lcs), that will be ellipsized. Again,
+	 * we look only for full path compnents so that we ellipsize between separators. This implies
+	 * that the file name cannot be ellipsized which is desirable anyway.
+	 */
+	lcs = utils_strv_find_lcs(names, num, G_DIR_SEPARATOR_S"/");
+	if (lcs)
 	{
-		/* Strip leading component. */
-		start = strchr(substring, G_DIR_SEPARATOR);
-		if (start)
-		{
-			lcs = start + 1;
-			/* Strip trailing components (perhaps empty). */
-			end = strrchr(lcs, G_DIR_SEPARATOR);
-			if (end)
-			{
-				*end = '\0';
-				lcs_len = strlen(lcs);
-				/* Don't bother for tiny common parts (which are often just "." or "/"). */
-				if (lcs_len < 5)
-					lcs_len = 0;
-			}
-		}
+		lcs_len = strlen(lcs);
+		/* Don't bother for tiny common parts (which are often just "." or "/"). Beware
+		 * that lcs includes the enclosing dir separators so the part must be at least 5 chars
+		 * to be eligible for ellipsizing.
+		 */
+		if (lcs_len < 7)
+			lcs_len = 0;
 	}
 
-	/* Finally build the shortened list of unique file names */
+	/* Last: build the shortened list of unique file names */
 	for (i = 0; i < num; i++)
 	{
-		start = file_names[i] + prefix_len;
 		if (lcs_len == 0)
 		{	/* no lcs, copy without prefix */
-			SETPTR(names[i], g_strdup(start));
+			names[i] = g_strdup(names[i]);
 		}
 		else
 		{
-			const gchar *lcs_start = strstr(start, lcs);
+			const gchar *lcs_start = strstr(names[i], lcs);
 			const gchar *lcs_end = lcs_start + lcs_len;
-			/* Maybe replace with unicode's "…" ? */
-			SETPTR(names[i], g_strdup_printf("%.*s...%s", (int)(lcs_start - start), start, lcs_end));
+			/* Dir seperators are included in lcs but shouldn't be elipsized. */
+			names[i] = g_strdup_printf("%.*s...%s", (int)(lcs_start - names[i] + 1), names[i], lcs_end - 1);
 		}
 	}
 
-	g_free(substring);
+	g_free(lcs);
 	g_free(prefix);
 
 	return names;


Modified: src/utils.h
6 lines changed, 5 insertions(+), 1 deletions(-)
===================================================================
@@ -212,6 +212,8 @@ const gchar *utils_find_open_xml_tag_pos(const gchar sel[], gint size);
 
 gchar *utils_get_real_path(const gchar *file_name);
 
+gchar **utils_strv_shorten_file_list(gchar **file_names, gssize file_names_len);
+
 #ifdef GEANY_PRIVATE
 
 typedef enum
@@ -300,7 +302,9 @@ gchar **utils_strv_new(const gchar *first, ...) G_GNUC_NULL_TERMINATED;
 
 gchar **utils_strv_join(gchar **first, gchar **second) G_GNUC_WARN_UNUSED_RESULT;
 
-gchar **utils_strv_shorten_file_list(gchar **file_names, gssize file_names_len);
+gchar *utils_strv_find_common_prefix(gchar **strv, gssize strv_len) G_GNUC_WARN_UNUSED_RESULT;
+
+gchar *utils_strv_find_lcs(gchar **strv, gssize strv_len, const gchar *delim) G_GNUC_WARN_UNUSED_RESULT;
 
 GSList *utils_get_config_files(const gchar *subdir);
 


Modified: tests/Makefile.am
11 lines changed, 11 insertions(+), 0 deletions(-)
===================================================================
@@ -1,2 +1,13 @@
 
 SUBDIRS = ctags
+
+AM_CPPFLAGS  = -DGEANY_PRIVATE -DG_LOG_DOMAIN=\""Geany"\" @GTK_CFLAGS@ @GTHREAD_CFLAGS@
+AM_CPPFLAGS += -I$(top_srcdir)/src
+
+AM_LDFLAGS = $(GTK_LIBS) $(GTHREAD_LIBS) $(INTLLIBS) -no-install
+
+check_PROGRAMS = test_utils
+
+test_utils_LDADD = $(top_builddir)/src/libgeany.la
+
+TESTS = $(check_PROGRAMS)


Modified: tests/test_utils.c
421 lines changed, 421 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,421 @@
+
+#include "utils.h"
+
+#include "gtkcompat.h"
+
+#define UTIL_TEST_ADD(path, func) g_test_add_func("/utils/" path, func);
+
+
+static void test_utils_strv_new(void)
+{
+	gchar **data;
+
+	data = utils_strv_new("1", NULL);
+	g_assert_nonnull(data);
+	g_assert_cmpint(g_strv_length(data), ==, 1);
+	g_assert_cmpstr(data[0], ==, "1");
+	g_strfreev(data);
+
+	data = utils_strv_new("1", "2", "3", NULL);
+	g_assert_nonnull(data);
+	g_assert_cmpint(g_strv_length(data), ==, 3);
+	g_assert_cmpstr(data[0], ==, "1");
+	g_assert_cmpstr(data[1], ==, "2");
+	g_assert_cmpstr(data[2], ==, "3");
+	g_strfreev(data);
+
+	data = utils_strv_new("1", "", "", "4", NULL);
+	g_assert_nonnull(data);
+	g_assert_cmpint(g_strv_length(data), ==, 4);
+	g_assert_cmpstr(data[0], ==, "1");
+	g_assert_cmpstr(data[1], ==, "");
+	g_assert_cmpstr(data[2], ==, "");
+	g_assert_cmpstr(data[3], ==, "4");
+	g_strfreev(data);
+}
+
+static void test_utils_strv_find_common_prefix(void)
+{
+	gchar **data, *s;
+
+	s = utils_strv_find_common_prefix(NULL, 0);
+	g_assert_null(s);
+
+	data = utils_strv_new("", NULL);
+	s = utils_strv_find_common_prefix(data, -1);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("1", "2", "3", NULL);
+	s = utils_strv_find_common_prefix(data, -1);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("abc", "amn", "axy", NULL);
+	s = utils_strv_find_common_prefix(data, -1);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "a");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("abc", "", "axy", NULL);
+	s = utils_strv_find_common_prefix(data, -1);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("22", "23", "33", NULL);
+	s = utils_strv_find_common_prefix(data, 1);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "22");
+	g_free(s);
+	s = utils_strv_find_common_prefix(data, 2);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "2");
+	g_free(s);
+	s = utils_strv_find_common_prefix(data, 3);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("/home/user/src/geany/src/stash.c", 
+	                      "/home/user/src/geany/src/sidebar.c", 
+	                      "/home/user/src/geany/src/sidebar.h", 
+	                      "/home/user/src/geany/src/sidebar.h",
+	                      "/home/user/src/geany/src/main.c",
+	                      "/home/user/src/geany-plugins/addons/src/addons.c",
+	                      NULL);
+	s = utils_strv_find_common_prefix(data, 4);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany/src/s");
+	g_free(s);
+	s = utils_strv_find_common_prefix(data, 5);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany/src/");
+	g_free(s);
+	s = utils_strv_find_common_prefix(data, -1);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany");
+	g_free(s);
+	g_strfreev(data);
+}
+
+#define DIR_SEP "\\/"
+void test_utils_strv_find_lcs(void)
+{
+	gchar **data, *s;
+
+	s = utils_strv_find_lcs(NULL, 0, "");
+	g_assert_null(s);
+
+	data = utils_strv_new("", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("1", "2", "3", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("abc", "amn", "axy", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "a");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("bca", "mna", "xya", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "a");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("abc", "", "axy", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("a123b", "b123c", "c123d", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "123");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("22", "23", "33", NULL);
+	s = utils_strv_find_lcs(data, 1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "22");
+	g_free(s);
+	s = utils_strv_find_lcs(data, 2, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "2");
+	g_free(s);
+	s = utils_strv_find_lcs(data, 3, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("/home/user/src/geany/src/stash.c", 
+	                      "/home/user/src/geany/src/sidebar.c", 
+	                      "/home/user/src/geany/src/sidebar.h", 
+	                      "/home/user/src/geany/src/sidebar.h",
+	                      "/home/user/src/geany/src/main.c",
+	                      "/home/user/src/geany-plugins/addons/src/addons.c",
+	                      NULL);
+	s = utils_strv_find_lcs(data, 4, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany/src/s");
+	g_free(s);
+	s = utils_strv_find_lcs(data, 4, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany/src/");
+	g_free(s);
+	s = utils_strv_find_lcs(data, 5, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany/src/");
+	g_free(s);
+	s = utils_strv_find_lcs(data, 5, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany/src/");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/geany");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/home/user/src/");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("/src/a/app-1.2.3/src/lib/module/source.c",
+	                      "/src/b/app-2.2.3/src/module/source.c", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/module/source.c");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/module/");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("/src/a/app-1.2.3/src/lib/module\\source.c",
+	                      "/src/b/app-2.2.3/src/module\\source.c", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/module\\source.c");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/module\\");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("/src/a/app-1.2.3/src/lib/module/",
+	                      "/src/b/app-2.2.3/src/module/", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, ".2.3/src/");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/module/");
+	g_free(s);
+	g_strfreev(data);
+
+	data = utils_strv_new("/usr/local/bin/geany", "/usr/bin/geany", "/home/user/src/geany/src/geany", NULL);
+	s = utils_strv_find_lcs(data, -1, "");
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "/geany");
+	g_free(s);
+	s = utils_strv_find_lcs(data, -1, DIR_SEP);
+	g_assert_nonnull(s);
+	g_assert_cmpstr(s, ==, "");
+	g_free(s);
+	g_strfreev(data);
+}
+
+
+/* g_strv_equal is too recent */
+static gboolean strv_eq(gchar **strv1, gchar **strv2)
+{
+	while(1) {
+		gchar *s1 = *strv1++;
+		gchar *s2 = *strv2++;
+
+		if (!s1 && !s2)
+			return TRUE;
+		else if (s1 && !s2)
+			return FALSE;
+		else if (s2 && !s1)
+			return FALSE;
+		else if (!g_str_equal(s1, s2))
+			return FALSE;
+	}
+}
+
+void test_utils_strv_shorten_file_list(void)
+{
+	gchar **data, **expected, **result;
+	gchar *empty[] = { NULL };
+
+	result = utils_strv_shorten_file_list(NULL, 0);
+	expected = empty;
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(result);
+
+	data = utils_strv_new("", NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = data;
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("1", "2", "3", NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = data;
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("abc", "amn", "axy", NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = data;
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("abc", "", "axy", NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = data;
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("22", "23", "33", NULL);
+	result = utils_strv_shorten_file_list(data, 1);
+	expected = utils_strv_new("22", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(result);
+	result = utils_strv_shorten_file_list(data, 2);
+	expected = utils_strv_new("22", "23", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(result);
+	result = utils_strv_shorten_file_list(data, 3);
+	expected = utils_strv_new("22", "23", "33", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("/home/user/src/geany/src/stash.c", 
+	                      "/home/user/src/geany/src/sidebar.c", 
+	                      "/home/user/src/geany/src/sidebar.h", 
+	                      "/home/user/src/geany/src/sidebar.h",
+	                      "/home/user/src/geany/src/main.c",
+	                      "/home/user/src/geany-plugins/addons/src/addons.c",
+	                      NULL);
+	result = utils_strv_shorten_file_list(data, 4);
+	expected = utils_strv_new("stash.c", "sidebar.c", "sidebar.h", "sidebar.h", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	result = utils_strv_shorten_file_list(data, 5);
+	expected = utils_strv_new("stash.c", "sidebar.c", "sidebar.h", "sidebar.h", "main.c", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = utils_strv_new("geany/src/stash.c", "geany/src/sidebar.c",
+	                          "geany/src/sidebar.h", "geany/src/sidebar.h", "geany/src/main.c",
+	                          "geany-plugins/addons/src/addons.c",
+	                          NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(data);
+
+	data = utils_strv_new("/home/user1/src/geany/src/stash.c", 
+	                      "/home/user2/src/geany/src/sidebar.c", 
+	                      "/home/user3/src/geany/src/sidebar.h", 
+	                      "/home/user4/src/geany/src/sidebar.h",
+	                      "/home/user5/src/geany/src/main.c",
+	                      NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = utils_strv_new("user1/.../stash.c",
+	                          "user2/.../sidebar.c",
+	                          "user3/.../sidebar.h",
+	                          "user4/.../sidebar.h",
+	                          "user5/.../main.c",
+	                          NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("/aaa/bbb/cc/ccccc/ddddd", "/aaa/bbb/xxx/yyy/cc/ccccc/ddddd", NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = utils_strv_new("cc/.../ddddd", "xxx/yyy/cc/.../ddddd", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(result);
+	g_strfreev(data);
+
+	data = utils_strv_new("/src/a/app-1.2.3/src/lib/module/source.c",
+	                      "/src/b/app-2.2.3/src/module/source.c", NULL);
+	result = utils_strv_shorten_file_list(data, -1);
+	expected = utils_strv_new("a/app-1.2.3/src/lib/.../source.c",
+	                          "b/app-2.2.3/src/.../source.c", NULL);
+	g_assert_true(strv_eq(result, expected));
+	g_strfreev(expected);
+	g_strfreev(result);
+	g_strfreev(data);
+}
+
+int main(int argc, char **argv)
+{
+	g_test_init(&argc, &argv, NULL);
+
+	UTIL_TEST_ADD("strv_join", test_utils_strv_new);
+	UTIL_TEST_ADD("strv_find_common_prefix", test_utils_strv_find_common_prefix);
+	UTIL_TEST_ADD("strv_find_lcs", test_utils_strv_find_lcs);
+	UTIL_TEST_ADD("strv_shorten_file_list", test_utils_strv_shorten_file_list);
+
+	return g_test_run();
+}



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list