summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2021-04-11 16:20:21 +0200
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2021-04-11 16:20:21 +0200
commit8c2bc60ceb48e3a64bf83920b999801895052f61 (patch)
treea4480a7b65ed5dce94e30fe9525fce9845d18163 /tests
parent801a862710e7a554736391e5a68a4e340341dbe5 (diff)
downloadglibmm-8c2bc60ceb48e3a64bf83920b999801895052f61.tar.gz
tests/glibmm_ustring_compare: Fix so it works for C++20
Make 3 tests, where the 2 new tests check that the disallowed comparisons between std::string and Glib::ustring don't compile. The new tests are added only in Meson builds (ninja test). See MR !50
Diffstat (limited to 'tests')
-rw-r--r--tests/glibmm_ustring_compare/main.cc43
-rw-r--r--tests/meson.build24
2 files changed, 39 insertions, 28 deletions
diff --git a/tests/glibmm_ustring_compare/main.cc b/tests/glibmm_ustring_compare/main.cc
index 349a2741..ccbbd280 100644
--- a/tests/glibmm_ustring_compare/main.cc
+++ b/tests/glibmm_ustring_compare/main.cc
@@ -1,26 +1,13 @@
#include <glibmm.h>
-
#include <iostream>
-// Helper class to check for non-existing overload
-template<typename T>
-struct Convertible
-{
- Convertible(const T&){};
-};
-
-static bool expect_missing_overload = false;
-
-void
-operator==(Convertible<std::string> const&, Glib::ustring const&)
-{
- g_assert_true(expect_missing_overload);
- expect_missing_overload = false;
-}
-
int
main(int, char**)
{
+ const char *cstr1 = "Hello";
+ Glib::ustring ustr1 = cstr1;
+
+#ifndef GLIBMM_TEST_THAT_COMPILATION_FAILS
// allocating
static_assert(std::is_convertible<const char*, Glib::ustring>::value, "");
// non-allocating
@@ -30,12 +17,10 @@ main(int, char**)
static_assert(!std::is_convertible<Glib::UStringView, Glib::ustring>::value, "");
static_assert(!std::is_convertible<Glib::UStringView, const char *>::value, "");
- const char *cstr1 = "Hello";
const char *cstr2 = "World";
const char *cstr12 = "HelloWorld";
const char *cstr12_25 = "lloWo"; // cstr12[2:2 + 5]
- Glib::ustring ustr1 = cstr1;
Glib::ustring ustr2 = cstr2;
Glib::ustring ustr12 = cstr12;
Glib::ustring ustr12_25 = cstr12_25;
@@ -98,17 +83,19 @@ main(int, char**)
static_assert(!std::is_convertible<std::string, Glib::UStringView>::value, "");
static_assert(!std::is_convertible<Glib::UStringView, std::string>::value, "");
- std::string sstr1 = cstr1;
+#else // GLIBMM_TEST_THAT_COMPILATION_FAILS
+
+ // By design some combinations of std::string and Glib::ustring are not allowed.
+ // Copied from ustring.h: Using the wrong string class shall not be as easy as
+ // using the right string class.
- // Would not compile without the helper overload
- expect_missing_overload = true;
- sstr1 == ustr1;
- g_assert_false(expect_missing_overload);
+ std::string sstr1 = cstr1;
- // Doesn't compile because of missing Glib::ustring::compare overload (expected), but
- // unfortunately not testable like the other way round.
-#if 0
- ustr1 == sstr1;
+#if GLIBMM_TEST_THAT_COMPILATION_FAILS == 1
+ sstr1 == ustr1; // Shall not compile
+#else
+ ustr1 == sstr1; // Shall not compile
+#endif
#endif
return EXIT_SUCCESS;
diff --git a/tests/meson.build b/tests/meson.build
index dabeb775..653ed878 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -41,6 +41,7 @@ test_programs = [
]
thread_dep = dependency('threads')
+meson_backend = find_program(meson.backend(), required: true)
foreach ex : test_programs
dir = ''
@@ -66,4 +67,27 @@ foreach ex : test_programs
)
test(ex_name, exe_file)
+
+ if ex[0][0] == 'glibmm_ustring_compare'
+
+ # Tests that shall fail to compile.
+ foreach suffix : ['1', '2']
+ ex_name_s = ex_name + suffix
+ exe_file = executable(ex_name_s, ex_sources,
+ cpp_args: ['-DGLIBMM_DISABLE_DEPRECATED', '-DGIOMM_DISABLE_DEPRECATED',
+ '-DGLIBMM_TEST_THAT_COMPILATION_FAILS=' + suffix],
+ dependencies: mm_dep,
+ implicit_include_directories: false,
+ gui_app: false,
+ build_by_default: false,
+ install: false,
+ )
+
+ target_name = 'tests' / ex_name_s
+ test(ex_name_s, meson_backend,
+ args: target_name,
+ should_fail: true,
+ )
+ endforeach
+ endif
endforeach