changeset 585:33427145b453

farray.sh: Implement an equality test in "farray_are_equal()"
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 18 Sep 2024 01:25:25 +0200
parents 7bf729bec285
children f536f6ac44bf
files share/local-bsdtools/farray.sh tests/farray-array.t
diffstat 2 files changed, 90 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/farray.sh	Wed Sep 18 01:23:57 2024 +0200
+++ b/share/local-bsdtools/farray.sh	Wed Sep 18 01:25:25 2024 +0200
@@ -981,6 +981,55 @@
 
 
 #:
+#: Test whether two arrays are equal.
+#:
+#: Two arrays are equal if they have both the same length and if
+#: all elements are equal (using ``test value1 = value2``).
+#:
+#: Args:
+#:   $1 (str): The name of the first array
+#:   $2 (str): The name of the second array
+#:
+#: Returns:
+#:   int: 0 if both input arrays are equal, 1 otherwise
+#:
+farray_are_equal() {
+    local __farr_l_name __farr_r_name
+
+    local __farr_l_token __farr_l_gvrname __farr_l_len
+    local __farr_r_token __farr_r_gvrname __farr_r_len
+
+    local __farr_name __farr_token __farr_gvrname __farr_len
+    local __farr_idx __farr_vl __farr_vr
+
+    [ $# -ne 2 ] && _farr_fatal "missing array"
+
+    _farr_array_get_meta "$1"
+    __farr_l_name="${__farr_name}"
+    __farr_l_token="${__farr_token}"
+    __farr_l_gvrname="${__farr_gvrname}"
+    __farr_l_len="${__farr_len}"
+
+    _farr_array_get_meta "$2"
+    __farr_r_name="${__farr_name}"
+    __farr_r_token="${__farr_token}"
+    __farr_r_gvrname="${__farr_gvrname}"
+    __farr_r_len="${__farr_len}"
+
+    [ ${__farr_l_len} -ne ${__farr_r_len} ] && return 1
+
+    __farr_idx=1
+    while [ ${__farr_idx} -le ${__farr_l_len} ]; do
+        eval __farr_vl=\"\$\{${__farr_l_gvrname}_${__farr_idx}\}\"
+        eval __farr_vr=\"\$\{${__farr_r_gvrname}_${__farr_idx}\}\"
+        [ "${__farr_vl}" != "${__farr_vr}" ] && return 1
+        __farr_idx=$((__farr_idx + 1))
+    done
+    return 0
+}
+
+
+#:
 #: Call a function for every element in an array starting at the first index.
 #:
 #: The function to be called must accept three arguments:
--- a/tests/farray-array.t	Wed Sep 18 01:23:57 2024 +0200
+++ b/tests/farray-array.t	Wed Sep 18 01:25:25 2024 +0200
@@ -74,3 +74,44 @@
   ERROR: farray `TEST' does not exist: token empty
   [1]
   $ check_no_array_artifacts
+
+Equality
+========
+
+Equality (empty)
+
+  $ farray_create TEST1
+  $ farray_create TEST2
+  $ farray_are_equal TEST1 TEST2
+  $ farray_destroy TEST1
+  $ farray_destroy TEST2
+  $ check_no_array_artifacts
+
+Equality (non-empty)
+
+  $ farray_create TEST1 0 1 2 '3  4   5' $'" 678" \\\'90 '
+  $ farray_create TEST2 0 1 2 '3  4   5' $'" 678" \\\'90 '
+  $ farray_are_equal TEST1 TEST2
+  $ farray_destroy TEST1
+  $ farray_destroy TEST2
+  $ check_no_array_artifacts
+
+In-Equality (non-empty, same length)
+
+  $ farray_create TEST1 0 1 2 '3  4   5' $'" 678" \\\'90 '
+  $ farray_create TEST2 0 1 2 '3  4   5' $'" 678" \\\'90'
+  $ farray_are_equal TEST1 TEST2
+  [1]
+  $ farray_destroy TEST1
+  $ farray_destroy TEST2
+  $ check_no_array_artifacts
+
+In-Equality (non-empty, different length)
+
+  $ farray_create TEST1 0 1 2 '3  4   5' $'" 678" \\\'90 '
+  $ farray_create TEST2   1 2 '3  4   5' $'" 678" \\\'90 '
+  $ farray_are_equal TEST1 TEST2
+  [1]
+  $ farray_destroy TEST1
+  $ farray_destroy TEST2
+  $ check_no_array_artifacts