aboutsummaryrefslogtreecommitdiff
path: root/tests/main.cpp
blob: 1b9231c75fb972f766e20ee345ae6186e4124054 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "../include/DynamicImage.hpp"
#include <dchat/MessageComposer.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)
{
    if(a != b)
    {
        fprintf(stderr, "%s:%d: Assert failed: %d == %d\n", file, line, a, b);
        exit(EXIT_FAILURE);
    }
}
#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.data(), text.bytes(), [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)
{
    return testVisual(argc, argv);
}