aboutsummaryrefslogtreecommitdiff
path: root/tests/test_buffers.c
blob: 7b073f42ebea20b367b33d1717d1d65103b5a06e (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
81
82
83
84
85
86
87
#include "test_core.h"

#include "ecex.h"

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void test_buffer_editing_and_undo(void) {
    buffer_t *buffer = buffer_new("edit", NULL, 0);
    assert(buffer);

    assert(buffer_insert(buffer, "hello") == 0);
    assert(buffer_insert_char(buffer, '\n') == 0);
    assert(buffer_insert(buffer, "world") == 0);
    assert(strcmp(buffer->data, "hello\nworld") == 0);
    assert(buffer->len == strlen("hello\nworld"));
    assert(buffer_line_count(buffer) == 2);

    buffer_set_point(buffer, 5);
    assert(buffer_insert(buffer, ",") == 0);
    assert(strcmp(buffer->data, "hello,\nworld") == 0);

    assert(buffer_undo(buffer) == 0);
    assert(strcmp(buffer->data, "hello\nworld") == 0);
    assert(buffer_redo(buffer) == 0);
    assert(strcmp(buffer->data, "hello,\nworld") == 0);

    buffer_free(buffer);
}

void test_buffer_selection_and_search(void) {
    buffer_t *buffer = buffer_new("select", NULL, 0);
    assert(buffer);

    assert(buffer_set_text(buffer, "alpha beta gamma beta") == 0);
    buffer_set_mark(buffer, 6);
    buffer_set_point(buffer, 10);
    assert(buffer_has_selection(buffer) == 1);

    size_t start = 0;
    size_t end = 0;
    buffer_selection_range(buffer, &start, &end);
    assert(start == 6);
    assert(end == 10);

    char *selection = buffer_substring(buffer, start, end);
    assert(selection);
    assert(strcmp(selection, "beta") == 0);
    free(selection);

    assert(buffer_replace_selection(buffer, "delta") == 0);
    assert(strcmp(buffer->data, "alpha delta gamma beta") == 0);

    size_t pos = 0;
    assert(buffer_search_forward(buffer, "gamma", 0, &pos) == 0);
    assert(pos == 12);
    assert(buffer_search_backward(buffer, "alpha", buffer->len, &pos) == 0);
    assert(pos == 0);
    assert(buffer_search_forward(buffer, "missing", 0, &pos) != 0);
    assert(buffer_undo(buffer) == 0);
    assert(strcmp(buffer->data, "alpha beta gamma beta") == 0);

    buffer_free(buffer);
}

void test_buffer_file_round_trip(void) {
    const char *path = "/tmp/ecex-test-core-buffer.txt";
    remove(path);

    buffer_t *writer = buffer_new("writer", NULL, 0);
    assert(writer);
    assert(buffer_set_text(writer, "one\ntwo\n") == 0);
    assert(buffer_save_as(writer, path) == 0);
    assert(writer->modified == 0);
    buffer_free(writer);

    buffer_t *reader = buffer_new("reader", path, 0);
    assert(reader);
    assert(buffer_load_file(reader, path) == 0);
    assert(strcmp(reader->data, "one\ntwo\n") == 0);
    assert(reader->modified == 0);
    buffer_free(reader);

    remove(path);
}