#include <utf.h>
#include <edit.h>
-static Buf TestBuf;
-
-static void onerror(char* msg) {
-}
+static Buf TestBuf = {0};
static void set_buffer_text(char* str) {
- int i = 0;
- buf_init(&TestBuf, onerror);
- TestBuf.crlf = 1;
- for (Rune* curr = TestBuf.bufstart; curr < TestBuf.bufend; curr++)
- *curr = '-';
- while (*str)
- buf_insert(&TestBuf, false, i++, (Rune)*str++);
+ buf_init(&TestBuf);
+ buf_puts(&TestBuf, str);
}
static bool buf_text_eq(char* str) {
- for (unsigned i = 0; i < buf_end(&TestBuf); i++) {
- //printf("'%c'", buf_get(&TestBuf, i));
- if ((Rune)*(str++) != buf_get(&TestBuf, i)) {
- //printf("\n");
- return false;
- }
- }
- //printf("\n");
- return true;
+ buf_selall(&TestBuf);
+ char* bstr = buf_gets(&TestBuf);
+ int ret = strcmp(str, bstr);
+ free(bstr);
+ return (ret == 0);
}
TEST_SUITE(BufferTests) {
/* Initializing
*************************************************************************/
TEST(buf_init should initialize an empty buffer) {
- Buf buf = {0};
- buf_init(&buf, (void*)0x12345678);
- CHECK(buf.modified == false);
- CHECK(buf.expand_tabs == config_get_bool(ExpandTabs));
- CHECK(buf.copy_indent == config_get_bool(CopyIndent));
- CHECK(buf.charset == UTF_8);
- CHECK(buf.crlf == 0);
- CHECK(buf.bufsize == 8192);
- CHECK(buf.bufstart != NULL);
- CHECK(buf.bufend == buf.bufstart + buf.bufsize);
- CHECK(buf.gapstart == buf.bufstart);
- CHECK(buf.gapend == buf.bufend);
- CHECK(buf.undo == NULL);
- CHECK(buf.redo == NULL);
- CHECK(buf.errfn == (void*)0x12345678);
- CHECK(buf.nlines == 0);
+ buf_init(&TestBuf);
+ CHECK(TestBuf.modified == false);
+ CHECK(TestBuf.bufsize == 8192);
+ CHECK(TestBuf.bufstart != NULL);
+ CHECK(TestBuf.bufend == TestBuf.bufstart + TestBuf.bufsize);
+ CHECK(TestBuf.gapstart == TestBuf.bufstart);
+ CHECK(TestBuf.gapend == TestBuf.bufend);
+ CHECK(TestBuf.undo == NULL);
+ CHECK(TestBuf.redo == NULL);
}
TEST(buf_init shoud free old buffer and reinitialize) {
- Buf buf = {0};
- buf_init(&buf, onerror);
- buf_insert(&buf, false, 0, 'a');
- buf_init(&buf, (void*)0x12345678);
- CHECK(buf.modified == false);
- CHECK(buf.expand_tabs == config_get_bool(ExpandTabs));
- CHECK(buf.copy_indent == config_get_bool(CopyIndent));
- CHECK(buf.charset == UTF_8);
- CHECK(buf.crlf == 0);
- CHECK(buf.bufsize == 8192);
- CHECK(buf.bufstart != NULL);
- CHECK(buf.bufend == buf.bufstart + buf.bufsize);
- CHECK(buf.gapstart == buf.bufstart);
- CHECK(buf.gapend == buf.bufend);
- CHECK(buf.undo == NULL);
- CHECK(buf.redo == NULL);
- CHECK(buf.errfn == (void*)0x12345678);
- CHECK(buf.nlines == 0);
+ buf_init(&TestBuf);
+ buf_putc(&TestBuf, 'a');
+ buf_init(&TestBuf);
+ CHECK(TestBuf.modified == false);
+ CHECK(TestBuf.bufsize == 8192);
+ CHECK(TestBuf.bufstart != NULL);
+ CHECK(TestBuf.bufend == TestBuf.bufstart + TestBuf.bufsize);
+ CHECK(TestBuf.gapstart == TestBuf.bufstart);
+ CHECK(TestBuf.gapend == TestBuf.bufend);
+ CHECK(TestBuf.undo == NULL);
+ CHECK(TestBuf.redo == NULL);
}
/* Loading
*************************************************************************/
TEST(buf_load should load a UTF-8 file from disk) {
- buf_init(&TestBuf, NULL);
- size_t pos = buf_load(&TestBuf, "testdocs/lorem.txt");
- CHECK(pos == 0);
+ buf_init(&TestBuf);
+ buf_load(&TestBuf, "testdocs/lorem.txt");
CHECK(TestBuf.modified == false);
- CHECK(TestBuf.expand_tabs == true);
- CHECK(TestBuf.copy_indent == config_get_bool(CopyIndent));
- CHECK(TestBuf.charset == UTF_8);
- CHECK(TestBuf.crlf == 0);
- CHECK(TestBuf.bufsize == 65536);
+ CHECK(TestBuf.bufsize == 61440);
CHECK(TestBuf.undo == NULL);
CHECK(TestBuf.redo == NULL);
- CHECK(TestBuf.errfn == NULL);
- CHECK(TestBuf.nlines == 998);
CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt"));
}
TEST(buf_load should load a non UTF-8 file from disk) {
- buf_init(&TestBuf, NULL);
- size_t pos = buf_load(&TestBuf, "testdocs/waf");
- CHECK(pos == 0);
+ buf_init(&TestBuf);
+ buf_load(&TestBuf, "testdocs/waf");
CHECK(TestBuf.modified == false);
- CHECK(TestBuf.expand_tabs == false);
- CHECK(TestBuf.copy_indent == config_get_bool(CopyIndent));
- CHECK(TestBuf.charset == BINARY);
- CHECK(TestBuf.crlf == 0);
- CHECK(TestBuf.bufsize == 131072);
+ CHECK(TestBuf.bufsize == 98304);
CHECK(TestBuf.undo == NULL);
CHECK(TestBuf.redo == NULL);
- CHECK(TestBuf.errfn == NULL);
- CHECK(TestBuf.nlines == 169);
CHECK(!strcmp(TestBuf.path, "testdocs/waf"));
}
- TEST(buf_load should load a file from disk and jump to a specific line) {
- buf_init(&TestBuf, NULL);
- size_t pos = buf_load(&TestBuf, "testdocs/lorem.txt:2");
- CHECK(pos == 70);
- CHECK(TestBuf.modified == false);
- CHECK(TestBuf.expand_tabs == true);
- CHECK(TestBuf.copy_indent == config_get_bool(CopyIndent));
- CHECK(TestBuf.charset == UTF_8);
- CHECK(TestBuf.crlf == 0);
- CHECK(TestBuf.bufsize == 65536);
- CHECK(TestBuf.undo == NULL);
- CHECK(TestBuf.redo == NULL);
- CHECK(TestBuf.errfn == NULL);
- CHECK(TestBuf.nlines == 998);
- CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt"));
- }
-
TEST(buf_load should remove ./ from file path) {
- buf_init(&TestBuf, NULL);
- size_t pos = buf_load(&TestBuf, "./testdocs/lorem.txt");
- CHECK(pos == 0);
+ buf_init(&TestBuf);
+ buf_load(&TestBuf, "./testdocs/lorem.txt");
CHECK(TestBuf.modified == false);
- CHECK(TestBuf.expand_tabs == true);
- CHECK(TestBuf.copy_indent == config_get_bool(CopyIndent));
- CHECK(TestBuf.charset == UTF_8);
- CHECK(TestBuf.crlf == 0);
- CHECK(TestBuf.bufsize == 65536);
+ CHECK(TestBuf.bufsize == 61440);
CHECK(TestBuf.undo == NULL);
CHECK(TestBuf.redo == NULL);
- CHECK(TestBuf.errfn == NULL);
- CHECK(TestBuf.nlines == 998);
CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt"));
}
TEST(buf_reload should reload the file from disk) {
- buf_init(&TestBuf, NULL);
+ buf_init(&TestBuf);
buf_load(&TestBuf, "testdocs/waf");
TestBuf.path = "testdocs/lorem.txt";
buf_reload(&TestBuf);
CHECK(TestBuf.modified == false);
- CHECK(TestBuf.expand_tabs == true);
- CHECK(TestBuf.copy_indent == config_get_bool(CopyIndent));
- CHECK(TestBuf.charset == UTF_8);
- CHECK(TestBuf.crlf == 0);
- CHECK(TestBuf.bufsize == 65536);
+ CHECK(TestBuf.bufsize == 61440);
CHECK(TestBuf.undo == NULL);
CHECK(TestBuf.redo == NULL);
- CHECK(TestBuf.errfn == NULL);
- CHECK(TestBuf.nlines == 998);
CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt"));
}
/* Saving
*************************************************************************/
TEST(buf_save should save a UTF-8 file to disk) {
- buf_init(&TestBuf, NULL);
+ buf_init(&TestBuf);
buf_load(&TestBuf, "testdocs/lorem.txt");
TestBuf.modified = true;
buf_save(&TestBuf);
}
TEST(buf_save should save a non UTF-8 file to disk) {
- buf_init(&TestBuf, NULL);
+ buf_init(&TestBuf);
buf_load(&TestBuf, "testdocs/waf");
TestBuf.modified = true;
buf_save(&TestBuf);
}
TEST(buf_save should save a file to disk with unix line endings) {
- buf_init(&TestBuf, NULL);
+ buf_init(&TestBuf);
buf_load(&TestBuf, "testdocs/lf.txt");
TestBuf.modified = true;
buf_save(&TestBuf);
}
TEST(buf_save should save a file to disk with dos line endings) {
- buf_init(&TestBuf, NULL);
+ buf_init(&TestBuf);
buf_load(&TestBuf, "testdocs/crlf.txt");
TestBuf.modified = true;
buf_save(&TestBuf);
CHECK(TestBuf.modified == false);
}
- TEST(buf_save should make sure unix file ends witn newline) {
- buf_init(&TestBuf, NULL);
- buf_load(&TestBuf, "testdocs/lf.txt");
- TestBuf.modified = true;
- size_t end = buf_end(&TestBuf);
- buf_delete(&TestBuf, end-1, end);
- CHECK(end-1 == buf_end(&TestBuf));
- buf_save(&TestBuf);
- CHECK(end == buf_end(&TestBuf));
- CHECK(TestBuf.modified == false);
- }
-
- TEST(buf_save should make sure dos file ends witn newline) {
- buf_init(&TestBuf, NULL);
- buf_load(&TestBuf, "testdocs/crlf.txt");
- TestBuf.modified = true;
- size_t end = buf_end(&TestBuf);
- buf_delete(&TestBuf, end-1, end);
- CHECK(end-1 == buf_end(&TestBuf));
- buf_save(&TestBuf);
- CHECK(end == buf_end(&TestBuf));
- CHECK(TestBuf.modified == false);
- }
-
+#if 0
/* Resizing
*************************************************************************/
/* Insertions
CHECK('c' == buf_get(&TestBuf, 2));
}
+ // buf_end
TEST(buf_end should return the index just after the last rune in the buffer) {
set_buffer_text("abc");
CHECK(3 == buf_end(&TestBuf));
}
+ // buf_iseol
TEST(buf_iseol should return true if index points to a newline rune) {
set_buffer_text("abc\ncba");
CHECK(buf_iseol(&TestBuf, 3));
set_buffer_text("abc\ncba");
CHECK(!buf_iseol(&TestBuf, 2));
}
+#endif
/* Movements
*************************************************************************/
CHECK(5 == buf_eol(&TestBuf, 5));
}
- // Start of Word
- TEST(buf_bow should return input when pointing to whitespace before word) {
- set_buffer_text(" abc ");
- CHECK(0 == buf_bow(&TestBuf, 0));
- }
-
- TEST(buf_bow should return 1 when first rune of word) {
- set_buffer_text(" abc ");
- CHECK(1 == buf_bow(&TestBuf, 1));
- }
-
- TEST(buf_bow should return 1 when second rune of word) {
- set_buffer_text(" abc ");
- CHECK(1 == buf_bow(&TestBuf, 2));
- }
-
- TEST(buf_bow should return 1 when third rune of word) {
- set_buffer_text(" abc ");
- CHECK(1 == buf_bow(&TestBuf, 3));
- }
-
- TEST(buf_bow should return input when pointing to whitespace after word) {
- IGNORE("this may be correct but moving by word is janky right now. revisit later");
- set_buffer_text(" abc ");
- CHECK(4 == buf_bow(&TestBuf, 4));
- }
-
- // End of Word
- TEST(buf_eow should return input when pointing to whitespace before word) {
- IGNORE("this may be correct but moving by word is janky right now. revisit later");
- set_buffer_text(" abc ");
- CHECK(0 == buf_eow(&TestBuf, 0));
- }
-
- TEST(buf_eow should return 3 when first rune of word) {
- set_buffer_text(" abc ");
- CHECK(3 == buf_eow(&TestBuf, 1));
- }
-
- TEST(buf_eow should return 3 when second rune of word) {
- set_buffer_text(" abc ");
- CHECK(3 == buf_eow(&TestBuf, 2));
- }
-
- TEST(buf_eow should return 3 when third rune of word) {
- set_buffer_text(" abc ");
- CHECK(3 == buf_eow(&TestBuf, 3));
- }
-
- TEST(buf_eow should return input when pointing to whitespace after word) {
- IGNORE("this may be correct but moving by word is janky right now. revisit later");
- set_buffer_text(" abc ");
- CHECK(4 == buf_eow(&TestBuf, 4));
- }
-
- // Scan Left
- TEST(buf_lscan should return location of token to the left) {
- set_buffer_text("a{bc}");
- CHECK(1 == buf_lscan(&TestBuf, 4, '{'));
- }
-
- TEST(buf_lscan should return input location if token not found) {
- set_buffer_text("{ab}");
- CHECK(3 == buf_lscan(&TestBuf, 3, '['));
- }
-
- // Scan Right
- TEST(buf_rscan should return location of token to the right) {
- set_buffer_text("{ab}c");
- CHECK(3 == buf_rscan(&TestBuf, 0, '}'));
- }
-
- TEST(buf_rscan should return input location if token not found) {
- set_buffer_text("{ab}c");
- CHECK(0 == buf_rscan(&TestBuf, 0, ']'));
- }
-
+#if 0
// By Rune
TEST(buf_byrune should do nothing for -1 at beginning of file) {
set_buffer_text("abc\n");
/* Literal Find
*************************************************************************/
-#if 0
TEST(buf_find should find next occurrence of the selection) {
set_buffer_text("foofodfoo");
unsigned beg = 0, end = 2;
*************************************************************************/
TEST(buf_getcol should return the column associated with the position) {
set_buffer_text("abcdef");
- CHECK(4 == buf_getcol(&TestBuf, 4));
+ TestBuf.selection = (Sel){ .end = 4 };
+ buf_getcol(&TestBuf);
+ CHECK(4 == TestBuf.selection.col);
}
TEST(buf_getcol should return the column associated with the position on second line) {
set_buffer_text("abcdef\nabcdef");
- CHECK(0 == buf_getcol(&TestBuf, 7));
+ TestBuf.selection = (Sel){ .end = 7 };
+ buf_getcol(&TestBuf);
+ CHECK(0 == TestBuf.selection.col);
}
TEST(buf_getcol should handle tab characters) {
set_buffer_text("\tabcdef");
- CHECK(4 == buf_getcol(&TestBuf, 1));
+ TestBuf.selection = (Sel){ .end = 1 };
+ buf_getcol(&TestBuf);
+ CHECK(4 == TestBuf.selection.col);
}
TEST(buf_setcol should set the column to column 1 of second line) {
set_buffer_text("abc\ndef");
- CHECK(4 == buf_setcol(&TestBuf, 4, 0));
+ TestBuf.selection = (Sel){ .end = 4, .col = 0 };
+ buf_setcol(&TestBuf);
+ CHECK(0 == TestBuf.selection.col);
+ CHECK(4 == TestBuf.selection.end);
}
TEST(buf_setcol should set the column to column 2 of second line) {
set_buffer_text("abc\ndef");
- CHECK(5 == buf_setcol(&TestBuf, 4, 1));
+ TestBuf.selection = (Sel){ .end = 4, .col = 1 };
+ buf_setcol(&TestBuf);
+ CHECK(1 == TestBuf.selection.col);
+ CHECK(5 == TestBuf.selection.end);
}
TEST(buf_setcol should handle tabs) {
set_buffer_text("abc\n\tdef");
- CHECK(5 == buf_setcol(&TestBuf, 4, 4));
+ TestBuf.selection = (Sel){ .end = 4, .col = 4 };
+ buf_setcol(&TestBuf);
+ CHECK(4 == TestBuf.selection.col);
+ CHECK(5 == TestBuf.selection.end);
}
TEST(buf_setcol should not set column past the last rune) {
set_buffer_text("abc\n\tdef");
- CHECK(8 == buf_setcol(&TestBuf, 4, 100));
+ TestBuf.selection = (Sel){ .end = 4, .col = 100 };
+ buf_setcol(&TestBuf);
+ CHECK(100 == TestBuf.selection.col);
+ CHECK(8 == TestBuf.selection.end);
}
}