aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/main.cpp81
1 files changed, 80 insertions, 1 deletions
diff --git a/tests/main.cpp b/tests/main.cpp
index 719a9ea..b18626c 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -1,7 +1,13 @@
#include "../include/MessageComposer.hpp"
+#include "../include/DynamicImage.hpp"
#include <stdio.h>
#include <vector>
#include <string.h>
+#include <gtkmm/application.h>
+#include <gtkmm/window.h>
+#include <gtkmm/grid.h>
+#include <gtkmm/textview.h>
+#include <assert.h>
#define REQUIRE(expr) do { if(!(expr)) { fprintf(stderr, "%s:%d: Assert failed: %s\n", __FILE__, __LINE__, #expr); exit(EXIT_FAILURE); } } while(0)
static void requireEqualValues(int a, int b, const char *file, int line)
@@ -14,6 +20,60 @@ static void requireEqualValues(int a, int b, const char *file, int line)
}
#define REQUIRE_EQUAL(a, b) do { requireEqualValues((a), (b), __FILE__, __LINE__); } while(0)
+static void applyRichText(Gtk::TextView *textView, const Glib::ustring &text)
+{
+ auto buffer = textView->get_buffer();
+ buffer->set_text("");
+ Gtk::TextIter iter = buffer->get_iter_at_offset(0);
+
+ dchat::compose(text, [textView, &text, &iter, &buffer](dchat::MessagePart messagePart)
+ {
+ switch(messagePart.type)
+ {
+ case dchat::MessagePart::Type::TEXT:
+ {
+ iter = buffer->insert(iter, text.data() + messagePart.textRange.start, text.data() + messagePart.textRange.end);
+ break;
+ }
+ case dchat::MessagePart::Type::EMOJI:
+ {
+ auto anchor = Gtk::TextChildAnchor::create();
+ iter = buffer->insert_child_anchor(iter, anchor);
+ auto image = Gtk::manage(new dchat::DynamicImage());
+ image->url = text.substr(messagePart.textRange.start, messagePart.textRange.length());
+ image->set_size_request(35, 35);
+ textView->add_child_at_anchor(*image, anchor);
+ break;
+ }
+ default:
+ assert(false);
+ break;
+ }
+ });
+}
+
+static int testVisual(int argc, char **argv)
+{
+ auto app = Gtk::Application::create(argc, argv, "dec05eba.dchat", Gio::APPLICATION_NON_UNIQUE);
+ Gtk::Window window;
+ window.set_border_width(0);
+ window.set_size_request(640, 480);
+
+ auto grid = Gtk::manage(new Gtk::Grid());
+ grid->set_vexpand(true);
+ grid->set_hexpand(true);
+ window.add(*grid);
+
+ auto textView = Gtk::manage(new Gtk::TextView());
+ textView->set_size_request(640, 480);
+ textView->set_wrap_mode(Gtk::WRAP_WORD_CHAR);
+ applyRichText(textView, "Hello world [emoji](https://discordemoji.com/assets/emoji/PeepoHide.png)[emoji](https://discordemoji.com/assets/emoji/PeepoHide.png)");
+ grid->attach(*textView, 0, 0, 1, 1);
+
+ window.show_all();
+ return app->run(window);
+}
+
int main(int argc, char **argv)
{
std::vector<dchat::MessagePart> expect =
@@ -107,5 +167,24 @@ int main(int argc, char **argv)
str = "abc [notemoji](cool) def";
dchat::compose(str, compareFunc);
}
- return 0;
+
+ {
+ expect =
+ {
+ dchat::MessagePart { dchat::MessagePart::Type::TEXT, dchat::Range{ 0, 12 } },
+ dchat::MessagePart { dchat::MessagePart::Type::EMOJI, dchat::Range{ 20, 71 } }
+ };
+
+ expectText =
+ {
+ "Hello world ",
+ "https://discordemoji.com/assets/emoji/PeepoHide.png"
+ };
+
+ index = 0;
+ str = "Hello world [emoji](https://discordemoji.com/assets/emoji/PeepoHide.png)";
+ dchat::compose(str, compareFunc);
+ }
+
+ return testVisual(argc, argv);
}