]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add unit test for common/buf.c
authorJohan Malm <jgm323@gmail.com>
Sat, 23 Sep 2023 14:07:25 +0000 (15:07 +0100)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Tue, 20 Aug 2024 16:31:53 +0000 (18:31 +0200)
CONTRIBUTING.md
meson.build
meson_options.txt
t/.gitignore [new file with mode: 0644]
t/buf-simple.c [new file with mode: 0644]
t/meson.build [new file with mode: 0644]

index 655376c5edde4f7973fa5c6c65b308deec94582b..0f79ef5fb53560bb586f0c4e0b2351729da501e1 100644 (file)
     - [4.3.3 The use of GNU extensions](#the-use-of-gnu-extensions)
     - [4.3.4 Naming Conventions](#naming-conventions)
 - [5. Commit Messages](#commit-messages)
-- [6. Submitting Patches](#submitting-patches)
-- [7. Native Language Support](#native-language-support)
-- [8. Upversion](#upversion)
+- [6. Unit Tests](#unit-tests)
+- [7. Submitting Patches](#submitting-patches)
+- [8. Native Language Support](#native-language-support)
+- [9. Upversion](#upversion)
 
 # How to Contribute
 
@@ -345,6 +346,29 @@ This first line should:
 And please wrap the commit message at max 74 characters, otherwise `git log`
 and similar look so weird. URLs and other references are exempt.
 
+# Unit Tests
+
+## Introduction
+
+The tests live in the `t/` directory.
+
+In the bigger scheme of validating that the compositor meets users' needs, unit
+tests do not contribute a great deal. However, they have a role to play in
+providing some verification that stand-alone functions behave as expected.
+
+On this project, writing unit-tests is not compulsory nor do we measure
+coverage. The inclusion of the t/ directory does not signifiy a move towards
+test-driven development. We intend to use unit tests sparingly and only when
+devs find them useful.
+
+## Usage
+
+From repo top level directory:
+
+    meson setup -Dtest=enabled build
+    meson compile -C build/
+    meson test --verbose -C build/
+
 # Submitting patches
 
 Base both bugfixes and new features on `master`.
index 4761fbc94c9766f00b5feb23189bcb5ef82c1347..8f9b5a9745dacf4fc0356fd9c8357c09d860f1ca 100644 (file)
@@ -130,6 +130,11 @@ subdir('include')
 subdir('src')
 subdir('docs')
 
+dep_cmocka = dependency('cmocka', required: get_option('test'))
+if dep_cmocka.found()
+  subdir('t')
+endif
+
 executable(
   meson.project_name(),
   labwc_sources,
index d9cb73a86c0ff8cd958117c413c4a9b91260aab2..4d6e8cd5564dd0076a081743f6095cca90e398aa 100644 (file)
@@ -3,3 +3,4 @@ option('xwayland', type: 'feature', value: 'auto', description: 'Enable support
 option('svg', type: 'feature', value: 'enabled', description: 'Enable svg window buttons')
 option('nls', type: 'feature', value: 'auto', description: 'Enable native language support')
 option('static_analyzer', type: 'feature', value: 'disabled', description: 'Run gcc static analyzer')
+option('test', type: 'feature', value: 'disabled', description: 'Run tests')
diff --git a/t/.gitignore b/t/.gitignore
new file mode 100644 (file)
index 0000000..a8d6b6c
--- /dev/null
@@ -0,0 +1 @@
+*.t
diff --git a/t/buf-simple.c b/t/buf-simple.c
new file mode 100644 (file)
index 0000000..4772211
--- /dev/null
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#define _POSIX_C_SOURCE 200809L
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <cmocka.h>
+#include "common/buf.h"
+#include "common/mem.h"
+
+static void
+test_expand_title(void **state)
+{
+       (void)state;
+
+       struct buf s = BUF_INIT;
+
+       char TEMPLATE[] = "foo ~/bar";
+       char expect[4096];
+       snprintf(expect, sizeof(expect), "foo %s/bar", getenv("HOME"));
+
+       buf_add(&s, TEMPLATE);
+       assert_string_equal(s.data, TEMPLATE);
+       assert_int_equal(s.len, strlen(TEMPLATE));
+
+       // Resolve ~
+       buf_expand_tilde(&s);
+       assert_string_equal(s.data, expect);
+       assert_int_equal(s.len, strlen(expect));
+
+       setenv("bar", "BAR", 1);
+
+       // Resolve $bar and ${bar}
+       s.len = 0;
+       buf_add(&s, "foo $bar baz");
+       buf_expand_shell_variables(&s);
+       assert_string_equal(s.data, "foo BAR baz");
+       assert_int_equal(s.len, 11);
+
+       s.len = 0;
+       buf_add(&s, "foo ${bar} baz");
+       buf_expand_shell_variables(&s);
+       assert_string_equal(s.data, "foo BAR baz");
+       assert_int_equal(s.len, 11);
+
+       // Don't resolve $()
+       s.len = 0;
+       buf_add(&s, "foo $(bar) baz");
+       buf_expand_shell_variables(&s);
+       assert_string_equal(s.data, "foo $(bar) baz");
+       assert_int_equal(s.len, 14);
+
+       unsetenv("bar");
+       free(s.data);
+}
+
+int main(int argc, char **argv)
+{
+       const struct CMUnitTest tests[] = {
+               cmocka_unit_test(test_expand_title),
+       };
+
+       return cmocka_run_group_tests(tests, NULL, NULL);
+}
diff --git a/t/meson.build b/t/meson.build
new file mode 100644 (file)
index 0000000..5517b97
--- /dev/null
@@ -0,0 +1,27 @@
+test_lib = static_library(
+  'test_lib',
+  sources: files(
+    '../src/common/buf.c',
+    '../src/common/mem.c',
+    '../src/common/string-helpers.c'
+  ),
+  include_directories: [labwc_inc],
+  dependencies: [dep_cmocka],
+)
+
+tests = [
+  'buf-simple',
+]
+
+foreach t : tests
+  test(
+    'test_@0@'.format(t),
+    executable(
+      'test_@0@'.format(t),
+      sources: '@0@.c'.format(t),
+      include_directories: [labwc_inc],
+      link_with: [test_lib],
+    ),
+    is_parallel: false,
+  )
+endforeach