diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/main.cpp | 81 |
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); } |