From ce86a8885920089fe4a5530a3a65e69c770bbcc5 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 28 Oct 2016 16:23:28 -0400 Subject: [PATCH] Added tests for buf.c --- .gitignore | 3 + Makefile | 5 +- buf.c | 2 +- tests/buf.c | 277 ++++++++++++++++++++++++++++++++++++---------------- 4 files changed, 200 insertions(+), 87 deletions(-) diff --git a/.gitignore b/.gitignore index 1bd9b14..371b261 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ edit unittests project.vim tags +*.gcno +*.gcda +*.gcov diff --git a/Makefile b/Makefile index 0c79a35..d51b015 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ -#GCOV = --coverage +PREFIX = /usr/local +GCOV = --coverage LDFLAGS = $(GCOV) -L/opt/X11/lib -lX11 -lXft -lfontconfig CFLAGS = $(GCOV) -Os --std=gnu99 -Wall -Wextra -I. -I/opt/X11/include -I/opt/local/include/freetype2 -I/usr/include/freetype2 OBJS = buf.o screen.o utf8.o keyboard.o mouse.o charset.o utils.o @@ -18,6 +19,8 @@ unittests: $(TESTOBJS) $(OBJS) coverage: test gcov -fabc $(OBJS) > coverage.txt +install: + cp clean: $(RM) edit unittests xedit.o $(OBJS) $(TESTOBJS) coverage.txt diff --git a/buf.c b/buf.c index f145b60..fabe810 100644 --- a/buf.c +++ b/buf.c @@ -248,7 +248,7 @@ unsigned buf_rscan(Buf* buf, unsigned off, Rune r) { return off; } -int range_match(Buf* buf, unsigned dbeg, unsigned dend, unsigned mbeg, unsigned mend) { +static int range_match(Buf* buf, unsigned dbeg, unsigned dend, unsigned mbeg, unsigned mend) { unsigned n1 = dend-dbeg, n2 = mend-mbeg; if (n1 != n2) return n1-n2; for (; n1; n1--, dbeg++, mbeg++) { diff --git a/tests/buf.c b/tests/buf.c index ccd1f1c..aa3aa74 100644 --- a/tests/buf.c +++ b/tests/buf.c @@ -11,6 +11,7 @@ static void buf_clr(Buf* buf) { static void set_buffer_text(char* str) { int i = 0; buf_clr(&TestBuf); + TestBuf.crlf = 1; for (Rune* curr = TestBuf.bufstart; curr < TestBuf.bufend; curr++) *curr = '-'; TestBuf.locked = false; @@ -27,137 +28,243 @@ static bool buf_text_eq(char* str) { } TEST_SUITE(BufferTests) { + /* Initializing + *************************************************************************/ + /* Loading + *************************************************************************/ + /* Saving + *************************************************************************/ + /* Resizing + *************************************************************************/ /* Insertions *************************************************************************/ - TEST(buf_ins should insert at 0 in empty buf) { - buf_clr(&TestBuf); - buf_ins(&TestBuf, 0, 'a'); - CHECK(buf_text_eq("a")); - } + /* Deletions + *************************************************************************/ + /* Undo/Redo + *************************************************************************/ + /* Locking + *************************************************************************/ - TEST(buf_ins should insert at 0) { - buf_clr(&TestBuf); - buf_ins(&TestBuf, 0, 'b'); - buf_ins(&TestBuf, 0, 'a'); - CHECK(buf_text_eq("ab")); + /* Accessors + *************************************************************************/ + // buf_get + TEST(buf_get should return newline for indexes outside the buffer) { + set_buffer_text("test"); + CHECK('\n' == buf_get(&TestBuf, 4)); } - TEST(buf_ins should insert at 1) { - buf_clr(&TestBuf); - buf_ins(&TestBuf, 0, 'a'); + TEST(buf_get should indexed character before the gap) { + set_buffer_text("ac"); buf_ins(&TestBuf, 1, 'b'); - CHECK(buf_text_eq("ab")); + CHECK('a' == buf_get(&TestBuf, 0)); } - TEST(buf_ins should insert at 1) { - buf_clr(&TestBuf); - buf_ins(&TestBuf, 0, 'a'); - buf_ins(&TestBuf, 1, 'c'); + TEST(buf_get should indexed character after the gap) { + set_buffer_text("ac"); buf_ins(&TestBuf, 1, 'b'); - CHECK(buf_text_eq("abc")); + CHECK('c' == buf_get(&TestBuf, 2)); } - TEST(buf_ins should sentence in larger text) { - set_buffer_text( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elementum eros quis venenatis. " - ); + 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_ins(&TestBuf, 5, ' '); - buf_ins(&TestBuf, 6, 'a'); + TEST(buf_iseol should return true if index points to a newline rune) { + set_buffer_text("abc\ncba"); + CHECK(buf_iseol(&TestBuf, 3)); + } - CHECK(buf_text_eq( - "Lorem a ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elementum eros quis venenatis. " - )); + TEST(buf_iseol should return true if index points to a crlf rune) { + CHECK(!"Test causes an assertion in the syncgap function. no idea why"); + set_buffer_text("abc\r\ncba"); + CHECK(buf_iseol(&TestBuf, 0)); } - /* Deletions - *************************************************************************/ + TEST(buf_iseol should return false if index does not point to a newline rune) { + set_buffer_text("abc\ncba"); + CHECK(!buf_iseol(&TestBuf, 2)); + } - /* Beginning and End of line + /* Movements *************************************************************************/ - TEST(buf_bol should move to first non newline character of line) { - set_buffer_text("\nabc\n"); - CHECK(1 == buf_bol(&TestBuf, 3)); + // Start of Line + TEST(buf_bol should return 0 if column 1 of first line) { + set_buffer_text("ab\ncd"); + CHECK(0 == buf_bol(&TestBuf, 2)); } - TEST(buf_bol should do nothing for blank line) { - set_buffer_text("\n\n"); - CHECK(1 == buf_bol(&TestBuf, 1)); + TEST(buf_bol should return 0 if column 2 of first line) { + set_buffer_text("ab\ncd"); + CHECK(0 == buf_bol(&TestBuf, 1)); } - TEST(buf_eol should move to last character of line) { - set_buffer_text("\nabc\n"); - CHECK(4 == buf_eol(&TestBuf, 1)); + TEST(buf_bol should return 0 if index points to newline) { + set_buffer_text("ab\ncd"); + CHECK(0 == buf_bol(&TestBuf, 0)); } - TEST(buf_eol should do nothing for blank line) { - set_buffer_text("\n\n"); - CHECK(1 == buf_eol(&TestBuf, 1)); + TEST(buf_bol should return 3 if column 1 of second line) { + set_buffer_text("ab\ncd"); + CHECK(3 == buf_bol(&TestBuf, 3)); } - /* Movement by Rune - *************************************************************************/ - TEST(buf_byrune should do nothing for -1 at beginning of file) - { - set_buffer_text("abc\n"); - CHECK(0 == buf_byrune(&TestBuf, 0, -1)); + TEST(buf_bol should return 3 if column 2 of second line) { + set_buffer_text("ab\ncd"); + CHECK(3 == buf_bol(&TestBuf, 4)); } - TEST(buf_byrune should do nothing for -2 at beginning of file) - { - set_buffer_text("abc\n"); - CHECK(0 == buf_byrune(&TestBuf, 0, -2)); + TEST(buf_bol should return input if index is outside buffer) { + set_buffer_text("ab\ncd"); + CHECK(6 == buf_bol(&TestBuf, 6)); } - TEST(buf_byrune should move to just after last rune for +1 at end of file) - { - set_buffer_text("abc\n"); - CHECK(4 == buf_byrune(&TestBuf, 3, 1)); - } + // End of Line + // Start of Word + // End of Word + // Scan Left + // Scan Right + // By Rune + // By Line + + /* Literal Find + *************************************************************************/ + /* Cursor Column Tracking + *************************************************************************/ - TEST(buf_byrune should move to just after last rune for +2 at end of file) - { - set_buffer_text("abc\n"); - CHECK(4 == buf_byrune(&TestBuf, 3, 2)); - } - //TEST(buf_byrune should skip newlines for -1) + + ///* Insertions + // *************************************************************************/ + //TEST(buf_ins should insert at 0 in empty buf) { + // buf_clr(&TestBuf); + // buf_ins(&TestBuf, 0, 'a'); + // CHECK(buf_text_eq("a")); + //} + + //TEST(buf_ins should insert at 0) { + // buf_clr(&TestBuf); + // buf_ins(&TestBuf, 0, 'b'); + // buf_ins(&TestBuf, 0, 'a'); + // CHECK(buf_text_eq("ab")); + //} + + //TEST(buf_ins should insert at 1) { + // buf_clr(&TestBuf); + // buf_ins(&TestBuf, 0, 'a'); + // buf_ins(&TestBuf, 1, 'b'); + // CHECK(buf_text_eq("ab")); + //} + + //TEST(buf_ins should insert at 1) { + // buf_clr(&TestBuf); + // buf_ins(&TestBuf, 0, 'a'); + // buf_ins(&TestBuf, 1, 'c'); + // buf_ins(&TestBuf, 1, 'b'); + // CHECK(buf_text_eq("abc")); + //} + + //TEST(buf_ins should sentence in larger text) { + // set_buffer_text( + // "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elementum eros quis venenatis. " + // ); + + // buf_ins(&TestBuf, 5, ' '); + // buf_ins(&TestBuf, 6, 'a'); + + // CHECK(buf_text_eq( + // "Lorem a ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elementum eros quis venenatis. " + // )); + //} + + ///* Deletions + // *************************************************************************/ + + ///* Beginning and End of line + // *************************************************************************/ + //TEST(buf_bol should move to first non newline character of line) { + // set_buffer_text("\nabc\n"); + // CHECK(1 == buf_bol(&TestBuf, 3)); + //} + + //TEST(buf_bol should do nothing for blank line) { + // set_buffer_text("\n\n"); + // CHECK(1 == buf_bol(&TestBuf, 1)); + //} + + //TEST(buf_eol should move to last character of line) { + // set_buffer_text("\nabc\n"); + // CHECK(4 == buf_eol(&TestBuf, 1)); + //} + + //TEST(buf_eol should do nothing for blank line) { + // set_buffer_text("\n\n"); + // CHECK(1 == buf_eol(&TestBuf, 1)); + //} + + ///* Movement by Rune + // *************************************************************************/ + //TEST(buf_byrune should do nothing for -1 at beginning of file) //{ - // set_buffer_text("ab\ncd\n"); - // CHECK(1 == buf_byrune(&TestBuf, 3, -1)); + // set_buffer_text("abc\n"); + // CHECK(0 == buf_byrune(&TestBuf, 0, -1)); //} - //TEST(buf_byrune should skip newlines for +1) + //TEST(buf_byrune should do nothing for -2 at beginning of file) //{ - // set_buffer_text("ab\ncd\n"); - // CHECK(3 == buf_byrune(&TestBuf, 1, 1)); + // set_buffer_text("abc\n"); + // CHECK(0 == buf_byrune(&TestBuf, 0, -2)); //} - //TEST(buf_byrune should not skip blank lines for -1) + //TEST(buf_byrune should move to just after last rune for +1 at end of file) //{ - // set_buffer_text("ab\n\ncd\n"); - // CHECK(3 == buf_byrune(&TestBuf, 4, -1)); + // set_buffer_text("abc\n"); + // CHECK(4 == buf_byrune(&TestBuf, 3, 1)); //} - //TEST(buf_byrune should not skip blank lines for +1) + //TEST(buf_byrune should move to just after last rune for +2 at end of file) //{ - // set_buffer_text("ab\n\ncd\n"); - // CHECK(3 == buf_byrune(&TestBuf, 1, 1)); + // set_buffer_text("abc\n"); + // CHECK(4 == buf_byrune(&TestBuf, 3, 2)); //} - //TEST(buf_byrune should move from blank line to non-blank line for -1) + ////TEST(buf_byrune should skip newlines for -1) + ////{ + //// set_buffer_text("ab\ncd\n"); + //// CHECK(1 == buf_byrune(&TestBuf, 3, -1)); + ////} + + ////TEST(buf_byrune should skip newlines for +1) + ////{ + //// set_buffer_text("ab\ncd\n"); + //// CHECK(3 == buf_byrune(&TestBuf, 1, 1)); + ////} + + ////TEST(buf_byrune should not skip blank lines for -1) + ////{ + //// set_buffer_text("ab\n\ncd\n"); + //// CHECK(3 == buf_byrune(&TestBuf, 4, -1)); + ////} + + ////TEST(buf_byrune should not skip blank lines for +1) + ////{ + //// set_buffer_text("ab\n\ncd\n"); + //// CHECK(3 == buf_byrune(&TestBuf, 1, 1)); + ////} + + ////TEST(buf_byrune should move from blank line to non-blank line for -1) + ////{ + //// set_buffer_text("ab\n\ncd\n"); + //// CHECK(1 == buf_byrune(&TestBuf, 3, -1)); + ////} + + //TEST(buf_byrune should move from blank line to non-blank line for +1) //{ // set_buffer_text("ab\n\ncd\n"); - // CHECK(1 == buf_byrune(&TestBuf, 3, -1)); + // CHECK(4 == buf_byrune(&TestBuf, 3, 1)); //} - TEST(buf_byrune should move from blank line to non-blank line for +1) - { - set_buffer_text("ab\n\ncd\n"); - CHECK(4 == buf_byrune(&TestBuf, 3, 1)); - } - - /* Movement by Line - *************************************************************************/ + ///* Movement by Line + // *************************************************************************/ } -- 2.49.0