From: Michael D. Lowis Date: Mon, 9 Apr 2018 19:15:04 +0000 (-0400) Subject: added unit tests and minor refactoring X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=ea95693b03264f42581f2ba7e4d3b655f181bbb2;p=projs%2Ftide.git added unit tests and minor refactoring --- diff --git a/Makefile b/Makefile index 97a0d23..a2703c4 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ INCS = -Iinc/ MAKEFLAGS = -j4 BINS = tide -MAN1 = docs/tide.1 docs/pick.1 docs/picktag.1 docs/pickfile.1 +MAN1 = docs/tide.1 LIBEDIT_OBJS = \ lib/buf.o \ @@ -13,15 +13,13 @@ LIBEDIT_OBJS = \ lib/config.o TEST_BINS = \ - tests/tide \ - tests/pick \ tests/libedit include config.mk .PHONY: all docs clean install uninstall test -all: $(BINS) $(MAN1) +all: $(BINS) test docs: ronn --roff docs/*.md @@ -33,42 +31,30 @@ clean: install: mkdir -p $(PREFIX)/bin - cp -f tcmd $(PREFIX)/bin - cp -f tfetch $(PREFIX)/bin cp -f tide $(PREFIX)/bin - cp -f tide-hl.rb $(PREFIX)/bin - cp -f tctl $(PREFIX)/bin - cp -f pick $(PREFIX)/bin cp -f xcpd $(PREFIX)/bin - cp -f pickfile $(PREFIX)/bin - cp -f picktag $(PREFIX)/bin uninstall: - rm -f $(PREFIX)/bin/tcmd - rm -f $(PREFIX)/bin/tfetch rm -f $(PREFIX)/bin/tide - rm -f $(PREFIX)/bin/tide-hl.rb - rm -f $(PREFIX)/bin/tctl - rm -f $(PREFIX)/bin/pick rm -f $(PREFIX)/bin/xcpd - rm -f $(PREFIX)/bin/pickfile - rm -f $(PREFIX)/bin/picktag test: $(TEST_BINS) - @echo "Warning: unit tests disabled temporarily. Re-enable later." -# for t in $(TEST_BINS); do ./$$t || exit 1; done + for t in $(TEST_BINS); do ./$$t || exit 1; done + +bugs: + make clean + scan-build make + +gcov: + make clean + make GCOV=1 test libedit.a: $(LIBEDIT_OBJS) $(AR) $(ARFLAGS) $@ $^ tide: tide.o libedit.a -pick: pick.o libedit.a xcpd: xcpd.o libedit.a -tfetch: tfetch.o -tctl: tctl.o libedit.a tests/libedit: tests/libedit.o tests/lib/buf.o tests/lib/utf8.o libedit.a -tests/tide: tests/tide.o libedit.a -tests/pick: tests/pick.o libedit.a # define implicit rule for building binaries %: %.o @@ -76,10 +62,3 @@ tests/pick: tests/pick.o libedit.a # load generate dependencies -include *.d lib/*.d tests/*.d tests/lib/*.d - -flaws: - -./analyze.sh tide.c lib/*.c - -scan-build: - make clean - scan-build make diff --git a/lib/x11.c b/lib/x11.c index cc931c7..ce4ef1c 100644 --- a/lib/x11.c +++ b/lib/x11.c @@ -665,7 +665,9 @@ static void mouse_left(WinRegion id, bool pressed, size_t row, size_t col) { uint64_t now = getmillis(); count = ((now-before) <= (uint64_t)ClickTime ? count+1 : 1); before = now; - if (win_btnpressed(MouseMiddle)) { + if (win_btnpressed(MouseRight)) { + puts("fetch tag"); + } else if (win_btnpressed(MouseMiddle)) { puts("exec with arg"); } else { if (count == 1) diff --git a/tests/lib/buf.c b/tests/lib/buf.c index 566cebd..e77ecc2 100644 --- a/tests/lib/buf.c +++ b/tests/lib/buf.c @@ -3,168 +3,98 @@ #include #include -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); @@ -172,7 +102,7 @@ TEST_SUITE(BufferTests) { } 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); @@ -180,7 +110,7 @@ TEST_SUITE(BufferTests) { } 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); @@ -188,37 +118,14 @@ TEST_SUITE(BufferTests) { } 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 @@ -371,11 +278,13 @@ TEST_SUITE(BufferTests) { 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)); @@ -391,6 +300,7 @@ TEST_SUITE(BufferTests) { set_buffer_text("abc\ncba"); CHECK(!buf_iseol(&TestBuf, 2)); } +#endif /* Movements *************************************************************************/ @@ -456,83 +366,7 @@ TEST_SUITE(BufferTests) { 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"); @@ -597,7 +431,6 @@ TEST_SUITE(BufferTests) { /* Literal Find *************************************************************************/ -#if 0 TEST(buf_find should find next occurrence of the selection) { set_buffer_text("foofodfoo"); unsigned beg = 0, end = 2; @@ -619,36 +452,54 @@ TEST_SUITE(BufferTests) { *************************************************************************/ 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); } } diff --git a/tests/pick.c b/tests/pick.c deleted file mode 100644 index 9e787de..0000000 --- a/tests/pick.c +++ /dev/null @@ -1,15 +0,0 @@ -#define INCLUDE_DEFS -#include -#include - -// Inculd the source file so we can access everything -#include "../pick.c" - -TEST_SUITE(UnitTests) { -} - -int main(int argc, char** argv) { - atf_init(argc,argv); - RUN_TEST_SUITE(UnitTests); - return atf_print_results(); -}