From b498ff7a98f75938768ee746db6a0d112ea791c2 Mon Sep 17 00:00:00 2001 From: Koichi Shiraishi Date: Thu, 2 May 2019 16:54:46 +0900 Subject: [PATCH 1/3] nvim: add AttachBuffer testcases --- nvim/nvim_test.go | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/nvim/nvim_test.go b/nvim/nvim_test.go index 3cdc3d2b..937f29f0 100644 --- a/nvim/nvim_test.go +++ b/nvim/nvim_test.go @@ -1,6 +1,7 @@ package nvim import ( + "bytes" "errors" "fmt" "log" @@ -379,6 +380,93 @@ func TestAPI(t *testing.T) { t.Errorf("HLByID(id, true)\n got %+v,\nwant %+v", hl, gui) } }) + + t.Run("buf_attach", func(t *testing.T) { + buffer, err := v.CurrentBuffer() + if err != nil { + t.Fatal(err) + } + if err := v.SetBufferLines(buffer, 0, -1, true, bytes.Fields([]byte(nil))); err != nil { + t.Fatal(err) + } + + type ChangedtickEvent struct { + Buffer Buffer + Changetick int64 + } + type BufLinesEvent struct { + Buffer Buffer + Changetick int64 + FirstLine int64 + LastLine int64 + LineData string + IsMultipart bool + } + + changedtickChan := make(chan *ChangedtickEvent) + v.RegisterHandler("nvim_buf_changedtick_event", func(changedtickEvent ...interface{}) { + ev := &ChangedtickEvent{ + Buffer: changedtickEvent[0].(Buffer), + Changetick: changedtickEvent[1].(int64), + } + changedtickChan <- ev + }) + + bufLinesChan := make(chan *BufLinesEvent) + v.RegisterHandler("nvim_buf_lines_event", func(bufLinesEvent ...interface{}) { + ev := &BufLinesEvent{ + Buffer: bufLinesEvent[0].(Buffer), + Changetick: bufLinesEvent[1].(int64), + FirstLine: bufLinesEvent[2].(int64), + LastLine: bufLinesEvent[3].(int64), + LineData: fmt.Sprint(bufLinesEvent[4]), + IsMultipart: bufLinesEvent[5].(bool), + } + bufLinesChan <- ev + }) + + ok, err := v.AttachBuffer(buffer, false, make(map[string]interface{})) + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal(errors.New("could not attach buffer")) + } + + changedtickExpected := &ChangedtickEvent{ + Buffer: 1, + Changetick: 4, + } + bufLinesEventExpected := &BufLinesEvent{ + Buffer: 1, + Changetick: 5, + FirstLine: 0, + LastLine: 1, + LineData: "[test]", + IsMultipart: false, + } + + go func() { + for { + select { + default: + case changedtick := <-changedtickChan: + if !reflect.DeepEqual(changedtick, changedtickExpected) { + t.Fatalf("changedtick = %+v, want %+v", changedtick, changedtickExpected) + } + case bufLines := <-bufLinesChan: + if expected := bufLinesEventExpected; !reflect.DeepEqual(bufLines, expected) { + t.Fatalf("bufLines = %+v, want %+v", bufLines, expected) + } + } + } + }() + + test := []byte("test") + if err := v.SetBufferLines(buffer, 0, -1, true, bytes.Fields(test)); err != nil { + t.Fatal(err) + } + }) } func TestDial(t *testing.T) { From e8b4f8363d4c43c10317d9af741d956f278d354f Mon Sep 17 00:00:00 2001 From: Koichi Shiraishi Date: Tue, 7 May 2019 07:21:27 +0900 Subject: [PATCH 2/3] nvim: avoid t.Fatal without gorounite --- nvim/nvim_test.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/nvim/nvim_test.go b/nvim/nvim_test.go index 937f29f0..ca59dc3d 100644 --- a/nvim/nvim_test.go +++ b/nvim/nvim_test.go @@ -7,6 +7,7 @@ import ( "log" "reflect" "strings" + "sync/atomic" "testing" "time" ) @@ -386,7 +387,9 @@ func TestAPI(t *testing.T) { if err != nil { t.Fatal(err) } - if err := v.SetBufferLines(buffer, 0, -1, true, bytes.Fields([]byte(nil))); err != nil { + + // clear curret buffer text + if err := v.SetBufferLines(buffer, 0, -1, true, bytes.Fields(nil)); err != nil { t.Fatal(err) } @@ -446,26 +449,48 @@ func TestAPI(t *testing.T) { IsMultipart: false, } + var numEvent int64 // add and load should be atomically + errc := make(chan error) + done := make(chan struct{}) go func() { for { select { default: + if atomic.LoadInt64(&numEvent) == 2 { // end buf_attach test when handle 2 event + done <- struct{}{} + return + } case changedtick := <-changedtickChan: if !reflect.DeepEqual(changedtick, changedtickExpected) { - t.Fatalf("changedtick = %+v, want %+v", changedtick, changedtickExpected) + errc <- fmt.Errorf("changedtick = %+v, want %+v", changedtick, changedtickExpected) } + t.Log("changedtick") + atomic.AddInt64(&numEvent, 1) case bufLines := <-bufLinesChan: if expected := bufLinesEventExpected; !reflect.DeepEqual(bufLines, expected) { - t.Fatalf("bufLines = %+v, want %+v", bufLines, expected) + errc <- fmt.Errorf("bufLines = %+v, want %+v", bufLines, expected) } + t.Log("bufLines") + atomic.AddInt64(&numEvent, 1) } } }() + go func() { + <-done + close(errc) + }() + test := []byte("test") if err := v.SetBufferLines(buffer, 0, -1, true, bytes.Fields(test)); err != nil { t.Fatal(err) } + + for err := range errc { + if err != nil { + t.Fatal(err) + } + } }) } From 01ee4d661d6d88193fccc3154d91aa00f79c7013 Mon Sep 17 00:00:00 2001 From: Koichi Shiraishi Date: Tue, 7 May 2019 07:39:22 +0900 Subject: [PATCH 3/3] nvim: remove debug logging --- nvim/nvim_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/nvim/nvim_test.go b/nvim/nvim_test.go index ca59dc3d..043b3c63 100644 --- a/nvim/nvim_test.go +++ b/nvim/nvim_test.go @@ -464,13 +464,11 @@ func TestAPI(t *testing.T) { if !reflect.DeepEqual(changedtick, changedtickExpected) { errc <- fmt.Errorf("changedtick = %+v, want %+v", changedtick, changedtickExpected) } - t.Log("changedtick") atomic.AddInt64(&numEvent, 1) case bufLines := <-bufLinesChan: if expected := bufLinesEventExpected; !reflect.DeepEqual(bufLines, expected) { errc <- fmt.Errorf("bufLines = %+v, want %+v", bufLines, expected) } - t.Log("bufLines") atomic.AddInt64(&numEvent, 1) } }